[
  {
    "path": ".github/FUNDING.yml",
    "content": "custom: https://www.paypal.me/glormeau\nliberapay: gildas\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\n\n---\n<!--\nFor questions, please create or update a thread here: \nhttps://github.com/gildas-lormeau/SingleFile/discussions\n\nPlease ensure that you do not find an answer before reporting the issue:\n - in the FAQ: https://github.com/gildas-lormeau/SingleFile/blob/master/faq.md\n - in the list of known issues: https://github.com/gildas-lormeau/SingleFile#known-issues\n - in the help page embedded in the extension\n-->\n\n**Describe the bug**\n<!-- A clear and concise description of what the bug is. -->\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\n<!-- A clear and concise description of what you expected to happen. -->\n\n**Screenshots**\n<!-- If applicable, add screenshots to help explain your problem. -->\n\n**Environment**\n - OS: [e.g. Win10 Pro, Ubuntu 18.04.1, Android 7.1.2]\n - Browser: [e.g. Chrome, Firefox]\n - Version: [e.g. 64]\n\n**Additional context**\n<!-- Add any other context about the problem here. -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\nlabels: 'feature request'\n---\n\n**Is your feature request related to a problem? Please describe.**\n<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->\n\n\n**Describe the solution you'd like**\n<!-- A clear and concise description of what you want to happen. -->\n\n\n**Describe alternatives you've considered (optional)**\n<!-- A clear and concise description of any alternative solutions or features you've considered. -->\n\n\n**Additional context (optional)**\n<!-- Add any other context or screenshots about the feature request here. -->\n"
  },
  {
    "path": ".gitignore",
    "content": "/.vscode/\n**/node_modules/\n.idea/"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published\n    by the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<https://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "README.MD",
    "content": "# SingleFile MV3\r\n\r\nThis is the new version of [SingleFile](https://www.getsinglefile.com) compatible with the Manifest V3.\r\n\r\n## Manual install\r\n\r\nDownload the zip file\r\n(https://github.com/gildas-lormeau/SingleFile-MV3/archive/master.zip) of the project\r\nand install it manually by unzipping it somewhere on your disk and following\r\nthese instructions:\r\n\r\n- Chrome:\r\n  https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/#load-unpacked\r\n- Microsoft Edge:\r\n  https://docs.microsoft.com/en-us/microsoft-edge/extensions-chromium/getting-started/extension-sideloading\r\n"
  },
  {
    "path": "_locales/az/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Extensionin təsviri.\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Seçilmiş tabları yaddaşa qeyd et\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Bütün tabları yaddaşa qeyd et\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Xüsusi qısa yol\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Xüsusi qısa yol #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Xüsusi qısa yol #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Xüsusi qısa yol #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Xüsusi qısa yol #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Xüsusi qısa yol #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Xüsusi qısa yol #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Xüsusi qısa yol #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Xüsusi qısa yol #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Xüsusi qısa yol #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Xüsusi qısa yol #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Səhifəni SingleFile ilə yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Seçilmiş linkləri yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Səhifəni redaktə et...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Səhifəni redaktə et və yaddaşa qeyd et...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Profil ilə yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Gözləyən yaddaşları göstər...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Standart profil seç\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Qayda yenilə\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Domain qaydası yarat\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Seçimi yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Frame-i yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Tabları yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Seçilmiş tabları yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Sabit olmayan tabları yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Bütün tabları yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"URL-ləri toplu yaddaşa qeyd et...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Avtomatik yaddaşa qeyd\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Deaktiv edildi\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Bu tabı avtomatik yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Sabit olmayan tabları avtomatik yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Bütün tabları avtomatik yaddaşa qeyd et\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"SingleFile ilə səhifəni yaddaşa qeyd et\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Bu səhifə SingleFile ilə yaddaşa qeyd edilə bilmir\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"SingleFile Başlatırlır\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Yaddaşa qeyd etmək progressi: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Yükləmə progressi: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"Xəta\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Avtomatik yaddaşa qeyd aktivdir\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"SingleFile seçimləri\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"İstifadəçi interfeysi\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"səhifənin kontekst menyusuna əlavə edin\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"işləmə zamanı səhifəyə gölge əlavə edin\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"yaddaşa qeyd edilmiş səhifəni baxarkən infobar göstərin\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"infobar məzmununun şablonu\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"qarışıq məzmunu blok edin\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"mənbə URL-lərini yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"infobarı yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"infobarı yaddaşa qeyd edilmiş səhifəni baxarkən açın\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"yaddaşa qeyd edilmiş tarixi daxil etməyin\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"infobarın açılmasını təsdiqləyin\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"səhifə yaddaşa qeyd edildikdən sonra tabı avtomatik olaraq bağlayın\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"klaviatura qısa yolu əmri\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"standart qısa yol\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Fayl adı\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"şablon\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"maksimum uzunluq\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"bayt\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"simvol\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"əvəz olunan simvol\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"emoji-ləri mətnlə əvəz edin\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"fayl adı şablon məlumatlarını səhifəyə yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"fayl adını təsdiqləmək üçün \\\"Fərqli qeyd et\\\" açın\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"fayl adı çatışmalarının həllini seçin\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"fərqli ad yaratmaq\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"mövcud faylı üzərindən yazmaq\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"fayl adını sorğulamaq\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"təkrar faylları atlayın\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML məzmunu\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"HTML məzmununu sıxışdırın\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"frame-ləri çıxarın\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"gizli elementləri çıxarın\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"müəyyən elementləri çıxarın\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Fayl formatı\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"format\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"öz-çıxarılma ZIP (universal)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"öz-çıxarılma ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"şifrə\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"kök qovluğu yarat\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"sıxışdırmanı deaktiv edin\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"ZIP məzmunundan sonra məlumat əlavə etməyin\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"mətn məzmununu əlavə edin\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"gömülü şəkil\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"screenshot\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"özəl şəkil\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Infobar\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Şəkillər\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"şəkilləri qruplaşdırın\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"şəkil ölçüsünü azaltma əmsalı\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"gözləyən şəkilləri yükləyin\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"maksimum boş vaxt (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"zoom səviyyəsini saxlayın\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"\\\"scroll\\\" hadisəsini göndərin\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"frame-lərdən əvvəl yükləyin\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"alternativ ekran çözünürlüklü şəkilləri çıxarın\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Şriftlər\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"istifadə olunmayan şriftləri çıxarın\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"alternativ şriftləri çıxarın\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Stil\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"CSS məzmununu sıxışdırın\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"stil-ləri qruplaşdırın\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"baş elementdə stil-ləri köçürün\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"istifadə olunmayan stil-ləri çıxarın\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"alternativ cihazlar üçün stil-ləri çıxarın\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Şəbəkə\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"bloklanmış resurslar\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"\\\"Accept\\\" başlığı\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"skriptlər\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"videolar\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"audio\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"sənədlər\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"şriftlər\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"stil-lər\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"şəkillər\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Göstərici\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Bookmarks\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Avtomatik yaddaşa qeyd\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Avtomatik ayarlar qaydaları\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Göstərilən bütün qaydaların silinməsini təsdiqləyin\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Göstərilən bütün qaydaları silin\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Tam və ya qısmi URL daxil edin (məsələn, example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Auto-save profil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"bütün profiləri göstərin\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"Auto-save profilini göstərin\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Qayda yenilə\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Qayda sil\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Qayda əlavə et\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Dəyişiklikləri təsdiqlə\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Dəyişiklikləri ləğv et\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Seçilmiş qaydanın silinməsini təsdiqləyin\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"səhifə yükləndikdən sonra və ya səhifə yüklənmədən qabaq avtomatik yaddaşa qeyd edin\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"səhifə yükləndikdən sonra avtomatik yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"səhifə yüklənmədən qabaq avtomatik yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"tabı atdıqda avtomatik yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"tabı çıxardıqda avtomatik yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"səhifə yükləndikdən sonra avtomatik yaddaşa qeyd etmə gecikməsi (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"avtomatik olaraq yaddaşa qeyd et\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"dövrədən sonra gecikmə (s)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"xarici yaddaşa qeyd et\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Redaktor\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"səhifəni yaddaşa qeyd etdikdən sonra redaktoru açın\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"yaddaşa qeyd edilmiş səhifəni yeni tabda açın\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"səhifəni yaddaşa qeyd etdikdən sonra redaktoru avtomatik olaraq açın\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"standart rejim\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"səhifəni redaktə edin\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"səhifəni formatlayın\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"elementləri çıxarın\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"xarici elementləri çıxarın\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"sistem mövzusunu tətbiq edin\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"formatlama zamanı səhifənin məzmun genişliyi (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"yaddaşa qeyd edilməmiş dəyişiklikləri saxlayın\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"redaktorun infobarını göstərin\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Müxtəlif\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"səhifələri arxa planda yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"işləmədən sonra statistikaları konsolda göstərin\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"maksimum ölçü təyin edin\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"maksimum ölçü (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"maksimum yükləmə vaxtını təyin edin\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"maksimum yükləmə vaxtı (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"çap \\\"Referer\\\" başlığını keçirin\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"raw səhifəni yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"mətni təhlükəsizlik siyasəti ilə əlavə edin\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"mətni kəsənlərə kopyalayın\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"fayla yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"səhifəni paylaşın\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"məzmunun mövcudluğunu əlavə edin\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"SingleFile-a saxlayacağınız hər səhifənin SHA256 hash-ini Woleet API-yə göndərməyə icazə verdiyinizi təsdiq edin. Bu funksiya haqqında daha çox məlumatı yardım səhifəsində və ya seçimin yanındakı sual işarəsinə klikləməklə tapa bilərsiniz.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"giriş tokeni\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"Google Drive-a yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"Dropbox-a yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"GitHub-a yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"giriş tokeni\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"istifadəçi adı\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"repo adı\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"branch adı\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"Amazon S3-ə yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"domain\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"region\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"bucket adı\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"access key\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"secret key\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"WebDAV serverinə yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"istifadəçi adı\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"şifrə\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"MCP serverinə yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"server URL\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"avtorizasiya tokeni\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"SingleFile Companion ilə yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"yaddaşa qeyd edilmiş səhifənin yerini yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"yaddaşa qeyd edilmiş səhifənin URL-ni əvəz edin\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"icazə verilmiş qovluqlar\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"sorğulanan qovluqlar\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"kömək\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"seçimləri sinxronlaşdır\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Sıfırla\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Seçimləri və ya cari profil sıfırlayın\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Bütün seçimləri və ya cari profil sıfırlamaq üçün təsdiqləyin\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Bütün seçimləri sıfırla\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Cari profili sıfırla\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"İmtina\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"İxrac\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"İçəri al\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Gözləyən şəkillər\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Frame məzmunu\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Gömülü şəkil\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Addım\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile xətası: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Şəkil əlavə et...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Səhifəni paylaş...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Seçimi paylaş...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Standart ayarlar\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Deaktiv edilmiş\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Yeni profil əlavə edin\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Profilin adını dəyişdirin\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Profil silin\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Yeni profilin adını daxil edin\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Seçilmiş profilin silinməsini təsdiqləyin\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Seçilmiş profilin yeni adını daxil edin\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Sarı qeyd əlavə edin\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Çəhrayı qeyd əlavə edin\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Mavi qeyd əlavə edin\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Yaşıl qeyd əlavə edin\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Seçilmiş mətni sarı rəngdə işarələyin\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Seçilmiş mətni çəhrayı rəngdə işarələyin\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Seçilmiş mətni mavi rəngdə işarələyin\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Seçilmiş mətni yaşıl rəngdə işarələyin\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Qeydləri göstərin/gizlədin\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"İşarələmələri göstərin/gizlədin\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Seçilmiş işarələməni silin\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Səhifəni redaktə edin\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Səhifəni daha yaxşı oxunacaq şəkildə formatlayın\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"İç elementlərin çıxarılmasını aktivləşdirin/deaktivləşdirin\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Xarici elementlərin çıxarılmasını aktivləşdirin/deaktivləşdirin\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Son silinmiş elementi geri qaytarın\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Bütün silinmiş elementləri geri qaytarın\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Son geri qaytarılmış elementi silin\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Səhifəni yaddaşa qeyd edin\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Səhifəni çap edin\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"MHTML faylını daxil et\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Gözləyənlər\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Bütününü ləğv edin\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"başlıq\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"status\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"gözləyən\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"işlənir\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"ləğv edilir\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Gözləyən yaddaşlar yoxdur\",\n\t\t\"description\": \"Label displayed when there are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"URL əlavə edin\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Yeni satırlar qeydləri ilə ayrılmış bir URL siyahısı girin\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"İmtina\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Toplu saxlama URL-ləri\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"URL yoxdur\",\n\t\t\"description\": \"Label displayed when there are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"URL əlavə edin\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"URL-ləri əlavə edin...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Bütününü silin\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Səhifələri yaddaşa qeyd edin\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"REST Form API-yə yaddaşa qeyd edin\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"giriş tokeni\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"fayl sahə adı\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"URL sahə adı\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Redaktor seçimləri\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Yaddaşa qeyd edin\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Konfiqurasiya yaddaşa qeyd edildi\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Yanlış JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/de/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Speichern einer kompletten Webseite in eine einzige HTML-Datei\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Speichern der ausgewählten Tabs oder ihrer ausgewählten Inhalte\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Speichern aller Tabs\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Benutzerdefinierte Tastenkombination #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Speichern der Webseite mit SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Speichern ausgewählter Links\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Annotieren der Webseite...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Annotieren und Speichern der Webseite...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Speichern der Webseite mit Profil\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Anzeigen der aktuellen Speichern...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Wählen Sie das Standardprofil aus\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Profil der aktuellen Regel auswählen\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Profil der aktuellen Domain auswählen\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Auswahl speichern\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Rahmen speichern\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Tab speichern\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Speichern der ausgewählten Tabs\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Speichern der nicht angehefteten Tabs\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Speichern aller Tabs\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Stapelweise URLs speichern...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Automatische Speicherung\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Deaktiviert\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Automatische Speicherung dieses Tabs\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Automatische Speicherung der nicht angehefteten Tabs\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Automatische Speicherung aller Tabs\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Webseite mit SingleFile abspeichern\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"SingleFile kann diese Webseite nicht speichern\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Initialisierung von SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Speicherung aktiviert: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Upload aktiviert: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Automatische Speicherung ist aktiv\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Auswahlmenu\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Benutzerschnittstelle\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"Eintrag im Kontextmenü der Webseite hinzufügen\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"Während der Speicherung die Webseite grau unterlegen\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"Infoknopf beim Betrachten einer gespeicherten Seite anzeigen\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"Muster für Inhalt des Infoknopfs\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"Blockieren gemischter Inhalte\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"Speichern der Original-URLs von eingebetteten Ressourcen\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"Einfügen Inhalt des Infoknopfs in die gespeicherte Seite\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"Infobar offen halten\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"Enthalten nicht das gespeicherte Datum\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"Inhalt des Infoknopfs im Dialogfenster eingeben\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"Automatisches Schließen des Tabs nach dem Speichern der Seite\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"Tastenkombination Befehl\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"Standard-Tastenkombination\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Dateiname\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"Vorlage\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"Maximale Länge\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"Bytes\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"Zeichen\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"Ersetzungszeichen\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"Emojis durch Text ersetzen\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"Speichern der Daten der Dateinamenvorlage auf der Seite\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"Dialogfenster \\\"Sichern als\\\" zur Bestätigung des Dateinamens öffnen\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"Vorgehensweise bei Konflikt mit dem Dateinamen\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"Eindeutigen Dateinamen erzeugen\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"Bestehende Datei überschreiben\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"Dialogfenster zur Eingabe eines Dateinamens\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"Überspringen doppelter Dateien\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML-Inhalt\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"HTML-Inhalt komprimieren\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"Rahmen entfernen\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"Verborgene Elemente entfernen\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"spezifische Elemente entfernen\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Dateiformat\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"format\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"selbstextrahierendes ZIP (universal)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"selbstextrahierendes ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"Passwort\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"Stammverzeichnis erstellen\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"Komprimierung deaktivieren\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"Keine Daten nach den ZIP-Daten anhängen\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"Text durchsuchbar machen\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"Eingebettetes Bild\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"Bildschirmfoto\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"Benutzerdefiniertes Bild\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Infoknopf\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Bilder\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"Doppelte Bilder zusammenfassen\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"Größenreduktionsfaktor\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"Speicherung zurückgestellter Bilder\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"maximale Inaktivitätszeit (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"Seite verkleinern\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"Ereignis \\\"scroll\\\" versenden\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"Speicherung zurückgestellter Rahmen\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"Bilder für alternative Bildschirmauflösungen entfernen\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Schriftarten\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"Unbenutze Schriftarten entfernen\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"Alternative Schriftarten entfernen\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Formatvorlagen\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"CSS-Inhalte komprimieren\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"Doppelte Formatvorlagen zusammenfassen\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"Die Stile, die sich außerhalb des Head-Elements befinden, in dieses verschieben\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"Nicht verwendete Stile entfernen\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"Formatvorlagen für alternative Bildschirme löschen\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Netzwerk\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"blockierte Ressourcen\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"Kopfzeile \\\"Accept\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"Scripts\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"Videos\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"Audios\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"Dokumente\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"Schriftarten\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"Stylesheets\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"Bilder\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Datei-Ziel\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Bookmarks\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Automatische Speicherung\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Automatische Einstellung festlegen\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Löschbestätigung für alle aufgelisteten Regeln\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Löschen aller aufgelisteten Regeln\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"URL komplett oder teilweise eingeben (z.B. example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Profil für automatische Speicherung\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"Alle Profiles auflisten\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"'Profil für automatische Speicherung' anzeigen Spalte\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Regel ändern\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Regel löschen\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Regel hinzufügen\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Änderungen bestätigen\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Änderungen verwerfen\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Löschung der auswählten Regel bestätigen\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"Automatische Speicherung nach dem Laden oder Schließen der Seite\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"Automatische Speicherung nach dem Laden der Seite\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"Automatische Speicherung beim Schließen der Seite\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"Automatische Speicherung beim Schließen des Tabs\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"Automatisches Speichern beim Entfernen des Tabs\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"Automatische Speicherung nach Seitenaufbau verzögern (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"Automatische Speicherung in regelmäßigen Abständen wiederholen\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"Zeitraum (s.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"Speichern der Seite mit SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Annotation-Editor\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"Seite vor dem Speichern annotieren\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"Gespeicherte Seiten in einem neuen Tab öffnen\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"Seiten, die mit SingleFile gespeichert wurden, im Annotation-Editor öffnen\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"Default-Modus\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"Normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"Editieren der Seite\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"Formatieren der Seite\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"Entfernen von Elementen\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"Entfernen externer Elemente\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"System-Design beim Formatieren einer Seite anwenden\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"Inhaltbreite (em) beim Formatieren einer Seite\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"Warnen beim Verlassen der Seite mit ungespeicherten Änderungen\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"Anzeige der Infoknopf\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Sonstiges\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"Speicherung der Seiten im Hintergrund\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"Statistik nach Verarbeitung in der Konsole anzeigen\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"maximale Größe festlegen\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"Maximale Größe (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"maximale Zeit für den Download festlegen\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"maximale Downloadzeit (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"Den \\\"Referer\\\"-Header nach einem Fehler bei einer Cross-Origin-Anfrage übergeben\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"Originalseite sichern\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"Content Security Policy einfügen\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"Kopieren in die Zwischenablage\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"Speichern im Dateisystem\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"Seite teilen\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"Existenzberechtigung hinzufügen\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Confirm you allow SingleFile to send to the Woleet API a SHA256 hash of each page you are going to save. You can find more information about this feature in the help page or by clicking on the question mark next to the option.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"Zugangstoken\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"Hochladen auf Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"Hochladen auf Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"Hochladen auf GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"Zugangstoken\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"Nutzername\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"Repository-Name\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"Zweigname\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"Hochladen auf Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"Domain\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"Region\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"Bucket-Name\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"Zugangsschlüssel\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"Geheimschlüssel\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"Hochladen auf einen WebDAV-Server\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"Benutzerkennwort\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"Passwort\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"Hochladen auf einen MCP-Server\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"Server-URL\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"Authentifizierungstoken\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"Speichern mit SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"Speichern der Seite eines neu angelegten Lesezeichens\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"Verlinken Das neue Bookmark mit der gespeicherten Seite\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"Erlaubte Ordner\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"Ignorierte Ordner\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"Hilfe\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"Optionen synchronisieren\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Zurücksetzen\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Zurücksetzung aller Optionen auf Standardeinstellung\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Zurücksetzung aller Optionen des aktuellen Profils bestätigen\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Alle Optionen zurücksetzen\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Das aktuelle Profil zurücksetzen\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Abbrechen\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Exportieren\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importieren\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Zurückgestellte Bilder\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Rahmeninhalte\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Eingebettetes Bild\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Schritt\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"150\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile Fehler : \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Bild öffnen...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Seite teilen...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Auswahl teilen...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Standardeinstellungen\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Deaktiviert\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Neues Profil anlegen\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Profil umbenennen\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Profil löschen\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Neuen Profilnamen eingeben\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Löschung des auswählten Profils bestätigen\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Neuen Namen für das ausgewählte Profil eingeben\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Fügen eine gelbe Notiz hinzu\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Fügen eine rosa Notiz hinzu\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Fügen eine blaue Notiz hinzu\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Fügen eine grüne Notiz hinzu\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Hervorheben des selektierten Textes in Gelb\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Hervorheben des selektierten Textes in Rosa\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Hervorheben des selektierten Textes in Blau\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Hervorheben des selektierten Textes in Grün\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Anzeigen/Verbergen von Notizen\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Anzeigen/Verbergen von hervorgehobenem Text\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Entfernen des selektierten hervorgehobenen Textes\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Aktivieren/Deaktivieren des Nur-Lese-Modus\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Die Seite zur besseren Lesbarkeit formatieren\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Aktivieren/Deaktivieren der Entfernung interner Elemente\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Aktivieren/Deaktivieren der Entfernung externer Elemente\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Wiederherstellen des zuletzt entfernten Elements\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Wiederherstellen aller entfernten Elemente\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Entfernen des zuletzt wiederhergestellten Elements\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Speichern der Webseite\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Drucken der Webseite\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"MHTML-Datei importieren\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Ausstehende Speicherungen\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Alle abbrechen\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Titel\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"Status\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"ausstehend\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"in Bearbeitung\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"wird abgebrochen\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Keine ausstehenden Speicherungen\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"URLs hinzufügen\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Geben Sie eine Liste von URLs ein, die durch einen Zeilenumbruch getrennt sind\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Abbrechen\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"URLs stapelweise speichern\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Keine URLs\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"URL hinzufügen\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"URLs hinzufügen...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Alle entfernen\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Seiten speichern\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"Hochladen auf ein REST-Formular-API\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"Authentifizierungstoken\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"Feldname der Datei\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"Feldname der URL\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Optionen-Editor\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Speichern\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Konfiguration gespeichert\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Ungültiges JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/en/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Save a complete page into a single HTML file\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Save the selected tabs or their selected contents\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Save all tabs\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Custom shortcut\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Custom shortcut #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Custom shortcut #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Custom shortcut #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Custom shortcut #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Custom shortcut #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Custom shortcut #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Custom shortcut #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Custom shortcut #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Custom shortcut #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Custom shortcut #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Save page with SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Save selected links\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Annotate the page...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Annotate and save the page...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Save page with profile\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"View pending saves...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Select the default profile\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Select the profile of the current rule\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Select the profile of the current domain\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Save selection\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Save frame\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Save tabs\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Save selected tabs\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Save unpinned tabs\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Save all tabs\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Batch save URLs...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Auto-save\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Disabled\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Auto-save this tab\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Auto-save unpinned tabs\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Auto-save all tabs\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Save page with SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"This page cannot be saved with SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Initializing SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Save progress: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Upload progress: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Auto-save active\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Options\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"User interface\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"add entry in the context menu of the webpage\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"overlay a shadow on the page during processing\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"display an infobar when viewing a saved page\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"template of the infobar content\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"block mixed content\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"save original URLs of embedded resources\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"include the infobar in the saved page\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"keep infobar open\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"do not include the saved date\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"open a prompt dialog to edit the infobar content\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"auto-close the tab after the page is saved\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"keyboard shortcut command\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"default shortcut\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"File name\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"template\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"max length\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"bytes\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"characters\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"replacement character\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"replace emojis with text\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"save the filename template data into the page\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"open the \\\"Save as\\\" dialog to confirm the file name\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"file name conflict resolution\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"create a unique name\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"overwrite the existing file\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"prompt for a name\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"skip duplicate files\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML content\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"compress HTML content\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"remove frames\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"remove hidden elements\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"remove specific elements\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"File format\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"format\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"self-extracting ZIP (universal)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"self-extracting ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"password\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"create a root directory\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"disable compression\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"do not append data after the ZIP data\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"make text searchable\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"embed image\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"page screenshot\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"custom image\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Infobar\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Images\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"group duplicate images together\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"image reduction factor\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"save deferred images\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"maximum idle time (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"zoom out the page\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"dispatch \\\"scroll\\\" event\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"load deferred frames\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"remove images for alternative screen resolutions\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Fonts\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"remove unused fonts\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"remove alternative fonts\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Stylesheets\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"compress CSS content\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"group duplicate stylesheets together\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"move in the head element the styles found outside of it\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"remove unused styles\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"remove stylesheets for alternative devices to screens\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Network\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"blocked resources\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"\\\"Accept\\\" header\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"scripts\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"videos\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"audios\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"documents\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"fonts\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"stylesheets\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"images\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Destination\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Bookmarks\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Auto-save\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Auto-settings rules\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Confirm the deletion of all displayed rules\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Delete all displayed rules\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Type a complete or partial URL (e.g. example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profile\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Auto-save profile\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"display all profiles\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"display 'Auto-save profile' column\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Update the rule\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Delete the rule\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Add the rule\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Validate changes\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Cancel changes\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Confirm the deletion of the selected rule\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"auto-save after page load or on page unload\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"auto-save after page load\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"auto-save on page unload\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"auto-save on tab discard\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"auto-save on tab removal\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"auto-save waiting delay after page load (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"auto-save periodically\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"period (s.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"save the page with SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Annotation editor\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"annotate the page before saving\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"open saved pages in a new tab\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"open pages saved with SingleFile in the annotation editor\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"default mode\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"edit the page\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"format the page\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"remove elements\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"remove external elements\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"apply the system theme when formatting a page\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"content width when formatting a page (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"warn if leaving page with unsaved changes\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"display the infobar\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Misc.\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"save pages in background\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"display stats in the console after processing\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"set maximum size\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"maximum size (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"set maximum download time\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"maximum download time (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"pass \\\"Referer\\\" header after a cross-origin request error\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"save raw page\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"set content security policy\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"copy to clipboard\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"save to filesystem\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"share page\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"add proof of existence\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Confirm you allow SingleFile to send to the Woleet API a SHA256 hash of each page you are going to save. You can find more information about this feature in the help page or by clicking on the question mark next to the option.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"access token\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"upload to Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"upload to Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"upload to GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"access token\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"user name\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"repository name\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"branch name\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"upload to Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"domain\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"region\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"bucket name\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"access key\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"secret key\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"upload to a WebDAV server\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"user identifier\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"password\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"upload to an MCP server\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"server URL\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"authentication token\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"save with SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"save the page of a newly created bookmark\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"link the new bookmark to the saved page\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"allowed folders\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"ignored folders\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"help\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"synchronize options\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Reset\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Reset all options to their default values\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Confirm the reset of all options or the current profile\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Reset all options\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Reset the current profile\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Cancel\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Export\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Import\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Deferred images\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Frame contents\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Embedded image\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Step\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile error: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Open image...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Share page...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Share selection...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Default settings\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Disabled\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Add a new profile\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Rename the profile\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Delete the profile\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Enter a name for this new profile\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Confirm the deletion of the selected profile\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Enter a new name for the selected profile\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Add a yellow note\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Add a pink note\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Add a blue note\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Add a green note\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Highlight selected text in yellow\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Highlight selected text in pink\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Highlight selected text in blue\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Highlight selected text in green\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Display/hide notes\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Display/hide the highlighted text\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Remove the selected highlighted text\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Enable/disable read-only\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Format the page for better readability\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Enable/disable removing of internal elements\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Enable/disable removing of external elements\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Restore last removed element\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Restore all removed elements\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Remove last restored element\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Save the page\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Print the page\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Import MHTML file\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Pending saves\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Cancel all\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Title\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"status\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"pending\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"processing\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"cancelling\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"No pending saves\",\n\t\t\"description\": \"Label displayed when there are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Add URLs\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Enter a list of URLs separated by a new line\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Cancel\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Batch save URLs\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"No URLs\",\n\t\t\"description\": \"Label displayed when there are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Add URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Add URLs...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Remove all\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Save pages\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"upload to a REST Form API\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"authorization token\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"archive data field name\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"archive URL field name\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Options editor\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Save\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Configuration saved\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Invalid JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/es/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Guarda una página completa en un único archivo HTML\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Guardar las pestañas seleccionadas o su contenidos seleccionados\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Guardar todas las pestañas\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Atajo personalizado\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Atajo personalizado #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Atajo personalizado #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Atajo personalizado #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Atajo personalizado #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Atajo personalizado #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Atajo personalizado #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Atajo personalizado #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Atajo personalizado #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Atajo personalizado #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Atajo personalizado #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Guardar página con SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Guardar los links seleccionados\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Anotar la página\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Anotar y guardar la página\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Guardar página con el perfil\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Ver guardados pendientes...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Seleccionar el perfil predeterminado\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Seleccionar el perfil de la regla actual\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Seleccionar el perfil del dominio actual\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Guardar selección\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Guardar marco (frame)\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Guardar pestañas\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Guardar pestañas seleccionadas\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Guardar pestañas no fijadas\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Guardar todas las pestañas\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Guardar por lotes URLs...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Auto-guardar\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Deshabilitado\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Auto-guardar esta pestaña\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Auto-guardar pestañas no fijadas\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Auto-guardar todas las pestañas\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Guardar página con SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Esta página no se puede guardar con SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Inicializando SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Progresión del guardado: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Progresión del upload: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Auto-guardar activado\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Opciones\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Interfaz de usuario\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"añadir entrada en el menú contextual de la página web\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"cubrir la página con un sombreado durante el procesado\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"mostrar una barra informativa al ver una página guardada\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"plantilla del contenido de la barra informativa\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"bloqueo de contenido mixto\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"guardar las URL originales de los recursos incrustados\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"incluir la barra informativa en la página guardada\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"mantener abierta la barra de información\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"no incluya la fecha guardada\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"abrir un cuadro de diálogo para editar el contenido de la barra informativa\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"cerrar automáticamente la pestaña después de guardar la página\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"comando de atajo de teclado\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"atajo predeterminado\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Nombre del archivo\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"plantilla\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"longitud máxima\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"bytes\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"caracteres\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"carácter de reemplazo\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"reemplazar emojis con texto\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"guardar los datos de la plantilla de nombre de archivo en la página\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"abrir el cuadro de diálogo \\\"Guardar como\\\" para confirmar el nombre del archivo\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"resolución de conflictos de nombre de archivo\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"crear un nombre exclusivo\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"sobrescribir el archivo existente\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"preguntar por un nombre\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"saltar los archivos duplicados\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"Contenido HTML\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"comprimir contenido HTML\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"eliminar marcos (frame)\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"eliminar elementos ocultos (hidden)\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"eliminar elementos específicos\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Formato de archivo\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"formato\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"ZIP autoextraíble (universal)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"ZIP autoextraíble\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"contraseña\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"crear un directorio raíz\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"deshabilitar compresión\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"no añadir datos después de los datos ZIP\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"hacer buscable el texto\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"imagen incrustada\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"captura de pantalla\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"imagen personalizada\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Barra informativa\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Imágenes\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"agrupar imágenes duplicadas combinadamente\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"factor de reducción del tamaño de la imagen\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"guardar imágenes diferidas\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"periodo máximo de espera (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"alejar la página\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"enviar evento \\\"scroll\\\"\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"guardar marco (frame) diferidas\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"eliminar imágenes para resoluciones alternativas de pantalla\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Fuentes\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"eliminar fuentes no usadas\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"eliminar fuentes alternativas\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Hojas de estilo\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"comprimir contenido CSS\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"agrupar hojas de estilo duplicadas combinadamente\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"mover al elemento de head los estilos que se encuentran fuera de él\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"eliminar estilos no usados\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"eliminar hojas de estilo para dispositivos alternativos a las pantallas\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Red\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"recursos bloqueados\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"Cabecera \\\"Accept\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"scripts\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"videos\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"audios\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"documentos\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"fuentes\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"hojas de estilo\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"imágenes\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Destino\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Marcadores\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Auto-guardado\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Reglas de auto-guardado\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Confirmar la eliminación de todas las reglas mostradas\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Elimina todas las reglas mostradas\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Escriba una URL parcial o completa (ej. ejemplo.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Perfil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Perfil de auto-guardado\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"mostrar todos los perfiles\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"mostrar columna 'Perfil de auto-guardado'\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Actualizar la regla\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Eliminar la regla\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Añadir la regla\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Validar cambios\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Cancelar cambios\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Confirmar la eliminación de la regla seleccionada\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"auto-guardar tras cargar la página o al purgar la página\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"auto-guardar tras cargar la página\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"auto-guardar al purgar la página\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"auto-guardado al descartar la pestaña\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"auto-guardado al cerrar la pestaña\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"retardo de auto-guardado tras cargar la página (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"auto-guardar periódicamente\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"periodo (s)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"guardar la página con SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"editor de anotaciones\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"anotar página antes de guardarla\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"abrir las páginas guardadas en una nueva pestaña\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"abrir páginas guardadas con SingleFile en el editor de anotaciones\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"modo predeterminado\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"editar la página\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"formatear la página\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"eliminar elementos\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"eliminar los elementos externos\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"aplicar diseño del sistema al formatear una páginae\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"ancho del contenido al formatear una página (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"mostrar advertencia al salir de una página con cambios no guardados\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"mostrar la barra informativa\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Miscelánea\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"guardar páginas en segundo plano\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"mostrar estadísticas en la consola tras el procesado\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"establecer el tamaño máximo\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"tamaño máximo (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"establecer el tiempo máximo de descarga\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"tiempo máximo de descarga (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"pasar el encabezado \\\"Referer\\\" después de un error de solicitud de origen cruzado\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"guardar página en crudo\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"establecer la política de seguridad del contenido\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"guardar en el portapapeles\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"guardar en el sistema de archivos\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"compartir página\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"añadir prueba de existencia\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Confirm you allow SingleFile to send to the Woleet API a SHA256 hash of each page you are going to save. You can find more information about this feature in the help page or by clicking on the question mark next to the option.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"token de acceso\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"subir a Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"subir a Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"subir a GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"token de acceso\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"nombre de usuario\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"nombre del repositorio\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"nombre de la rama\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"subir a Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"dominio\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"región\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"bucket nombre\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"clave de acceso\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"clave secreta\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"subir a un servidor WebDAV\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"identificador de usuario\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"contraseña\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"subir a un servidor MCP\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"URL del servidor\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"token de autenticación\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"guardar la página con SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"guardar la página de un marcador recién creado\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"enlazar el nuevo marcador a la página guardada\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"carpetas permitidas\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"carpetas ignoradas\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"ayuda\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"sincronizar opciones\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Restablecer\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Restablece todas las opciones a sus valores predeterminados\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Confirmar el restablecimiento de todas las opciones o del perfil actual\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Restablecer todas las ocpiones\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Restablecer el perfil actual\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"Aceptar\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Cancelar\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Exportar\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importar\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Imágenes diferidas\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Contenidos de marco (frame)\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Imagen incrustada\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Nivel\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"192\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"Error de SingleFile: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Abrir imagen...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Compartir página...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Compartir selección...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Configuración predeterminada\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Deshabilitado\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Añade un perfil nuevo\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Renombra el perfil\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Elimina el perfil\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Introducir un nombre para este nuevo perfil\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Confirmar la eliminación del perfil seleccionado\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Introducir un nuevo nombre para el perfil seleccionado\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Añadir una nota amarilla\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Añadir una nota rosa\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Añadir una nota azul\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Añadir una nota verde\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Resaltar texto seleccionado en amarillo\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Resaltar texto seleccionado en rosa\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Resaltar texto seleccionado en azul\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Resaltar texto seleccionado en verde\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Mostrar/ocultar notas\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Mostrar/ocultar el texto resaltado\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Eliminar el texto resaltado seleccionado\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Activar/desactivar solo lectura\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Formatear la página para una mejor legibilidad\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Activar/desactivar la eliminación de elementos internos\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Activar/desactivar la eliminación de elementos externos\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Restaurar el último elemento eliminado\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Restaurar todos los elementos eliminados\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Eliminar el último elemento restaurado\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Guardar la página\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Imprimir la página\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Importar archivo MHTML\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Guardados pendientes\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Cancelar todo\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Título\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"estado\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"pendiente\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"procesando\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"cancelando\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"No hay guardados pendientes\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Añadir URLs\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Introduce una lista de URLs separadas por una nueva línea\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Cancelar\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Guardar URLs en lote\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Sin URLs\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Añadir URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Añadir URLs...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Eliminar todo\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Guardar páginas\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"subir a un formulario REST Api\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"authorization token\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"archive data field name\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"archive URL field name\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Editor de opciones\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Guardar\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Configuración guardada\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"JSON no válido\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/fr/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Sauvegardez une page complète dans un simple fichier HTML\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Sauvegarder les onglets sélectionnés ou leurs contenus sélectionnés\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Sauver tous les onglets\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Raccourci personnalisé\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Raccourci personnalisé #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Raccourci personnalisé #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Raccourci personnalisé #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Raccourci personnalisé #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Raccourci personnalisé #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Raccourci personnalisé #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Raccourci personnalisé #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Raccourci personnalisé #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Raccourci personnalisé #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Raccourci personnalisé #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Sauver la page avec SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Sauver les liens selectionnés\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Annoter la page...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Annoter et sauver la page...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Sauver la page avec le profil\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Afficher les sauvegardes en cours...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Sélectionner le profil par défaut\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Sélectionner le profil de la règle courante\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Sélectionner le profil du domaine courant\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Sauver la sélection\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Sauver le cadre\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Sauver les onglets\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Sauver les onglets sélectionnés\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Sauver les onglets non épinglés\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Sauver tous les onglets\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Sauver des URLs par lot...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Auto-sauvegarde\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Désactivée\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Auto-sauvegarder cet onglet\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Auto-sauvegarder les onglets non épinglés\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Auto-sauvegarder tous les onglets\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Sauver la page avec SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Cette page ne peut pas être sauvée avec SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Initialisation de SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Progression de la sauvegarde : \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Progression de l'envoi: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Auto-sauvegarde active\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Options\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Interface utilisateur\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"ajouter une entrée dans le menu contextuel de la page web\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"assombrir la page pendant la sauvegarde\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"afficher une barre d'information quand une sauvegarde est affichée\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"modèle du contenu de la barre d'information\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"bloquer les contenus mixtes\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"sauvegarder les URLs d'origine des ressources embarquées\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"inclure la barre d'information dans la page sauvegardée\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"maintenir la barre d'information ouverte\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"ne pas inclure la date de sauvegarde\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"ouvrir une boite de dialogue pour éditer le contenu de la barre d'information\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"fermer automatiquement l'onglet après l'enregistrement de la page\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"commande de raccourci clavier\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"raccourci par défaut\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Nom de fichier\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"modèle\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"longueur maximale\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"octets\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"caractères\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"caractère de remplacement\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"remplacer les emojis par du texte\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"enregistrer les données du modèle de nom de fichier dans la page\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"ouvrir la boite de dialogue \\\"Sauver sous\\\" pour confirmer le nom de fichier\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"résolution de conflit de noms\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"créer un nom unique\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique filename'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"écraser le fichier existant\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"demander un nom de fichier\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'prompt for a filename'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"passer les fichiers en double\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"Contenu HTML\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"compresser le contenu HTML\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"supprimer les cadres\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"supprimer les élements cachés\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"supprimer des éléments spécifiques\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Format de fichier\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"format\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"auto-extractibles ZIP (universel)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"auto-extractibles ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"mot de passe\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"créer un répertoire racine\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"désactiver la compression\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"ne pas ajouter de données après les données ZIP\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"rendre le texte indexable\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"intégrer une image\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"capture d'écran\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"image personnalisée\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Barre d'information\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Images\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"regrouper les images dupliquées\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"facteur de réduction des images\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"sauver les images chargées de manière différée\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"temps d'inactivité maximal (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"dézoomer la page\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"envoyer l'évènement \\\"scroll\\\"\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"charger les cadres différés\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"supprimer les images pour des résolutions d'écran alternatives\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Polices de caractère\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"supprimer les polices de caractère inutilisées\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"supprimer les polices de caractère alternatives\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Feuilles de style\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"compresser le contenu CSS\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"regrouper les feuilles de style dupliquées\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"déplacer dans l'élément head les styles trouvés en dehors de celui-ci\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"supprimer les styles inutilisés\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"supprimer les feuilles de styles pour les appareils autres que des écrans\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Réseau\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"ressources bloquées\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"en-tête \\\"Accept\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"scripts\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"vidéos\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"audios\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"documents\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"polices de caractères\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"feuilles de style\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"images\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Destination\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Signets\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Auto-sauvegarde\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Règles d'auto-configuration\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Confirmez la suppression de toutes les règles affichées\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Supprimer toutes les règles affichées\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Entrer une URL complète ou partielle (e.g. example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profil\",\n\t\t\"description\": \"Options label in the auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Profil auto-sauvegarde\",\n\t\t\"description\": \"Options label in the auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"afficher tous les profils\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"afficher la colonne 'Profil auto-sauvegarde'\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Mettre à jour la règle\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Supprimer la règle\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Ajouter la règle\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Valider les changements\",\n\t\t\"description\": \"Popup text 'Valider les changements' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Annuler les changements\",\n\t\t\"description\": \"Popup text 'Annuler les changements' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Confirmer la suppression de la règle selectionnée\",\n\t\t\"description\": \"Popup text 'Confirm deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"auto-sauvegarder après le chargement de la page ou au déchargement\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"auto-sauvegarder après le chargement de la page\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"auto-sauvegarder au déchargement de la page\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"auto-sauvegarder à la mise à l'écart de l'onglet\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"auto-sauvegarder à la supression de l'onglet\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"délai d'attente après le chargement de la page (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"auto-sauvegarder périodiquement\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"période (s)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"sauvegarder la page avec SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Éditeur d'annotations\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"annoter la page avant de la sauvegarder\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"ouvrir les pages sauvées dans un nouvel onglet\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"ouvrir les pages sauvées avec SingleFile dans l'éditeur d'annotations\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"mode par défaut\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"éditer la page\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"formater la page\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"supprimer des éléments\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"supprimer des éléments externes\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"appliquer le thème système lors du formattage d'une page\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"largeur du contenu lors du formatage d'une page (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"avertir si l'on quitte la page avec des modifications non sauvegardées\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"afficher la barre d'information\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Divers\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"sauvegarder la page en tâche de fond\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"afficher les statistiques dans la console après la sauvegarde\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"définir la taille maximale\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"taille maximale (Mo)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"définir la durée maximale de téléchargement\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"durée maximale de téléchargement (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"passer l'en-tête \\\"Referer\\\" après une erreur de requête multi-origine\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"sauvegarder la page brute\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"définir la stratégie de sécurité du contenu\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"copier dans le presse-papiers\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"enregistrer dans le système de fichiers\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"partager la page\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"ajouter une preuve d'existence\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Confirmez que vous autorisez SingleFile à envoyer à l'API de Woleet un hachage SHA256 de chaque page que vous allez enregistrer. Vous trouverez plus d'informations sur cette fonctionnalité dans la page d'aide ou en cliquant sur le point d'interrogation à côté de l'option.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"jeton d'accès\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"téléverser sur Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"téléverser sur Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"téléverser sur GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"jeton d'accès\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"nom d'utilisateur\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"nom du dépôt\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"nom de la branche\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"téléverser sur Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"domaine\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"région\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"nom du bucket\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"clé d'accès\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"clé secrète\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"téléverser sur un serveur WebDAV\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"identifiant utilisateur\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"mot de passe\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"téléverser sur un serveur MCP\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"URL du serveur\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"jeton d'authentification\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"sauvegarder avec SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"sauvegarder la page d'un signet nouvellement créé\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"lier le nouveau signet à la page sauvegardée\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"dossiers autorisés\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"dossiers ignorés\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"aide (anglais)\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"synchronizer les options\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Remise à zéro\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Remettre toutes les options à leur valeur par défaut\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Confirmer la remise à zéro de toutes les options ou la remise à zéro du profil courant\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Remettre à zéro toutes les options\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Remettre à zéro le profil courant\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Annuler\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Exporter\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importer\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Images différées\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Contenus des cadres\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Image intégrée\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Étape\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"147\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"Erreur SingleFile : \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Ouvrir image...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Partager la page...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Partager la sélection...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Configuration par défaut\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Désactivé\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Ajouter un nouveau profil\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Renommer le profil\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Supprimer le profil\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Saisissez un nom pour ce nouveau profil\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Confirmez la suppression du profil selectionné\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Saisissez un nouveau nom pour le profil sélectionné\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Ajouter une note jaune\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Ajouter une note rose\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Ajouter une note bleue\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Ajouter une note verte\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Surligner en jaune le text selectionné\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Surligner en rose le text selectionné\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Surligner en bleu le text selectionné\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Surligner en vert le text selectionné\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Afficher/cacher les notes\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Afficher/cacher le texte surligné\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Supprimer le surlignement du texte selectionné\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Activer/déactiver le mode lecture seule\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Formater la  page pour une meilleure lisibilité\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Activer/désactiver la supression des éléments internes\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Activer/désactiver la supression des éléments externes\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Restaurer le dernier élement supprimé\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Restaurer tous les élements supprimés\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Supprimer le dernier élement restauré\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Sauver la page\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Imprimer la page\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Importer un fichier MHTML\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Sauvegardes en cours\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Annuler tout\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Titre\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"statut\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"en attente\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"en cours\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"annulation\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Aucune sauvegarde en cours\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Ajouter URLs\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Entrez une liste d'URLs séparées par une nouvelle ligne\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Annuler\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Sauver des URLs par lot\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Pas d'URLs\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Ajouter une URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Ajouter des URLs...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Supprimer tout\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Sauver les pages\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"téléverser sur une API de formulaire REST\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL de l'API\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"Jeton d'authentification\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"Nom du champ des données de l'archive\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"Nom du champ de l'URL de l'archive\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Éditeur d'options\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Sauvegarder\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Configuration sauvegardée\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"JSON invalide\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/it/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Salva una pagina completa in un singolo file HTML\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Salva la scheda selezionata o i suoi contenuti selezionati\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Salva tutte le schede\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Scorciatoia personalizzata\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Scorciatoia personalizzata #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Scorciatoia personalizzata #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Scorciatoia personalizzata #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Scorciatoia personalizzata #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Scorciatoia personalizzata #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Scorciatoia personalizzata #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Scorciatoia personalizzata #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Scorciatoia personalizzata #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Scorciatoia personalizzata #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Scorciatoia personalizzata #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Salva pagina con SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Salva link selezionati\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Annota la pagina...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Annota e salva la pagina...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Salva pagina con profilo\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Mostra salvataggi in attesa...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Seleziona il profilo predefinito\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Seleziona il profilo della regola corrente\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Seleziona il profilo del dominio corrente\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Salva selezione\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Salva frame\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Salva schede\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Salva schede selezionate\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Salva schede sbloccate\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Salva tutte le schede\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Salvataggio batch di URL...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Auto-salvataggio\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Disabilitato\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Auto-salva questa scheda\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Auto-sava schede sbloccate\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Auto-salva tutte le schede\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Salva pagina con SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Questa pagina non può essere salvata con SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Inizializzazione SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Progressi salvataggio: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Progressi caricamento: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Auto-salvataggio attivo\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Opzioni\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Interfaccia utente\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"aggiunge voce nel menu contestuale della pagina web\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"Sovrapponi un'ombra sulla pagina durante la lavorazione\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"Visualizza una barra informatica quando vedi una pagina salvata\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"Modello del contenuto della barra informativa\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"blocca contenuti misti\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"salva gli URL originali delle risorse incorporate\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"includi una barra informativa nella pagina salvata\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"mantenere aperto l'infobar\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"non includere la data di salvataggio\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"Apri un finestra di dialogo per modificare il contenuto della barra informativa\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"auto-chiudi la scheda dopo che la pagina è stata salvata\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"comando di scorciatoia da tastiera\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"scorciatoia predefinita\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Nome file\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"Modello\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"lunghezza massima\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"bytes\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"caratteri\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"carattere di sostituzione\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"sostituisci le emoji con il testo\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"salvare i dati del modello del nome del file nella pagina\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"Apri la finesta di dialogo \\\"Salva come\\\" per confermare il nome del file\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"Risoluzione conflitto nome file\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"crea un nome univoco\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"Sovrascirivi il file esistente\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"chiedi un nome\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"ignora file duplicati\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"Contenuto HTML\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"comprimi contenuto HTML\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"rimuovi frame\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"rimuovi elementi nascosti\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"rimuovi elementi specifici\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Formato del file\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"formato\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"ZIP autoestraente (universale)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"ZIP autoestraente\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"password\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"crea una cartella principale\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"disabilita la compressione\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"non aggiungere dati dopo i dati ZIP\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"rendi il testo ricercabile\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"immagine incorporata\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"screenshot\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"immagine personalizzata\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Barra informativa\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Immagini\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"raggruppa insieme immagini duplicate\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"fattore di riduzione dell'immagine\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"salva immagini differite\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"massimo tempo di attesa (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"zoom out pagina\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"inviare evento \\\"scroll\\\"\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"salva frame differite\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"rimuovi immagini per risoluzioni dello schermo alternative\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Caratteri\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"rimuovi caratteri non utilizzati\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"rimuovi caratteri alternativi\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Fogli di stile\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"comprimi contenuto CSS\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"raggruppa insieme fogli di stile duplicati\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"sposta nell'elemento head gli stili trovati al di fuori di esso\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"Rimuovi stili non utilizzati\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"rimuovi stili non utilizzati per per schermi dispositivi alternativi\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Rete\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"risorse bloccate\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"Intestazione \\\"Accept\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"scripts\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"videos\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"audios\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"documenti\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"caratteri\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"fogli di stile\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"immagini\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Destinazione\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Segnalibri\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Auto-salva\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Regole auto-impostazioni rules\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Conferma l'eliminazione di tutte le regole visualizzate\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Elimina tutte le regole visualizzate\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Tipo di URL completo o parziale (p.e. esempio.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profilo\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Auto-salva profilo\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"mostra tutti i profili\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"mostra colonna 'Auto-salva profilo'\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Aggiorna la regola\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Elimina la regola\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Aggiungi la regola\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Valida cambiamenti\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Annulla cambiamenti\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Conferma l'eliminazione delle regole selezionate\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"auto-salva dopo il caricamento della pagina o al non caricamento della pagina\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"auto-salva pagina dopo il caricamento\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"auto-salva al non caricamento della pagina\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"auto-salva all'uscita della scheda\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"auto-save alla rimozione della scheda\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"auto-salva ritardo attesa dopo caricamento pagina (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"auto-salva periodicamente\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"periodo (s.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"salva la pagina con SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Editor annotazioni\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"annota la pagina prima di salvarla\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"apri pagine salvate in una nuova scheda\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"apri pagine salvate con SingleFile nell'editor annotazioni\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"modalità predefinita\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normale\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"modifica la pagina\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"formatta la pagina\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"rimuovi elementi\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"rimuovi elementi esterni\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"applica il tema di sistema quando formatti una pagina\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"larghezza contenuto quando formatti una pagina (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"avvisa se si lascia una pagina con cambiamenti non salvati\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"visualizzare la barra informativa\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Varie\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"salva pagine in background\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"mostra statistiche nella console dopo la lavorazione\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"imposta dimensione massima\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"dimensione massima (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"impostare tempo massimo di download\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"tempo massimo di download (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"passa header \\\"Referer\\\" dopo un errore di richiesta cross-origin\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"salva pagina grezza\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"imposta policy di sicurezza contenuto\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"copia negli appunti\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"salva nel filesystem\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"condividi pagina\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"aggiungi una prova di esistenza\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Conferma che permetti a SingleFile di inare alle API Woleet un hash SHA256 di ogni pagina che stai per salvare. Puoi trovare maggiori informazioni su questa caratteristica nella pagina di aiuto o facendo clic sul punto esclamativo accanto all'opzione.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"token accesso\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"carica su Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"carica su Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"carica su GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"token accesso\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"nome utente\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"nome repository\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"nome branch\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"carica su Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"dominio\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"regione\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"nome bucket\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"chiave di accesso\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"chiave segreta\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"carica su un server WebDAV\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"identificatore utente\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"password\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"carica su un server MCP\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"URL del server\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"token di autenticazione\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"salva con SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"salva la pagina di un nuovo segnalibro creato\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"collega il nuovo segnalibro alla pagina salvata\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"cartelle permesse\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"cartelle ignorate\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"aiuto\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"sincronizza opzioni\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Ripristina\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Ripristina tutte le opzioni ai loro valori predefiniti\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Conferma il ripristino di tutte le opzioni o del profilo corrente\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Ripristina tutte le opzioni\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Ripristina il profilo corrente\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Annulla\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Esporta\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importa\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Immagini differite\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Contenuti frame\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Immagine incorporata\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Passo\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"Errore di SingleFile: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Apri immagine...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Condividi pagina...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Condividi selezione...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Impostazioni predefinite\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Disabilitato\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Aggiungi un nuovo profilo\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Rinomina il profilo\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Elimina il profilo\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Inserisci un nome per questo nuovo profilo\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Conferma l'eliminazione del profilo selezionato\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Inserisci un nuovo nome per il profilo selezionato\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Aggiungi una nota gialla\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Aggiungi una nota rosa\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Aggiungi una nota blu\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Aggiungi una nota verde\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Evidenzia testo selezionato in giallo\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Evidenzia testo selezionato in rosa\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Evidenzia testo selezionato in blu\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Evidenzia testo selezionato in verde\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Mostra/nascondi note\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Mostra/nascondi il testo evidenziato\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Rimuovi il testo evidenziato selezionato\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Abilita/disabilita solo lettura\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Formatta la pagina per una migliore leggibilità\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Abilita/disabilita la rimozione di elementi interni\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Abilita/disabilita la rimozioni di elementi esterni\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Ripristina ultimo elemento rimosso\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Ripristina tutti gli elementi rimossi\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Rimuovi ultimo elemento ripristinato\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Salva la pagina\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Stampa la pagina\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Importa file MHTML\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Salvataggi in attesa\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Cancella tutto\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Titolo\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"stato\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"in attesa\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"in lavorazione\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"cancellazione\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Nessun  salvataggio in attesa\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Aggiungi URL\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Inserisci un elenco di URL separati da una nuova riga\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Annulla\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Salvataggio batch di URL\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Nessun URL\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Aggiungi URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Aggiungi URL...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Rimuovi tutto\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Salva le pagine\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"carica su un API REST Form\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"token di autorizzazione\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"nome del campo dei dati di archivio\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"nome del campo URL archivio\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Editor opzioni\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Salva\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Configurazione salvata\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"JSON non valido\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/ja/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"完全なページを単一の HTML ファイルに保存する\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Save the selected tabs or their selected contents\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"すべてのタブを保存\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"カスタムショートカット\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"カスタムショートカット #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"カスタムショートカット #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"カスタムショートカット #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"カスタムショートカット #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"カスタムショートカット #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"カスタムショートカット #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"カスタムショートカット #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"カスタムショートカット #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"カスタムショートカット #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"カスタムショートカット #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"SingleFile でページを保存\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"選択したリンクを保存する\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"ページに注釈を付ける...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"ページに注釈を付けて保存する...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"プロファイルでページを保存する\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"保留中の保存を表示...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"規定（default）のプロファイルを選択\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"現在のルールのプロファイルを選択\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"現在のドメインのプロファイルを選択\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"選択を保存\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"フレームを保存\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"タブを保存\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"選択したタブを保存\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"固定解除されたタブを保存する\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"すべてのタブを保存\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"URLを一括保存する...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"自動保存\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"無効\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"このタブを自動保存する\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"固定解除されたタブの自動保存\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"すべてのタブを自動的に保存する\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"SingleFile でページを保存\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"このページは SingleFile では保存できません\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"SingleFile の初期化\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"進行状況を保存: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"アップロードの進行状況: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"エラー\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"有効な自動保存\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"オプション（設定）\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"ユーザーインターフェイス（表示）\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"ウェブページのコンテキストメニューにエントリを追加する\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"処理中のページに影を重ねる\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"保存したページを表示するときに情報バーを表示する\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"infobar コンテンツのテンプレート\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"ミックスコンテンツをブロックする\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"埋め込まれたリソースの元の URL を保存する\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"保存されたページに、infobar を含める\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"インフォバーを開いておく\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"保存日時を含めない\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"infobar のコンテンツを編集するためのプロンプトダイアログを開く\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"ページが保存された後にタブを自動的に閉じる\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"キーボードショートカットコマンド\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"デフォルトのショートカット\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"ファイル名\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"保存時の定形書式\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"最大長\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"バイト\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"文字数\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"置換文字\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"絵文字をテキストに置き換える\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"ファイル名テンプレートデータをページに保存する\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"を開く（として保存する：ファイル名を確認するためのダイアログ）\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"ファイル名の競合を解決する\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"独自の名前を作成する\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"既存のファイルを上書きする\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"名前を求めるプロンプト\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"重複ファイルをスキップ\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML コンテンツ\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"HTML コンテンツを圧縮する\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"フレームを削除する\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"隠された要素を削除する\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"特定の要素を削除する\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"ファイル形式\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"形式\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"自己解凍型ZIP（ユニバーサル）\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"自己解凍型ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"パスワード\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"ルートディレクトリを作成する\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"圧縮を無効にする\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"ZIPデータの後にデータを追加しない\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"テキストを検索可能にする\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"埋め込み画像\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"スクリーンショット\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"カスタム画像\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"インフォバー\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"画像\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"オプション重複画像のグループ化\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"画像の縮小係数\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"遅延画像を保存する\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"最大アイドル時間（ミリ秒）\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"ページを縮小する\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"「スクロール」イベントを発行する\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"遅延フレームを読み込む\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"代替画面解像度用の画像を削除します\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"フォント\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"未使用のフォントを削除する\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"代替フォントを削除する\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"スタイルシート\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"CSS コンテンツを圧縮する\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"オプション重複スタイルシートのグループ化\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"head要素の外にあるスタイルをhead要素内に移動する\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"未使用のスタイルを削除する\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"代替デバイス用のスタイルシートを画面に表示しない\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"ネットワーク\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"ブロックされたリソース\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"\\\"Accept\\\" ヘッダー\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"スクリプト\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"ビデオ\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"オーディオ\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"ドキュメント\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"フォント\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"スタイルシート\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"画像\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"宛先\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"ブックマーク\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"自動保存\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"自動設定のルール\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"表示されているすべてのルールの削除を確認します\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"表示されているすべてのルールを削除する\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"完全または部分的な URL を入力します (例 example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"プロファイル\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"プロファイルの自動保存\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"すべてのプロファイルを表示します\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"「プロファイルの自動保存」列を表示する\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"ルールを更新する\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"ルールを削除する\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"ルールを追加する\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"変更内容を検証します\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"変更をキャンセルします\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"選択したルールの削除を確認する\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"ページの読み込み後またはページの非読み込み時に自動保存\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"ページ読み込み後の自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"ページの非読み込み時に自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"タブの破棄時に自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"タブの削除時に自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"ページ読み込み後の自動保存待ち時間（秒）\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"定期的に自動保存する\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"所要時間（秒）\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"SingleFile Companion でページを保存する\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"注釈エディタ\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"保存する前にページに注釈を付けます\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"新しいタブで保存されたページを開く\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"annotation editor で、SingleFile で保存されたページを開く\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"デフォルトモード\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"通常\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"ページを編集する\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"ページの書式設定\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"要素を削除する\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"外部要素を削除する\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"ページの書式設定時にシステムテーマを適用する\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"ページの書式設定時のコンテンツ幅（em）\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"未保存の変更がある場合に警告する\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"インフォバーを表示する\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"その他\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"バックグラウンドでページを保存する\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"処理後、コンソールに統計情報を表示する\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"最大サイズを設定する\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"最大サイズ（MB）\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"最大ダウンロード時間を設定する\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"最大ダウンロード時間（秒）\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"クロスオリジンリクエストエラー後に「Referer」ヘッダーを渡す\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"生のページを保存\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"コンテンツセキュリティポリシーを設定する\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"クリップボードに保存する\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"ファイルシステムに保存する\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"ページを共有する\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"ブロックチェーン証明を追加する\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Confirm you allow SingleFile to send to the Woleet API a SHA256 hash of each page you are going to save. You can find more information about this feature in the help page or by clicking on the question mark next to the option.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"アクセストークン\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"Google Drive に保存\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"Dropbox に保存\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"GitHub にアップロードする\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"アクセストークン\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"ユーザー名\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"リポジトリ名\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"ブランチ名\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"Amazon S3 にアップロードする\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"ドメイン\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"リージョン\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"バケット名\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"アクセスキー\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"シークレットキー\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"WebDAVサーバーにアップロードする\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"ユーザー識別子\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"パスワード\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"MCPサーバーにアップロードする\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"サーバーURL\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"認証トークン\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"SingleFile Companionで保存する\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"新しく作成したブックマークのページを保存する\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"新しいブックマークを保存したページにリンクさせることを可能にする\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"許可されたフォルダ\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"無視されたフォルダ\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"ヘルプ\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"同期オプション\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"リセット\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"すべてのオプションを規定値にリセットする\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"すべてのオプションまたは現在のプロファイルのリセットを確認します\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"すべてのオプションをリセットする\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"現在のプロファイルをリセットする\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"キャンセル\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"エクスポート\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"インポート\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"遅延画像\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"フレームの内容\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"埋め込み画像\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"ステップ\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"115\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile エラー: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"画像を開く...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"ページを共有...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"選択したコンテンツを共有...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"デフォルトの設定\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"無効\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"新しいプロファイルを追加します\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"プロファイルの名前を変更する\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"プロファイルを削除する\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"この新しいプロファイルの名前を入力します。\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"選択したプロファイルの削除を確認する\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"選択したプロファイルの新しい名前を入力します。\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"黄色のメモを追加する\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"ピンクのメモを追加\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"青いメモを追加する\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"緑のメモを追加する\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"選択したテキストを黄色で強調表示します\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"選択したテキストをピンクで強調表示します\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"選択したテキストを青色で強調表示します\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"選択したテキストを緑色で強調表示します\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"メモを表示/非表示\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"強調表示されたテキストを表示/非表示\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"選択した強調表示されたテキストを削除します\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"読み取り専用を有効/無効にする\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"ページを読みやすくフォーマットする\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"内部要素の削除を有効/無効にする\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"外部要素の削除を有効/無効にする\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"最後に削除された要素を復元する\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"削除されたすべての要素を復元する\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"最後に復元された要素を削除する\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"ページを保存する\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"ページを印刷する\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"MHTMLファイルをインポート\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"保留中の保存\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"すべてをキャンセルする\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"タイトル\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"状態\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"保留中\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"処理中\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"キャンセル実行中\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"保留中の保存はありません\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"URL を追加\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"改行で区切られた URL のリストを入力してください\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"キャンセル\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"URL を一括保存\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"URL がありません\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"URL を追加\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"URL を追加...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"すべて削除\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"ページを保存\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"REST Form API に保存する\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"認証トークン\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"ファイル・データ・フィールド名\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"アーカイブURLフィールド名\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"オプションエディタ\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"保存\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"設定が保存されました\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"無効な JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/nl_NL/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Sla een complete website op in één HTML-bestand\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Sla de geselecteerde tabbladen of hun geselecteerde inhoud op\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Sla alle tabbladen op\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Aangepaste snelkoppeling\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Aangepaste snelkoppeling #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Sla pagina op met SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Sla geselecteerde links op\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Annoteer de pagina...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Annoteer en sla de pagina op...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Sla pagina op met profiel\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Bekijk lopende opslagen...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Selecteer het standaardprofiel\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Selecteer het profiel van de huidige regel\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Selecteer het profiel van het huidige domein\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Sla selectie op\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Sla frame op\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Sla tabbladen op\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Sla geselecteerde tabbladen op\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Sla niet vastgezette tabbladen op\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Sla alle tabbladen op\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"URL's in batches opslaan...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Automatisch opslaan\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Uitgeschakeld\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Sla dit tabblad automatisch op\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Sla niet vastgezette tabbladen automatisch op\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Sla alle tabbladen automatisch op\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Sla pagina op met SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Deze pagina kan niet worden opgeslagen met SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"SingleFile initialiseren\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Opslagvoortgang: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Uploadvoortgang: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Automatisch opslaan actief\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Opties\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Gebruikersinterface\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"voeg een item toe aan het contextmenu van de webpagina\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"plaats een schaduw over de pagina tijdens het verwerken\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"toon een infobalk bij het bekijken van een opgeslagen pagina\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"sjabloon van de infobalkinhoud\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"blokkeer gemengde inhoud\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"sla originele URL's van ingesloten bronnen op\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"neem de infobalk op in de opgeslagen pagina\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"infobalk openhouden\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"sla de opgeslagen datum niet op\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"open een promptvenster om de inhoud van de infobalk te bewerken\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"sluit het tabblad automatisch na het opslaan van de pagina\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"toetsenbord snelkoppeling opdracht\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"standaard snelkoppeling\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Bestandsnaam\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"sjabloon\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"maximale lengte\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"bytes\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"tekens\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"vervangend teken\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"vervang emoji's door tekst\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"sla de bestandsnaamsjabloongegevens op in de pagina\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"open het \\\"Opslaan als\\\"-venster om de bestandsnaam te bevestigen\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"gebruik een unieke bestandsnaam\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"gebruik een unieke naam\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"overschrijf het bestaande bestand\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"dialoogvenster voor het invoeren van een bestandsnaam\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"sla dubbele bestanden over\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML-inhoud\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"comprimeer HTML-inhoud\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"verwijder frames\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"verwijder verborgen elementen\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"specifieke elementen verwijderen\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Bestandsformaat\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"formaat\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"zelfuitpakkend ZIP (universeel)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"zelfuitpakkend ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"wachtwoord\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"maak een hoofdmap\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"compressie uitschakelen\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"voeg geen gegevens toe na de ZIP-gegevens\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"maak tekst doorzoekbaar\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"insluiten afbeelding\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"schermafbeelding\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"aangepaste afbeelding\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Infobalk\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Afbeeldingen\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"dubbele afbeeldingen samenvoegen\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"factor voor verkleining van afbeeldingen\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"uitgestelde afbeeldingen opslaan\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"maximale wachttijd (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"zoom uit op de pagina\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"verzend \\\"scroll\\\"-gebeurtenis\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"laad uitgestelde frames\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"verwijder afbeeldingen voor alternatieve schermresoluties\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Lettertypen\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"verwijder ongebruikte lettertypen\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"verwijder alternatieve lettertypen\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Stijlbladen\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"CSS-inhoud comprimeren\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"dubbele stijlbladen samenvoegen\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"verplaats de stijlen die zich buiten het head-element bevinden\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"verwijder ongebruikte stijlen\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"verwijder stijlbladen voor alternatieve apparaten\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Netwerk\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"geblokkeerde bronnen\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"\\\"Accept\\\"-koptekst\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"scripts\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"video's\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"audio's\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"documenten\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"lettertypen\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"stijlbladen\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"afbeeldingen\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Bestemming\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Bladwijzers\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Automatisch opslaan\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Regels voor automatische configuratie\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Bevestig het verwijderen van alle weergegeven regels\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Verwijder alle weergegeven regels\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Typ een volledige of gedeeltelijke URL (bijv. voorbeeld.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profiel\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Profiel automatisch opslaan\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"toon alle profielen\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"toon 'profiel automatisch opslaan' kolom\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Regel bijwerken\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Regel verwijderen\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Regel toevoegen\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Wijzigingen bevestigen\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Wijzigingen annuleren\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Bevestig de verwijdering van de geselecteerde regel\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"automatisch opslaan na het laden van de pagina of bij het verlaten van de pagina\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"automatisch opslaan na het laden van de pagina\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"automatisch opslaan bij het verlaten van de pagina\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"automatisch opslaan bij het sluiten van het tabblad\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"automatisch opslaan bij het verwijderen van het tabblad\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"wachttijd voor automatisch opslaan na het laden van de pagina (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"periodiek automatisch opslaan\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"periode (s.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"pagina opslaan met SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Annotatie-editor\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"pagina annoteren voor opslaan\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"opgeslagen pagina's openen in een nieuw tabblad\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"open pagina's opgeslagen met SingleFile in de annotatie-editor\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"standaardmodus\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normaal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"bewerk de pagina\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"formatteer de pagina\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"verwijder elementen\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"verwijder externe elementen\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"pas systeemthema toe bij formatteren van pagina\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"inhoudsbreedte bij formatteren van pagina (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"waarschuwen bij verlaten van pagina met niet-opgeslagen wijzigingen\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"toon infobalk\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Diversen\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"sla pagina's op in de achtergrond\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"toon statistieken in console na verwerking\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"stel maximale grootte in\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"maximale grootte (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"stel maximale downloadtijd in\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"maximale downloadtijd (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"stuur \\\"Referer\\\"-header na een cross-origin verzoekfout\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"Originele pagina opslaan\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"inhoudsbeveiligingsbeleid instellen\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"kopieer naar klembord\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"opslaan in bestandssysteem\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"deel pagina\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"voeg bewijs van bestaan toe\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Bevestig dat je SingleFile toestaat een SHA256-hash van elke pagina die je opslaat naar de Woleet API te sturen. Meer informatie vind je op de helppagina of door op het vraagteken naast de optie te klikken.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"toegangstoken\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"upload naar Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"upload naar Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"upload naar GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"toegangstoken\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"gebruikersnaam\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"naam van de repository\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"naam van de branch\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"upload naar Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"domein\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"regio\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"bucketnaam\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"toegangssleutel\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"geheime sleutel\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"upload naar een WebDAV-server\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"gebruikers-ID\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"wachtwoord\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"upload naar een MCP-server\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"server-URL\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"authenticatietoken\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"opslaan met SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"bewaar de pagina van een nieuw gemaakte bladwijzer\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"koppel nieuwe bladwijzer aan opgeslagen pagina\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"toegestane mappen\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"genegeerde mappen\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"help\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"synchroniseer opties\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Reset\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Reset alle opties naar standaardwaarden\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Bevestig reset van alle opties of het huidige profiel\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Reset alle opties\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Reset huidig profiel\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Annuleer\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Exporteer\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importeer\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Geplaatste afbeeldingen\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Inhoud van frames\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Ingebedde afbeelding\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Stap\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"147\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile fout: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Afbeelding openen...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Pagina delen...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Selectie delen...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Standaardinstellingen\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Uitgeschakeld\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Nieuw profiel toevoegen\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Profiel hernoemen\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Profiel verwijderen\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Voer een naam in voor dit nieuwe profiel\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Bevestig de verwijdering van het geselecteerde profiel\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Voer een nieuwe naam in voor het geselecteerde profiel\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Gele notitie toevoegen\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Roze notitie toevoegen\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Blauwe notitie toevoegen\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Groene notitie toevoegen\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Markeer geselecteerde tekst in geel\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Markeer geselecteerde tekst in roze\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Markeer geselecteerde tekst in blauw\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Markeer geselecteerde tekst in groen\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Notities weergeven/verbergen\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Gemarkeerde tekst weergeven/verbergen\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Verwijder de geselecteerde markering\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"In-/uitschakelen alleen-lezen modus\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Pagina formatteren voor betere leesbaarheid\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"In-/uitschakelen verwijderen van interne elementen\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"In-/uitschakelen verwijderen van externe elementen\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Laatste verwijderde element herstellen\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Alle verwijderde elementen herstellen\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Laatste herstelde element verwijderen\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Pagina opslaan\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Pagina afdrukken\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Importeer MHTML-bestand\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Opslaan in afwachting\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Alles annuleren\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Titel\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"status\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"in afwachting\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"verwerken\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"annuleren\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"er zijn geen opslaan in afwachting\",\n\t\t\"description\": \"Label displayed when there are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"URLs toevoegen\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Voer een lijst van URLs in, gescheiden door een nieuwe regel\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Annuleren\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Batch-URLs opslaan\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Geen URLs\",\n\t\t\"description\": \"Label displayed when there are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"URL toevoegen\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"URLs toevoegen...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Alles verwijderen\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Pagina's opslaan\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"uploaden naar een REST Form API\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"autorisatietoken\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"veldnaam voor archiefdata\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"veldnaam voor archief-URL\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Opties editor\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Opslaan\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Configuratie opgeslagen\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Ongeldige JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/pl/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Zapisuj kompletną stronę w pojedynczym pliku HTML.\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Zapisz wybrane karty lub ich wybraną zawartość\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Zapisz wszystkie karty\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Skrót niestandardowy\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Skrót niestandardowy nr 1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Skrót niestandardowy nr 2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Skrót niestandardowy nr 3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Skrót niestandardowy nr 4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Skrót niestandardowy nr 5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Skrót niestandardowy nr 6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Skrót niestandardowy nr 7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Skrót niestandardowy nr 8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Skrót niestandardowy nr 9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Skrót niestandardowy nr 10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Zapisz stronę z SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Zapisz wybrane odnośniki\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Adnotuj stronę...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Adnotuj i zapisz stronę...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Zapisz stronę z profilem\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Zobacz oczekujące zapisy...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Wybierz profil domyślny\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Wybierz profil bieżącej reguły\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Wybierz profil bieżącej domeny\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Zapisz wybór\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Zapisz ramkę\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Zapisz karty\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Zapisz wybrane karty\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Zapisz odpięte karty\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Zapisz wszystkie karty\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Zapisz wsadowo adresy URL...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Automatyczny zapis\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Wyłączony\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Automatycznie zapisz tę kartę\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Automatycznie zapisz odpięte karty\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Automatycznie zapisz wszystkie karty\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Zapisz stronę z SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Tej strony nie można zapisać z SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Inicjowanie SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Postęp zapisywania: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Postęp przesyłania: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Automatyczny zapis aktywny\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Opcje\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Interfejs użytkownika\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"dodawaj wpis w menu kontekstowym strony\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"nakładaj cień na stronę podczas przetwarzania\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"wyświetlaj pasek informacyjny podczas przeglądania zapisanej strony\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"szablon zawartości paska informacyjnego\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"blokuj zawartość mieszaną\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"zapisuj oryginalne adresy URL zasobów osadzonych\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"dołączaj pasek informacyjny do zapisanej strony\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"utrzymuj pasek informacyjny otwarty\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"nie dołączaj zapisanej daty\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"otwieraj okno dialogowe z monitem, aby edytować zawartość paska informacyjnego\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"automatycznie zamykaj kartę po zapisaniu strony\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"polecenie skrótu klawiaturowego\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"skrót domyślny\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Nazwa pliku\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"szablon\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"maksymalna długość\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"bajty\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"znaki\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"znak zastępczy\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"zamień emotikony na tekst\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"zapisz dane szablonu nazwy pliku na stronie\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"otwieraj okno \\\"Zapisz jako\\\", aby potwierdzić nazwę pliku\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"rozwiązywanie konfliktu nazwy pliku\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"stwórz unikalną nazwę pliku\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"nadpisz istniejący plik\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"zapytaj o nazwę\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"pomiń duplikaty plików\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"Zawartość HTML\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"kompresuj zawartość HTML\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"usuwaj ramki\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"usuwaj ukryte elementy\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"usuwaj określone elementy\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Format pliku\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"format\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"samorozpakowujący się plik ZIP (uniwersalny)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"samorozpakowujący się plik ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"utwórz katalog główny\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"wyłącz kompresję\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"nie dołączaj danych po danych ZIP\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"hasło\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"uczyń tekst przeszukiwalnym\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"osadź obraz\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"zrzut ekranu strony\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"obraz niestandardowy\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Pasek informacyjny\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Obrazy\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"grupuj zduplikowane obrazy razem\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"współczynnik redukcji obrazów\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"zapisuj odroczone obrazy\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"maksymalny czas bezczynności (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"pomniejsz stronę\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"wysyłaj zdarzenie \\\"scroll\\\"\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"ładuj odroczone ramki\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"usuwaj obrazy dla alternatywnych rozdzielczości ekranu\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Czcionki\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"usuwaj nieużywane czcionki\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"usuwaj alternatywne czcionki\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Arkusze stylów\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"kompresuj zawartość CSS\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"grupuj razem duplikaty arkuszy stylów\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"przenoś do elementu head style znajdujące się poza nim\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"usuwaj nieużywane style\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"usuwaj arkusze stylów dla urządzeń innych niż ekrany\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Sieć\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"zablokowane zasoby\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"nagłówek \\\"Akceptuj\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"skrypty\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"wideo\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"audio\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"dokumenty\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"czcionki\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"arkusze stylów\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"obrazy\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Cel\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Zakładki\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Automatyczny zapis\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Reguły automatycznej konfiguracji\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Potwierdź usunięcie wszystkich wyświetlanych reguł\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Usuń wszystkie wyświetlane reguły\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"Adres URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Wpisz cały lub częściowy adres URL (np. example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Automatyczny zapis profilu\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"wyświetlaj wszystkie profile\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"wyświetlaj kolumnę 'Automatyczny zapis profilu'\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Uaktualnij regułę\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Usuń regułę\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Dodaj regułę\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Zatwierdź zmiany\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Anuluj zmiany\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Potwierdź usunięcie wybranej reguły\",\n\t\t\"description\": \"Popup text 'Confirm deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"automatycznie zapisuj po załadowaniu lub przy wyładowaniu strony\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"automatycznie zapisuj po załadowaniu strony\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"automatycznie zapisuj przy wyładowaniu strony\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"automatycznie zapisuj przy odrzucaniu karty\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"automatycznie zapisuj przy usuwaniu karty\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"opóźnienie oczekiwania automatycznego zapisywania po załadowaniu strony (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"automatycznie zapisuj okresowo\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"okres (s)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"zapisuj stronę z SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Edytor adnotacji\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"adnotuj stronę przed zapisaniem\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"otwieraj zapisane strony w nowej karcie\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"otwieraj strony zapisane z SingleFile w edytorze adnotacji\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"tryb domyślny\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normalny\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"edytuj stronę\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"formatuj stronę\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"usuń elementy\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"usuń elementy zewnętrzne\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"zastosuj motyw systemowy podczas formatowania strony\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"szerokość zawartości podczas formatowania strony (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"ostrzegaj, jeśli opuszczasz stronę z niezapisanymi zmianami\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"wyświetlanie paska informacyjnego\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Różne\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"zapisuj strony w tle\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"wyświetlaj statystyki w konsoli po przetworzeniu\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"ustaw maksymalny rozmiar\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"maksymalny rozmiar (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"ustaw maksymalny czas pobierania\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"maksymalny czas pobierania (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"przekazuj nagłówek \\\"Referer\\\" po błędzie żądania między źródłami\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"zapisuj surową stronę\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"ustaw politykę bezpieczeństwa treści\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"kopiuj do schowka\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"zapisuj do systemu plików\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"udostępnij stronę\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"dodawaj dowód istnienia\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Potwierdź, że zezwalasz SingleFile na wysyłanie do interfejsu API Woleet skrótu SHA256 każdej strony, którą chcesz zapisać. Więcej informacji na temat tej funkcji można znaleźć na stronie pomocy lub klikając znak zapytania obok opcji.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"token dostępu\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"przesyłaj na Dysk Google\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"przesyłaj na Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"przesyłaj do GitHuba\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"token dostępu\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"nazwa użytkownika\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"nazwa repozytorium\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"nazwa gałęzi\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"przesyłaj do Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"domena\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"region\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"nazwa komory\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"klucz dostępu\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"klucz tajny\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"przesyłaj na serwer WebDAV\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"adres URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"identyfikator użytkownika\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"hasło\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"przesyłaj na serwer MCP\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"adres URL serwera\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"token uwierzytelniający\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"zapisuj z SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"zapisuj stronę nowo utworzonej zakładki\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"łącz nową zakładkę z zapisaną stroną\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"dozwolone foldery\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"ignorowane foldery\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"pomoc (w języku angielskim)\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"synchronizuj opcje\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Resetuj\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Zresetuj wszystkie opcje do ich wartości domyślnych\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Potwierdź zresetowanie wszystkich opcji lub bieżącego profilu\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Zresetuj wszystkie opcje\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Zresetuj bieżący profil\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Anuluj\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Eksportuj\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importuj\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Odroczone obrazy\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Zawartość ramki\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Osadzony obraz\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Krok\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"130\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"Błąd SingleFile: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Otwórz obraz...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Udostępnij stronę...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Udostępnij wybór...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Ustawienia domyślne\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Wyłączony\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Dodaj nowy profil\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Zmień nazwę profilu\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Usuń profil\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Wpisz nazwę tego nowego profilu\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Potwierdź usunięcie wybranego profilu\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Wpisz nową nazwę wybranego profilu\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Dodaj żółtą notatkę\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Dodaj różową notatkę\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Dodaj niebieską notatkę\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Dodaj zieloną notatkę\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Podświetl wybrany tekst na żółto\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Podświetl wybrany tekst na różowo\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Podświetl wybrany tekst na niebiesko\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Podświetl wybrany tekst na zielono\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Wyświetl/ukryj notatki\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Wyświetl/ukryj podświetlony tekst\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Usuń wybrany podświetlony tekst\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Włącz/wyłącz tylko do odczytu\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Sformatuj stronę dla lepszej czytelności\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Włącz/wyłącz usuwanie elementów wewnętrznych\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Włącz/wyłącz usuwanie elementów zewnętrznych\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Przywróć ostatni usunięty element\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Przywróć wszystkie usunięte elementy\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Usuń ostatni przywrócony element\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Zapisz stronę\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Wydrukuj stronę\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Importuj plik MHTML\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Oczekujące zapisy\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Anuluj wszystkie\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"Adres URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Tytuł\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"status\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"oczekiwanie\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"przetwarzanie\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"anulowanie\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Brak oczekujących zapisów\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Dodaj adresy URL\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Wprowadź listę adresów URL oddzielonych nowym wierszem\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Anuluj\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Zapisz wsadowo adresy URL\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Brak adresów URL\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Dodaj adres URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Dodaj adresy URL...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Usuń wszystkie\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Zapisz strony\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"Adres URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"przesyłaj do API formularza REST\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"adres URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"token autoryzacji\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"nazwa pola danych archiwum\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"nazwa pola adresu URL archiwum\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Edytor opcji\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Zapisz\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Konfiguracja zapisana\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Nieprawidłowy JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/pt_PT/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Guardar uma página completa num único ficheiro HTML\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Guardar os separadores selecionados ou o seu conteúdo selecionado\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Guardar todos os separadores\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Atalho personalizado\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Atalho personalizado #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Atalho personalizado #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Atalho personalizado #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Atalho personalizado #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Atalho personalizado #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Atalho personalizado #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Atalho personalizado #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Atalho personalizado #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Atalho personalizado #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Atalho personalizado #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Guardar página com SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Guardar links selecionados\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Anotar a página...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Anotar e guardar a página...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Guardar página com perfil\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Ver transferências pendentes...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Selecionar o perfil predefinido\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Selecionar o perfil da regra atual\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Selecionar o perfil do domínio atual\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Guardar seleção\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Guardar frame\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Guardar separadores\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Guardar separadores selecionados\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Guardar separadores não fixados\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Guardar todos os separadores\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Guardar URLs em lote...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Guardar automaticamente\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Desativado\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Guardar automaticamente este separador\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Guardar automaticamente separadores não fixados\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Guardar automaticamente todos os separadores\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Guardar página com SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Esta página não pode ser guardada com o SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"A iniciar SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Guardar progresso: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Carregar progresso: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERRO\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Guardar automaticamente ativo\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Opções\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Interface do utilizador\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"adicionar entrada no menu de contexto da página web\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"sobrepor uma sombra na página durante o processamento\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"mostrar uma barra de informações ao visualizar uma página guardada\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"modelo do conteúdo da barra de informações\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"bloco de conteúdo misto\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"guardar os URLs originais dos recursos incorporados\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"incluir a barra de informações na página guardada\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"manter o infobar aberto\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"não incluir a data em que foi guardada\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"abrir uma caixa de diálogo para editar o conteúdo da barra de informações\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"fechar automaticamente o separador depois de a página ser guardada\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"comando de atalho de teclado\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"atalho padrão\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Nome de ficheiro\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"modelo\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"comprimento máximo\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"bytes\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"caracteres\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"caractere de substituição\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"substituir emojis por texto\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"save the filename template data into the page\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"abrir a caixa de diálogo \\\"Guardar como\\\" para confirmar o nome de ficheiro\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"resolução de conflitos de nome de ficheiro\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"criar um nome único\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"substituir o ficheiro existente\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"solicitar um nome\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"ignorar ficheiros duplicados\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"Conteúdo HTML\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"comprimir conteúdo HTML\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"remover frames\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"remover elementos ocultos\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"remover elementos específicos\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Formato de ficheiro\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"formato\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"ZIP auto-extraível (universal)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"ZIP auto-extraível\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"palavra-passe\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"criar um diretório raiz\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"desabilitar compactação\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"não anexar dados após os dados ZIP\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"tornar o texto pesquisável\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"imagem incorporada\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"captura de ecrã\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"imagem personalizada\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Barra de Informações\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Imagens\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"agrupar imagens duplicadas\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"fator de redução do tamanho da imagem\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"guardar imagens diferidas\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"tempo máximo de inatividade (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"diminuir o zoom da página\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"enviar evento \\\"scroll\\\"\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"carregar frames diferidos\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"remover imagens para resoluções de ecrã alternativas\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Tipos de letra\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"remover tipos de letra não utilizados\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"remover tipos de letra alternativos\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Folhas de estilo\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"comprimir conteúdo CSS\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"agrupar folhas de estilo duplicadas\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"mover para o elemento principal os estilos que se encontram fora dele\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"remover estilos não utilizados\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"remover folhas de estilo para dispositivos alternativos aos ecrãs\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Rede\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"recursos bloqueados\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"cabeçalho \\\"Accept\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"scripts\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"vídeos\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"áudios\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"documentos\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"tipos de letra\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"folhas de estilo\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"imagens\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Destino\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Marcadores\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Guardar automaticamente\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Regras de configuração automática\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Confirmar a eliminação de todas as regras apresentadas\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Eliminar todas as regras apresentadas\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Introduzir um URL completo ou parcial (p. ex., exemplo-pagina.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Perfil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Guardar perfil automaticamente\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"mostrar todos os perfis\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"mostrar a coluna 'Guardar perfil automaticamente'\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Atualizar a regra\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Eliminar a regra\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Adicionar a regra\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Validar alterações\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Cancelar alterações\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Confirmar a eliminação da regra selecionada\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"guardar automaticamente após o carregamento da página ou quando a página é transferida\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"guardar automaticamente após o carregamento da página\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"guardar automaticamente quando a página é transferida\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"guardar automaticamente quando o separador é eliminado\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"guardar automaticamente quando o separador é removido\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"guardar automaticamente após espera de carregamento da página (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"guardar automaticamente de forma periódica\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"período (s.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"guardar a página com o SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Editor de anotações\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"anotar a página antes de a guardar\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"abrir páginas guardadas num novo separador\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"abrir páginas guardadas com o SingleFile no editor de anotações\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"modo predefinido\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"editar a página\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"formatar a página\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"remover elementos\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"remover elementos externos\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"aplicar o tema do sistema ao formatar uma página\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"largura do conteúdo (em) ao formatar uma página\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"avisar se sair da página com alterações não guardadas\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"mostrar a barra de informações\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Diversos\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"guardar páginas em segundo plano\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"mostrar estatísticas na consola após o processamento\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"definir o tamanho máximo\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"tamanho máximo (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"definir o tempo máximo de transferência\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"tempo máximo de transferência (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"passar o cabeçalho \\\"Referer\\\" após um erro de pedido de origem cruzada\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"guardar página em bruto\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"definir a política de segurança de conteúdos\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"copiar para a área de transferência\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"guardar no sistema de ficheiros\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"partilhar página\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"adicionar prova de existência\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Confirme que permite que o SingleFile envie para a API do Woleet um hash SHA256 de cada página que vai guardar. Pode encontrar mais informações sobre esta funcionalidade na página de ajuda ou clicando no ponto de interrogação junto à opção.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"token de acesso\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"carregar para o Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"carregar para o Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"carregar para o GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"token de acesso\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"nome de utilizador\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"nome de repositório\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"nome do branch (ramo)\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"carregar para a Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"domínio\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"região\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"nome do bucket\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"chave de acesso\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"chave secreta\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"carregar para um servidor WebDAV\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"identificador de utilizador\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"palavra-passe\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"carregar para um servidor MCP\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"URL do servidor\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"token de autenticação\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"guardar com o SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"guardar página de um marcador recentemente criado\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"ligar o novo marcador à página guardada\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"pastas permitidas\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"pastas ignoradas\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"ajuda\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"opções de sincronização\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Repor\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Repor todas as opções para os valores predefinidos\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Confirmar a reposição de todas as opções ou do perfil atual\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Repor todas as opções\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Repor o perfil atual\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Cancelar\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Exportar\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importar\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Imagens diferidas\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Conteúdo do frame\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Imagem incorporada\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Passo\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"Erro do SingleFile: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Abrir imagem...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Partilhar página...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Partilhar seleção...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Definições predefinidas\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Desativado\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Adicionar um novo perfil\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Mudar o nome do perfil\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Eliminar o perfil\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Introduzir um nome para este novo perfil\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Confirmar a eliminação do perfil selecionado\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Introduzir um novo nome para o perfil selecionado\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Adicionar uma nota amarela\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Adicionar uma nota cor-de-rosa\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Adicionar uma nota azul\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Adicionar uma nota verde\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Realçar o texto selecionado a amarelo\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Realçar o texto selecionado a cor-de-rosa\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Realçar o texto selecionado a azul\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Realçar o texto selecionado a verde\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Mostrar/ocultar notas\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Mostrar/ocultar o texto realçado\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Remover o texto realçado selecionado\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Ativar/desativar o modo só de leitura\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Formatar a página para uma melhor legibilidade\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Ativar/desativar a remoção de elementos internos\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Ativar/desativar a remoção de elementos externos\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Restaurar o último elemento removido\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Restaurar todos os elementos removidos\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Remover o último elemento restaurado\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Guardar a página\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Imprimir a página\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Importar arquivo MHTML\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Transferência pendente\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Cancelar tudo\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Título\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"estado\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"pendente\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"em curso\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"cancelado\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Não há transferências pendentes\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Adicionar URLs\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Introduzir uma lista de URLs separados por uma nova linha\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Cancelar\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Guardar URLs em lote\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Sem URLs\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Adicionar URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Adicionar URLs...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Remover tudo\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Guardar páginas\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"carregar para um formulário REST API\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"token de autorização\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"nome do campo de dados do arquivo\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"nome do campo URL do arquivo\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Editor de opções\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Guardar\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Configuração guardada\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"JSON inválido\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/pt_br/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Salvar página inteira num único arquivo HTML\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Salvar abas selecionadas ou conteúdo selecionado\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Salvar todas abas\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Atalho personalizado\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Atalho personalizado #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Atalho personalizado #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Atalho personalizado #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Atalho personalizado #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Atalho personalizado #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Atalho personalizado #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Atalho personalizado #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Atalho personalizado #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Atalho personalizado #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Atalho personalizado #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Salvar página via SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Salvar links selecionados\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Anotar a página...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Anotar e salvar a página...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Salvar página com perfil\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Ver conteúdo pendente...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Selecione perfil padrão\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Selecione perfil da regra atual\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Selecione perfil do domínio atual\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Salvar seleção\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Salvar frame\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Salvar abas\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Salvar abas selecionadas\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Salvar abas não fixadas\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Salvar todas abas\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Salvar em lote as URLs...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Salvar autom.\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Desativado\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Salvar autom. esta aba\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Salvar autom. abas não fixadas\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Salvar autom. todas abas\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Salvar página via SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Esta página não pode ser salva via SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Inicializando SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Salvar progresso: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Enviar progresso: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERRO\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Salvar autom. ativo\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Opções\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Interface de usuário\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"adicionar uma entrada em menu do contexto da página\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"sobrepor a sombra em página durante processamento\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"mostrar o infobar ao ver uma página salva\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"modelo de conteúdo do infobar\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"bloquear conteúdo misto\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"salvar URLs originais de recursos integrados\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"incluir o infobar na página salva\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"manter o infobar aberto\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"não incluir data de salvamento\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"abrir um diálogo com aviso para editar conteúdo do infobar\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"fechar autom. a aba após página ser salva\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"comando de atalho de teclado\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"atalho padrão\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Nome de arquivo\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"modelo\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"tamanho máximo\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"bytes\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"caracteres\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"caractere de substituição\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"substituir emojis por texto\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"save the filename template data into the page\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"abrir o diálogo \\\"Salvar como\\\" para confirmar nome de arquivo\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"Resolução de conflito do nome de arquivo\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"criar um nome único\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"substituir o arquivo já existente\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"solicitar por um nome\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"pular arquivos duplicados\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"conteúdo HTML\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"compactar conteúdo HTML\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"remover frames\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"remover elementos escondidos\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"remover elementos específicos\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Formato do arquivo\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"formato\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"ZIP autoextraível (universal)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"ZIP autoextraível\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"senha\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"criar um diretório raiz\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"desabilitar compactação\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"não anexe dados após os dados ZIP\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"tornar texto pesquisável\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"imagem incorporada\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"captura de tela\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"imagem personalizada\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Infobar\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Imagens\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"agrupar imagens duplicadas\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"fator de redução do tamanho da imagem\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"salvar imagens diferidas\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"tempo máximo de inatividade (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"diminuir zoom na página\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"envio do evento \\\"scroll\\\"\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"salvar frames diferidas\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"remover imagens para resoluções alternativas de tela\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Fontes\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"remover fontes não usadas\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"remover fontes alternativas\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Folhas de estilo\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"compactar conteúdo CSS\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"agrupar folhas de estilo duplicadas\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"mover para elemento head os estilos encontrados fora dele\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"remover estilos não usados\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"remover folhas de estilo para dispositivos além de telas\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Rede\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"recursos bloqueados\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"cabeçalho \\\"Accept\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"scripts\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"vídeos\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"áudios\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"documentos\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"fontes\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"folhas de estilo\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"imagens\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Destino\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Favoritos\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Salvar automaticamente\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Regras da configuração automática\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Confirmar eliminação de todas as regras exibidas\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Eliminar todas as regras exibidas\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Digite uma URL completa ou parcial (p. ex. algum-site.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Perfil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Salvar autom. perfil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"mostrar todos perfis\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"mostrar coluna 'Salvar autom. perfil'\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Atualizar a regra\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Eliminar a regra\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Adicionar a regra\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Validar as mudanças\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Cancelar as mudanças\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Confirmar a eliminação da regra selecionada\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"Salvar autom. após carregamento ou purga da página\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"Salvar autom. após carregamento da página\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"Salvar autom. após purga da página\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"Salvar autom. ao descartar a aba\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"Salvar autom. ao remover a aba\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"Salvar autom. após aguardar o carregamento da página (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"Auto-salvar periodicamente\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"intervalo (s.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"salvar a página via SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Editor de anotações\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"anotar a página antes de salvar\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"abrir páginas salvas numa aba nova\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"abrir páginas salvas via SingleFile em editor de anotações\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"modo padrão\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"editar a página\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"formatar a página\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"remover elementos\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"remover elementos externos\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"aplicar tema do sistema ao formatar uma página\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"largura do conteúdo ao formatar uma página (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"dar aviso ao sair da página sem previamente salvar as mudanças\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"exibir o infobar\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Diversos\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"salvar páginas em segundo plano\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"exibir estatísticas no console após processamento\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"definir tamanho máximo\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"tamanho máximo (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"definir tempo máximo de download\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"tempo máximo de download (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"passar o cabeçalho \\\"Referer\\\" após um erro de pedido de origem cruzada\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"salvar página em bruto\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"definir a política de segurança de conteúdo\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"copiar para a área de transferência\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"salvar no sistema de arquivos\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"partilhar página\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"adicionar prova de existência\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Confirme que você permite que o SingleFile envie para a API do Woleet um hash SHA256 de cada página que você vai salvar. Você pode obter mais informações sobre esse recurso na página de ajuda ou clicando no ponto de interrogação ao lado da opção.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"token de acesso\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"enviar para o Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"enviar para o Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"enviar para o GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"token de acesso\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"nome de usuário\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"nome de repositório\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"nome do branch (ramo)\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"enviar para o Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"domínio\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"região\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"nome do bucket\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"chave de acesso\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"chave secreta\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"enviar para um servidor WebDAV\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"identificador do usuário\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"senha\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"enviar para um servidor MCP\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"URL do servidor\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"token de autenticação\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"salvar via SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"salvar página de um favorito recém-criado\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"vincular um novo favorito a página salva\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"pastas permitidas\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"pastas ignoradas\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"ajuda\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"sincronizar opções\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Resetar\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Resetar todas as opções para valores padrão\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Confirmar restauração de todas as opções ou do perfil atual\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Resetar todas as opções\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Resetar o perfil atual\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Cancelar\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Exportar\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importar\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Imagens diferidas\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Conteúdo do frame\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Imagem incorporada\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Passo\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"Erro do SingleFile: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Abrir imagem...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Partilhar página...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Partilhar seleção...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Configurações padrão\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Desativado\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Adicionar um novo perfil\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Renomear o perfil\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Eliminar o perfil\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Digite um nome para este novo perfil\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Confirmar a eliminação do perfil selecionado\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Digite um novo nome para o perfil selecionado\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Adicionar anotação amarela\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Adicionar anotação rosa\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Adicionar anotação azul\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Adicionar anotação verde\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Destacar texto selecionado em amarelo\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Destacar texto selecionado em cor-de-rosa\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Destacar texto selecionado em azul\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Destacar texto selecionado em verde\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Mostrar/esconder anotações\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Mostrar/esconder texto destacado\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Remover o texto destacado selecionado\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Ativar/desativar modo somente leitura\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Formatar à página para melhor legibilidade\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Ativar/desativar a remoção de elementos internos\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Ativar/desativar a remoção de elementos externos\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Restaurar o último elemento removido\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Restaurar todos os elementos removidos\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Remover o último elemento restaurado\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Salvar a página\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Imprimir a página\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Importar arquivo MHTML\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Conteúdo para ser salvo\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Cancelar tudo\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Título\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"progresso\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"pendente\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"processando\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"cancelando\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Nenhum conteúdo pendente a ser salvo\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Adicionar URLs\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Digite uma lista de URLs, separadas por uma nova linha\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Cancelar\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Salvar URLs em lote\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Nenhuma URL\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Adicionar URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Adicionar URLs...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Remover tudo\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Salvar as páginas\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"enviar para um API de formulário REST\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"token de autorização\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"nome do campo de dados do ficheiro\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"nome do campo URL do arquivo\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Editor de opções\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Salvar\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Configuração salva\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"JSON inválido\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/ru/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Сохранение полной страницы в едином HTML-файле\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Сохранить выбранные вкладки или выбранное на них содержимое\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Сохранить все вкладки\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Пользовательская горячая клавиша\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Пользовательская горячая клавиша №10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Сохранить страницу\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Сохранить выбранные ссылки\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Аннотировать страницу...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Аннотировать и сохранить страницу...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Сохранить с профилем\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Просмотр отложенных сохранений...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Выберите профиль по умолчанию\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Выберите профиль текущего правила\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Выберите профиль текущего домена\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Сохранить выделенное\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Сохранить фрейм\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Сохранить вкладки\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Сохранить выбранные вкладки\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Сохранить незакреплённые вкладки\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Сохранить все вкладки\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Пакетное сохранение URL...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Автосохранение\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Отключено\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Автосохранение этой вкладки\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Автосохранение незакреплённых вкладок\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Автосохранение всех вкладок\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Сохранить страницу с помощью SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Эта страница не может быть сохранена SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Инициализация SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Ход сохранения: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Ход загрузки: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Автосохранение активно\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Параметры\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Пользовательский интерфейс\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"добавить пункт в контекстное меню веб-страницы\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"наложить тень на страницу во время обработки\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"показать информационную панель при просмотре сохранённой страницы\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"шаблон содержимого информационной панели\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"блокировать смешанное содержимое\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"сохранить оригинальные URL встроенных ресурсов\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"добавить информационную панель в сохраняемую страницу\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"не закрывать информационную панель\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"не включать дату сохранения\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"открыть диалоговое окно для редактирования содержимого информационной панели\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"автозакрытие вкладки после сохранения страницы\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"горячая клавиша команды\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"горячая клавиша по умолчанию\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Имя файла\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"шаблон\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"максимальная длина\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"байт\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"символов\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"заменяющий символ\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"заменять эмодзи текстом\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"сохранить имя файла шаблона\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"открыть диалоговое окно \\\"Сохранить как\\\" для подтверждения имени файла\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"решение конфликта имён файлов\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"создать уникальное имя\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"перезаписать существующий файл\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"запросить новое имя\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"пропустить дублирующиеся файлы\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"Содержимое HTML\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"сжать содержимое HTML\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"удалить фреймы\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"удалить скрытые элементы\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"удалить указанные элементы\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Формат файла\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"формат\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"самораспаковывающийся ZIP (универсальный)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"самораспаковывающийся ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"пароль\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"создать корневую папку\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"отключить сжатие\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"не добавлять данные после данных ZIP\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"делать текст доступным для поиска\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"встроенное изображение\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"снимок страницы\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"своё изображение\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Информационная панель\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Изображения\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"группировать дубликаты изображений\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"коэффициент уменьшения изображения\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"сохранить отложенные изображения\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"максимальное время простоя (мс)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"уменьшить масштаб страницы\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"отправить команду прокрутки\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"сохранить отложенные фреймы\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"удалить изображения для альтернативных разрешений экрана\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Шрифты\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"удалить неиспользуемые шрифты\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"удалить альтернативные шрифты\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Таблицы стилей\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"сжать содержимое CSS\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"группировать повторяющиеся таблицы стилей\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"переместить в основной элемент стили, найденные вне него\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"удалить неиспользуемые стили\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"удалить таблицы стилей для экранов альтернативных устройств\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Сеть\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"блокируемые ресурсы\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"Заголовок \\\"Accept\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"скрипты\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"видео\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"аудио\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"документы\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"шрифты\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"таблицы стилей\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"изображения\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Место назначения\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Закладки\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Автосохранение\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Правила автонастройки\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Подтвердите удаление всех отображаемых правил\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Удалить все отображаемые правила\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Введите полный или частичный URL (например, example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Профиль\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Профиль автосохранения\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"показать все профили\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"показывать столбец \\\"Профиль автосохранения\\\"\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Обновить правило\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Удалить правило\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Добавить правило\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Подтвердить изменения\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Отменить изменения\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Подтвердите удаление выбранного правила\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"автосохранение после загрузки или выгрузки страницы\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"автосохранение после загрузки страницы\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"автосохранение после выгрузки страницы\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"автосохранение при сбросе вкладки\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"автосохранение при удалении вкладки\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"задержка автосохранения после загрузки страницы (сек.)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"переодическое автосохранение\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"период (сек.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"сохранять страницу с помощью SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Редактор аннотаций\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"аннотировать страницу перед сохранением\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"открывать сохранённые страницы в новой вкладке\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"сохранять открытые страницы из редактора аннотаций SingleFile\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"режим по умолчанию\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"обычный\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"редактировать страницу\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"форматировать страницу\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"удалить элементы\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"удалить внешние элементы\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"использовать системную тему при форматировании страницы\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"ширина содержимого при форматировании страницы (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"предупреждать при закрытии страницы с несохранёнными изменениями\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"показать информационную панель\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Разное\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"сохранять страницы в фоновом режиме\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"показывать статистику в консоли после обработки\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"установить максимальный размер\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"максимальный размер (МБ)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"установить максимальное время загрузки\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"максимальное время загрузки (сек.)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"пропустить заголовок \\\"Referer\\\" после ошибки запроса перекрёстного источника\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"сохранить исходную страницу\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"установить политику безопасности содержимого\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"копировать в буфер обмена\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"сохранить как файл\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"поделиться страницей\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"добавить доказательство существования\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Подтвердите, что разрешаете SingleFile отправлять в Woleet API SHA256-хеш каждой сохраняемой вами страницы. Дополнительную информацию об этой функции можно найти на странице помощи или нажав на знак вопроса рядом с параметром.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"токен доступа\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"загрузить на Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"загрузить на Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"загрузить на GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"токен доступа\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"имя пользователя\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"имя репозитория\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"имя ветки\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"загрузить на Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"домен\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"регион\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"имя сегмента\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"ключ доступа\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"секретный ключ\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"загрузить на WebDAV-сервер\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"имя пользователя\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"пароль\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"загрузить на MCP-сервер\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"токен аутентификации\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"сохранять с помощью SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"сохранить страницу недавно созданной закладки\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"связать новую закладку с сохранённой страницей\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"разрешённые папки\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"игнорируемые папки\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"помощь\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"параметры синхронизации\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Сброс\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Сбросить все параметры к значениям по умолчанию\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Подтвердите сброс всех параметров или текущего профиля\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Сбросить все параметры\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Сбросить текущий профиль\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Отмена\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Экспорт\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Импорт\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Отложенные изображения\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Содержимое фреймов\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Встроенное изображение\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Шаг\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"190\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"Ошибка SingleFile: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Открыть изображение...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Поделиться страницей...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Поделиться выделенным...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Настройки по умолчанию\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Отключено\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Добавить профиль\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Переименовать профиль\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Удалить профиль\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Введите имя для этого профиля\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Подтвердите удаление выбранного профиля\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Введите новое имя для выбранного профиля\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Добавить жёлтую заметку\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Добавить розовую заметку\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Добавить синюю заметку\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Добавить зелёную заметку\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Выделить выбранный текст жёлтым цветом\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Выделить выбранный текст розовым цветом\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Выделить выбранный текст синим цветом\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Выделить выбранный текст зелёным цветом\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Показать/скрыть заметки\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Показать/скрыть выделение текста\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Удалить выделение выбранного текста\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Включить/отключить режим \\\"только для чтения\\\"\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Форматировать страницу для лучшей читаемости\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Включить/отключить удаление внутренних элементов\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Включить/отключить удаление внешних элементов\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Восстановить последний удалённый элемент\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Восстановить все удалённые элементы\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Удалить последний восстановленный элемент\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Сохранить страницу\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Печать страницы\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Импорт MHTML-файла\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Отложенное сохранение\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Отменить все\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Заголовок\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"статус\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"отложено\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"выполнение\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"отмена\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Нет отложенных сохранений\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Добавить URL\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Введите список URL, разделённых новой строкой\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Отмена\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Пакетное сохранение URL\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Нет URL\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Добавить URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Добавить URL...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Удалить все\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Сохранить страницы\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"загрузить в API формы REST\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"токен авторизации\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"имя поля данных архива\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"имя поля URL архива\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Редактор параметров\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Сохранить\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Конфигурация сохранена\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Неправильный JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/sv/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Spara en hel sida i en enda HTML-fil\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Spara de markerade flikarna eller deras valda innehåll\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Spara alla flikar\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Anpassad genväg\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Anpassad genväg #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Anpassad genväg #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Anpassad genväg #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Anpassad genväg #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Anpassad genväg #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Anpassad genväg #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Anpassad genväg #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Anpassad genväg #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Anpassad genväg #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Anpassad genväg #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Spara sidan med SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Spara valda länkar\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Anteckna sidan...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Anteckna och spara sidan...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Spara sidan med profil\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Visa väntande sparingar...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Välj standardprofilen\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Välj profilen för den aktuella regeln\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Välj profilen för den aktuella domänen\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Spara valet\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Spara ram\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Spara flikar\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Spara valda flikar\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Spara ofästa flikar\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Spara alla flikar\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Gruppspara URL:er...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Spara automatiskt\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Inaktiverad\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Spara denna flik automatiskt\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Spara ofästa flikar automatiskt\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Spara alla flikar automatiskt\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Spara sidan med SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Denna sida kan inte sparas med SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Initierar SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Spara förlopp: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Uppladdningsförlopp: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"FEL\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Automatisk spara aktiv\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Alternativ\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Användargränssnitt\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"lägg till post i snabbmenyn på webbsidan\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"överlägg en skugga på sidan under bearbetningen\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"visa ett infofält när du visar en sparad sida\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"mall för informationsfältets innehåll\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"blockera blandat innehåll\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"spara original URL:er för inbäddade resurser\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"inkludera informationsfältet på den sparade sidan\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"håll informationsfältet öppet\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"inkludera inte sparat datum\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"öppna en dialogruta för att redigera informationsfältets innehåll\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"stäng fliken automatiskt efter att sidan har sparats\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"tangentbordsgenväg kommando\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"standardgenväg\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Filnamn\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"mall\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"max längd\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"byte\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"tecken\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"ersättningstecken\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"ersätt emojis med text\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"spara filnamnsmallens data med sidan\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"öppna dialogrutan \\\"Spara som\\\" för att bekräfta filnamnet\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"filnamn konfliktlösning\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"skapa ett unikt namn\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"skriva över den befintliga filen\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"fråga efter ett namn\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"hoppa över dubblettfiler\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML-innehåll\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"komprimera HTML-innehåll\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"ta bort ramar\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"ta bort dolda element\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"ta bort specifika element\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Filformat\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"format\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"självextraherande ZIP (universell)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"självextraherande ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"lösenord\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"skapa en rotkatalog\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"inaktivera komprimering\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"lägg inte till data efter ZIP-data\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"gör texten sökbar\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"bädda in bild\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"sidans skärmdump\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"anpassad bild\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Informationsfält\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Bilder\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"gruppera dubblettbilder\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"faktor för minskning av bildstorlek\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"spara uppskjutna bilder\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"maximal vilotid (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"zooma ut sidan\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"skicka \\\"rullnings\\\"händelse\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"ladda uppskjutna ramar\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"ta bort bilder för alternativa skärmupplösningar\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Teckensnitt\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"ta bort oanvända teckensnitt\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"ta bort alternativa teckensnitt\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Stilmallar\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"komprimera CSS-innehåll\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"gruppera dubblettstilmallar tillsammans\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"flytta i huvudelementet stilarna som finns utanför det\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"ta bort oanvända stilar\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"ta bort stilmallar för alternativa enheter till skärmar\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Nätverk\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"blockerade resurser\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"\\\"Acceptera\\\" rubrik\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"skript\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"videor\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"ljud\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"dokument\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"teckensnitt\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"stilmallar\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"bilder\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Destination\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Bokmärken\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Spara automatiskt\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Regler för automatiska inställningar\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Bekräfta borttagningen av alla visade regler\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Ta bort alla visade regler\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Ange en fullständig eller delvis URL (t.ex. example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Spara profil automatiskt\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"visa alla profiler\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"visa kolumnen 'Spara profil automatiskt'\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Uppdatera regeln\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Ta bort regeln\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Lägg till regeln\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Validera ändringar\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Avbryt ändringar\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Bekräfta borttagningen av den valda regeln\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"spara automatiskt efter sidladdning eller vid urladdning\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"spara automatiskt efter sidladdning\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"spara automatiskt vid urladdning av sidor\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"spara automatiskt vid kassera flik\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"spara automatiskt vid flikborttagning\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"spara automatiskt vid väntefördröjning efter sidladdning (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"spara automatiskt periodvis\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"period (s.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"spara sidan med SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Anteckningsredigerare\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"anteckna sidan innan du sparar\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"öppna sparade sidor i en ny flik\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"öppna sidor sparade med SingleFile i anteckningsredigeraren\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"standardläge\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"redigera sidan\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"formatera sidan\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"ta bort element\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"ta bort externa element\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"tillämpa systemtemat vid formatering av en sida\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"innehållsbredd vid formatering av en sida (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"varna om du lämnar sidan med osparade ändringar\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"visa informationsfältet\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Övrigt\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"spara sidor i bakgrunden\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"visa statistik i konsolen efter bearbetning\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"ställ in maximal storlek\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"maximal storlek (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"ställ in maximal nedladdningstid\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"maximal nedladdningstid (er)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"skicka rubriken \\\"Referer\\\" efter ett fel med korsoriginansförfrågan\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"spara rå sida\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"ange innehållssäkerhetspolicy\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"kopiera till urklipp\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"spara till filsystemet\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"dela sida\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"lägga till bevis på existens\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Bekräfta att du tillåter SingleFile att skicka till Woleet API en SHA256-hash för varje sida du ska spara. Du kan hitta mer information om denna funktion på hjälpsidan eller genom att klicka på frågetecknet bredvid alternativet.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"åtkomsttoken\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"ladda upp till Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"ladda upp till Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"ladda upp till GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"åtkomsttoken\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"användarnamn\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"förvarets namn\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"filialnamn\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"ladda upp till Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"domän\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"region\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"hinknamn\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"åtkomstnyckel\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"hemlig nyckel\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"ladda upp till en WebDAV-server\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"användaridentifierare\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"lösenord\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"ladda upp till en MCP-server\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"server URL\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"autentiseringstoken\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"spara med SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"spara sidan av ett nyskapat bokmärke\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"länka det nya bokmärket till den sparade sidan\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"tillåtna mappar\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"ignorerade mappar\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"hjälp\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"synchronize options\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Återställ\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Återställ alla alternativ till deras standardvärden\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Bekräfta återställningen av alla alternativ eller den aktuella profilen\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Återställ alla alternativ\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Återställ den aktuella profilen\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Avbryt\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Exportera\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Importera\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Uppskjutna bilder\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Raminnehåll\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Inbäddad bild\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Steg\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile-fel: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Öppna bild...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Dela sida...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Dela val...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Standardinställningar\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Inaktiverad\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Lägg till en ny profil\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Byt namn på profilen\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Ta bort profilen\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Ange ett namn för den här nya profilen\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Bekräfta borttagningen av den valda profilen\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Ange ett nytt namn för den valda profilen\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Lägg till en gul anteckning\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Lägg till en rose anteckning\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Lägg till en blå anteckning\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Lägg till en grön anteckning\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Markera vald text i gult\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Markera vald text i rosa\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Markera vald text i blått\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Markera vald text i grönt\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Visa/dölj anteckningar\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Visa/dölj den markerade texten\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Ta bort den markerade texten\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Aktivera/inaktivera skrivskyddad\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Formatera sidan för bättre läsbarhet\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Aktivera/inaktivera borttagning av interna element\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Aktivera/inaktivera borttagning av externa element\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Återställ senast borttagna element\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Återställ alla borttagna element\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Ta bort senast återställda element\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Spara sidan\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Skriv ut sidan\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Importera MHTML-fil\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Väntande sparingar\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Avbryt alla\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Titel\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"status\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"väntande\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"bearbetning\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"avbryter\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Inga väntande sparningar\",\n\t\t\"description\": \"Label displayed when there are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Lägg till URL:er\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Ange en lista med URL:er åtskilda av en ny rad\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Avbryt\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Gruppspara URL:er\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Inga URL:er\",\n\t\t\"description\": \"Label displayed when there are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Lägg till URL\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Lägg till URL:er...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Ta bort alla\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Spara sidor\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"ladda upp till ett REST Form API\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"auktoriseringstoken\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"arkivdatafältnamn\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"arkivets URL-fältnamn\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Alternativredigerare\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Spara\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Konfiguration sparad\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Ogiltig JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/tr/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Tam bir sayfayı tek bir HTML dosyasına kaydet\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Seçili sekmeleri veya seçili içeriklerini kaydet\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Tüm sekmeleri kaydet\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Özel kısayol\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Özel kısayol #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Özel kısayol #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Özel kısayol #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Özel kısayol #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Özel kısayol #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Özel kısayol #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Özel kısayol #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Özel kısayol #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Özel kısayol #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Özel kısayol #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Sayfayı SingleFile ile kaydet\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Seçilen bağlantıları kaydet\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Sayfaya açıklama ekle...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Sayfaya açıklama ekle ve sayfayı kaydet...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Sayfayı profille kaydet\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Bekleyen kaydetmeleri görüntüle...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Varsayılan profili seçin\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Geçerli kuralın profilini seçin\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Geçerli etki alanının profilini seçin\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Seçimi kaydet\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Çerçeveyi kaydet\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Sekmeleri kaydet\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Seçili sekmeleri kaydet\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Sabitlenmemiş sekmeleri kaydet\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Tüm sekmeleri kaydet\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"URL'leri toplu olarak kaydedin...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Otomatik-kaydet\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Devre dışı\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Bu sekmeyi otomatik-kaydet\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Sabitlenmemiş sekmeleri otomatik-kaydet\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Tüm sekmeleri otomatik olarak kaydet\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Sayfayı SingleFile ile kaydet\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Bu sayfa SinglePage ile kaydedilemiyor\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"SingleFile Başlatılıyor\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"İlerlemeyi kaydet: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"İlerlemeyi yükle: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"Onay\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"HATA\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Otomatik-kaydet aktif\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Seçenekler\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Kullanıcı arayüzü\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"web sayfasının içerik menüsüne giriş ekle\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"işleme sırasında sayfaya bir gölge bindir\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"kayıtlı bir sayfayı görüntülerken bir bilgi çubuğu görüntüle\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"bilgi çubuğu içeriği şablonu\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"karışık içeriği engelle\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"gömülü kaynakların orijinal URL'lerini kaydet\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"bilgi çubuğunu kaydedilen sayfaya dahil et\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"bilgi çubuğunu açık tut\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"kaydedilen tarihi dahil etme\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"bilgi çubuğu içeriğini düzenlemek için bir bilgi istemi iletişim kutusu aç\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"sayfa kaydedildikten sonra sekmeyi otomatik kapat\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"klavye kısayolu komutu\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"varsayılan kısayol\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Dosya ismi\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"şablon\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"maksimum uzunluk\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"baytlar\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"karakterler\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"yerine geçen karakter\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"emoji'leri metinle değiştir\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"dosya adı şablon verilerini sayfaya kaydetme\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"dosya adını onaylamak için \\\"Farklı kaydet\\\" iletişim kutusunu aç\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"dosya adı çakışma çözümü\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"benzersiz bir ad oluştur\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"mevcut dosyanın üzerine yaz\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"isim sor\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"yinelenen dosyaları atla\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML içeriği\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"HTML içeriğini sıkıştır\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"çerçeveleri kaldır\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"gizli öğeleri kaldır\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"belirli öğeleri kaldır\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Dosya biçimi\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"biçim\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"kendinden çıkartılabilen ZIP (evrensel)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"kendinden çıkartılabilen ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"şifre\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"kök dizin oluştur\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"sıkıştırmayı devre dışı bırak\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"ZIP verilerinden sonra veri eklemeyin\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"metni aranabilir yap\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"gömülü görüntü\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"ekran görüntüsü\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"özel görüntü\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Bilgi çubuğu\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Görüntüler\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"yinelenen görüntüleri gruplandır\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"görüntü küçültme faktörü\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"ertelenen görüntüleri kaydet\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"maksimum boşta kalma süresi (ms)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"sayfayı uzaklaştır\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"\\\"scroll\\\" olayını gönder\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"ertelenen çerçeveleri kaydet\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"alternatif ekran çözünürlükleri için görüntüleri kaldır\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Yazı tipleri\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"kullanılmayan yazı tiplerini kaldır\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"alternatif yazı tiplerini kaldır\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Stil sayfaları\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"CSS içeriğini sıkıştır \",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"yinelenen stil sayfalarını gruplandır\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"dışında bulunan stilleri baş öğesinde taşı\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"kullanılmayan stilleri kaldır\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"Alternatif ekranlar için stil sayfalarını silin\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Ağ\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"engellenen kaynaklar\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"\\\"Accept\\\" başlığı\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"kodlar\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"videolar\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"sesler\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"belgeler\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"yazı tipleri\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"stil sayfaları\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"görseller\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Hedef\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Yer işaretleri\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Otomatik-kaydet\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Otomatik-ayarlar kuralları\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Görüntülenen tüm kuralların silinmesini onaylayın\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Görüntülenen tüm kuralları sil\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Tam veya kısmi bir URL yazın (ör. example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Profil\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Profili otomatik kaydet\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"tüm profilleri göster\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"'Profili otomatik kaydet' sütununu göster\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"kuralı güncelle\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Kuralı sil\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Kuralı ekle\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Değişiklikleri doğrula\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Değişiklikleri iptal et\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Seçilen kuralın silinmesini onaylayın\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"sayfa yüklendikten sonra veya sayfa kaldırıldığında otomatik kaydet\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"Sayfa yükünden sonra otomatik kaydet\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"sayfa boşaltmada otomatik kaydet\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"sekme atıldığında otomatik kaydet\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"sekme kaldırmada otomatik kaydetme\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"sayfa yüklemesinden sonra otomatik kaydetme bekleme gecikmesi (s)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"periyodik olarak otomatik kaydet\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"periyot (s.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"sayfayı SingleFile Companion ile kaydedin\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Ek açıklama düzenleyici\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"kaydetmeden önce sayfaya açıklama ekleyin\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"kayıtlı sayfaları yeni bir sekmede aç\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"açıklama düzenleyicide SingleFile ile kaydedilen sayfaları açın\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"varsayılan mod\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"normal\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"sayfayı düzenle\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"sayfayı biçimlendir\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"öğeleri kaldır\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"dış öğeleri kaldır\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"bir sayfayı biçimlendirirken sistem temasını uygula\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"sayfayı biçimlendirirken içerik genişliği (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"kaydedilmemiş değişiklikle sayfadan ayrılırsa uyar\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"bilgi çubuğunu görüntüleme\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Çeşitli.\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"sayfaları arka planda kaydet\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"işledikten sonra istatistikleri konsolda göster\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"maksimum boyutu ayarla\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"maksimum boyut (MB)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"maksimum indirme süresini ayarla\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"maksimum indirme süresi (s)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"kaynaklar arası istek hatasından sonra \\\"Referer\\\" başlığını iletin\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"ham sayfayı kaydet\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"içerik güvenlik politikası belirle\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"panoya kopyala\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"dosya sistemine kaydet\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"sayfayı paylaş\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"varlığın kanıtını ekle\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"SingleFile'ın Woleet API'ye kaydedeceğiniz her sayfanın bir SHA256 hash'ini göndermesine izin verdiğinizi onaylayın. Bu özellikle ilgili daha fazla bilgiyi yardım sayfasında veya seçeneğin yanındaki soru işaretine tıklayarak bulabilirsiniz.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"erişim belirteci\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"Google Drive'a yükle\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"Dropbox'a yükle\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"GitHub'a yükle\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"erişim belirteci\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"kullanıcı adı\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"havuz adı\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"şube adı\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"Amazon S3'e yükleme\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"alan adı\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"bölge\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"kova adı\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"erişim anahtarı\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"gizli anahtar\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"bir WebDAV sunucusuna yükle\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"kullanıcı tanımlayıcı\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"şifre\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"MCP sunucusuna yükle\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"sunucu URL'si\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"kimlik doğrulama belirteci\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"SingleFile Companion ile kaydet\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"yeni oluşturulan yer iminin sayfasını kaydet\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"yeni yer imini kaydedilen sayfaya bağla\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"izin verilen klasörler\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"yok sayılan klasörler\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"yardım\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"senkronizasyon seçenekleri\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Sıfırla\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Tüm seçenekleri varsayılan değerlerine sıfırlayın\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Tüm seçeneklerin veya geçerli profilin sıfırlanmasını onayla\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Tüm seçenekleri sıfırla\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Geçerli profili sıfırla\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"TAMAM\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"İPTAL\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Dışarı aktar\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"İçe aktar\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Ertelenmiş resimler\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"çerçeve içeriği\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Gömülü resim\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Adım\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile hata: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Resmi aç...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Sayfayı paylaş...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Seçimi paylaş...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Varsayılan ayarlar\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Devre dışı\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Yeni profil ekle\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"profili yeniden adlandır\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Profili sil\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Yeni profil için bir isim gir\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Seçilen profilin silinmesini onaylayın\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Seçilen profil için yeni bir ad girin\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Sarı bir not ekle\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Pembe bir not ekle\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Mavi bir not ekle\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Yeşil bir not ekle\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Seçili metni sarı renkle vurgula\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Seçili metni pembe renkle vurgula\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Seçili metni mavi renkle vurgula\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Seçili metni yeşil renkle vurgula\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Notları göster/gizle\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Vurgulanan metni göster/gizle\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Seçili vurgulanan metni kaldır\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Salt okunuru etkinleştir/devre dışı bırak\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Daha iyi okunabilirlik için sayfayı biçimlendir\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Dahili elemanların kaldırılmasını etkinleştirin/devre dışı bırak\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Harici öğelerin kaldırılmasını etkinleştirin/devre dışı bırak\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Son kaldırılan öğeyi geri yükle\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Kaldırılan tüm öğeleri geri yükle\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Son geri yüklenen öğeyi kaldır\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Sayfayı kaydet\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Sayfayı yazdır\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"MHTML dosyasını içe aktar\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Bekleyen kaydetmeler\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Hepsini iptal et\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Başlık\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"durum\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"askıda\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"işleniyor\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"iptal ediliyor\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"bekleyen kayıt yok\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"URL ekle\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Yeni satır kayıtlarıyla ayrılmış bir URL listesi girin\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"TAMAM\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"İPTAL\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Toplu kaydetme URL'leri\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"URL yok\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"URL ekle\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"URL ekle...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Hepsini sil\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Sayfaları kaydet\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"REST Form Api'ye Yükleme\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"yetkilendirme belirteci\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"arşiv veri alanı adı\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"arşiv URL alan adı\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Seçenekler düzenleyici\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Kaydet\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Yapılandırma kaydedildi\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Geçersiz JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/uk/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"Зберегти всю сторінку в один HTML-файл\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"Зберегти вибрані вкладки або їх вибраний вміст\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"Зберегти всі вкладки\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"Власна комбінація клавіш\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"Власна комбінація клавіш #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"Власна комбінація клавіш #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"Власна комбінація клавіш #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"Власна комбінація клавіш #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"Власна комбінація клавіш #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"Власна комбінація клавіш #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"Власна комбінація клавіш #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"Власна комбінація клавіш #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"Власна комбінація клавіш #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"Власна комбінація клавіш #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"Зберегти сторінку з допомогою SingleFile\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"Зберегти вибрані посилання\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"Анотувати сторінку...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"Анотувати і зберегти сторінку...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"Зберегти сторінку з профілем\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"Перегляд відкладених збережень...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"Виберіть профіль за замовчуванням \",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"Виберіть профіль поточного правила\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"Виберіть профіль поточного домену\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"Зберегти виділене\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"Зберегти фрейм\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"Зберегти вкладки\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"Зберегти вибрані вкладки\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"Зберегти незакріплені вкладки\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"Зберегти всі вкладки\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"Пакетне збереження URL-адрес...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"Автозбереження\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"Вимкнено\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"Автозбереження цієї вкладки\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"Автозбереження незакріплених вкладок\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"Автозбереження всіх вкладок\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"Зберегти сторінку з допомогою SingleFile\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"Ця сторінка не може бути збережена з SingleFile\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"Ініціалізація SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"Прогрес збереження: \",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"Прогрес завантаження: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"ОК\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"ERR\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"Автозбереження активне\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[A]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"Параметри\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"Користувацький інтерфейс\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"додати пункт в контекстне меню веб-сторінки\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"затіняти сторінку під час обробки\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"відображати інформ. панель під час перегляду збереженої сторінки\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"шаблон вмісту інформаційної панелі \",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"блок змішаного наповнення\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"зберігати оригінальні URL-адреси вбудованих ресурсів\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"додавати інформ. панель в сторінку що зберігається\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"тримати інфопанель відкритою\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"не включати збережену дату\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"відкривати діалогове вікно для редагування вмісту інформаційної панелі\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"автоматично закривати вкладку після збереження сторінки\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"команда гарячої клавіші\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"стандартна гаряча клавіша\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"Ім'я файлу\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"шаблон\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"максимальна довжина\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"байти\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"символи\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"замінний символ\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"Замініть смайлики на текст\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"Збережіть дані шаблону імені файлу на сторінці\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"відкривати діалогове вікно \\\"Save as\\\" для підтвердження імені файлу\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"Розв'язок конфліктів імен файлів\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"створити унікальне ім'я\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"перезаписати існуючий файл\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"запит імені\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"пропускати дублікати файлів\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML-вміст\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"стискати вміст HTML\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"видалити фрейми\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"видалити приховані елементи\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"видалити певні елементи\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"Формат файлу\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"формату\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"саморозпаковується ZIP (універсальний)\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"саморозпаковується ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"пароль\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"створити кореневий каталог\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"відключити сжаття\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"не додавайте дані після ZIP-архіву\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"зробити текст доступним для пошуку\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"вбудоване зображення\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"знімок екрану\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"власне зображення\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"Інфобар\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"Зображення\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"групувати дублікати зображень\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"коефіцієнт зменшення розміру зображення\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"зберегти відстрочені зображення\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"максимальний час простою (мс)\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"зменшити масштаб сторінки\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"відправка події \\\"прокрутка\\\"\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"зберегти відстрочені фрейми\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"видалити зображення для альтернативних розширень екрану \",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"Шрифти\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"видалити невикористовувані шрифти\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"видалити альтернативні шрифти\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"Стилі\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"стискати вміст CSS \",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"групувати дублікати таблиць стилів\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"переміщати в елемент head стилі, що знаходяться за його межами\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"видалити невикористовувані стилі\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"видалити стилі для екранів альтернативних пристроїв\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"Мережа\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"заблоковані ресурси\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"заголовок \\\"Accept\\\"\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"скрипти\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"відеоролики\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"аудіозаписи\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"документи\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"шрифти\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"таблиці стилів\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"зображення\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"Пункт призначення\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"Закладки\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"Автозбереження\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"Правила автоналаштування \",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"Підтвердіть видалення всіх показаних правил\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"Видалити всі правила\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"URL-адреса\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"Введіть повний або частковий URL (напр. example.com)\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"Профіль\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"Профіль автозбереження\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"переглянути всі профілі\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"відобразити стовпчик 'Профіль автозбереження'\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"Оновити правило\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"Видалити правило\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"Додати правило\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"Підтвердити зміни\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"Скасувати зміни\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"Підтвердити видалення вибраного правила\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"автозбереження після завантаження або розвантаження сторінки\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"автозбереження після завантаження сторінки\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"автозбереження після розвантаження сторінки\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"автозбереження на вкладці відкинути\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"автозбереження при видаленні вкладки\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"затримка автозбереження після завантаження сторінки (с)\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"періодичне автозбереження\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"період (с.)\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"зберегти сторінку за допомогою програми SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"Редактор анотацій\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"анотувати сторінки перед збереженням\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"відкривати збережені сторінки в новій вкладці\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"відкривати сторінки, збережені за допомогою SingleFile, в редакторі анотацій\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"режим за замовчуванням\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"нормальний\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"редагувати сторінку\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"відформатувати сторінку\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"зняти елементи\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"зняти зовнішні елементи\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"застосовувати системну тему при форматуванні сторінки\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"ширина вмісту при форматуванні сторінки (em)\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"попереджати при виході зі сторінки з незбереженими змінами\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"відображати інформ. панель\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"Різне\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"зберігати сторінки у фоновому режимі\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"відображати статистику в консолі після обробки\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"встановити максимальний розмір\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"максимальний розмір (МБ)\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"встановити максимальний час завантаження\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"максимальний час завантаження (с)\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"передача заголовка \\\"Referer\\\" після помилки перехресного запиту\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"зберегти вихідну сторінку\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"встановити політику безпеки контенту\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"зберегти в буфер обміну\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"збереження у файлову систему\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"поділитися сторінкою\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"додати докази існування\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"Підтвердьте, що ви дозволяєте SingleFile надсилати в Woleet API хеш SHA256 кожної сторінки, яку ви збираєтеся зберегти. Ви можете знайти більше інформації про цю функцію на сторінці довідки або натиснувши на знак питання поруч із опцією.\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"токен доступу\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"завантажити на Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"завантажити на Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"завантажити на GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"токен доступу\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"ім'я користувача\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"назва сховища\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"назва філії\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"завантажити на Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"домен\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"регіон\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"назва відра\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"ключ доступу\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"секретний ключ\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"вивантаження на WebDAV-сервер\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"ідентифікатор користувача\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"пароль\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"завантажити на MCP-сервер\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"URL сервера\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"токен автентифікації\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"зберегти за допомогою програми SingleFile Companion\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"зберегти сторінку новоствореної закладки\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"прив'язати нову закладку до збереженої сторінки\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"дозволені папки\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"ігноровані папки\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"допомога\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"параметри синхронізації\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"Скидання\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"Скинути всі параметри до типових значень\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"Підтвердити скидання всіх параметрів чи поточного профілю\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"Скинути всі параметри\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"Скинути поточний профіль\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"ОК\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"Скасувати\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"Експорт\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"Імпорт\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"Відстрочені зображення\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"Вміст фрейму\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"Вбудоване зображення\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"Крок\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"Сто двадцять і два,\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"Помилка SingleFile: \",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"Відкрити зображення..\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"Поділитися сторінкою...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"Seite teilen...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"Типові налаштування\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"Вимкнено\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"Додати новий профіль\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"Перейменувати профіль\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"Видалити профіль\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"Введіть ім'я нового профілю\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"Підтвердити видалення обраного профілю\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"Введіть нове ім'я для обраного профілю\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"Додати жовту примітку\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"Додати рожеву примітку\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"Додати синю примітку\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"Додати зелену примітку\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"Позначити виділений текст жовтим кольором\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"Позначити виділений текст рожевим кольором\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"Позначити виділений текст синім кольором\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"Позначити виділений текст зеленим кольором\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"Показати/приховати примітки\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"Показати/приховати текст\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"Видалити виділений текст\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"Ввімкнути/вимкнути режим 'тільки для читання'\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"Відформатуйте сторінку для кращої читабельності\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"Увімкнути/вимкнути зняття внутрішніх елементів\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"Увімкнути/вимкнути зняття зовнішніх елементів\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"Відновлення останнього видаленого елемента\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"Відновити всі видалені елементи\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"Видалити останній відновлений елемент\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"Зберегти сторінку\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"Роздрукувати сторінку\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"Імпортувати файл MHTML\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"Очікують на збереження\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"Скасувати все\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"Назва\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"статус\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"на розгляді\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"переробка\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"скасування\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"Відкладених збережень немає\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"Додати URL-адреси\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"Введіть список URL-адрес через новий рядок\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"OK\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"Скасувати\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"Пакетне збереження URL-адрес\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"Немає URL-адрес\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"Додати URL-адресу\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"Додати URL-адреси\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"Видалити всі\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"Зберегти сторінки\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"завантажити на REST Form Api\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"URL\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"токен авторизації\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"назва поля архівних даних\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"назва поля URL-адреси\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"Редактор параметрів\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"Зберегти\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"Конфігурація збережена\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"Недійсний JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/zh_CN/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"将一个完整的页面保存到单个 HTML 文件中\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"保存选中标签页或其中的选中内容\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"保存所有标签页\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"自定义快捷键\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"自定义快捷键 #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"自定义快捷键 #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"自定义快捷键 #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"自定义快捷键 #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"自定义快捷键 #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"自定义快捷键 #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"自定义快捷键 #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"自定义快捷键 #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"自定义快捷键 #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"自定义快捷键 #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"使用 SingleFile 保存页面\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"保存所选链接\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"标注页面...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"标注并保存该页面...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"使用指定的配置文件保存页面\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"查看挂起的保存项...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"选择默认配置文件\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"选择当前规则的配置文件\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"选择当前域名的配置文件\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"保存选中部分\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"保存框架\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"保存标签页\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"保存选中标签页\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"保存未固定标签页\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"保存所有标签页\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"批量保存网址...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"自动保存\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"已禁用\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"自动保存此标签页\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"自动保存未固定标签页\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"自动保存所有标签页\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"使用 SingleFile 保存页面\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"SingleFile 无法保存此页面\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"正在初始化 SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"保存进度：\",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"上传进度: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"完成\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"错误\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"自动保存活动页面\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[自动]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"选项\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"用户界面\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"在页面的上下文菜单中添加 SingleFile 条目\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"在处理过程中用阴影覆盖页面\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"查看已保存页面时显示信息栏\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"信息栏内容模板\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"拦截混合內容\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"保存嵌入资源的原始网址\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"将信息栏嵌入到保存的页面中\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"查看已保存页面时使信息栏为打开状态\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"不包括保存日期\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"打开提示对话框编辑信息栏内容\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"页面保存后自动关闭该标签页\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"自定义快捷键命令\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"默认快捷键\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"文件名\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"模板\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"最大长度\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"字节\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"字符\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"替换字符\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"用文字替换表情符号\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"将文件名模板数据保存到页面中\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"打开 “另存为” 对话框以确认文件名\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"文件名冲突解决方案\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"创建一个唯一名称\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"覆盖现有文件\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"指定一个新名称\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"跳过重复文件\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML 内容\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"压缩 HTML 内容\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"移除框架\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"移除隐藏元素\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"移除特定元素\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"文件格式\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"格式\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"自解压缩 ZIP（通用）\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"自解压缩 ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"密码\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"创建根目录\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"禁用压缩\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"不要在 ZIP 数据后添加数据\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"使文本可被搜索\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"嵌入图片\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"网页截图\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"自定义图片\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"信息栏\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"图片\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"将重复图片分组到一起\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"图片缩小系数\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"保存延迟加载的图片\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"最长空闲时间（毫秒）\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"缩小页面\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"触发滚动事件\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"加载延迟框架\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"移除用于备选分辨率的图片\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"字体\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"移除未使用字体\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"移除备选字体\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"样式表\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"压缩 CSS 内容\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"将重复样式表分组到一起\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"移动 head 标签之外的样式到其内\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"移除未使用的样式\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"移除用于备选设备屏幕的样式表\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"网络\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"拦截资源文件\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"“Accept” 请求头\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"脚本\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"视频\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"音频\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"文档\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"字体\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"样式表\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"图片\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"保存位置\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"书签\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"自动保存\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"自动设置规则\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"确认删除所有已显示规则\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"删除所有已显示规则\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"网址\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"输入完整的或部分网址 （例如 example.com）\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"配置文件\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"自动保存配置文件\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"显示所有配置文件\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"显示 “自动保存配置文件” 列\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"更新规则\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"删除规则\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"添加规则\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"验证更改\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"取消更改\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"确认删除所选规则\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"在页面加载完成后或开始卸载时进行自动保存\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"在页面加载完成后进行自动保存\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"在页面开始卸载时进行自动保存\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"在页面丢弃时进行自动保存\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"在页面移除时进行自动保存\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"页面加载完成后延迟该时间再进行自动保存（秒）\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"定期自动保存\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"周期（秒）\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"使用 SingleFile Companion 保存页面\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"标注编辑器\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"在保存前对该页面进行标注编辑\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"在新标签页中打开保存后的页面\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"在标注编辑器中打开用 SingleFile 保存的页面\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"默认模式\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"常规\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"编辑模式\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"格式化页面\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"删除内部文档元素\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"删除外部文档元素\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"在标注编辑器中打开页面时应用系统主题样式\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"格式化页面时的内容宽度（em）\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"离开标注编辑器时提醒保存已修改的内容\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"显示信息栏\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"杂项\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"在后台保存页面\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"处理完成后在控制台中显示统计数据\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"限制资源文件大小\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"大小上限（兆字节）\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"限制资源文件下载超时时间\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"时间上限（秒）\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"跨域请求失败时添加来源地址头信息（Referer）\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"保存原始页面\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"设置内容安全策略\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"保存到剪切板\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"保存到文件系统\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"分享页面\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"添加证明文件存在的指纹\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"请确认您是否允许 SingleFile 将您要保存的每个页面的 SHA256 哈希值发送给 Woleet API 。您可以在帮助页面或者通过点击该选项旁的问号找到此功能的更多信息。\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"访问令牌\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"保存到 Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"保存到 Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"保存到 GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"访问令牌\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"用户名\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"仓库名称\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"分支名称\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"保存到 Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"域名\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"区域\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"存储桶名称\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"访问密钥\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"密钥\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"保存到 WebDAV 服务器\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"地址\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"用户名\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"密码\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"保存到 MCP 服务器\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"服务器地址\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"认证令牌\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"使用 SingleFile Companion 保存\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"创建新书签时保存其对应页面\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"将新书签的链接指向已保存页面\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"允许文件夹\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"忽略文件夹\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"帮助\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"同步选项\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"重置\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"重置所有选项为默认值\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"确认重置所有选项或当前配置文件\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"重置所有选项\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"重置当前配置文件\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"确定\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"取消\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"导出\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"导入\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"延迟加载的图片\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"框架内容\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"嵌入图片\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"步骤\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile 错误：\",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"打开图片...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"分享页面...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"分享选中内容...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"默认设置\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"已禁用\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"新增配置文件\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"重命名配置文件\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"删除配置文件\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"新增配置文件\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"确认删除所选配置文件？\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"重命名配置文件\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"添加黄色标注\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"添加粉色标注\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"添加蓝色标注\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"添加绿色标注\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"将所选文本高亮为黄色\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"将所选文本高亮为粉色\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"将所选文本高亮为蓝色\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"将所选文本高亮为绿色\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"显示/隐藏 标注\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"显示/隐藏 高亮文本\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"移除所选高亮文本\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"启用/禁用 编辑模式\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"格式化页面以提升可读性\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"启用/禁用 点击时删除内部文档元素\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"启用/禁用 点击时删除外部文档元素\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"撤销上次移除元素的操作\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"撤销所有移除元素的操作\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"恢复上次移除元素的操作\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"保存该页面\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"打印页面\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"导入 MHTML 文件\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"挂起保存项\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"取消全部\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"网址\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"标题\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"状态\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"正在挂起\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"正在处理\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"正在取消\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"没有挂起中的保存项\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"添加网址\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"请按行输入网址列表\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"确定\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"取消\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"批量保存网址\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"无网址\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"添加网址\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"添加多个网址...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"删除所有\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"保存页面\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"网址\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"保存到 REST 表单 API\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"网址\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"授权令牌\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"文件字段名称\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"网址字段名称\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"选项编辑器\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"保存\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"配置已保存\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"无效的 JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "_locales/zh_TW/messages.json",
    "content": "{\n\t\"extensionDescription\": {\n\t\t\"message\": \"將一個完整的頁面保存到單個 HTML 文件中\",\n\t\t\"description\": \"Description of the extension.\"\n\t},\n\t\"commandSaveSelectedTabs\": {\n\t\t\"message\": \"保存選中標籤頁或其中的選中內容\",\n\t\t\"description\": \"Command (Ctrl+Shift+Y): 'Save the selected tabs or their selected contents'\"\n\t},\n\t\"commandSaveAllTabs\": {\n\t\t\"message\": \"保存所有標籤頁\",\n\t\t\"description\": \"Command (Ctrl+Shift+U): 'Save all tabs'\"\n\t},\n\t\"commandCustomShortcut\": {\n\t\t\"message\": \"自定義快捷鍵\",\n\t\t\"description\": \"Command label: 'Custom shortcut'\"\n\t},\n\t\"commandCustomShortcut0\": {\n\t\t\"message\": \"自定義快捷鍵 #1\",\n\t\t\"description\": \"Command label: 'Custom shortcut #1'\"\n\t},\n\t\"commandCustomShortcut1\": {\n\t\t\"message\": \"自定義快捷鍵 #2\",\n\t\t\"description\": \"Command label: 'Custom shortcut #2'\"\n\t},\n\t\"commandCustomShortcut2\": {\n\t\t\"message\": \"自定義快捷鍵 #3\",\n\t\t\"description\": \"Command label: 'Custom shortcut #3'\"\n\t},\n\t\"commandCustomShortcut3\": {\n\t\t\"message\": \"自定義快捷鍵 #4\",\n\t\t\"description\": \"Command label: 'Custom shortcut #4'\"\n\t},\n\t\"commandCustomShortcut4\": {\n\t\t\"message\": \"自定義快捷鍵 #5\",\n\t\t\"description\": \"Command label: 'Custom shortcut #5'\"\n\t},\n\t\"commandCustomShortcut5\": {\n\t\t\"message\": \"自定義快捷鍵 #6\",\n\t\t\"description\": \"Command label: 'Custom shortcut #6'\"\n\t},\n\t\"commandCustomShortcut6\": {\n\t\t\"message\": \"自定義快捷鍵 #7\",\n\t\t\"description\": \"Command label: 'Custom shortcut #7'\"\n\t},\n\t\"commandCustomShortcut7\": {\n\t\t\"message\": \"自定義快捷鍵 #8\",\n\t\t\"description\": \"Command label: 'Custom shortcut #8'\"\n\t},\n\t\"commandCustomShortcut8\": {\n\t\t\"message\": \"自定義快捷鍵 #9\",\n\t\t\"description\": \"Command label: 'Custom shortcut #9'\"\n\t},\n\t\"commandCustomShortcut9\": {\n\t\t\"message\": \"自定義快捷鍵 #10\",\n\t\t\"description\": \"Command label: 'Custom shortcut #10'\"\n\t},\n\t\"menuSavePage\": {\n\t\t\"message\": \"使用 SingleFile 保存頁面\",\n\t\t\"description\": \"Menu entry: 'Save page with SingleFile'\"\n\t},\n\t\"menuSaveSelectedLinks\": {\n\t\t\"message\": \"保存所選鏈接\",\n\t\t\"description\": \"Menu entry: 'Save selected links'\"\n\t},\n\t\"menuEditPage\": {\n\t\t\"message\": \"標註頁面...\",\n\t\t\"description\": \"Menu entry: 'Annotate the page...'\"\n\t},\n\t\"menuEditAndSavePage\": {\n\t\t\"message\": \"標註並保存該頁面...\",\n\t\t\"description\": \"Menu entry: 'Annotate and save the page...'\"\n\t},\n\t\"menuSaveWithProfile\": {\n\t\t\"message\": \"使用指定的配置文件保存頁面\",\n\t\t\"description\": \"Menu entry: 'Save with profile'\"\n\t},\n\t\"menuViewPendingSaves\": {\n\t\t\"message\": \"查看掛起的保存項...\",\n\t\t\"description\": \"Menu entry: 'View pending saves...'\"\n\t},\n\t\"menuSelectProfile\": {\n\t\t\"message\": \"選擇默認配置文件\",\n\t\t\"description\": \"Menu entry: 'Select the default profile'\"\n\t},\n\t\"menuUpdateRule\": {\n\t\t\"message\": \"選擇當前規則的配置文件\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current rule'\"\n\t},\n\t\"menuCreateDomainRule\": {\n\t\t\"message\": \"選擇當前域名的配置文件\",\n\t\t\"description\": \"Menu entry: 'Select the profile of the current domain'\"\n\t},\n\t\"menuSaveSelection\": {\n\t\t\"message\": \"保存選中部分\",\n\t\t\"description\": \"Menu entry: 'Save selection'\"\n\t},\n\t\"menuSaveFrame\": {\n\t\t\"message\": \"保存框架\",\n\t\t\"description\": \"Menu entry: 'Save frame'\"\n\t},\n\t\"menuSaveTabs\": {\n\t\t\"message\": \"保存標籤頁\",\n\t\t\"description\": \"Menu entry (SingleFile button only): 'Save tabs'\"\n\t},\n\t\"menuSaveSelectedTabs\": {\n\t\t\"message\": \"保存選中標籤頁\",\n\t\t\"description\": \"Menu entry: 'Save selected tabs'\"\n\t},\n\t\"menuSaveUnpinnedTabs\": {\n\t\t\"message\": \"保存未固定標籤頁\",\n\t\t\"description\": \"Menu entry: 'Save unpinned tabs'\"\n\t},\n\t\"menuSaveAllTabs\": {\n\t\t\"message\": \"保存所有標籤頁\",\n\t\t\"description\": \"Menu entry: 'Save all tabs'\"\n\t},\n\t\"menuBatchSaveUrls\": {\n\t\t\"message\": \"批量保存網址...\",\n\t\t\"description\": \"Menu entry: 'Batch save URLs...'\"\n\t},\n\t\"menuAutoSave\": {\n\t\t\"message\": \"自動保存\",\n\t\t\"description\": \"Menu entry: 'Auto-save'\"\n\t},\n\t\"menuAutoSaveDisabled\": {\n\t\t\"message\": \"已禁用\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Disabled'\"\n\t},\n\t\"menuAutoSaveTab\": {\n\t\t\"message\": \"自動保存此標籤頁\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save this tab'\"\n\t},\n\t\"menuAutoSaveUnpinnedTabs\": {\n\t\t\"message\": \"自動保存未固定標籤頁\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save unpinned tabs'\"\n\t},\n\t\"menuAutoSaveAllTabs\": {\n\t\t\"message\": \"自動保存所有標籤頁\",\n\t\t\"description\": \"Menu entry: 'Auto-save' > Auto-save all tabs'\"\n\t},\n\t\"buttonDefaultTooltip\": {\n\t\t\"message\": \"使用 SingleFile 保存頁面\",\n\t\t\"description\": \"Button title: 'Save page with SingleFile'\"\n\t},\n\t\"buttonBlockedBadge\": {\n\t\t\"message\": \"🚫\",\n\t\t\"description\": \"Button badge when the page is blocked: '🚫'\"\n\t},\n\t\"buttonBlockedTooltip\": {\n\t\t\"message\": \"SingleFile 無法保存此頁面\",\n\t\t\"description\": \"Button title: 'This page cannot be saved with SingleFile'\"\n\t},\n\t\"buttonInitializingTooltip\": {\n\t\t\"message\": \"正在初始化 SingleFile\",\n\t\t\"description\": \"Button title during initialization: 'Initializing SingleFile (x/2)'\"\n\t},\n\t\"buttonInitializingBadge\": {\n\t\t\"message\": \"•••\",\n\t\t\"description\": \"Badge label during initialization: '•••'\"\n\t},\n\t\"buttonSaveProgressTooltip\": {\n\t\t\"message\": \"保存進度：\",\n\t\t\"description\": \"Button title during save: 'Save progress: xx%'\"\n\t},\n\t\"buttonUploadProgressTooltip\": {\n\t\t\"message\": \"上傳進度: \",\n\t\t\"description\": \"Button title during save: 'Upload progress: xx%'\"\n\t},\n\t\"buttonOKBadge\": {\n\t\t\"message\": \"完成\",\n\t\t\"description\": \"Badge label: 'OK'\"\n\t},\n\t\"buttonErrorBadge\": {\n\t\t\"message\": \"錯誤\",\n\t\t\"description\": \"Badge label for unexpected errors\"\n\t},\n\t\"buttonAutoSaveActiveTooltip\": {\n\t\t\"message\": \"自動保存活動頁面\",\n\t\t\"description\": \"Button title: 'Auto-save active'\"\n\t},\n\t\"buttonAutoSaveActiveBadge\": {\n\t\t\"message\": \"[自動]\",\n\t\t\"description\": \"Badge label when auto-save is active\"\n\t},\n\t\"optionsTitle\": {\n\t\t\"message\": \"選項\",\n\t\t\"description\": \"Options page title\"\n\t},\n\t\"optionsUserInterfaceSubTitle\": {\n\t\t\"message\": \"用戶界面\",\n\t\t\"description\": \"Options sub-title: 'User interface'\"\n\t},\n\t\"optionAddMenuEntry\": {\n\t\t\"message\": \"在頁面的上下文菜單中添加 SingleFile 條目\",\n\t\t\"description\": \"Options page label: 'add entry in the context menu of the webpage'\"\n\t},\n\t\"optionDisplayShadow\": {\n\t\t\"message\": \"在處理過程中用陰影覆蓋頁面\",\n\t\t\"description\": \"Options page label: 'overlay a shadow on the page during processing'\"\n\t},\n\t\"optionDisplayInfobar\": {\n\t\t\"message\": \"查看已保存頁面時顯示信息欄\",\n\t\t\"description\": \"Options page label: 'display an infobar when viewing a saved page'\"\n\t},\n\t\"optionInfobarTemplate\": {\n\t\t\"message\": \"信息欄內容模板\",\n\t\t\"description\": \"Options page label: 'template of the infobar content'\"\n\t},\n\t\"optionBlockMixedContent\": {\n\t\t\"message\": \"攔截混合內容\",\n\t\t\"description\": \"Options page label: 'block mixed content'\"\n\t},\n\t\"optionSaveOriginalURLs\": {\n\t\t\"message\": \"保存嵌入資源的原始網址\",\n\t\t\"description\": \"Options page label: 'save original URLs of embedded resources'\"\n\t},\n\t\"optionIncludeInfobar\": {\n\t\t\"message\": \"將信息欄嵌入到保存的頁面中\",\n\t\t\"description\": \"Options page label: 'include the infobar in the saved page'\"\n\t},\n\t\"optionOpenInfobar\": {\n\t\t\"message\": \"查看已保存頁面時使信息欄為打開狀態\",\n\t\t\"description\": \"Options page label: 'keep infobar open'\"\n\t},\n\t\"optionRemoveInfobarSavedDate\": {\n\t\t\"message\": \"不包括保存日期\",\n\t\t\"description\": \"Options page label: 'do not include the saved date'\"\n\t},\n\t\"optionConfirmInfobar\": {\n\t\t\"message\": \"打開提示對話框編輯信息欄內容\",\n\t\t\"description\": \"Options page label: 'open a prompt dialog to edit the infobar content'\"\n\t},\n\t\"optionAutoClose\": {\n\t\t\"message\": \"頁面保存後自動關閉該標籤頁\",\n\t\t\"description\": \"Options page label: 'auto-close the tab after the page is saved'\"\n\t},\n\t\"optionCustomShortcut\": {\n\t\t\"message\": \"自定義快捷鍵命令\",\n\t\t\"description\": \"Options page label: 'keyboard shortcut command'\"\n\t},\n\t\"optionCustomShortcutDefault\": {\n\t\t\"message\": \"默認快捷鍵\",\n\t\t\"description\": \"Options page label: 'default shortcut'\"\n\t},\n\t\"optionsFileNameSubTitle\": {\n\t\t\"message\": \"文件名\",\n\t\t\"description\": \"Options sub-title: 'File name'\"\n\t},\n\t\"optionFilenameTemplate\": {\n\t\t\"message\": \"模板\",\n\t\t\"description\": \"Options page label: 'template'\"\n\t},\n\t\"optionFilenameMaxLength\": {\n\t\t\"message\": \"最大長度\",\n\t\t\"description\": \"Options page label: 'max length'\"\n\t},\n\t\"optionFilenameMaxLengthBytesUnit\": {\n\t\t\"message\": \"字節\",\n\t\t\"description\": \"Options page label: 'bytes'\"\n\t},\n\t\"optionFilenameMaxLengthCharsUnit\": {\n\t\t\"message\": \"字符\",\n\t\t\"description\": \"Options page label: 'characters'\"\n\t},\n\t\"optionFilenameReplacementCharacter\": {\n\t\t\"message\": \"替換字符\",\n\t\t\"description\": \"Options page label: 'replacement character'\"\n\t},\n\t\"optionReplaceEmojisInFilename\": {\n\t\t\"message\": \"用文字替換表情符號\",\n\t\t\"description\": \"Options page label: 'replace emojis with text'\"\n\t},\n\t\"optionSaveFilenameTemplateData\": {\n\t\t\"message\": \"將文件名模板數據保存到頁面中\",\n\t\t\"description\": \"Options page label: 'save the filename template data into the page'\"\n\t},\n\t\"optionConfirmFilename\": {\n\t\t\"message\": \"打開 “另存為” 對話框以確認文件名\",\n\t\t\"description\": \"Options page label: 'open the \\\"Save as\\\" dialog to confirm the file name'\"\n\t},\n\t\"optionFilenameConflictAction\": {\n\t\t\"message\": \"文件名衝突解決方案\",\n\t\t\"description\": \"Options page label: 'filename conflict resolution'\"\n\t},\n\t\"optionFilenameConflictActionUniquify\": {\n\t\t\"message\": \"創建一個唯一名稱\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'create a unique name'\"\n\t},\n\t\"optionFilenameConflictActionOverwrite\": {\n\t\t\"message\": \"覆蓋現有文件\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'overwrite the existing file'\"\n\t},\n\t\"optionFilenameConflictActionPrompt\": {\n\t\t\"message\": \"指定一個新名稱\",\n\t\t\"description\": \"Value for 'name conflict resolution' option: 'prompt for a name'\"\n\t},\n\t\"optionFilenameConflictActionSkip\": {\n\t\t\"message\": \"跳過重複文件\",\n\t\t\"description\": \"Value for 'filename conflict resolution' option: 'skip duplicate files'\"\n\t},\n\t\"optionsHTMLContentSubTitle\": {\n\t\t\"message\": \"HTML 內容\",\n\t\t\"description\": \"Options sub-title: 'HTML content'\"\n\t},\n\t\"optionCompressHTML\": {\n\t\t\"message\": \"壓縮 HTML 內容\",\n\t\t\"description\": \"Options page label: 'compress HTML content'\"\n\t},\n\t\"optionRemoveFrames\": {\n\t\t\"message\": \"移除框架\",\n\t\t\"description\": \"Options page label: 'remove frames'\"\n\t},\n\t\"optionRemoveHiddenElements\": {\n\t\t\"message\": \"移除隱藏元素\",\n\t\t\"description\": \"Options page label: 'remove hidden elements'\"\n\t},\n\t\"optionRemovedElementsSelector\": {\n\t\t\"message\": \"移除特定元素\",\n\t\t\"description\": \"Options page label: 'remove specific elements'\"\n\t},\n\t\"optionsFileFormatSubTitle\": {\n\t\t\"message\": \"文件格式\",\n\t\t\"description\": \"Options sub-title: 'File format'\"\n\t},\n\t\"optionFileFormat\": {\n\t\t\"message\": \"格式\",\n\t\t\"description\": \"Options page label: 'format'\"\n\t},\n\t\"optionFileFormatSelectHTML\": {\n\t\t\"message\": \"HTML\",\n\t\t\"description\": \"Options page label: 'HTML'\"\n\t},\n\t\"optionFileFormatSelectSelfExtractingUniversal\": {\n\t\t\"message\": \"自解壓縮 ZIP（通用）\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP (universal)'\"\n\t},\n\t\"optionFileFormatSelectSelfExtracting\": {\n\t\t\"message\": \"自解壓縮 ZIP\",\n\t\t\"description\": \"Options page label: 'self-extracting ZIP'\"\n\t},\n\t\"optionFileFormatSelectZIP\": {\n\t\t\"message\": \"ZIP\",\n\t\t\"description\": \"Options page label: 'ZIP'\"\n\t},\n\t\"optionPassword\": {\n\t\t\"message\": \"密碼\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionCreateRootDirectory\": {\n\t\t\"message\": \"創建根目錄\",\n\t\t\"description\": \"Options page label: 'create a root directory'\"\n\t},\n\t\"optionDisableCompression\": {\n\t\t\"message\": \"禁用壓縮\",\n\t\t\"description\": \"Options page label: 'disable compression'\"\n\t},\n\t\"optionPreventAppendedData\": {\n\t\t\"message\": \"不要在 ZIP 數據後添加數據\",\n\t\t\"description\": \"Options page label: 'do not append data after the ZIP data'\"\n\t},\n\t\"optionInsertTextBody\": {\n\t\t\"message\": \"使文本可被搜索\",\n\t\t\"description\": \"Options page label: 'make text searchable'\"\n\t},\n\t\"optionInsertEmbeddedImage\": {\n\t\t\"message\": \"嵌入圖片\",\n\t\t\"description\": \"Options page label: 'embed image'\"\n\t},\n\t\"optionInsertEmbeddedScreenshotImage\": {\n\t\t\"message\": \"網頁截圖\",\n\t\t\"description\": \"Options page label: 'page screenshot'\"\n\t},\n\t\"optionInsertEmbeddedCustomImage\": {\n\t\t\"message\": \"自定義圖片\",\n\t\t\"description\": \"Options page label: 'custom image'\"\n\t},\n\t\"optionsInfobarSubTitle\": {\n\t\t\"message\": \"信息欄\",\n\t\t\"description\": \"Options sub-title: 'Infobar'\"\n\t},\n\t\"optionsImagesSubTitle\": {\n\t\t\"message\": \"圖片\",\n\t\t\"description\": \"Options sub-title: 'Images'\"\n\t},\n\t\"optionGroupDuplicateImages\": {\n\t\t\"message\": \"將重複圖片分組到一起\",\n\t\t\"description\": \"Options page label: 'group duplicate images together'\"\n\t},\n\t\"optionImageReductionFactor\": {\n\t\t\"message\": \"圖片縮小係數\",\n\t\t\"description\": \"Options page label: 'image reduction factor'\"\n\t},\n\t\"optionLoadDeferredImages\": {\n\t\t\"message\": \"保存延遲加載的圖片\",\n\t\t\"description\": \"Options page label: 'save deferred images'\"\n\t},\n\t\"optionLoadDeferredImagesMaxIdleTime\": {\n\t\t\"message\": \"最長空閒時間（毫秒）\",\n\t\t\"description\": \"Options page label: 'maximum idle time (ms)'\"\n\t},\n\t\"optionLoadDeferredImagesKeepZoomLevel\": {\n\t\t\"message\": \"縮小頁面\",\n\t\t\"description\": \"Options page label: 'zoom out the page'\"\n\t},\n\t\"optionLoadDeferredImagesDispatchScrollEvent\": {\n\t\t\"message\": \"觸發滾動事件\",\n\t\t\"description\": \"Options page label: 'dispatch \\\"scroll\\\" event'\"\n\t},\n\t\"optionLoadDeferredImagesBeforeFrames\": {\n\t\t\"message\": \"加載延遲框架\",\n\t\t\"description\": \"Options page label: 'load deferred frames'\"\n\t},\n\t\"optionRemoveAlternativeImages\": {\n\t\t\"message\": \"移除用於備選分辨率的圖片\",\n\t\t\"description\": \"Options page label: 'remove images for alternative screen resolutions'\"\n\t},\n\t\"optionsFontsSubTitle\": {\n\t\t\"message\": \"字體\",\n\t\t\"description\": \"Options sub-title: 'Fonts'\"\n\t},\n\t\"optionRemoveUnusedFonts\": {\n\t\t\"message\": \"移除未使用字體\",\n\t\t\"description\": \"Options page label: 'remove unused fonts'\"\n\t},\n\t\"optionRemoveAlternativeFonts\": {\n\t\t\"message\": \"移除備選字體\",\n\t\t\"description\": \"Options page label: 'remove alternative fonts'\"\n\t},\n\t\"optionsStylesheetsSubTitle\": {\n\t\t\"message\": \"樣式表\",\n\t\t\"description\": \"Options sub-title: 'Stylesheets'\"\n\t},\n\t\"optionCompressCSS\": {\n\t\t\"message\": \"壓縮 CSS 內容\",\n\t\t\"description\": \"Options page label: 'compress CSS content'\"\n\t},\n\t\"optionGroupDuplicateStylesheets\": {\n\t\t\"message\": \"將重複樣式表分組到一起\",\n\t\t\"description\": \"Options page label: 'group duplicate stylesheets together'\"\n\t},\n\t\"optionMoveStylesInHead\": {\n\t\t\"message\": \"移動 head 標籤之外的樣式到其內\",\n\t\t\"description\": \"Options page label: 'move in the head element the styles found outside of it'\"\n\t},\n\t\"optionRemoveUnusedStyles\": {\n\t\t\"message\": \"移除未使用的樣式\",\n\t\t\"description\": \"Options page label: 'remove unused styles'\"\n\t},\n\t\"optionRemoveAlternativeMedias\": {\n\t\t\"message\": \"移除用於備選設備屏幕的樣式表\",\n\t\t\"description\": \"Options page label: 'remove stylesheets for alternative devices to screens'\"\n\t},\n\t\"optionsNetworkSubTitle\": {\n\t\t\"message\": \"網絡\",\n\t\t\"description\": \"Options sub-title: 'Network'\"\n\t},\n\t\"optionsBlockedResources\": {\n\t\t\"message\": \"攔截資源文件\",\n\t\t\"description\": \"Options page label: 'blocked resources'\"\n\t},\n\t\"optionsAcceptHeaders\": {\n\t\t\"message\": \"“Accept” 請求頭\",\n\t\t\"description\": \"Options page label: '\\\"Accept\\\" header'\"\n\t},\n\t\"optionResourceScript\": {\n\t\t\"message\": \"腳本\",\n\t\t\"description\": \"Options page label: 'scripts'\"\n\t},\n\t\"optionResourceVideo\": {\n\t\t\"message\": \"視頻\",\n\t\t\"description\": \"Options page label: 'videos'\"\n\t},\n\t\"optionResourceAudio\": {\n\t\t\"message\": \"音頻\",\n\t\t\"description\": \"Options page label: 'audios'\"\n\t},\n\t\"optionResourceDocument\": {\n\t\t\"message\": \"文檔\",\n\t\t\"description\": \"Options page label: 'documents'\"\n\t},\n\t\"optionResourceFont\": {\n\t\t\"message\": \"字體\",\n\t\t\"description\": \"Options page label: 'fonts'\"\n\t},\n\t\"optionResourceStylesheet\": {\n\t\t\"message\": \"樣式表\",\n\t\t\"description\": \"Options page label: 'stylesheets'\"\n\t},\n\t\"optionResourceImage\": {\n\t\t\"message\": \"圖片\",\n\t\t\"description\": \"Options page label: 'images'\"\n\t},\n\t\"optionsDestinationSubTitle\": {\n\t\t\"message\": \"保存位置\",\n\t\t\"description\": \"Options sub-title: 'Destination'\"\n\t},\n\t\"optionsBookmarkSubTitle\": {\n\t\t\"message\": \"書籤\",\n\t\t\"description\": \"Options sub-title: 'Bookmarks'\"\n\t},\n\t\"optionsAutoSaveSubTitle\": {\n\t\t\"message\": \"自動保存\",\n\t\t\"description\": \"Options sub-title: 'Auto-save'\"\n\t},\n\t\"optionsAutoSettingsSubTitle\": {\n\t\t\"message\": \"自動設置規則\",\n\t\t\"description\": \"Options sub-title: 'Auto-settings rules'\"\n\t},\n\t\"optionsDeleteDisplayedRulesConfirm\": {\n\t\t\"message\": \"確認刪除所有已顯示規則\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of all displayed rules'\"\n\t},\n\t\"optionsDeleteRulesTooltip\": {\n\t\t\"message\": \"刪除所有已顯示規則\",\n\t\t\"description\": \"Popup text 'Delete all displayed rules'\"\n\t},\n\t\"optionsAutoSettingsUrl\": {\n\t\t\"message\": \"網址\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'URL'\"\n\t},\n\t\"optionsAutoSettingsUrlPlaceholder\": {\n\t\t\"message\": \"輸入完整的或部分網址 （例如 example.com）\",\n\t\t\"description\": \"Placeholder in the Auto-settings rules: 'Type a complete or partial URL (e.g. example.com)'\"\n\t},\n\t\"optionsAutoSettingsProfile\": {\n\t\t\"message\": \"配置文件\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Profile'\"\n\t},\n\t\"optionsAutoSettingsAutoSaveProfile\": {\n\t\t\"message\": \"自動保存配置文件\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'Auto-save profile'\"\n\t},\n\t\"optionsAutoSettingsShowAllProfiles\": {\n\t\t\"message\": \"顯示所有配置文件\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display all profiles'\"\n\t},\n\t\"optionsAutoSettingsShowAutoSaveProfile\": {\n\t\t\"message\": \"顯示 “自動保存配置文件” 列\",\n\t\t\"description\": \"Options label in the Auto-settings rules: 'display 'Auto-save profile' column'\"\n\t},\n\t\"optionsUpdateRuleTooltip\": {\n\t\t\"message\": \"更新規則\",\n\t\t\"description\": \"Popup text 'Update the rule' in the options page\"\n\t},\n\t\"optionsDeleteRuleTooltip\": {\n\t\t\"message\": \"刪除規則\",\n\t\t\"description\": \"Popup text 'Delete the rule' in the options page\"\n\t},\n\t\"optionsAddRuleTooltip\": {\n\t\t\"message\": \"添加規則\",\n\t\t\"description\": \"Popup text 'Add the rule' in the options page\"\n\t},\n\t\"optionsValidateChangesTooltip\": {\n\t\t\"message\": \"驗證更改\",\n\t\t\"description\": \"Popup text 'Validate changes' in the options page\"\n\t},\n\t\"optionsCancelChangesTooltip\": {\n\t\t\"message\": \"取消更改\",\n\t\t\"description\": \"Popup text 'Cancel changes' in the options page\"\n\t},\n\t\"optionsDeleteRuleConfirm\": {\n\t\t\"message\": \"確認刪除所選規則\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected rule' in the options page\"\n\t},\n\t\"optionAutoSaveLoadOrUnload\": {\n\t\t\"message\": \"在頁面加載完成後或開始卸載時進行自動保存\",\n\t\t\"description\": \"auto-save after page load or on page unload\"\n\t},\n\t\"optionAutoSaveLoad\": {\n\t\t\"message\": \"在頁面加載完成後進行自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save after page load'\"\n\t},\n\t\"optionAutoSaveUnload\": {\n\t\t\"message\": \"在頁面開始卸載時進行自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save on page unload'\"\n\t},\n\t\"optionAutoSaveDiscard\": {\n\t\t\"message\": \"在頁面丟棄時進行自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save on tab discard'\"\n\t},\n\t\"optionAutoSaveRemove\": {\n\t\t\"message\": \"在頁面移除時進行自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save on tab removal'\"\n\t},\n\t\"optionAutoSaveDelay\": {\n\t\t\"message\": \"頁面加載完成後延遲該時間再進行自動保存（秒）\",\n\t\t\"description\": \"Options page label: 'auto-save waiting delay after page load (s)'\"\n\t},\n\t\"optionAutoSaveRepeat\": {\n\t\t\"message\": \"定期自動保存\",\n\t\t\"description\": \"Options page label: 'auto-save periodically'\"\n\t},\n\t\"optionAutoSaveRepeatDelay\": {\n\t\t\"message\": \"週期（秒）\",\n\t\t\"description\": \"Options page label: 'period (s)'\"\n\t},\n\t\"optionAutoSaveExternalSave\": {\n\t\t\"message\": \"使用 SingleFile Companion 保存頁面\",\n\t\t\"description\": \"Options page label: 'save the page with SingleFile Companion'\"\n\t},\n\t\"optionsEditorSubTitle\": {\n\t\t\"message\": \"標註編輯器\",\n\t\t\"description\": \"Options sub-title: 'Annotation editor'\"\n\t},\n\t\"optionOpenEditor\": {\n\t\t\"message\": \"在保存前對該頁面進行標註編輯\",\n\t\t\"description\": \"Options page label: 'annotate the page before saving'\"\n\t},\n\t\"optionOpenSavedPage\": {\n\t\t\"message\": \"在新標籤頁中打開保存後的頁面\",\n\t\t\"description\": \"Options page label: 'open saved pages in a new tab'\"\n\t},\n\t\"optionAutoOpenEditor\": {\n\t\t\"message\": \"在標註編輯器中打開用 SingleFile 保存的頁面\",\n\t\t\"description\": \"Options page label: 'open pages saved with SingleFile in the annotation editor'\"\n\t},\n\t\"optionDefaultEditorMode\": {\n\t\t\"message\": \"默認模式\",\n\t\t\"description\": \"Options page label: 'default mode'\"\n\t},\n\t\"optionDefaultEditorModeNormal\": {\n\t\t\"message\": \"常規\",\n\t\t\"description\": \"Options page label: 'default mode > normal'\"\n\t},\n\t\"optionDefaultEditorModeEdit\": {\n\t\t\"message\": \"編輯模式\",\n\t\t\"description\": \"Options page label: 'default mode > edit the page'\"\n\t},\n\t\"optionDefaultEditorModeFormat\": {\n\t\t\"message\": \"格式化頁面\",\n\t\t\"description\": \"Options page label: 'default mode > format the page'\"\n\t},\n\t\"optionDefaultEditorModeCut\": {\n\t\t\"message\": \"刪除內部文檔元素\",\n\t\t\"description\": \"Options page label: 'default mode > remove elements'\"\n\t},\n\t\"optionDefaultEditorModeCutExternal\": {\n\t\t\"message\": \"刪除外部文檔元素\",\n\t\t\"description\": \"Options page label: 'default mode > remove external elements'\"\n\t},\n\t\"optionApplySystemTheme\": {\n\t\t\"message\": \"在標註編輯器中打開頁面時應用系統主題樣式\",\n\t\t\"description\": \"Title of the button 'apply the system theme when formatting a page'\"\n\t},\n\t\"optionContentWidth\": {\n\t\t\"message\": \"格式化頁面時的內容寬度（em）\",\n\t\t\"description\": \"Options page label: 'content width when formatting a page (em)'\"\n\t},\n\t\"optionWarnUnsavedPage\": {\n\t\t\"message\": \"離開標註編輯器時提醒保存已修改的內容\",\n\t\t\"description\": \"Title of the button 'warn if leaving page with unsaved changes'\"\n\t},\n\t\"optionDisplayInfobarInEditor\": {\n\t\t\"message\": \"顯示信息欄\",\n\t\t\"description\": \"Title of the button 'display the infobar'\"\n\t},\n\t\"optionsMiscSubTitle\": {\n\t\t\"message\": \"雜項\",\n\t\t\"description\": \"Options sub-title: 'Misc.'\"\n\t},\n\t\"optionBackgroundSave\": {\n\t\t\"message\": \"在後臺保存頁面\",\n\t\t\"description\": \"Options page label: 'save pages in background'\"\n\t},\n\t\"optionDisplayStats\": {\n\t\t\"message\": \"處理完成後在控制檯中顯示統計數據\",\n\t\t\"description\": \"Options page label: 'display stats in the console after processing'\"\n\t},\n\t\"optionSetMaxResourceSize\": {\n\t\t\"message\": \"限制資源文件大小\",\n\t\t\"description\": \"Options page label: 'set maximum size'\"\n\t},\n\t\"optionMaxResourceSize\": {\n\t\t\"message\": \"大小上限（兆字節）\",\n\t\t\"description\": \"Options page label: 'maximum size (MB)'\"\n\t},\n\t\"optionSetMaxResourceDelay\": {\n\t\t\"message\": \"限制資源文件下載超時時間\",\n\t\t\"description\": \"Options page label: 'set maximum download time'\"\n\t},\n\t\"optionMaxResourceDelay\": {\n\t\t\"message\": \"時間上限（秒）\",\n\t\t\"description\": \"Options page label: 'maximum download time (s)'\"\n\t},\n\t\"optionPassReferrerOnError\": {\n\t\t\"message\": \"跨域請求失敗時添加來源地址頭信息（Referer）\",\n\t\t\"description\": \"Options page label: 'pass \\\"Referer\\\" header after a cross-origin request error'\"\n\t},\n\t\"optionSaveRawPage\": {\n\t\t\"message\": \"保存原始頁面\",\n\t\t\"description\": \"Options page label: 'save raw page'\"\n\t},\n\t\"optionInsertMetaCSP\": {\n\t\t\"message\": \"設置內容安全策略\",\n\t\t\"description\": \"Options page label: 'set content security policy'\"\n\t},\n\t\"optionSaveToClipboard\": {\n\t\t\"message\": \"保存到剪切板\",\n\t\t\"description\": \"Options page label: 'copy to clipboard'\"\n\t},\n\t\"optionSaveToFilesystem\": {\n\t\t\"message\": \"保存到文件系統\",\n\t\t\"description\": \"Options page label: 'save to filesystem'\"\n\t},\n\t\"optionSharePage\": {\n\t\t\"message\": \"分享頁面\",\n\t\t\"description\": \"Options page label: 'share page'\"\n\t},\n\t\"optionAddProof\": {\n\t\t\"message\": \"添加證明文件存在的指紋\",\n\t\t\"description\": \"Options page label: 'add proof of existence'\"\n\t},\n\t\"optionsAddProofConfirm\": {\n\t\t\"message\": \"請確認您是否允許 SingleFile 將您要保存的每個頁面的 SHA256 哈希值發送給 Woleet API 。您可以在幫助頁面或者通過點擊該選項旁的問號找到此功能的更多信息。\",\n\t\t\"description\": \"Popup text displayed wen enabling the option 'add proof of existence'\"\n\t},\n\t\"optionWoleetKey\": {\n\t\t\"message\": \"訪問令牌\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionSaveToGDrive\": {\n\t\t\"message\": \"保存到 Google Drive\",\n\t\t\"description\": \"Options page label: 'upload to Google Drive'\"\n\t},\n\t\"optionSaveToDropbox\": {\n\t\t\"message\": \"保存到 Dropbox\",\n\t\t\"description\": \"Options page label: 'upload to Dropbox'\"\n\t},\n\t\"optionSaveToGitHub\": {\n\t\t\"message\": \"保存到 GitHub\",\n\t\t\"description\": \"Options page label: 'upload to GitHub'\"\n\t},\n\t\"optionGitHubToken\": {\n\t\t\"message\": \"訪問令牌\",\n\t\t\"description\": \"Options page label: 'access token'\"\n\t},\n\t\"optionGitHubUser\": {\n\t\t\"message\": \"用戶名\",\n\t\t\"description\": \"Options page label: 'user name'\"\n\t},\n\t\"optionGitHubRepository\": {\n\t\t\"message\": \"倉庫名稱\",\n\t\t\"description\": \"Options page label: 'repository name'\"\n\t},\n\t\"optionGitHubBranch\": {\n\t\t\"message\": \"分支名稱\",\n\t\t\"description\": \"Options page label: 'branch name'\"\n\t},\n\t\"optionSaveToS3\": {\n\t\t\"message\": \"保存到 Amazon S3\",\n\t\t\"description\": \"Options page label: 'upload to Amazon S3'\"\n\t},\n\t\"optionS3Domain\": {\n\t\t\"message\": \"域名\",\n\t\t\"description\": \"Options page label: 'domain'\"\n\t},\n\t\"optionS3Region\": {\n\t\t\"message\": \"區域\",\n\t\t\"description\": \"Options page label: 'region'\"\n\t},\n\t\"optionS3Bucket\": {\n\t\t\"message\": \"存儲桶名稱\",\n\t\t\"description\": \"Options page label: 'bucket name'\"\n\t},\n\t\"optionS3AccessKey\": {\n\t\t\"message\": \"訪問密鑰\",\n\t\t\"description\": \"Options page label: 'access key'\"\n\t},\n\t\"optionS3SecretKey\": {\n\t\t\"message\": \"密鑰\",\n\t\t\"description\": \"Options page label: 'secret key'\"\n\t},\n\t\"optionSaveWithWebDAV\": {\n\t\t\"message\": \"保存到 WebDAV 服務器\",\n\t\t\"description\": \"Options page label: 'upload to a WebDAV server'\"\n\t},\n\t\"optionWebDAVURL\": {\n\t\t\"message\": \"地址\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionWebDAVUser\": {\n\t\t\"message\": \"用戶名\",\n\t\t\"description\": \"Options page label: 'user identifier'\"\n\t},\n\t\"optionWebDAVPassword\": {\n\t\t\"message\": \"密碼\",\n\t\t\"description\": \"Options page label: 'password'\"\n\t},\n\t\"optionSaveWithMCP\": {\n\t\t\"message\": \"保存到 MCP 服務器\",\n\t\t\"description\": \"Options page label: 'upload to an MCP server'\"\n\t},\n\t\"optionMCPServerUrl\": {\n\t\t\"message\": \"服務器地址\",\n\t\t\"description\": \"Options page label: 'server URL'\"\n\t},\n\t\"optionMCPAuthToken\": {\n\t\t\"message\": \"認證令牌\",\n\t\t\"description\": \"Options page label: 'authentication token'\"\n\t},\n\t\"optionSaveWithCompanion\": {\n\t\t\"message\": \"使用 SingleFile Companion 保存\",\n\t\t\"description\": \"Options page label: 'save with SingleFile Companion'\"\n\t},\n\t\"optionSaveCreatedBookmarks\": {\n\t\t\"message\": \"創建新書籤時保存其對應頁面\",\n\t\t\"description\": \"Options page label: 'save the page of a newly created bookmark'\"\n\t},\n\t\"optionReplaceBookmarkURL\": {\n\t\t\"message\": \"將新書籤的鏈接指向已保存頁面\",\n\t\t\"description\": \"Options page label: 'link the new bookmark to the saved page'\"\n\t},\n\t\"optionAllowedBookmarkFolders\": {\n\t\t\"message\": \"允許文件夾\",\n\t\t\"description\": \"Options page label: 'allowed folders'\"\n\t},\n\t\"optionIgnoredBookmarkFolders\": {\n\t\t\"message\": \"忽略文件夾\",\n\t\t\"description\": \"Options page label: 'ignored folders'\"\n\t},\n\t\"optionsHelpLink\": {\n\t\t\"message\": \"幫助\",\n\t\t\"description\": \"Options help link\"\n\t},\n\t\"optionSynchronize\": {\n\t\t\"message\": \"同步選項\",\n\t\t\"description\": \"Options label: 'synchronize options'\"\n\t},\n\t\"optionsResetButton\": {\n\t\t\"message\": \"重置\",\n\t\t\"description\": \"Options button: 'Reset'\"\n\t},\n\t\"optionsResetTooltip\": {\n\t\t\"message\": \"重置所有選項為默認值\",\n\t\t\"description\": \"Options 'Reset' button tooltip\"\n\t},\n\t\"optionsResetConfirm\": {\n\t\t\"message\": \"確認重置所有選項或當前配置文件\",\n\t\t\"description\": \"Popup text 'Confirm the reset of all options or the current profile' in the options page\"\n\t},\n\t\"optionsResetAllButton\": {\n\t\t\"message\": \"重置所有選項\",\n\t\t\"description\": \"Options confirm button: 'Reset all options'\"\n\t},\n\t\"optionsResetCurrentButton\": {\n\t\t\"message\": \"重置當前配置文件\",\n\t\t\"description\": \"Options confirm button: 'Reset current profile'\"\n\t},\n\t\"optionsOKButton\": {\n\t\t\"message\": \"確定\",\n\t\t\"description\": \"Options confirm button: 'OK'\"\n\t},\n\t\"optionsCancelButton\": {\n\t\t\"message\": \"取消\",\n\t\t\"description\": \"Options confirm button: 'Cancel'\"\n\t},\n\t\"optionsExportButton\": {\n\t\t\"message\": \"導出\",\n\t\t\"description\": \"Options button: 'Export'\"\n\t},\n\t\"optionsImportButton\": {\n\t\t\"message\": \"導入\",\n\t\t\"description\": \"Options button: 'Import'\"\n\t},\n\t\"logPanelDeferredImages\": {\n\t\t\"message\": \"延遲加載的圖片\",\n\t\t\"description\": \"Label 'Deferred images' in the log panel\"\n\t},\n\t\"logPanelFrameContents\": {\n\t\t\"message\": \"框架內容\",\n\t\t\"description\": \"Label 'Frame contents' in the log panel\"\n\t},\n\t\"logPanelEmbeddedImage\": {\n\t\t\"message\": \"嵌入圖片\",\n\t\t\"description\": \"Label 'Embedded image' in the log panel\"\n\t},\n\t\"logPanelStep\": {\n\t\t\"message\": \"步驟\",\n\t\t\"description\": \"Label 'Step' (for 'Step x / 4') in the log panel\"\n\t},\n\t\"logPanelWidth\": {\n\t\t\"message\": \"122\",\n\t\t\"description\": \"Width of the log panel in pixels, it should be adjusted for the longest label beginning with 'log' (e.g. 'logPanelDeferredImages')\"\n\t},\n\t\"topPanelError\": {\n\t\t\"message\": \"SingleFile 錯誤：\",\n\t\t\"description\": \"Label 'SingleFile error: ' in the top panel when displaying an error message\"\n\t},\n\t\"topPanelEmbeddedImageButton\": {\n\t\t\"message\": \"打開圖片...\",\n\t\t\"description\": \"Top panel button 'Open image...' when embedding an image\"\n\t},\n\t\"topPanelSharePageButton\": {\n\t\t\"message\": \"分享頁面...\",\n\t\t\"description\": \"Top panel button 'Share page...' when sharing a page\"\n\t},\n\t\"topPanelShareSelectionButton\": {\n\t\t\"message\": \"分享選中內容...\",\n\t\t\"description\": \"Top panel button 'Share selection...' when sharing selected content\"\n\t},\n\t\"profileDefaultSettings\": {\n\t\t\"message\": \"默認設置\",\n\t\t\"description\": \"Label 'Default settings' of the default settings in the options page\"\n\t},\n\t\"profileDisabled\": {\n\t\t\"message\": \"已禁用\",\n\t\t\"description\": \"Label 'Disabled' of the disabled profile name in the options page\"\n\t},\n\t\"profileAddButtonTooltip\": {\n\t\t\"message\": \"新增配置文件\",\n\t\t\"description\": \"Tooltip 'Add a new profile' in the options page\"\n\t},\n\t\"profileRenameButtonTooltip\": {\n\t\t\"message\": \"重命名配置文件\",\n\t\t\"description\": \"Tooltip 'Rename the profile' in the options page\"\n\t},\n\t\"profileDeleteButtonTooltip\": {\n\t\t\"message\": \"刪除配置文件\",\n\t\t\"description\": \"Tooltip 'Delete the profile' in the options page\"\n\t},\n\t\"profileAddPrompt\": {\n\t\t\"message\": \"新增配置文件\",\n\t\t\"description\": \"Popup text 'Enter a name for this new profile' in the options page\"\n\t},\n\t\"profileDeleteConfirm\": {\n\t\t\"message\": \"確認刪除所選配置文件？\",\n\t\t\"description\": \"Popup text 'Confirm the deletion of the selected profile' in the options page\"\n\t},\n\t\"profileRenamePrompt\": {\n\t\t\"message\": \"重命名配置文件\",\n\t\t\"description\": \"Popup text 'Enter a new name for the selected profile' in the options page\"\n\t},\n\t\"editorAddYellowNote\": {\n\t\t\"message\": \"添加黃色標註\",\n\t\t\"description\": \"Title of the button 'Add a yellow note' in the editor\"\n\t},\n\t\"editorAddPinkNote\": {\n\t\t\"message\": \"添加粉色標註\",\n\t\t\"description\": \"Title of the button 'Add a pink note' in the editor\"\n\t},\n\t\"editorAddBlueNote\": {\n\t\t\"message\": \"添加藍色標註\",\n\t\t\"description\": \"Title of the button 'Add a blue note' in the editor\"\n\t},\n\t\"editorAddGreenNote\": {\n\t\t\"message\": \"添加綠色標註\",\n\t\t\"description\": \"Title of the button 'Add a green note' in the editor\"\n\t},\n\t\"editorHighlightYellow\": {\n\t\t\"message\": \"將所選文本高亮為黃色\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in yellow' in the editor\"\n\t},\n\t\"editorHighlightPink\": {\n\t\t\"message\": \"將所選文本高亮為粉色\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in pink' in the editor\"\n\t},\n\t\"editorHighlightBlue\": {\n\t\t\"message\": \"將所選文本高亮為藍色\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in blue' in the editor\"\n\t},\n\t\"editorHighlightGreen\": {\n\t\t\"message\": \"將所選文本高亮為綠色\",\n\t\t\"description\": \"Title of the button 'Highlight selected text in green' in the editor\"\n\t},\n\t\"editorToggleNotes\": {\n\t\t\"message\": \"顯示/隱藏 標註\",\n\t\t\"description\": \"Title of the button 'Display/hide notes' in the editor\"\n\t},\n\t\"editorToggleHighlights\": {\n\t\t\"message\": \"顯示/隱藏 高亮文本\",\n\t\t\"description\": \"Title of the button 'Display/hide the highlighted text' in the editor\"\n\t},\n\t\"editorRemoveHighlight\": {\n\t\t\"message\": \"移除所選高亮文本\",\n\t\t\"description\": \"Title of the button 'Remove the selected highlighted text' in the editor\"\n\t},\n\t\"editorEditPage\": {\n\t\t\"message\": \"啟用/禁用 編輯模式\",\n\t\t\"description\": \"Title of the button 'Enable/disable read-only' in the editor\"\n\t},\n\t\"editorFormatPage\": {\n\t\t\"message\": \"格式化頁面以提升可讀性\",\n\t\t\"description\": \"Title of the button 'Format the page for better readability' in the editor\"\n\t},\n\t\"editorCutInnerPage\": {\n\t\t\"message\": \"啟用/禁用 點擊時刪除內部文檔元素\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of internal elements' in the editor\"\n\t},\n\t\"editorCutOuterPage\": {\n\t\t\"message\": \"啟用/禁用 點擊時刪除外部文檔元素\",\n\t\t\"description\": \"Title of the button 'Enable/disable removing of external elements' in the editor\"\n\t},\n\t\"editorUndoCutPage\": {\n\t\t\"message\": \"撤銷上次移除元素的操作\",\n\t\t\"description\": \"Title of the button 'Restore last removed element' in the editor\"\n\t},\n\t\"editorUndoAllCutPage\": {\n\t\t\"message\": \"撤銷所有移除元素的操作\",\n\t\t\"description\": \"Title of the button 'Restore all removed elements' in the editor\"\n\t},\n\t\"editorRedoCutPage\": {\n\t\t\"message\": \"恢復上次移除元素的操作\",\n\t\t\"description\": \"Title of the button 'Remove last restored element' in the editor\"\n\t},\n\t\"editorSavePage\": {\n\t\t\"message\": \"保存該頁面\",\n\t\t\"description\": \"Title of the button 'Save the page' in the editor\"\n\t},\n\t\"editorPrintPage\": {\n\t\t\"message\": \"打印頁面\",\n\t\t\"description\": \"Title of the button 'Print the page' in the editor\"\n\t},\n\t\"editorImportMht\": {\n\t\t\"message\": \"導入 MHTML 文件\",\n\t\t\"description\": \"Title of the button 'Import MHTML file' in the editor\"\n\t},\n\t\"pendingsTitle\": {\n\t\t\"message\": \"掛起保存項\",\n\t\t\"description\": \"Title of the pending save page 'Pending saves' in the editor\"\n\t},\n\t\"pendingsCancelAllButton\": {\n\t\t\"message\": \"取消全部\",\n\t\t\"description\": \"Pending saves button 'Cancel all'\"\n\t},\n\t\"pendingsURLTitle\": {\n\t\t\"message\": \"網址\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'URL'\"\n\t},\n\t\"pendingsTitleTitle\": {\n\t\t\"message\": \"標題\",\n\t\t\"description\": \"Title of the first column in the table of the pending saves 'Title'\"\n\t},\n\t\"pendingsStatusTitle\": {\n\t\t\"message\": \"狀態\",\n\t\t\"description\": \"Title of the second column in the table of the pending saves 'status'\"\n\t},\n\t\"pendingsPendingStatus\": {\n\t\t\"message\": \"正在掛起\",\n\t\t\"description\": \"Value of 'status' for pending saves\"\n\t},\n\t\"pendingsProcessingStatus\": {\n\t\t\"message\": \"正在處理\",\n\t\t\"description\": \"Value of 'status' for current saves\"\n\t},\n\t\"pendingsCancellingStatus\": {\n\t\t\"message\": \"正在取消\",\n\t\t\"description\": \"Value of 'status' for cancelled saves\"\n\t},\n\t\"pendingsNoPendings\": {\n\t\t\"message\": \"沒有掛起中的保存項\",\n\t\t\"description\": \"Label displayed when they are no pending saves\"\n\t},\n\t\"pendingsAddUrlsButton\": {\n\t\t\"message\": \"添加網址\",\n\t\t\"description\": \"button 'Add URLs'\"\n\t},\n\t\"pendingsAddUrls\": {\n\t\t\"message\": \"請按行輸入網址列表\",\n\t\t\"description\": \"Label of the add URLs input\"\n\t},\n\t\"pendingsAddUrlsOKButton\": {\n\t\t\"message\": \"確定\",\n\t\t\"description\": \"Add URLs popup confirm button: 'OK'\"\n\t},\n\t\"pendingsAddUrlsCancelButton\": {\n\t\t\"message\": \"取消\",\n\t\t\"description\": \"Add URLs popup cancel button: 'Cancel'\"\n\t},\n\t\"batchSaveUrlsTitle\": {\n\t\t\"message\": \"批量保存網址\",\n\t\t\"description\": \"Title of the 'batch save URLs' page\"\n\t},\n\t\"batchSaveUrlsNoURLs\": {\n\t\t\"message\": \"無網址\",\n\t\t\"description\": \"Label displayed when they are no URLs\"\n\t},\n\t\"batchSaveUrlsAddUrlButton\": {\n\t\t\"message\": \"添加網址\",\n\t\t\"description\": \"label of the button 'Add URL'\"\n\t},\n\t\"batchSaveUrlsAddUrlsButton\": {\n\t\t\"message\": \"添加多個網址...\",\n\t\t\"description\": \"label of the button 'Add URLs...'\"\n\t},\n\t\"batchSaveUrlsRemoveAllButton\": {\n\t\t\"message\": \"刪除所有\",\n\t\t\"description\": \"label of the button 'Remove all'\"\n\t},\n\t\"batchSaveUrlsSavePagesButton\": {\n\t\t\"message\": \"保存頁面\",\n\t\t\"description\": \"label of the button 'Save pages'\"\n\t},\n\t\"batchSaveUrlsURLTitle\": {\n\t\t\"message\": \"網址\",\n\t\t\"description\": \"Title of the column in the table of the URLs\"\n\t},\n\t\"optionSaveToRestFormApi\": {\n\t\t\"message\": \"保存到 REST 表單 API\",\n\t\t\"description\": \"Options page label: 'upload to a REST Form API'\"\n\t},\n\t\"optionRestFormApiUrl\": {\n\t\t\"message\": \"網址\",\n\t\t\"description\": \"Options page label: 'URL'\"\n\t},\n\t\"optionRestFormApiToken\": {\n\t\t\"message\": \"授權令牌\",\n\t\t\"description\": \"Options page label: 'authorization token'\"\n\t},\n\t\"optionRestFormApiFileFieldName\": {\n\t\t\"message\": \"文件字段名稱\",\n\t\t\"description\": \"Options page label: 'archive data field name'\"\n\t},\n\t\"optionRestFormApiUrlFieldName\": {\n\t\t\"message\": \"網址字段名稱\",\n\t\t\"description\": \"Options page label: 'archive URL field name'\"\n\t},\n\t\"optionsEditorTitle\": {\n\t\t\"message\": \"選項編輯器\",\n\t\t\"description\": \"Options title: 'Options editor'\"\n\t},\n\t\"optionsEditorSaveButton\": {\n\t\t\"message\": \"保存\",\n\t\t\"description\": \"Options editor button: 'Save'\"\n\t},\n\t\"optionsEditorConfigSaved\": {\n\t\t\"message\": \"配置已保存\",\n\t\t\"description\": \"Options editor message: 'Configuration saved'\"\n\t},\n\t\"optionsEditorInvalidJSON\": {\n\t\t\"message\": \"無效的 JSON\",\n\t\t\"description\": \"Options editor error message: 'Invalid JSON'\"\n\t}\n}"
  },
  {
    "path": "build-dev.sh",
    "content": "#!/bin/bash\n\nnpx rollup -c rollup.config.dev.js\n\ncat lib/chrome-browser-polyfill.js lib/single-file-frames.js lib/single-file-extension-frames.js > lib/single-file-frames.bundle.js\ncat lib/chrome-browser-polyfill.js lib/single-file-bootstrap.js lib/single-file-extension-bootstrap.js lib/single-file-infobar.js > lib/single-file-bootstrap.bundle.js"
  },
  {
    "path": "build-extension.sh",
    "content": "#!/bin/bash\n\ndpkg -s zip &> /dev/null\nif [ $? -ne 0 ]\nthen\n    if ! command -v zip &> /dev/null; then\n        echo \"Installing zip\"\n        sudo apt install zip\n    fi\nfi\n\ndpkg -s jq &> /dev/null\nif [ $? -ne 0 ]\nthen\n    if ! command -v jq &> /dev/null; then\n        echo \"Installing jq\"\n        sudo apt install jq\n    fi\nfi\n\nnpm install\nnpm update\n\n./build.sh\n\nrm singlefile-extension-chromium.zip singlefile-extension-edge.zip\n\nzip -r singlefile-extension-chromium.zip manifest.json lib _locales src\n\ncp src/core/bg/config.js config.copy.js\ncp manifest.json manifest.copy.json\njq 'del(.oauth2)' manifest.json > manifest.tmp.json && mv manifest.tmp.json manifest.json\nsed -i \"\" 's/forceWebAuthFlow: false/forceWebAuthFlow: true/g' src/core/bg/config.js\nsed -i \"\" 's/image\\/avif,//g' src/core/bg/config.js\nzip -r singlefile-extension-edge.zip manifest.json lib _locales src\nmv config.copy.js src/core/bg/config.js\nmv manifest.copy.json manifest.json"
  },
  {
    "path": "build.sh",
    "content": "#!/bin/bash\n\nnpx rollup -c rollup.config.js\n\ncat lib/chrome-browser-polyfill.js lib/single-file-frames.js lib/single-file-extension-frames.js > lib/single-file-frames.bundle.js\ncat lib/chrome-browser-polyfill.js lib/single-file-bootstrap.js lib/single-file-extension-bootstrap.js lib/single-file-infobar.js > lib/single-file-bootstrap.bundle.js"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import js from \"@eslint/js\";\n\nexport default [\n\tjs.configs.recommended,\n\t{\n\t\tlanguageOptions: {\n\t\t\tecmaVersion: 2025,\n\t\t\tsourceType: \"module\",\n\t\t\tglobals: {\n\t\t\t\tconsole: \"readonly\",\n\t\t\t}\n\t\t},\n\t\trules: {\n\t\t\t\"linebreak-style\": [\n\t\t\t\t\"error\",\n\t\t\t\t\"unix\"\n\t\t\t],\n\t\t\t\"quotes\": [\n\t\t\t\t\"error\",\n\t\t\t\t\"double\"\n\t\t\t],\n\t\t\t\"semi\": [\n\t\t\t\t\"error\",\n\t\t\t\t\"always\"\n\t\t\t],\n\t\t\t\"no-console\": [\n\t\t\t\t\"warn\"\n\t\t\t]\n\t\t}\n\t}\n];\n"
  },
  {
    "path": "faq.md",
    "content": "# FAQ\r\n\r\n## What does SingleFile do?\r\nSingleFile is a browser extension designed to help users save web pages as complete, self-contained files. The extension's primary function is to capture an entire web page, including its HTML, CSS, JavaScript, images, and other resources, and package them into a single HTML file.\r\n\r\n## I am a web archivist, is it ok to use SingleFile to archive content?\r\nNo, SingleFile is not a tool used by professionals to archive content on the Web, especially in the academic field. Professionals prefer to rely on tools based on the [WARC specification](https://iipc.github.io/warc-specifications/) instead. \r\n\r\n## Does SingleFile upload any data to third-party servers?\r\nAs stated in the [privacy policy](https://github.com/gildas-lormeau/SingleFile/blob/master/privacy.md), SingleFile does not upload any data to third-party servers. All the work is done in your browser. However, when you save a page with SingleFile, it can download resources (images, CSS, frame contents, fonts etc.) that are not displayed or not already cached but present in the page.\r\n\r\n## Why can't I save some pages like https://addons.mozilla.org/addon/single-file?\r\nFor security purposes, browsers block web extensions on certain domains. This prevents a malicious extension to remove or change bad reviews, for example.\r\n\r\n## Why aren't images saved on sites like sspai.com or weibo.com?\r\nThese sites require the HTTP header \"referer\" to be present in order to download images.  For privacy reasons, this feature is not enabled by default in SingleFile. To enable it, you need to check the option \"Network > pass \"Referer\" header after a cross-origin request error\".\r\n\r\n## Why don't interactive elements like folding titles, dynamic maps or carousels work properly in saved pages?\r\nThese elements need JavaScript to work properly. By default, SingleFile removes scripts because they can alter the rendering and there is no guarantee they will work offline. However, you can save them by unchecking the option \"Network > blocked resources > scripts\", and optionally  unchecking \"HTML Content > remove hidden elements\", unchecking \"Stylesheets > remove unused styles\", and checking the option \"HTML content > save raw page\".\r\n\r\n## Why isn't the infobar displayed / Why cannot I save a page from the filesystem in Chrome?\r\nBy default, Chrome extensions are not allowed to access to pages stored on the filesystem. Therefore, you must enable the option \"Allow access to file URLs\" in the extension page to display the infobar when viewing a saved page, or to save a page stored on the filesystem.\r\n\r\n## How does the self-extracting ZIP format work?\r\nThe self-extracting ZIP files created by SingleFile are essentially regular ZIP files. They take advantage of the flexibility in the ZIP specification, which allows for additional data to be included before and after the ZIP payload. See this [presentation](https://github.com/gildas-lormeau/Polyglot-HTML-ZIP-PNG) for more info.\r\n\r\n## What are the permissions requested by SingleFile for?\r\nThe permissions requested by SingleFile are defined in the [manifest.json](https://github.com/gildas-lormeau/SingleFile/blob/master/manifest.json) file. Below are the reasons why they are necessary.\r\n - `identity`: allows SingleFile to connect to your Google Drive account.\r\n - `storage`: allows SingleFile to store your settings.\r\n - `contextMenus`: allows SingleFile to display an entry in the context menu of web pages.\r\n - `tabs` (all_urls): allows SingleFile to inject the code needed to process a page in any tab. This permission is needed for saving several tabs in one click, for example.\r\n - `downloads`: allows SingleFile to save pages as if they were downloaded from the web.\r\n - `clipboardWrite`: allows SingleFile to copy the content of a page into the clipboard instead of saving it.\r\n - `nativeMessaging`: allows you to use [SingleFile Companion](https://github.com/gildas-lormeau/single-file-companion) to save pages.\r\n\r\n## SingleFile is slow on my computer/tablet/phone, can it run faster?\r\nThe default configuration of SingleFile is optimized to produce small pages. This can sometimes slow down the save process considerably. Below are the options you can disable to save time and CPU.\r\n - HTML content > remove hidden elements\r\n - Stylesheets > remove unused styles\r\n\r\nYou can also disable the options below. Some resources (e.g. images, frames) on the page may be missing though.\r\n - HTML content > remove frames\r\n - Images > save deferred images\r\n\r\n## How to convert MHTML files to single HTML files?\r\nSee https://github.com/gildas-lormeau/mhtml-to-html.\r\n"
  },
  {
    "path": "lib/chrome-browser-polyfill.js",
    "content": "!function(){\"use strict\";\"undefined\"==typeof globalThis&&(window.globalThis=window),(()=>{const e=globalThis.chrome;globalThis.__defineGetter__(\"browser\",()=>({action:{onClicked:{addListener:t=>e.action.onClicked.addListener(t)},setBadgeText:t=>e.action.setBadgeText(t),setBadgeBackgroundColor:t=>e.action.setBadgeBackgroundColor(t),setTitle:t=>e.action.setTitle(t),setIcon:t=>e.action.setIcon(t)},bookmarks:{get:t=>e.bookmarks.get(t),onCreated:{addListener:t=>e.bookmarks.onCreated.addListener(t),removeListener:t=>e.bookmarks.onCreated.removeListener(t)},onChanged:{addListener:t=>e.bookmarks.onChanged.addListener(t),removeListener:t=>e.bookmarks.onChanged.removeListener(t)},onMoved:{addListener:t=>e.bookmarks.onMoved.addListener(t),removeListener:t=>e.bookmarks.onMoved.removeListener(t)},update:(t,n)=>e.bookmarks.update(t,n)},commands:{onCommand:{addListener:t=>e.commands.onCommand.addListener(t)}},downloads:{download:t=>e.downloads.download(t),onChanged:{addListener:t=>e.downloads.onChanged.addListener(t),removeListener:t=>e.downloads.onChanged.removeListener(t)},search:t=>e.downloads.search(t)},i18n:{getUILanguage:()=>e.i18n.getUILanguage(),getMessage:(t,n)=>e.i18n.getMessage(t,n)},identity:{getRedirectURL:()=>e.identity.getRedirectURL(),getAuthToken:t=>e.identity.getAuthToken(t),launchWebAuthFlow:t=>e.identity.launchWebAuthFlow(t),removeCachedAuthToken:t=>e.identity.removeCachedAuthToken(t)},contextMenus:{onClicked:{addListener:t=>e.contextMenus.onClicked.addListener(t)},create:t=>e.contextMenus.create(t),update:(t,n)=>e.contextMenus.update(t,n),removeAll:()=>e.contextMenus.removeAll()},permissions:{request:t=>e.permissions.request(t),remove:t=>e.permissions.remove(t)},runtime:{id:e.runtime.id,sendNativeMessage:(t,n)=>new Promise((r,o)=>{e.runtime.sendNativeMessage(t,n,t=>{e.runtime.lastError?o(e.runtime.lastError):r(t)})}),getManifest:()=>e.runtime.getManifest(),onMessage:{addListener:t=>e.runtime.onMessage.addListener((e,n,r)=>{const o=t(e,n);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{r(e)}catch(e){}}),!0}),removeListener:t=>e.runtime.onMessage.removeListener(t)},onMessageExternal:{addListener:t=>e.runtime.onMessageExternal.addListener((e,n,r)=>{const o=t(e,n);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{r(e)}catch(e){}}),!0})},sendMessage:t=>new Promise((n,r)=>{e.runtime.sendMessage(t,t=>{e.runtime.lastError?r(e.runtime.lastError):n(t)}),e.runtime.lastError&&r(e.runtime.lastError)}),getURL:t=>e.runtime.getURL(t),getContexts:t=>e.runtime.getContexts(t),get lastError(){return e.runtime.lastError}},scripting:{executeScript:t=>e.scripting.executeScript(t)},storage:{local:{set:t=>e.storage.local.set(t),get:t=>e.storage.local.get(t),clear:()=>e.storage.local.clear(),remove:t=>e.storage.local.remove(t)},sync:{set:t=>e.storage.sync.set(t),get:t=>e.storage.sync.get(t),clear:()=>e.storage.sync.clear(),remove:t=>e.storage.sync.remove(t)}},tabs:{onCreated:{addListener:t=>e.tabs.onCreated.addListener(t)},onActivated:{addListener:t=>e.tabs.onActivated.addListener(t)},onUpdated:{addListener:t=>e.tabs.onUpdated.addListener(t),removeListener:t=>e.tabs.onUpdated.removeListener(t)},onRemoved:{addListener:t=>e.tabs.onRemoved.addListener(t),removeListener:t=>e.tabs.onRemoved.removeListener(t)},onReplaced:{addListener:t=>e.tabs.onReplaced.addListener(t),removeListener:t=>e.tabs.onReplaced.removeListener(t)},captureVisibleTab:(t,n)=>e.tabs.captureVisibleTab(t,n),sendMessage:(t,n,r={})=>new Promise((o,s)=>{e.tabs.sendMessage(t,n,r,t=>{e.runtime.lastError?s(e.runtime.lastError):o(t)}),e.runtime.lastError&&s(e.runtime.lastError)}),query:t=>e.tabs.query(t),create:t=>e.tabs.create(t),get:t=>e.tabs.get(t),remove:t=>e.tabs.remove(t),update:(t,n)=>e.tabs.update(t,n)},devtools:{inspectedWindow:{onResourceContentCommitted:{addListener:t=>e.devtools.inspectedWindow.onResourceContentCommitted.addListener(t)},get tabId(){return e.devtools.inspectedWindow.tabId}}},offscreen:{createDocument:t=>e.offscreen.createDocument(t)},declarativeNetRequest:{updateSessionRules:t=>e.declarativeNetRequest.updateSessionRules(t)}}))})()}();\n"
  },
  {
    "path": "lib/single-file-background.js",
    "content": "!function(){\"use strict\";\"undefined\"==typeof globalThis&&(window.globalThis=window),(()=>{const e=globalThis.chrome;globalThis.__defineGetter__(\"browser\",()=>({action:{onClicked:{addListener:t=>e.action.onClicked.addListener(t)},setBadgeText:t=>e.action.setBadgeText(t),setBadgeBackgroundColor:t=>e.action.setBadgeBackgroundColor(t),setTitle:t=>e.action.setTitle(t),setIcon:t=>e.action.setIcon(t)},bookmarks:{get:t=>e.bookmarks.get(t),onCreated:{addListener:t=>e.bookmarks.onCreated.addListener(t),removeListener:t=>e.bookmarks.onCreated.removeListener(t)},onChanged:{addListener:t=>e.bookmarks.onChanged.addListener(t),removeListener:t=>e.bookmarks.onChanged.removeListener(t)},onMoved:{addListener:t=>e.bookmarks.onMoved.addListener(t),removeListener:t=>e.bookmarks.onMoved.removeListener(t)},update:(t,r)=>e.bookmarks.update(t,r)},commands:{onCommand:{addListener:t=>e.commands.onCommand.addListener(t)}},downloads:{download:t=>e.downloads.download(t),onChanged:{addListener:t=>e.downloads.onChanged.addListener(t),removeListener:t=>e.downloads.onChanged.removeListener(t)},search:t=>e.downloads.search(t)},i18n:{getUILanguage:()=>e.i18n.getUILanguage(),getMessage:(t,r)=>e.i18n.getMessage(t,r)},identity:{getRedirectURL:()=>e.identity.getRedirectURL(),getAuthToken:t=>e.identity.getAuthToken(t),launchWebAuthFlow:t=>e.identity.launchWebAuthFlow(t),removeCachedAuthToken:t=>e.identity.removeCachedAuthToken(t)},contextMenus:{onClicked:{addListener:t=>e.contextMenus.onClicked.addListener(t)},create:t=>e.contextMenus.create(t),update:(t,r)=>e.contextMenus.update(t,r),removeAll:()=>e.contextMenus.removeAll()},permissions:{request:t=>e.permissions.request(t),remove:t=>e.permissions.remove(t)},runtime:{id:e.runtime.id,sendNativeMessage:(t,r)=>new Promise((s,a)=>{e.runtime.sendNativeMessage(t,r,t=>{e.runtime.lastError?a(e.runtime.lastError):s(t)})}),getManifest:()=>e.runtime.getManifest(),onMessage:{addListener:t=>e.runtime.onMessage.addListener((e,r,s)=>{const a=t(e,r);if(a&&\"function\"==typeof a.then)return a.then(e=>{if(void 0!==e)try{s(e)}catch(e){}}),!0}),removeListener:t=>e.runtime.onMessage.removeListener(t)},onMessageExternal:{addListener:t=>e.runtime.onMessageExternal.addListener((e,r,s)=>{const a=t(e,r);if(a&&\"function\"==typeof a.then)return a.then(e=>{if(void 0!==e)try{s(e)}catch(e){}}),!0})},sendMessage:t=>new Promise((r,s)=>{e.runtime.sendMessage(t,t=>{e.runtime.lastError?s(e.runtime.lastError):r(t)}),e.runtime.lastError&&s(e.runtime.lastError)}),getURL:t=>e.runtime.getURL(t),getContexts:t=>e.runtime.getContexts(t),get lastError(){return e.runtime.lastError}},scripting:{executeScript:t=>e.scripting.executeScript(t)},storage:{local:{set:t=>e.storage.local.set(t),get:t=>e.storage.local.get(t),clear:()=>e.storage.local.clear(),remove:t=>e.storage.local.remove(t)},sync:{set:t=>e.storage.sync.set(t),get:t=>e.storage.sync.get(t),clear:()=>e.storage.sync.clear(),remove:t=>e.storage.sync.remove(t)}},tabs:{onCreated:{addListener:t=>e.tabs.onCreated.addListener(t)},onActivated:{addListener:t=>e.tabs.onActivated.addListener(t)},onUpdated:{addListener:t=>e.tabs.onUpdated.addListener(t),removeListener:t=>e.tabs.onUpdated.removeListener(t)},onRemoved:{addListener:t=>e.tabs.onRemoved.addListener(t),removeListener:t=>e.tabs.onRemoved.removeListener(t)},onReplaced:{addListener:t=>e.tabs.onReplaced.addListener(t),removeListener:t=>e.tabs.onReplaced.removeListener(t)},captureVisibleTab:(t,r)=>e.tabs.captureVisibleTab(t,r),sendMessage:(t,r,s={})=>new Promise((a,n)=>{e.tabs.sendMessage(t,r,s,t=>{e.runtime.lastError?n(e.runtime.lastError):a(t)}),e.runtime.lastError&&n(e.runtime.lastError)}),query:t=>e.tabs.query(t),create:t=>e.tabs.create(t),get:t=>e.tabs.get(t),remove:t=>e.tabs.remove(t),update:(t,r)=>e.tabs.update(t,r)},devtools:{inspectedWindow:{onResourceContentCommitted:{addListener:t=>e.devtools.inspectedWindow.onResourceContentCommitted.addListener(t)},get tabId(){return e.devtools.inspectedWindow.tabId}}},offscreen:{createDocument:t=>e.offscreen.createDocument(t)},declarativeNetRequest:{updateSessionRules:t=>e.declarativeNetRequest.updateSessionRules(t)}}))})();const e=8388608;let t=1;async function r(t,r,s){for(let a=0;a*e<=s.array.length;a++){const n={method:\"singlefile.fetchResponse\",requestId:r,headers:s.headers,status:s.status,error:s.error};n.truncated=s.array.length>e,n.truncated?(n.finished=(a+1)*e>s.array.length,n.array=s.array.slice(a*e,(a+1)*e)):n.array=s.array,await browser.tabs.sendMessage(t,n)}return{}}async function s(e,r){const s=t++;return await browser.declarativeNetRequest.updateSessionRules({addRules:[{action:{type:\"modifyHeaders\",requestHeaders:[{header:\"Referer\",operation:\"set\",value:r}]},condition:{initiatorDomains:[browser.runtime.id],urlFilter:e,resourceTypes:[\"xmlhttprequest\"]},id:s}]}),s}browser.runtime.onMessage.addListener((e,t)=>{if(e.method&&e.method.startsWith(\"singlefile.fetch\"))return new Promise(a=>{(async function(e,t){if(\"singlefile.fetch\"==e.method)try{const a=await async function(e,t={}){t.cache=\"no-store\";const r=await fetch(e,t);if(t.referrer&&(401==r.status||403==r.status||404==r.status)){const r=await s(e,t.referrer);await new Promise(e=>setTimeout(e,1e3));try{const r=await fetch(e,t),s=Array.from(new Uint8Array(await r.arrayBuffer())),a={\"content-type\":r.headers.get(\"content-type\")};return{array:s,headers:a,status:r.status}}finally{await async function(e){await browser.declarativeNetRequest.updateSessionRules({removeRuleIds:[e]})}(r)}}const a=Array.from(new Uint8Array(await r.arrayBuffer())),n={\"content-type\":r.headers.get(\"content-type\")},o=r.status;return{array:a,headers:n,status:o}}(e.url,{referrer:e.referrer,headers:e.headers});return r(t.tab.id,e.requestId,a)}catch(s){return r(t.tab.id,e.requestId,{error:s.message,array:[]})}else if(\"singlefile.fetchFrame\"==e.method)return browser.tabs.sendMessage(t.tab.id,e)})(e,t).then(a).catch(e=>a({error:e&&(e.message||e.toString())}))})}),browser.runtime.onMessage.addListener((e,t)=>{if(\"singlefile.frameTree.initResponse\"==e.method||\"singlefile.frameTree.ackInitRequest\"==e.method)return browser.tabs.sendMessage(t.tab.id,e,{frameId:0}),Promise.resolve({})});const a=new Map;function n(e,t){e.delete(t)}browser.runtime.onMessage.addListener((e,t)=>{if(\"singlefile.lazyTimeout.setTimeout\"==e.method){let r,s=a.get(t.tab.id);if(s)if(r=s.get(t.frameId),r){const t=r.get(e.type);t&&clearTimeout(t)}else r=new Map;const o=setTimeout(async()=>{try{const r=a.get(t.tab.id),s=r.get(t.frameId);r&&s&&n(s,e.type),await browser.tabs.sendMessage(t.tab.id,{method:\"singlefile.lazyTimeout.onTimeout\",type:e.type})}catch(e){}},e.delay);return s||(s=new Map,r=new Map,s.set(t.frameId,r),a.set(t.tab.id,s)),r.set(e.type,o),Promise.resolve({})}if(\"singlefile.lazyTimeout.clearTimeout\"==e.method){let r=a.get(t.tab.id);if(r){const s=r.get(t.frameId);if(s){const t=s.get(e.type);t&&clearTimeout(t),n(s,e.type)}}return Promise.resolve({})}}),browser.tabs.onRemoved.addListener(e=>a.delete(e))}();\n"
  },
  {
    "path": "lib/single-file-bootstrap.bundle.js",
    "content": "!function(){\"use strict\";\"undefined\"==typeof globalThis&&(window.globalThis=window),(()=>{const e=globalThis.chrome;globalThis.__defineGetter__(\"browser\",()=>({action:{onClicked:{addListener:t=>e.action.onClicked.addListener(t)},setBadgeText:t=>e.action.setBadgeText(t),setBadgeBackgroundColor:t=>e.action.setBadgeBackgroundColor(t),setTitle:t=>e.action.setTitle(t),setIcon:t=>e.action.setIcon(t)},bookmarks:{get:t=>e.bookmarks.get(t),onCreated:{addListener:t=>e.bookmarks.onCreated.addListener(t),removeListener:t=>e.bookmarks.onCreated.removeListener(t)},onChanged:{addListener:t=>e.bookmarks.onChanged.addListener(t),removeListener:t=>e.bookmarks.onChanged.removeListener(t)},onMoved:{addListener:t=>e.bookmarks.onMoved.addListener(t),removeListener:t=>e.bookmarks.onMoved.removeListener(t)},update:(t,n)=>e.bookmarks.update(t,n)},commands:{onCommand:{addListener:t=>e.commands.onCommand.addListener(t)}},downloads:{download:t=>e.downloads.download(t),onChanged:{addListener:t=>e.downloads.onChanged.addListener(t),removeListener:t=>e.downloads.onChanged.removeListener(t)},search:t=>e.downloads.search(t)},i18n:{getUILanguage:()=>e.i18n.getUILanguage(),getMessage:(t,n)=>e.i18n.getMessage(t,n)},identity:{getRedirectURL:()=>e.identity.getRedirectURL(),getAuthToken:t=>e.identity.getAuthToken(t),launchWebAuthFlow:t=>e.identity.launchWebAuthFlow(t),removeCachedAuthToken:t=>e.identity.removeCachedAuthToken(t)},contextMenus:{onClicked:{addListener:t=>e.contextMenus.onClicked.addListener(t)},create:t=>e.contextMenus.create(t),update:(t,n)=>e.contextMenus.update(t,n),removeAll:()=>e.contextMenus.removeAll()},permissions:{request:t=>e.permissions.request(t),remove:t=>e.permissions.remove(t)},runtime:{id:e.runtime.id,sendNativeMessage:(t,n)=>new Promise((r,o)=>{e.runtime.sendNativeMessage(t,n,t=>{e.runtime.lastError?o(e.runtime.lastError):r(t)})}),getManifest:()=>e.runtime.getManifest(),onMessage:{addListener:t=>e.runtime.onMessage.addListener((e,n,r)=>{const o=t(e,n);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{r(e)}catch(e){}}),!0}),removeListener:t=>e.runtime.onMessage.removeListener(t)},onMessageExternal:{addListener:t=>e.runtime.onMessageExternal.addListener((e,n,r)=>{const o=t(e,n);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{r(e)}catch(e){}}),!0})},sendMessage:t=>new Promise((n,r)=>{e.runtime.sendMessage(t,t=>{e.runtime.lastError?r(e.runtime.lastError):n(t)}),e.runtime.lastError&&r(e.runtime.lastError)}),getURL:t=>e.runtime.getURL(t),getContexts:t=>e.runtime.getContexts(t),get lastError(){return e.runtime.lastError}},scripting:{executeScript:t=>e.scripting.executeScript(t)},storage:{local:{set:t=>e.storage.local.set(t),get:t=>e.storage.local.get(t),clear:()=>e.storage.local.clear(),remove:t=>e.storage.local.remove(t)},sync:{set:t=>e.storage.sync.set(t),get:t=>e.storage.sync.get(t),clear:()=>e.storage.sync.clear(),remove:t=>e.storage.sync.remove(t)}},tabs:{onCreated:{addListener:t=>e.tabs.onCreated.addListener(t)},onActivated:{addListener:t=>e.tabs.onActivated.addListener(t)},onUpdated:{addListener:t=>e.tabs.onUpdated.addListener(t),removeListener:t=>e.tabs.onUpdated.removeListener(t)},onRemoved:{addListener:t=>e.tabs.onRemoved.addListener(t),removeListener:t=>e.tabs.onRemoved.removeListener(t)},onReplaced:{addListener:t=>e.tabs.onReplaced.addListener(t),removeListener:t=>e.tabs.onReplaced.removeListener(t)},captureVisibleTab:(t,n)=>e.tabs.captureVisibleTab(t,n),sendMessage:(t,n,r={})=>new Promise((o,s)=>{e.tabs.sendMessage(t,n,r,t=>{e.runtime.lastError?s(e.runtime.lastError):o(t)}),e.runtime.lastError&&s(e.runtime.lastError)}),query:t=>e.tabs.query(t),create:t=>e.tabs.create(t),get:t=>e.tabs.get(t),remove:t=>e.tabs.remove(t),update:(t,n)=>e.tabs.update(t,n)},devtools:{inspectedWindow:{onResourceContentCommitted:{addListener:t=>e.devtools.inspectedWindow.onResourceContentCommitted.addListener(t)},get tabId(){return e.devtools.inspectedWindow.tabId}}},offscreen:{createDocument:t=>e.offscreen.createDocument(t)},declarativeNetRequest:{updateSessionRules:t=>e.declarativeNetRequest.updateSessionRules(t)}}))})()}();\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).singlefileBootstrap={})}(this,function(e){\"use strict\";const t=\"single-file-load-image\",s=\"single-file-image-loaded\",o=\"_singleFile_fontFaces\",n=\"_singleFile_worklets\",i=globalThis.CustomEvent,a=globalThis.document,r=globalThis.Document,l=globalThis.JSON,d=globalThis.MutationObserver;let c,u;function m(){a instanceof r&&(a.addEventListener(\"single-file-new-font-face\",e=>{const t=e.detail,s=Object.assign({},t);delete s.src,c.set(l.stringify(s),t)}),a.addEventListener(\"single-file-delete-font\",e=>{const t=e.detail,s=Object.assign({},t);delete s.src,c.delete(l.stringify(s))}),a.addEventListener(\"single-file-clear-fonts\",()=>c=new Map),a.addEventListener(\"single-file-new-worklet\",e=>{const t=e.detail;u.set(t.moduleURL,t)}))}c=globalThis.window[o]?globalThis.window[o]:globalThis.window[o]=new Map,u=globalThis.window[n]?globalThis.window[n]:globalThis.window[n]=new Map,m(),new d(m).observe(a,{childList:!0});const g=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",h=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+g+\"?|(\"+g+\")|.)\",\"ig\");const p=\"single-file-\",f=\"_singleFile_waitForUserScript\",T=\"__frameTree__::\",b=p+\"on-before-capture\",E=p+\"on-after-capture\",y=p+\"request-get-adopted-stylesheets\",w=p+\"response-get-adopted-stylesheets\",I=p+\"unregister-request-get-adopted-stylesheets\",A=p+\"user-script-init\",v=\"data-\"+p+\"removed-content\",S=\"data-\"+p+\"hidden-content\",R=\"data-\"+p+\"kept-content\",N=\"data-\"+p+\"hidden-frame\",P=\"data-\"+p+\"preserved-space-element\",M=\"data-\"+p+\"shadow-root-element\",L=\"data-\"+p+\"win-id\",C=\"data-\"+p+\"image\",O=\"data-\"+p+\"poster\",D=\"data-\"+p+\"video\",_=\"data-\"+p+\"canvas\",x=\"data-\"+p+\"movable-style\",F=\"data-\"+p+\"input-value\",k=\"data-\"+p+\"input-checked\",U=\"data-\"+p+\"lazy-loaded-src\",q=\"data-\"+p+\"stylesheet\",H=\"data-\"+p+\"disabled-noscript\",B=\"data-\"+p+\"async-script\",V=\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\",W=[\"NOSCRIPT\",\"DISABLED-NOSCRIPT\",\"META\",\"LINK\",\"STYLE\",\"TITLE\",\"TEMPLATE\",\"SOURCE\",\"OBJECT\",\"SCRIPT\",\"HEAD\",\"BODY\"],z=[\"SCRIPT\",\"NOSCRIPT\",\"META\",\"LINK\",\"TEMPLATE\"],Y=/^'(.*?)'$/,j=/^\"(.*?)\"$/,G={regular:\"400\",normal:\"400\",bold:\"700\",bolder:\"700\",lighter:\"100\"},K=\"single-file-ui-element\",$=\"data:,\",X=\"data-sf-nesting-track-id\",Z=(e,t,s)=>globalThis.addEventListener(e,t,s),J=globalThis.JSON,Q=globalThis.CustomEvent,ee=globalThis.MutationObserver,te=globalThis.URL,se=globalThis.DOMParser;function oe(e,t,s){e.querySelectorAll(\"noscript:not([\"+H+\"])\").forEach(e=>{e.setAttribute(H,e.textContent),e.textContent=\"\"}),function(e){e.querySelectorAll(\"meta[http-equiv=refresh]\").forEach(e=>{e.removeAttribute(\"http-equiv\"),e.setAttribute(\"disabled-http-equiv\",\"refresh\")})}(e),e.head&&e.head.querySelectorAll(V).forEach(e=>e.hidden=!0),e.querySelectorAll(\"svg foreignObject\").forEach(e=>{const t=e.querySelectorAll(\"html > head > \"+V+\", html > body > \"+V);t.length&&(Array.from(e.childNodes).forEach(e=>e.remove()),t.forEach(t=>e.appendChild(t)))});const o=new Map;let n;t&&e.documentElement?(!function(e){i(e.body);const t=function(e,t){const s=(new se).parseFromString(e,\"text/html\");s.head||s.documentElement.insertBefore(s.createElement(\"HEAD\"),s.body);let o=s.querySelector(\"base\");o&&o.getAttribute(\"href\")||(o&&o.remove(),o=s.createElement(\"base\"),o.setAttribute(\"href\",t),s.head.insertBefore(o,s.head.firstChild));return s}(ge(e)),s=a(e.body),o=a(t.body),n=new Set;function i(e,t=0,s=\"\"){const o=s?`${s}.${t+1}`:`${t+1}`;e.setAttribute(X,o),Array.from(e.children).forEach((e,t)=>i(e,t,o))}function a(e){const t={};return s(e),t;function s(e){if(e.getAttribute){const o=e.getAttribute(X);o&&(t[o]=e),Array.from(e.children).forEach(s)}}}function r(e,t){const s=e.getAttribute(X);s&&!t.has(s)&&e.removeAttribute(X),Array.from(e.children).forEach(e=>r(e,t))}Object.keys(s).forEach(t=>{if(t in o){if((s[t].parentElement?.getAttribute(X)||null)!==(o[t]?.parentElement?.getAttribute(X)||null)){let o=s[t];for(;o&&o!==e.body;){const e=o.getAttribute(X);e&&n.add(e),o=o.parentElement}}}}),r(e.body,n)}(e),n=ne(t,e,e.documentElement,s),s.moveStylesInHead&&e.querySelectorAll(\"body style, body ~ style\").forEach(e=>{const s=he(t,e);s&&de(e,s)&&(e.setAttribute(x,\"\"),n.markedElements.push(e))})):n={canvases:[],images:[],posters:[],videos:[],usedFonts:[],shadowRoots:[],markedElements:[]};let i=\"\";if(e.referrer)try{i=new te(\"/\",new te(e.referrer).origin).href}catch(e){}return{canvases:n.canvases,fonts:Array.from(c.values()),worklets:Array.from(u.values()),stylesheets:ue(e),images:n.images,posters:n.posters,videos:n.videos,usedFonts:Array.from(n.usedFonts.values()),shadowRoots:n.shadowRoots,referrer:i,markedElements:n.markedElements,invalidElements:o,scrollPosition:{x:t.scrollX,y:t.scrollY},adoptedStyleSheets:ie(e.adoptedStyleSheets)}}function ne(e,t,s,o,n={usedFonts:new Map,canvases:[],images:[],posters:[],videos:[],shadowRoots:[],markedElements:[]},i=new Map,a){if(s.childNodes){Array.from(s.childNodes).filter(t=>t instanceof e.HTMLElement||t instanceof e.SVGElement||t instanceof globalThis.HTMLElement||t instanceof globalThis.SVGElement).forEach(s=>{let r,l,d;if(!o.autoSaveExternalSave&&(o.removeHiddenElements||o.removeUnusedFonts||o.compressHTML)&&(d=he(e,s),(s instanceof e.HTMLElement||s instanceof globalThis.HTMLElement)&&o.removeHiddenElements&&(l=(a||s.closest(\"html > head\"))&&W.includes(s.tagName.toUpperCase())||s.closest(\"details\"),l||(r=a||de(s,d),r&&!z.includes(s.tagName.toUpperCase())&&(s.setAttribute(S,\"\"),n.markedElements.push(s)))),!r)){if(o.compressHTML&&d){const e=d.getPropertyValue(\"white-space\");e&&e.startsWith(\"pre\")&&(s.setAttribute(P,\"\"),n.markedElements.push(s))}o.removeUnusedFonts&&(ae(d,o,n.usedFonts),ae(he(e,s,\":first-letter\"),o,n.usedFonts),ae(he(e,s,\":before\"),o,n.usedFonts),ae(he(e,s,\":after\"),o,n.usedFonts))}!function(e,t,s,o,n,i,a){const r=s.tagName&&s.tagName.toUpperCase();if(\"CANVAS\"==r)try{n.canvases.push({dataURI:s.toDataURL(\"image/png\"),backgroundColor:a.getPropertyValue(\"background-color\")}),s.setAttribute(_,n.canvases.length-1),n.markedElements.push(s)}catch(e){}if(\"IMG\"==r){const t={currentSrc:i?$:o.loadDeferredImages&&s.getAttribute(U)||s.currentSrc};if(n.images.push(t),s.setAttribute(C,n.images.length-1),n.markedElements.push(s),s.removeAttribute(U),a=a||he(e,s)){t.size=function(e,t,s){let o=t.naturalWidth,n=t.naturalHeight;if(!o&&!n){const i=null==t.getAttribute(\"style\");if(s=s||he(e,t)){let e,a,r,l,d,c,u,m,g=!1;if(\"content-box\"==s.getPropertyValue(\"box-sizing\")){const e=t.style.getPropertyValue(\"box-sizing\"),s=t.style.getPropertyPriority(\"box-sizing\"),o=t.clientWidth;t.style.setProperty(\"box-sizing\",\"border-box\",\"important\"),g=t.clientWidth!=o,e?t.style.setProperty(\"box-sizing\",e,s):t.style.removeProperty(\"box-sizing\")}e=me(\"padding-left\",s),a=me(\"padding-right\",s),r=me(\"padding-top\",s),l=me(\"padding-bottom\",s),g?(d=me(\"border-left-width\",s),c=me(\"border-right-width\",s),u=me(\"border-top-width\",s),m=me(\"border-bottom-width\",s)):d=c=u=m=0,o=Math.max(0,t.clientWidth-e-a-d-c),n=Math.max(0,t.clientHeight-r-l-u-m),i&&t.removeAttribute(\"style\")}}return{pxWidth:o,pxHeight:n}}(e,s,a);const o=a.getPropertyValue(\"box-shadow\"),n=a.getPropertyValue(\"background-image\");o&&\"none\"!=o||n&&\"none\"!=n||!(t.size.pxWidth>1||t.size.pxHeight>1)||(t.replaceable=!0,t.backgroundColor=a.getPropertyValue(\"background-color\"),t.objectFit=a.getPropertyValue(\"object-fit\"),t.boxSizing=a.getPropertyValue(\"box-sizing\"),t.objectPosition=a.getPropertyValue(\"object-position\"))}}if(\"VIDEO\"==r){const o=s.currentSrc;if(o&&!o.startsWith(\"blob:\")&&!o.startsWith(\"data:\")){const t=he(e,s.parentNode);n.videos.push({positionParent:t&&t.getPropertyValue(\"position\"),src:o,size:{pxWidth:s.clientWidth,pxHeight:s.clientHeight,videoWidth:s.videoWidth,videoHeight:s.videoHeight},currentTime:s.currentTime}),s.setAttribute(D,n.videos.length-1)}if(!s.getAttribute(\"poster\")){const e=t.createElement(\"canvas\"),o=e.getContext(\"2d\");e.width=s.videoWidth,e.height=s.videoHeight;try{o.drawImage(s,0,0,e.width,e.height),n.posters.push(e.toDataURL(\"image/png\")),s.setAttribute(O,n.posters.length-1),n.markedElements.push(s)}catch(e){}}}\"IFRAME\"==r&&i&&o.removeHiddenElements&&(s.setAttribute(N,\"\"),n.markedElements.push(s));\"INPUT\"==r&&(\"password\"!=s.type&&(s.setAttribute(F,s.value),n.markedElements.push(s)),\"radio\"!=s.type&&\"checkbox\"!=s.type||(s.setAttribute(k,s.checked),n.markedElements.push(s)));\"TEXTAREA\"==r&&(s.setAttribute(F,s.value),n.markedElements.push(s));\"SELECT\"==r&&s.querySelectorAll(\"option\").forEach(e=>{e.selected&&(e.setAttribute(F,\"\"),n.markedElements.push(e))});\"SCRIPT\"==r&&(s.async&&\"\"!=s.getAttribute(\"async\")&&\"async\"!=s.getAttribute(\"async\")&&(s.setAttribute(B,\"\"),n.markedElements.push(s)),s.textContent=s.textContent.replace(/<\\/script>/gi,\"<\\\\/script>\"))}(e,t,s,o,n,r,d);const c=!(s instanceof e.SVGElement||s instanceof globalThis.SVGElement)&&re(s);if(c&&!s.classList.contains(K)&&\"single-file-infobar\"!=s.tagName.toLowerCase()){const a={};s.setAttribute(M,n.shadowRoots.length),n.markedElements.push(s),n.shadowRoots.push(a);try{if(c.adoptedStyleSheets){const e=e=>a.adoptedStyleSheets=e.detail.adoptedStyleSheets;c.addEventListener(w,e),c.dispatchEvent(new Q(y,{bubbles:!0})),a.adoptedStyleSheets||s.dispatchEvent(new Q(y,{bubbles:!0})),c.removeEventListener(w,e)}}catch(e){}ne(e,t,c,o,n,i,r),a.content=c.innerHTML,a.mode=c.mode,a.delegateFocus=c.delegatesFocus,a.clonable=c.clonable,a.serializable=c.serializable;try{c.adoptedStyleSheets&&void 0===c.adoptedStyleSheets.length&&c.dispatchEvent(new Q(I,{bubbles:!0}))}catch(e){}}ne(e,t,s,o,n,i,r),!o.autoSaveExternalSave&&o.removeHiddenElements&&a&&(l||\"\"==s.getAttribute(R)?s.parentElement&&(s.parentElement.setAttribute(R,\"\"),n.markedElements.push(s.parentElement)):r&&(s.setAttribute(v,\"\"),n.markedElements.push(s)))})}return n}function ie(e,t=new Map){if(e){const s=[];for(const o of Array.from(e))if(t.has(o))s.push(t.get(o));else{let e=\"\";if(o&&o.cssRules)for(const t of o.cssRules)e+=t.cssText+\"\\n\";t.set(o,e),s.push(e)}return s}return[]}function ae(e,t,s){if(e){const o=e.getPropertyValue(\"font-style\")||\"normal\";e.getPropertyValue(\"font-family\").split(\",\").forEach(n=>{if(n=le(n),!t.loadedFonts||t.loadedFonts.find(e=>le(e.family)==n&&e.style==o)){const t=(i=e.getPropertyValue(\"font-weight\"),G[i.toLowerCase().trim()]||i),a=e.getPropertyValue(\"font-variant\")||\"normal\",r=[n,t,o,a];s.set(J.stringify(r),[n,t,o,a])}var i})}}function re(e){const t=globalThis.chrome;if(e.openOrClosedShadowRoot)return e.openOrClosedShadowRoot;if(!(t&&t.dom&&t.dom.openOrClosedShadowRoot))return e.shadowRoot;try{return t.dom.openOrClosedShadowRoot(e)}catch(t){return e.shadowRoot}}function le(e=\"\"){return function(e){e=e.match(Y)?e.replace(Y,\"$1\"):e.replace(j,\"$1\");return e.trim()}((t=e.trim(),t.replace(h,(e,t,s)=>{const o=\"0x\"+t-65536;return o!=o||s?t:o<0?String.fromCharCode(o+65536):String.fromCharCode(o>>10|55296,1023&o|56320)}))).toLowerCase();var t}function de(e,t){let s=!1;if(t){const o=t.getPropertyValue(\"display\"),n=t.getPropertyValue(\"opacity\"),i=t.getPropertyValue(\"visibility\");if(s=\"none\"==o,!s&&(\"0\"==n||\"hidden\"==i)&&e.getBoundingClientRect){const t=e.getBoundingClientRect();s=!t.width&&!t.height}}return Boolean(s)}function ce(e,t,s){if(e.querySelectorAll(\"[\"+H+\"]\").forEach(e=>{e.textContent=e.getAttribute(H),e.removeAttribute(H)}),e.querySelectorAll(\"meta[disabled-http-equiv]\").forEach(e=>{e.setAttribute(\"http-equiv\",e.getAttribute(\"disabled-http-equiv\")),e.removeAttribute(\"disabled-http-equiv\")}),e.head&&e.head.querySelectorAll(\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\").forEach(e=>e.removeAttribute(\"hidden\")),!t){const s=[v,N,S,P,C,O,D,_,F,k,M,q,B];t=e.querySelectorAll(s.map(e=>\"[\"+e+\"]\").join(\",\"))}t.forEach(e=>{e.removeAttribute(v),e.removeAttribute(S),e.removeAttribute(R),e.removeAttribute(N),e.removeAttribute(P),e.removeAttribute(C),e.removeAttribute(O),e.removeAttribute(D),e.removeAttribute(_),e.removeAttribute(F),e.removeAttribute(k),e.removeAttribute(M),e.removeAttribute(q),e.removeAttribute(B),e.removeAttribute(x)}),s&&s.forEach((e,t)=>e.replaceWith(t))}function ue(e){if(e){const t=[];return e.querySelectorAll(\"style\").forEach((s,o)=>{try{if(!s.sheet.disabled){const n=e.createElement(\"style\");n.textContent=s.textContent,e.body.appendChild(n);const i=n.sheet;n.remove();const a=Array.from(i.cssRules).map(e=>e.cssText).join(\"\\n\"),r=Array.from(s.sheet.cssRules).map(e=>e.cssText).join(\"\\n\");i&&a==r||(s.setAttribute(q,o),t[o]=Array.from(s.sheet.cssRules).map(e=>e.cssText).join(\"\\n\"))}}catch(e){}}),t}}function me(e,t){if(t.getPropertyValue(e).endsWith(\"px\"))return parseFloat(t.getPropertyValue(e))}function ge(e){const t=e.doctype;let s=\"\";return t&&(s=\"<!DOCTYPE \"+t.nodeName,t.publicId?(s+=' PUBLIC \"'+t.publicId+'\"',t.systemId&&(s+=' \"'+t.systemId+'\"')):t.systemId&&(s+=' SYSTEM \"'+t.systemId+'\"'),t.internalSubset&&(s+=\" [\"+t.internalSubset+\"]\"),s+=\"> \"),s+e.documentElement.outerHTML}function he(e,t,s){try{return e.getComputedStyle(t,s)}catch(e){}}const pe={LAZY_SRC_ATTRIBUTE_NAME:U,SINGLE_FILE_UI_ELEMENT_CLASS:K},fe=\"attributes\",Te=globalThis.browser,be=globalThis.document,Ee=globalThis.MutationObserver,ye=new Map;let we;async function Ie(e){if(be.documentElement){ye.clear();const o=be.body?Math.max(be.body.scrollHeight,be.documentElement.scrollHeight):be.documentElement.scrollHeight,n=be.body?Math.max(be.body.scrollWidth,be.documentElement.scrollWidth):be.documentElement.scrollWidth;if(o>globalThis.innerHeight||n>globalThis.innerWidth){const r=Math.max(o-1.5*globalThis.innerHeight,0),l=Math.max(n-1.5*globalThis.innerWidth,0);if(globalThis.scrollY<r||globalThis.scrollX<l)return function(e){return we=0,new Promise(async o=>{let n;const r=new Set,l=new Ee(async t=>{if((t=t.filter(e=>e.type==fe)).length){t.filter(e=>{if(\"src\"==e.attributeName&&(e.target.setAttribute(pe.LAZY_SRC_ATTRIBUTE_NAME,e.target.src),e.target.addEventListener(\"load\",c)),\"src\"==e.attributeName||\"srcset\"==e.attributeName||e.target.tagName&&\"SOURCE\"==e.target.tagName.toUpperCase())return!e.target.classList||!e.target.classList.contains(pe.SINGLE_FILE_UI_ELEMENT_CLASS)}).length&&(n=!0,await ve(l,e,g),r.size||await Ae(l,e,g))}});async function d(t){await Re(\"idleTimeout\",async()=>{n?we<10&&(we++,Pe(\"idleTimeout\"),await d(Math.max(500,t/2))):(Pe(\"loadTimeout\"),Pe(\"maxTimeout\"),Se(l,e,g))},t,e.loadDeferredImagesNativeTimeout)}function c(e){const t=e.target;t.removeAttribute(pe.LAZY_SRC_ATTRIBUTE_NAME),t.removeEventListener(\"load\",c)}async function u(t){n=!0,await ve(l,e,g),await Ae(l,e,g),t.detail&&r.add(t.detail)}async function m(t){await ve(l,e,g),await Ae(l,e,g),r.delete(t.detail),r.size||await Ae(l,e,g)}function g(e){l.disconnect(),be.removeEventListener(t,u),be.removeEventListener(s,m),o(e)}await d(2*e.loadDeferredImagesMaxIdleTime),await ve(l,e,g),l.observe(be,{subtree:!0,childList:!0,attributes:!0}),be.addEventListener(t,u),be.addEventListener(s,m),function(e){e.loadDeferredImagesBlockCookies&&a.dispatchEvent(new i(\"single-file-block-cookies-start\")),e.loadDeferredImagesBlockStorage&&a.dispatchEvent(new i(\"single-file-block-storage-start\")),e.loadDeferredImagesDispatchScrollEvent&&a.dispatchEvent(new i(\"single-file-dispatch-scroll-event-start\")),e.loadDeferredImagesKeepZoomLevel?a.dispatchEvent(new i(\"single-file-load-deferred-images-keep-zoom-level-start\")):a.dispatchEvent(new i(\"single-file-load-deferred-images-start\"))}(e)})}(e)}}}async function Ae(e,t,s){await Re(\"loadTimeout\",()=>Se(e,t,s),t.loadDeferredImagesMaxIdleTime,t.loadDeferredImagesNativeTimeout)}async function ve(e,t,s){await Re(\"maxTimeout\",async()=>{await Pe(\"loadTimeout\"),await Se(e,t,s)},10*t.loadDeferredImagesMaxIdleTime,t.loadDeferredImagesNativeTimeout)}async function Se(e,t,s){await Pe(\"idleTimeout\"),function(e){e.loadDeferredImagesBlockCookies&&a.dispatchEvent(new i(\"single-file-block-cookies-end\")),e.loadDeferredImagesBlockStorage&&a.dispatchEvent(new i(\"single-file-block-storage-end\")),e.loadDeferredImagesDispatchScrollEvent&&a.dispatchEvent(new i(\"single-file-dispatch-scroll-event-end\")),e.loadDeferredImagesKeepZoomLevel?a.dispatchEvent(new i(\"single-file-load-deferred-images-keep-zoom-level-end\")):a.dispatchEvent(new i(\"single-file-load-deferred-images-end\"))}(t),await Re(\"endTimeout\",async()=>{await Pe(\"maxTimeout\"),s()},t.loadDeferredImagesMaxIdleTime/2,t.loadDeferredImagesNativeTimeout),e.disconnect()}async function Re(e,t,s,o){if(Te&&Te.runtime&&Te.runtime.sendMessage&&!o){if(!ye.get(e)||!ye.get(e).pending){const o={callback:t,pending:!0};ye.set(e,o);try{await Te.runtime.sendMessage({method:\"singlefile.lazyTimeout.setTimeout\",type:e,delay:s})}catch(o){Ne(e,t,s)}o.pending=!1}}else Ne(e,t,s)}function Ne(e,t,s){const o=ye.get(e);o&&globalThis.clearTimeout(o),ye.set(e,t),globalThis.setTimeout(t,s)}async function Pe(e){if(Te&&Te.runtime&&Te.runtime.sendMessage)try{await Te.runtime.sendMessage({method:\"singlefile.lazyTimeout.clearTimeout\",type:e})}catch(t){Me(e)}else Me(e)}function Me(e){const t=ye.get(e);ye.delete(e),t&&globalThis.clearTimeout(t)}Te&&Te.runtime&&Te.runtime.onMessage&&Te.runtime.onMessage.addListener&&Te.runtime.onMessage.addListener(e=>{if(\"singlefile.lazyTimeout.onTimeout\"==e.method){const t=ye.get(e.type);if(t){ye.delete(e.type);try{t.callback()}catch(t){Me(e.type)}}}});const Le={ON_BEFORE_CAPTURE_EVENT_NAME:b,ON_AFTER_CAPTURE_EVENT_NAME:E,WIN_ID_ATTRIBUTE_NAME:L,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:f,preProcessDoc:oe,serialize:ge,postProcessDoc:ce,getShadowRoot:re},Ce=\"singlefile.frameTree.initRequest\",Oe=\"singlefile.frameTree.ackInitRequest\",De=\"singlefile.frameTree.cleanupRequest\",_e=\"singlefile.frameTree.initResponse\",xe=5e3,Fe=\".\",ke=globalThis.window==globalThis.top,Ue=globalThis.browser,qe=globalThis.top,He=globalThis.MessageChannel,Be=globalThis.document,Ve=globalThis.JSON,We=globalThis.MutationObserver,ze=globalThis.DOMParser;let Ye,je=globalThis.sessions;function Ge(){globalThis.addEventListener(\"message\",async e=>{if(\"string\"==typeof e.data&&e.data.startsWith(T)){e.preventDefault(),e.stopPropagation();const t=Ve.parse(e.data.substring(15));if(t.method==Ce)e.source&&ot(e.source,{method:Oe,windowId:t.windowId,sessionId:t.sessionId}),ke||(globalThis.stop(),t.options.loadDeferredImages&&Ie(t.options),await $e(t));else if(t.method==Oe)Qe(\"requestTimeouts\",t.sessionId,t.windowId),et(t.sessionId,t.windowId);else if(t.method==De)Xe(t);else if(t.method==_e&&je.get(t.sessionId)){e.ports[0].onmessage=e=>Ze(e.data)}}},!0)}function Ke(){return globalThis.crypto.getRandomValues(new Uint32Array(32)).join(\"\")}async function $e(e){const t=e.sessionId;delete globalThis._singleFile_cleaningUp,ke||(Ye=globalThis.frameId=e.windowId),Je(Be,e.options,Ye,t),ke||(st({frames:[nt(Be,globalThis,Ye,e.options,e.scrolling)],sessionId:t,requestedFrameId:Be.documentElement.dataset.requestedFrameId&&Ye}),delete Be.documentElement.dataset.requestedFrameId)}function Xe(e){if(!globalThis._singleFile_cleaningUp){globalThis._singleFile_cleaningUp=!0;const t=e.sessionId;tt(it(Be),e.windowId,t)}}function Ze(e){e.frames.forEach(t=>Qe(\"responseTimeouts\",e.sessionId,t.windowId));const t=je.get(e.sessionId);if(t){e.requestedFrameId&&(t.requestedFrameId=e.requestedFrameId),e.frames.forEach(e=>{let s=t.frames.find(t=>e.windowId==t.windowId);s||(s={windowId:e.windowId},t.frames.push(s)),s.processed||(s.content=e.content,s.baseURI=e.baseURI,s.title=e.title,s.url=e.url,s.canvases=e.canvases,s.fonts=e.fonts,s.worklets=e.worklets,s.stylesheets=e.stylesheets,s.images=e.images,s.posters=e.posters,s.videos=e.videos,s.usedFonts=e.usedFonts,s.shadowRoots=e.shadowRoots,s.processed=e.processed,s.scrollPosition=e.scrollPosition,s.scrolling=e.scrolling,s.adoptedStyleSheets=e.adoptedStyleSheets)});t.frames.filter(e=>!e.processed).length||(t.frames=t.frames.sort((e,t)=>t.windowId.split(Fe).length-e.windowId.split(Fe).length),t.resolve&&(t.requestedFrameId&&t.frames.forEach(e=>{e.windowId==t.requestedFrameId&&(e.requestedFrame=!0)}),t.resolve(t.frames)))}}function Je(e,t,s,o){const n=it(e);!function(e,t,s,o,n){const i=[];let a;je.get(n)?a=je.get(n).requestTimeouts:(a={},je.set(n,{requestTimeouts:a}));t.forEach((e,t)=>{const s=o+Fe+t;e.setAttribute(Le.WIN_ID_ATTRIBUTE_NAME,s),i.push({windowId:s})}),st({frames:i,sessionId:n,requestedFrameId:e.documentElement.dataset.requestedFrameId&&o}),t.forEach((e,t)=>{const i=o+Fe+t;try{ot(e.contentWindow,{method:Ce,windowId:i,sessionId:n,options:s,scrolling:e.scrolling})}catch(e){}a[i]=globalThis.setTimeout(()=>st({frames:[{windowId:i,processed:!0}],sessionId:n}),xe)}),delete e.documentElement.dataset.requestedFrameId}(e,n,t,s,o),n.length&&function(e,t,s,o,n){const i=[];t.forEach((e,t)=>{const a=o+Fe+t;let r,l;try{r=e.contentDocument,l=e.contentWindow,l.stop()}catch(e){}const d=e.getAttribute(\"srcdoc\");if(!r&&d){r=(new ze).parseFromString(d,\"text/html\"),l=globalThis}if(r)try{Qe(\"requestTimeouts\",n,a),Je(r,s,a,n),i.push(nt(r,l,a,s,e.scrolling))}catch(e){i.push({windowId:a,processed:!0})}}),st({frames:i,sessionId:n,requestedFrameId:e.documentElement.dataset.requestedFrameId&&o}),delete e.documentElement.dataset.requestedFrameId}(e,n,t,s,o)}function Qe(e,t,s){const o=je.get(t);if(o&&o[e]){const t=o[e][s];t&&(globalThis.clearTimeout(t),delete o[e][s])}}function et(e,t){const s=je.get(e);s&&s.responseTimeouts&&(s.responseTimeouts[t]=globalThis.setTimeout(()=>st({frames:[{windowId:t,processed:!0}],sessionId:e}),1e4))}function tt(e,t,s){e.forEach((e,o)=>{const n=t+Fe+o;e.removeAttribute(Le.WIN_ID_ATTRIBUTE_NAME);try{ot(e.contentWindow,{method:De,windowId:n,sessionId:s})}catch(e){}}),e.forEach((e,o)=>{const n=t+Fe+o;let i;try{i=e.contentDocument}catch(e){}if(i)try{tt(it(i),n,s)}catch(e){}})}function st(e){e.method=_e;try{qe.singlefile.processors.frameTree.initResponse(e)}catch(t){ot(qe,e,!0)}}function ot(e,t,s){if(e==qe&&Ue&&Ue.runtime&&Ue.runtime.sendMessage)Ue.runtime.sendMessage(t);else if(s){const s=new He;e.postMessage(T+Ve.stringify({method:t.method,sessionId:t.sessionId}),\"*\",[s.port2]),s.port1.postMessage(t)}else e.postMessage(T+Ve.stringify(t),\"*\")}function nt(e,t,s,o,n){const i=Le.preProcessDoc(e,t,o),a=Le.serialize(e);Le.postProcessDoc(e,i.markedElements,i.invalidElements);return{windowId:s,content:a,baseURI:e.baseURI.split(\"#\")[0],url:e.documentURI,title:e.title,canvases:i.canvases,fonts:i.fonts,worklets:i.worklets,stylesheets:i.stylesheets,images:i.images,posters:i.posters,videos:i.videos,usedFonts:i.usedFonts,shadowRoots:i.shadowRoots,scrollPosition:i.scrollPosition,scrolling:n,adoptedStyleSheets:i.adoptedStyleSheets,processed:!0}}function it(e){let t=Array.from(e.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]'));return e.querySelectorAll(\"*\").forEach(e=>{const s=Le.getShadowRoot(e);s&&(t=t.concat(...it(s)))}),t}je||(je=globalThis.sessions=new Map),ke&&(Ye=\"0\",Ue&&Ue.runtime&&Ue.runtime.onMessage&&Ue.runtime.onMessage.addListener&&Ue.runtime.onMessage.addListener(e=>e.method==_e?(Ze(e),Promise.resolve({})):e.method==Oe?(Qe(\"requestTimeouts\",e.sessionId,e.windowId),et(e.sessionId,e.windowId),Promise.resolve({})):void 0)),Ge(),function e(){Z(A,({detail:e})=>globalThis[f]=async(t,s)=>{const o=Object.assign({},s);let n;delete o.win,delete o.doc,delete o.onprogress,delete o.frames,delete o.taskId,delete o._migratedTemplateFormat,delete o.woleetKey;try{n=\"jsonDetail\"==e?J.stringify({options:o}):{options:o}}catch(e){}const i=new Q(t+\"-request\",{cancelable:!0,detail:n});let a;const r=new Promise(e=>{a=e,Z(t+\"-response\",t=>{if(t.detail)try{const e=\"string\"==typeof t.detail?J.parse(t.detail):t.detail;e.options&&Object.assign(s,e.options)}catch(e){}e()})});(e=>{try{globalThis.dispatchEvent(e)}catch(e){}})(i),i.defaultPrevented?await r:a()}),new ee(e).observe(globalThis.document,{childList:!0})}(),new We(Ge).observe(Be,{childList:!0});const at=[\"AREA\",\"BASE\",\"BASEFONT\",\"BGSOUND\",\"BR\",\"COL\",\"COMMAND\",\"EMBED\",\"FRAME\",\"HR\",\"IMG\",\"INPUT\",\"KEYGEN\",\"LINK\",\"META\",\"PARAM\",\"SOURCE\",\"TRACK\",\"WBR\"],rt=[{tagName:\"HEAD\",accept:e=>!e.childNodes.length||1==e.childNodes[0].nodeType},{tagName:\"BODY\",accept:e=>!e.childNodes.length}],lt=[{tagName:\"HTML\",accept:e=>!e||8!=e.nodeType},{tagName:\"HEAD\",accept:e=>!e||8!=e.nodeType&&(3!=e.nodeType||!ut(e.textContent))},{tagName:\"BODY\",accept:e=>!e||8!=e.nodeType},{tagName:\"LI\",accept:(e,t)=>!e&&t.parentElement&&(\"UL\"==mt(t.parentElement)||\"OL\"==mt(t.parentElement))||e&&[\"LI\"].includes(mt(e))},{tagName:\"DT\",accept:e=>!e||[\"DT\",\"DD\"].includes(mt(e))},{tagName:\"P\",accept:e=>e&&[\"ADDRESS\",\"ARTICLE\",\"ASIDE\",\"BLOCKQUOTE\",\"DETAILS\",\"DIV\",\"DL\",\"FIELDSET\",\"FIGCAPTION\",\"FIGURE\",\"FOOTER\",\"FORM\",\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\",\"HEADER\",\"HR\",\"MAIN\",\"NAV\",\"OL\",\"P\",\"PRE\",\"SECTION\",\"TABLE\",\"UL\"].includes(mt(e))},{tagName:\"DD\",accept:e=>!e||[\"DT\",\"DD\"].includes(mt(e))},{tagName:\"RT\",accept:e=>!e||[\"RT\",\"RP\"].includes(mt(e))},{tagName:\"RP\",accept:e=>!e||[\"RT\",\"RP\"].includes(mt(e))},{tagName:\"OPTGROUP\",accept:e=>!e||[\"OPTGROUP\"].includes(mt(e))},{tagName:\"OPTION\",accept:e=>!e||[\"OPTION\",\"OPTGROUP\"].includes(mt(e))},{tagName:\"COLGROUP\",accept:e=>!e||8!=e.nodeType&&(3!=e.nodeType||!ut(e.textContent))},{tagName:\"CAPTION\",accept:e=>!e||8!=e.nodeType&&(3!=e.nodeType||!ut(e.textContent))},{tagName:\"THEAD\",accept:e=>!e||[\"TBODY\",\"TFOOT\"].includes(mt(e))},{tagName:\"TBODY\",accept:e=>!e||[\"TBODY\",\"TFOOT\"].includes(mt(e))},{tagName:\"TFOOT\",accept:e=>!e},{tagName:\"TR\",accept:e=>!e||[\"TR\"].includes(mt(e))},{tagName:\"TD\",accept:e=>!e||[\"TD\",\"TH\"].includes(mt(e))},{tagName:\"TH\",accept:e=>!e||[\"TD\",\"TH\"].includes(mt(e))}],dt=[\"STYLE\",\"SCRIPT\",\"XMP\",\"IFRAME\",\"NOEMBED\",\"NOFRAMES\",\"PLAINTEXT\",\"NOSCRIPT\"];function ct(e,t,s){return 3==e.nodeType?function(e){const t=e.parentNode;let s;t&&1==t.nodeType&&(s=mt(t));return!s||dt.includes(s)?(\"SCRIPT\"!=s||t.type&&\"text/javascript\"!=t.type)&&\"STYLE\"!=s?e.textContent:e.textContent.replace(/<\\//gi,\"<\\\\/\").replace(/\\/>/gi,\"\\\\/>\"):e.textContent.replace(/&/g,\"&amp;\").replace(/\\u00a0/g,\"&nbsp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}(e):8==e.nodeType?\"\\x3c!--\"+e.textContent+\"--\\x3e\":1==e.nodeType?function(e,t,s){const o=mt(e),n=t&&rt.find(t=>o==mt(t)&&t.accept(e));let i=\"\";n&&!e.attributes.length||(i=\"<\"+o.toLowerCase(),Array.from(e.attributes).forEach(s=>i+=function(e,t,s){const o=e.name;let n=\"\";if(!o.match(/[\"'>/=]/)){let i,a=e.value;s&&\"class\"==o&&(a=Array.from(t.classList).map(e=>e.trim()).join(\" \")),a=a.replace(/&/g,\"&amp;\").replace(/\\u00a0/g,\"&nbsp;\"),a.includes('\"')&&(a.includes(\"'\")||!s?a=a.replace(/\"/g,\"&quot;\"):i=!0);const r=!s||a.match(/[ \\t\\n\\f\\r'\"`=<>]/);n+=\" \";const l=e.namespaceURI,d=e.localName||o;l?\"http://www.w3.org/XML/1998/namespace\"==l?n+=\"xml:\"+d:\"http://www.w3.org/2000/xmlns/\"==l?n+=\"xmlns\"===d?\"xmlns\":\"xmlns:\"+d:\"http://www.w3.org/1999/xlink\"==l?n+=\"xlink:\"+d:e.prefix?n+=e.prefix+\":\"+d:n+=o:n+=o,\"\"!=a&&(n+=\"=\",r&&(n+=i?\"'\":'\"'),n+=a,r&&(n+=i?\"'\":'\"'))}return n}(s,e,t)),i+=\">\");\"TEMPLATE\"!=o||e.childNodes.length?Array.from(e.childNodes).forEach(e=>i+=ct(e,t,s||\"svg\"==o)):i+=e.innerHTML;const a=t&&lt.find(t=>o==mt(t)&&t.accept(e.nextSibling,e));(s||!a&&!at.includes(o))&&(i+=\"</\"+o.toLowerCase()+\">\");return i}(e,t,s):void 0}function ut(e){return Boolean(e.match(/^[ \\t\\n\\f\\r]/))}function mt(e){return e.tagName&&e.tagName.toUpperCase()}const gt={frameTree:Object.freeze({__proto__:null,TIMEOUT_INIT_REQUEST_MESSAGE:xe,cleanup:function(e){je.delete(e),Xe({windowId:Ye,sessionId:e})},getAsync:function(e){const t=Ke();return e=Ve.parse(Ve.stringify(e)),new Promise(s=>{je.set(t,{frames:[],requestTimeouts:{},responseTimeouts:{},resolve:e=>{e.sessionId=t,s(e)}}),$e({windowId:Ye,sessionId:t,options:e})})},getSync:function(e){const t=Ke();e=Ve.parse(Ve.stringify(e)),je.set(t,{frames:[],requestTimeouts:{},responseTimeouts:{}}),function(e){const t=e.sessionId;delete globalThis._singleFile_cleaningUp,ke||(Ye=globalThis.frameId=e.windowId);Je(Be,e.options,Ye,t),ke||(st({frames:[nt(Be,globalThis,Ye,e.options,e.scrolling)],sessionId:t,requestedFrameId:Be.documentElement.dataset.requestedFrameId&&Ye}),delete Be.documentElement.dataset.requestedFrameId)}({windowId:Ye,sessionId:t,options:e});const s=je.get(t).frames;return s.sessionId=t,s},initResponse:Ze})},ht={COMMENT_HEADER:\"Page saved with SingleFile\",COMMENT_HEADER_LEGACY:\"Archive processed by SingleFile\",ON_BEFORE_CAPTURE_EVENT_NAME:b,ON_AFTER_CAPTURE_EVENT_NAME:E,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:f,preProcessDoc:oe,postProcessDoc:ce,serialize:(e,t)=>function(e,t){const s=e.doctype;let o=\"\";return s&&(o=\"<!DOCTYPE \"+s.nodeName,s.publicId?(o+=' PUBLIC \"'+s.publicId+'\"',s.systemId&&(o+=' \"'+s.systemId+'\"')):s.systemId&&(o+=' SYSTEM \"'+s.systemId+'\"'),s.internalSubset&&(o+=\" [\"+s.internalSubset+\"]\"),o+=\"> \"),o+ct(e.documentElement,t)}(e,t),getShadowRoot:re};e.helper=ht,e.processors=gt});\n!function(){\"use strict\";const e=33554432,t=\"data-sf-nesting-track-id\",o=globalThis.singlefileBootstrap,n=new Map;let a,r,s,d,i,c,l,u,m,f,h,v,y,E;async function p(){if(document.documentElement.dataset&&void 0!==document.documentElement.dataset.sfz){const e=await g();document.querySelectorAll(\"#sfz-error-message\").forEach(e=>e.remove()),function(e){document.dispatchEvent(new CustomEvent(\"single-file-bootstrap\",{detail:{data:e}}))}(e)}else if(document.body&&1==document.body.childNodes.length&&\"PRE\"==document.body.childNodes[0].tagName&&/<html[^>]* data-sfz[^>]*>/i.test(document.body.childNodes[0].textContent)){const e=(new DOMParser).parseFromString(document.body.childNodes[0].textContent,\"text/html\");document.replaceChild(e.documentElement,document.documentElement),document.querySelectorAll(\"script\").forEach(e=>{const t=document.createElement(\"script\");t.textContent=e.textContent,e.parentElement.replaceChild(t,e)}),await p()}}function g(){return new Promise((e,t)=>{const o=new XMLHttpRequest;o.open(\"GET\",location.href),o.send(),o.responseType=\"arraybuffer\",o.onload=()=>e(new Uint8Array(o.response)),o.onerror=()=>{const o=document.getElementById(\"sfz-error-message\");o&&o.remove();const a=n.size;n.set(a,{resolve:e,reject:t}),browser.runtime.sendMessage({method:\"singlefile.fetch\",requestId:a,url:location.href})}})}async function b(e){return i&&\"content.autosave\"==e.method?(async function(e){r=e.options,\"complete\"!=document.readyState&&await new Promise(e=>globalThis.addEventListener(\"load\",e));await w(),r.autoSaveRepeat&&setTimeout(()=>{i&&!l&&(u=!1,r.autoSaveDelay=0,b(e))},1e3*r.autoSaveRepeatDelay)}(e),{}):\"content.maybeInit\"==e.method?(S(),{}):\"content.init\"==e.method?(r=e.options,i=e.autoSaveEnabled,T(),{}):\"content.openEditor\"==e.method?(O(document)?D(document):T(),{}):\"devtools.resourceCommitted\"==e.method?(o.pageInfo.updatedResources[e.url]={content:e.content,type:e.type,encoding:e.encoding},{}):\"singlefile.fetchResponse\"==e.method?await async function(e){const t=n.get(e.requestId);if(t)return e.error?(t.reject(new Error(e.error)),n.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,n.set(e.requestId,t)),e.finished&&(e.array=t.array)),e.truncated&&!e.finished||(t.resolve(e.array),n.delete(e.requestId))),{}}(e):void 0}function S(){const e=document.querySelector(\"singlefile-infobar\");e&&e.remove(),m==location.href||o.pageInfo.processing||(u=!1,m=location.href,browser.runtime.sendMessage({method:\"tabs.init\",savedPageDetected:O(document)}).catch(()=>{}),browser.runtime.sendMessage({method:\"ui.processInit\"}).catch(()=>{}))}async function w(){const e=o.helper;if((!l||c)&&!u)if(l=!0,r.autoSaveDelay&&!c)await new Promise(e=>c=setTimeout(e,1e3*r.autoSaveDelay)),await w();else{const t=globalThis[e.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];let n,a=[];c=null,!r.removeFrames&&globalThis.frames&&globalThis.frames.length&&(a=await o.processors.frameTree.getAsync(r)),n=a&&a.sessionId,r.userScriptEnabled&&t&&await t(e.ON_BEFORE_CAPTURE_EVENT_NAME);const s=e.preProcessDoc(document,globalThis,r);C(s,a),n&&o.processors.frameTree.cleanup(n),e.postProcessDoc(document,s.markedElements,s.invalidElements),r.userScriptEnabled&&t&&await t(e.ON_AFTER_CAPTURE_EVENT_NAME),u=!0,l=!1}}function T(){i&&r&&(r.autoSaveUnload||r.autoSaveLoadOrUnload||r.autoSaveDiscard||r.autoSaveRemove)?a||(globalThis.addEventListener(\"unload\",R),document.addEventListener(\"visibilitychange\",A),a=!0):(globalThis.removeEventListener(\"unload\",R),document.removeEventListener(\"visibilitychange\",A),a=!1)}function A(){\"hidden\"==document.visibilityState&&r.autoSaveDiscard&&I({autoSaveDiscard:r.autoSaveDiscard})}function R(){!u&&(r.autoSaveUnload||r.autoSaveLoadOrUnload||r.autoSaveRemove)&&I({autoSaveUnload:r.autoSaveUnload,autoSaveRemove:r.autoSaveRemove})}function I({autoSaveUnload:e,autoSaveDiscard:t,autoSaveRemove:n}){const a=o.helper,s=globalThis[a.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];let d=[];!r.removeFrames&&globalThis.frames&&globalThis.frames.length&&(d=o.processors.frameTree.getSync(r)),r.userScriptEnabled&&s&&s(a.ON_BEFORE_CAPTURE_EVENT_NAME);C(a.preProcessDoc(document,globalThis,r),d,{autoSaveUnload:e,autoSaveDiscard:t,autoSaveRemove:n})}function C(e,t,{autoSaveUnload:n,autoSaveDiscard:a,autoSaveRemove:i}={}){const c=o.helper,l=o.pageInfo.updatedResources,u=o.pageInfo.visitDate.getTime();Object.keys(l).forEach(e=>l[e].retrieved=!1),browser.runtime.sendMessage({method:\"autosave.save\",tabId:s,tabIndex:d,taskId:r.taskId,content:c.serialize(document),canvases:e.canvases,fonts:e.fonts,stylesheets:e.stylesheets,images:e.images,posters:e.posters,usedFonts:e.usedFonts,shadowRoots:e.shadowRoots,videos:e.videos,referrer:e.referrer,adoptedStyleSheets:e.adoptedStyleSheets,worklets:e.worklets,frames:t,url:location.href,updatedResources:l,visitDate:u,autoSaveUnload:n,autoSaveDiscard:a,autoSaveRemove:i})}async function D(n){let a;h?a=await g():(P(n),function(e){s(e.body);const o=function(e,t){const o=(new DOMParser).parseFromString(e,\"text/html\");o.head||o.documentElement.insertBefore(o.createElement(\"HEAD\"),o.body);let n=o.querySelector(\"base\");n&&n.getAttribute(\"href\")||(n&&n.remove(),n=o.createElement(\"base\"),n.setAttribute(\"href\",t),o.head.insertBefore(n,o.head.firstChild));return o}(function(e){const t=e.doctype;let o=\"\";t&&(o=\"<!DOCTYPE \"+t.nodeName,t.publicId?(o+=' PUBLIC \"'+t.publicId+'\"',t.systemId&&(o+=' \"'+t.systemId+'\"')):t.systemId&&(o+=' SYSTEM \"'+t.systemId+'\"'),t.internalSubset&&(o+=\" [\"+t.internalSubset+\"]\"),o+=\"> \");return o+e.documentElement.outerHTML}(e)),n=d(e.body),a=d(o.body),r=new Set;function s(e,o=0,n=\"\"){const a=n?`${n}.${o+1}`:`${o+1}`;e.setAttribute(t,a),Array.from(e.children).forEach((e,t)=>s(e,t,a))}function d(e){const o={};return n(e),o;function n(e){if(e.getAttribute){const a=e.getAttribute(t);a&&(o[a]=e),Array.from(e.children).forEach(n)}}}function i(e,o){const n=e.getAttribute(t);n&&!o.has(n)&&e.removeAttribute(t),Array.from(e.children).forEach(e=>i(e,o))}Object.keys(n).forEach(o=>{if(o in a){if((n[o].parentElement?.getAttribute(t)||null)!==(a[o]?.parentElement?.getAttribute(t)||null)){let a=n[o];for(;a&&a!==e.body;){const e=a.getAttribute(t);e&&r.add(e),a=a.parentElement}}}}),i(e.body,r)}(n),a=o.helper.serialize(n));for(let t=0;t*e<a.length;t++){const o={method:\"editor.open\",filename:decodeURIComponent(location.href.match(/^.*\\/(.*)$/)[1]),compressContent:h,extractDataFromPageTags:v,insertTextBody:y,insertMetaCSP:E,selfExtractingArchive:h};o.truncated=a.length>e,o.truncated?(o.finished=(t+1)*e>a.length,a instanceof Uint8Array?o.content=Array.from(a.subarray(t*e,(t+1)*e)):o.content=a.substring(t*e,(t+1)*e)):(o.embeddedImage=await M(a),o.content=a instanceof Uint8Array?Array.from(a):a),await browser.runtime.sendMessage(o)}}async function M(e){if(137==e[0]&&80==e[1]&&78==e[2]&&71==e[3]){let t=new Blob([new Uint8Array(e)],{type:\"image/png\"});const o=URL.createObjectURL(t),n=new Image;n.src=o,await new Promise((e,t)=>{n.onload=e,n.onerror=t});const a=new OffscreenCanvas(n.width,n.height);a.getContext(\"2d\").drawImage(n,0,0),t=await a.convertToBlob({type:\"image/png\"});const r=await t.arrayBuffer();return Array.from(new Uint8Array(r))}}function O(e){if(void 0===f){const t=o.helper,n=e.documentElement.firstChild;h=e.documentElement.dataset&&\"\"==e.documentElement.dataset.sfz,v=Boolean(e.querySelector(\"sfz-extra-data\")),y=Boolean(e.querySelector(\"body > main[hidden]\")),E=Boolean(e.querySelector(\"meta[http-equiv=content-security-policy]\")),f=h||n.nodeType==Node.COMMENT_NODE&&(n.textContent.includes(t.COMMENT_HEADER)||n.textContent.includes(t.COMMENT_HEADER_LEGACY))}return f}function P(e){e.querySelectorAll(\"*\").forEach(e=>{const t=o.helper.getShadowRoot(e);if(t){P(t);const o=document.createElement(\"template\");o.setAttribute(\"shadowrootmode\",\"open\"),Array.from(t.childNodes).forEach(e=>o.appendChild(e)),e.appendChild(o)}})}o.pageInfo={updatedResources:{},visitDate:new Date},browser.runtime.sendMessage({method:\"bootstrap.init\"}).then(e=>{r=e.optionsAutoSave;const t=e.options;s=e.tabId,d=e.tabIndex,i=e.autoSaveEnabled,t&&t.autoOpenEditor&&O(document)?\"loading\"==document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>D(document)):D(document):\"loading\"==document.readyState?document.addEventListener(\"DOMContentLoaded\",T):T()}),browser.runtime.onMessage.addListener(e=>{if(i&&\"content.autosave\"==e.method||\"content.maybeInit\"==e.method||\"content.init\"==e.method||\"content.openEditor\"==e.method||\"devtools.resourceCommitted\"==e.method||\"singlefile.fetchResponse\"==e.method)return b(e)}),document.addEventListener(\"DOMContentLoaded\",S,!1),globalThis.window==globalThis.top&&location&&location.href&&(location.href.startsWith(\"file://\")||location.href.startsWith(\"content://\"))&&(\"loading\"==document.readyState?document.addEventListener(\"DOMContentLoaded\",p,!1):p())}();\n!function(){\"use strict\";const n=\"single-file-infobar\";function o(o,i,t){if(!o.querySelector(n)){let t;i.infobarContent?t=i.infobarContent.replace(/\\\\n/g,\"\\n\").replace(/\\\\t/g,\"\\t\"):i.saveDate&&(t=i.saveDate),t=t||\"No info\";const e=\"BODY\"==o.body.tagName?o.body:o.documentElement,a=function(n,o,i){const t=n.createElement(o);return i.appendChild(t),Array.from(getComputedStyle(t)).forEach(n=>t.style.setProperty(n,\"initial\",\"important\")),t}(o,n,e);let r;r=a.attachShadow({mode:\"open\"});const A=o.createElement(\"div\"),c=o.createElement(\"style\");if(c.textContent=\"\\n.infobar,\\n.infobar .infobar-icon,\\n.infobar .infobar-link-icon {\\n  min-inline-size: 28px;\\n  min-block-size: 28px;\\n  box-sizing: border-box;\\n}\\n\\n.infobar,\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  opacity: 0.7;\\n  transition: opacity 250ms;\\n}\\n\\n.infobar:hover,\\n.infobar .infobar-close-icon:hover,\\n.infobar .infobar-link-icon:hover {\\n  opacity: 1;\\n}\\n\\n.infobar,\\n.infobar-content {\\n  display: flex;\\n}\\n\\n.infobar {\\n  position: fixed;\\n  max-height: calc(100% - 32px);\\n  top: 16px;\\n  right: 16px;\\n  margin-inline-start: 16px;\\n  margin-block-end: 16px;\\n  color: #2d2d2d;\\n  background-color: #737373;\\n  border: 2px solid;\\n  border-color: #eee;\\n  border-radius: 16px;\\n  z-index: 2147483647;\\n  animation-name: flash;\\n  animation-duration: .5s;\\n  animation-timing-function: cubic-bezier(0.39, 0.58, 0.57, 1);\\n  animation-delay: 1s;\\n  animation-iteration-count: 2;\\n}\\n\\n.infobar:valid, .infobar:not(:focus-within):not(.infobar-focus) .infobar-content {\\n  display: none;\\n}\\n\\n.infobar:focus-within, .infobar.infobar-focus {\\n  background-color: #f9f9f9;\\n  border-color: #878787;\\n  border-radius: 8px;\\n  opacity: 1;\\n  transition-property: opacity, background-color, border-color, border-radius, color;\\n}\\n\\n.infobar-content {\\n  border: 2px solid;\\n  border-color: #f9f9f9;\\n  border-radius: 6px;\\n  background-color: #f9f9f9;\\n  overflow: auto;\\n}\\n\\n.infobar-content span {\\n  font-family: Arial, Helvetica, sans-serif;\\n  font-size: 14px;\\n  line-height: 18px;\\n  word-break: break-word;\\n  white-space: pre-wrap;\\n  margin-inline: 4px;\\n  margin-block: 4px;\\n}\\n\\n.infobar .infobar-icon,\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  cursor: pointer;\\n  background-position: center;\\n  background-repeat: no-repeat;\\n}\\n\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  align-self: flex-start;\\n}\\n\\n.infobar .infobar-icon {\\n  position: absolute;\\n  min-inline-size: 24px;\\n  min-block-size: 24px;\\n}\\n\\n@keyframes flash {\\n  0%, 100% {\\n\\tbackground-color: #737373;\\n  }\\n  50% {\\n\\tbackground-color: #dd6a00;\\n  }\\n}\\n\\n.infobar:focus-within .infobar-icon, .infobar.infobar-focus .infobar-icon {\\n  z-index: -1;\\n  background-image: none;\\n  margin: 4px;\\n}\\n\\n.infobar .infobar-close-icon {\\n  min-inline-size: 22px;\\n  min-block-size: 22px;\\n}\\n\\n.infobar .infobar-icon {\\n  background-color: transparent;\\n  background-size: 70%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHADIRLMaOHwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAPUExURQAAAIqKioyNjY2OjvDw8L2y1DEAAAABdFJOUwBA5thmAAAAAWJLR0QB/wIt3gAAAGNJREFUSMdjYCAJsLi4OBCQx6/CBQwIGIDPCBcXAkYQUsACU+AwlBVQHg6Eg5pgZBGOboIJZugDFwRwoJECJCUOhJI1wZwzqmBUwagCuipgIqTABG9h7YIKaKGAURAFEF/6AQAO4HqSoDP8bgAAAABJRU5ErkJggg==);\\n}\\n\\n.infobar .infobar-link-icon {\\n  right: 4px;\\n  background-size: 60%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8H+DhhoQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJJJREFUOI3t070NRCEMA2CnYAOyDyPwpHj/Va7hJ3FzV7zy3ET5JIwoAF6Jk4wzAJAkzxAYG9YRTgB+24wBgKmfrGAKTcEfAY4KRlRoIeBTgKOCERVaCPgU4Khge2GqKOBTgKOCERVaAEC/4PNcnyoSWHpjqkhwKxbcig0Q6AorXYF/+A6eIYD1lVbwG/jdA6/kA2THRAURVubcAAAAAElFTkSuQmCC);\\n}\\n\\n.infobar .infobar-close-icon {\\n  appearance: none;\\n  background-size: 80%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8VC4EQ6QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJtJREFUOI3NkrsBgCAMRLFwBPdxBArcfxXFkO8rbKWAAJfHJ9faf9vuYX/749T5NmShm3bEwbe2SxeuM4+2oxDL1cDoKtVUjRy+tH78Cv2CS+wIiQNC1AEhk4AQeUTMWUJMfUJMSEJMSEY8kIx4IONroaYAimNxsXp1PA7PxwfVL8QnowwoVC0lig07wDDVUjAdbAnjwtow/z/bDW7eI4M2KruJAAAAAElFTkSuQmCC);\\n}\\n\",i.infobarPositionAbsolute){c.textContent+=\".infobar { position: absolute; }\";\"static\"==getComputedStyle(e).position&&e.style.setProperty(\"position\",\"relative\",\"important\")}i.infobarPositionTop?c.textContent+=`.infobar { top: ${i.infobarPositionTop}; bottom: auto; }`:i.infobarPositionBottom&&(c.textContent+=`.infobar { bottom: ${i.infobarPositionBottom}; top: auto; }`),i.infobarPositionRight?c.textContent+=`.infobar { right: ${i.infobarPositionRight}; left: auto; }`:i.infobarPositionLeft&&(c.textContent+=`.infobar { left: ${i.infobarPositionLeft}; right: auto; }`),c.textContent=c.textContent.replace(/ {2}/g,\"\").replace(/\\n/g,\"\").replace(/: /g,\":\").replace(/, /g,\",\"),A.appendChild(c);const s=o.createElement(\"form\");s.classList.add(\"infobar\"),i.openInfobar&&s.classList.add(\"infobar-focus\"),A.appendChild(s);const l=o.createElement(\"span\");l.tabIndex=-1,l.classList.add(\"infobar-icon\"),s.appendChild(l);const b=o.createElement(\"span\");b.tabIndex=-1,b.classList.add(\"infobar-content\");const f=o.createElement(\"input\");f.type=\"checkbox\",f.required=!0,f.classList.add(\"infobar-close-icon\"),f.title=\"Close\",b.appendChild(f);const d=o.createElement(\"span\");d.textContent=t,b.appendChild(d);const p=o.createElement(\"a\");p.classList.add(\"infobar-link-icon\"),p.target=\"_blank\",p.rel=\"noopener noreferrer\",p.title=\"Open source URL: \"+i.saveUrl,p.href=i.saveUrl,b.appendChild(p),s.appendChild(b),r.appendChild(A)}}(n=>{const i=n.browser,t=n.MutationObserver;let e;async function a(){let n={displayInfobar:!0};const t=function(n,o=\"SingleFile\"){const i=n.evaluate(\"//comment()\",n,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);let t=i&&i.singleNodeValue;if(t&&t.nodeType==Node.COMMENT_NODE&&t.textContent.includes(o)){const n=t.textContent.split(\"\\n\"),[,,o,...i]=n,e=o.match(/^ url: (.*) ?$/),a=e&&e[1];if(a){let n,o;if(i.length&&(o=i[0].split(\"saved date: \")[1],o&&i.shift(),i.length>1)){let o=i[0].split(\"info: \")[1].trim();for(let n=1;n<i.length-1;n++)o+=\"\\n\"+i[n].trim();n=o.trim()}return{saveUrl:a,infobarContent:n,saveDate:o}}}}(document);if(t&&t.saveUrl){if(i&&i.runtime&&i.runtime.sendMessage)try{n=await i.runtime.sendMessage({method:\"tabs.getOptions\",url:t.saveUrl})}catch(n){}n.displayInfobar&&(t.openInfobar=n.openInfobar,t.infobarPositionAbsolute=n.infobarPositionAbsolute,t.infobarPositionTop=n.infobarPositionTop,t.infobarPositionRight=n.infobarPositionRight,t.infobarPositionBottom=n.infobarPositionBottom,t.infobarPositionLeft=n.infobarPositionLeft,o(document,t),function(n,{saveUrl:o,infobarContent:i,saveDate:t}){if(o){const e=n.querySelector(\"single-file-infobar\").shadowRoot;e.querySelector(\".infobar-content span\").textContent=i||t;const a=e.querySelector(\".infobar-content .infobar-link-icon\");a.href=o,a.title=\"Open source URL: \"+o}}(document,t))}}!function o(){n.window==n.top&&(document.addEventListener(\"single-file-display-infobar\",a,!1),\"\"!=document.documentElement.getAttribute(\"data-sfz\")||e?\"loading\"==document.readyState?document.addEventListener(\"DOMContentLoaded\",a,!1):a():e=new t(o).observe(document,{childList:!0}));n.singlefile&&(n.singlefile.infobar={displayIcon:a})}()})(\"object\"==typeof globalThis?globalThis:window)}();\n"
  },
  {
    "path": "lib/single-file-bootstrap.js",
    "content": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).singlefileBootstrap={})}(this,function(e){\"use strict\";const t=\"single-file-load-image\",s=\"single-file-image-loaded\",o=\"_singleFile_fontFaces\",n=\"_singleFile_worklets\",i=globalThis.CustomEvent,a=globalThis.document,r=globalThis.Document,l=globalThis.JSON,d=globalThis.MutationObserver;let c,u;function m(){a instanceof r&&(a.addEventListener(\"single-file-new-font-face\",e=>{const t=e.detail,s=Object.assign({},t);delete s.src,c.set(l.stringify(s),t)}),a.addEventListener(\"single-file-delete-font\",e=>{const t=e.detail,s=Object.assign({},t);delete s.src,c.delete(l.stringify(s))}),a.addEventListener(\"single-file-clear-fonts\",()=>c=new Map),a.addEventListener(\"single-file-new-worklet\",e=>{const t=e.detail;u.set(t.moduleURL,t)}))}c=globalThis.window[o]?globalThis.window[o]:globalThis.window[o]=new Map,u=globalThis.window[n]?globalThis.window[n]:globalThis.window[n]=new Map,m(),new d(m).observe(a,{childList:!0});const g=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",h=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+g+\"?|(\"+g+\")|.)\",\"ig\");const p=\"single-file-\",f=\"_singleFile_waitForUserScript\",T=\"__frameTree__::\",b=p+\"on-before-capture\",E=p+\"on-after-capture\",y=p+\"request-get-adopted-stylesheets\",w=p+\"response-get-adopted-stylesheets\",I=p+\"unregister-request-get-adopted-stylesheets\",A=p+\"user-script-init\",v=\"data-\"+p+\"removed-content\",S=\"data-\"+p+\"hidden-content\",R=\"data-\"+p+\"kept-content\",N=\"data-\"+p+\"hidden-frame\",P=\"data-\"+p+\"preserved-space-element\",M=\"data-\"+p+\"shadow-root-element\",L=\"data-\"+p+\"win-id\",C=\"data-\"+p+\"image\",O=\"data-\"+p+\"poster\",D=\"data-\"+p+\"video\",_=\"data-\"+p+\"canvas\",x=\"data-\"+p+\"movable-style\",F=\"data-\"+p+\"input-value\",k=\"data-\"+p+\"input-checked\",U=\"data-\"+p+\"lazy-loaded-src\",q=\"data-\"+p+\"stylesheet\",H=\"data-\"+p+\"disabled-noscript\",B=\"data-\"+p+\"async-script\",V=\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\",W=[\"NOSCRIPT\",\"DISABLED-NOSCRIPT\",\"META\",\"LINK\",\"STYLE\",\"TITLE\",\"TEMPLATE\",\"SOURCE\",\"OBJECT\",\"SCRIPT\",\"HEAD\",\"BODY\"],z=[\"SCRIPT\",\"NOSCRIPT\",\"META\",\"LINK\",\"TEMPLATE\"],Y=/^'(.*?)'$/,j=/^\"(.*?)\"$/,G={regular:\"400\",normal:\"400\",bold:\"700\",bolder:\"700\",lighter:\"100\"},K=\"single-file-ui-element\",$=\"data:,\",X=\"data-sf-nesting-track-id\",Z=(e,t,s)=>globalThis.addEventListener(e,t,s),J=globalThis.JSON,Q=globalThis.CustomEvent,ee=globalThis.MutationObserver,te=globalThis.URL,se=globalThis.DOMParser;function oe(e,t,s){e.querySelectorAll(\"noscript:not([\"+H+\"])\").forEach(e=>{e.setAttribute(H,e.textContent),e.textContent=\"\"}),function(e){e.querySelectorAll(\"meta[http-equiv=refresh]\").forEach(e=>{e.removeAttribute(\"http-equiv\"),e.setAttribute(\"disabled-http-equiv\",\"refresh\")})}(e),e.head&&e.head.querySelectorAll(V).forEach(e=>e.hidden=!0),e.querySelectorAll(\"svg foreignObject\").forEach(e=>{const t=e.querySelectorAll(\"html > head > \"+V+\", html > body > \"+V);t.length&&(Array.from(e.childNodes).forEach(e=>e.remove()),t.forEach(t=>e.appendChild(t)))});const o=new Map;let n;t&&e.documentElement?(!function(e){i(e.body);const t=function(e,t){const s=(new se).parseFromString(e,\"text/html\");s.head||s.documentElement.insertBefore(s.createElement(\"HEAD\"),s.body);let o=s.querySelector(\"base\");o&&o.getAttribute(\"href\")||(o&&o.remove(),o=s.createElement(\"base\"),o.setAttribute(\"href\",t),s.head.insertBefore(o,s.head.firstChild));return s}(ge(e)),s=a(e.body),o=a(t.body),n=new Set;function i(e,t=0,s=\"\"){const o=s?`${s}.${t+1}`:`${t+1}`;e.setAttribute(X,o),Array.from(e.children).forEach((e,t)=>i(e,t,o))}function a(e){const t={};return s(e),t;function s(e){if(e.getAttribute){const o=e.getAttribute(X);o&&(t[o]=e),Array.from(e.children).forEach(s)}}}function r(e,t){const s=e.getAttribute(X);s&&!t.has(s)&&e.removeAttribute(X),Array.from(e.children).forEach(e=>r(e,t))}Object.keys(s).forEach(t=>{if(t in o){if((s[t].parentElement?.getAttribute(X)||null)!==(o[t]?.parentElement?.getAttribute(X)||null)){let o=s[t];for(;o&&o!==e.body;){const e=o.getAttribute(X);e&&n.add(e),o=o.parentElement}}}}),r(e.body,n)}(e),n=ne(t,e,e.documentElement,s),s.moveStylesInHead&&e.querySelectorAll(\"body style, body ~ style\").forEach(e=>{const s=he(t,e);s&&de(e,s)&&(e.setAttribute(x,\"\"),n.markedElements.push(e))})):n={canvases:[],images:[],posters:[],videos:[],usedFonts:[],shadowRoots:[],markedElements:[]};let i=\"\";if(e.referrer)try{i=new te(\"/\",new te(e.referrer).origin).href}catch(e){}return{canvases:n.canvases,fonts:Array.from(c.values()),worklets:Array.from(u.values()),stylesheets:ue(e),images:n.images,posters:n.posters,videos:n.videos,usedFonts:Array.from(n.usedFonts.values()),shadowRoots:n.shadowRoots,referrer:i,markedElements:n.markedElements,invalidElements:o,scrollPosition:{x:t.scrollX,y:t.scrollY},adoptedStyleSheets:ie(e.adoptedStyleSheets)}}function ne(e,t,s,o,n={usedFonts:new Map,canvases:[],images:[],posters:[],videos:[],shadowRoots:[],markedElements:[]},i=new Map,a){if(s.childNodes){Array.from(s.childNodes).filter(t=>t instanceof e.HTMLElement||t instanceof e.SVGElement||t instanceof globalThis.HTMLElement||t instanceof globalThis.SVGElement).forEach(s=>{let r,l,d;if(!o.autoSaveExternalSave&&(o.removeHiddenElements||o.removeUnusedFonts||o.compressHTML)&&(d=he(e,s),(s instanceof e.HTMLElement||s instanceof globalThis.HTMLElement)&&o.removeHiddenElements&&(l=(a||s.closest(\"html > head\"))&&W.includes(s.tagName.toUpperCase())||s.closest(\"details\"),l||(r=a||de(s,d),r&&!z.includes(s.tagName.toUpperCase())&&(s.setAttribute(S,\"\"),n.markedElements.push(s)))),!r)){if(o.compressHTML&&d){const e=d.getPropertyValue(\"white-space\");e&&e.startsWith(\"pre\")&&(s.setAttribute(P,\"\"),n.markedElements.push(s))}o.removeUnusedFonts&&(ae(d,o,n.usedFonts),ae(he(e,s,\":first-letter\"),o,n.usedFonts),ae(he(e,s,\":before\"),o,n.usedFonts),ae(he(e,s,\":after\"),o,n.usedFonts))}!function(e,t,s,o,n,i,a){const r=s.tagName&&s.tagName.toUpperCase();if(\"CANVAS\"==r)try{n.canvases.push({dataURI:s.toDataURL(\"image/png\"),backgroundColor:a.getPropertyValue(\"background-color\")}),s.setAttribute(_,n.canvases.length-1),n.markedElements.push(s)}catch(e){}if(\"IMG\"==r){const t={currentSrc:i?$:o.loadDeferredImages&&s.getAttribute(U)||s.currentSrc};if(n.images.push(t),s.setAttribute(C,n.images.length-1),n.markedElements.push(s),s.removeAttribute(U),a=a||he(e,s)){t.size=function(e,t,s){let o=t.naturalWidth,n=t.naturalHeight;if(!o&&!n){const i=null==t.getAttribute(\"style\");if(s=s||he(e,t)){let e,a,r,l,d,c,u,m,g=!1;if(\"content-box\"==s.getPropertyValue(\"box-sizing\")){const e=t.style.getPropertyValue(\"box-sizing\"),s=t.style.getPropertyPriority(\"box-sizing\"),o=t.clientWidth;t.style.setProperty(\"box-sizing\",\"border-box\",\"important\"),g=t.clientWidth!=o,e?t.style.setProperty(\"box-sizing\",e,s):t.style.removeProperty(\"box-sizing\")}e=me(\"padding-left\",s),a=me(\"padding-right\",s),r=me(\"padding-top\",s),l=me(\"padding-bottom\",s),g?(d=me(\"border-left-width\",s),c=me(\"border-right-width\",s),u=me(\"border-top-width\",s),m=me(\"border-bottom-width\",s)):d=c=u=m=0,o=Math.max(0,t.clientWidth-e-a-d-c),n=Math.max(0,t.clientHeight-r-l-u-m),i&&t.removeAttribute(\"style\")}}return{pxWidth:o,pxHeight:n}}(e,s,a);const o=a.getPropertyValue(\"box-shadow\"),n=a.getPropertyValue(\"background-image\");o&&\"none\"!=o||n&&\"none\"!=n||!(t.size.pxWidth>1||t.size.pxHeight>1)||(t.replaceable=!0,t.backgroundColor=a.getPropertyValue(\"background-color\"),t.objectFit=a.getPropertyValue(\"object-fit\"),t.boxSizing=a.getPropertyValue(\"box-sizing\"),t.objectPosition=a.getPropertyValue(\"object-position\"))}}if(\"VIDEO\"==r){const o=s.currentSrc;if(o&&!o.startsWith(\"blob:\")&&!o.startsWith(\"data:\")){const t=he(e,s.parentNode);n.videos.push({positionParent:t&&t.getPropertyValue(\"position\"),src:o,size:{pxWidth:s.clientWidth,pxHeight:s.clientHeight,videoWidth:s.videoWidth,videoHeight:s.videoHeight},currentTime:s.currentTime}),s.setAttribute(D,n.videos.length-1)}if(!s.getAttribute(\"poster\")){const e=t.createElement(\"canvas\"),o=e.getContext(\"2d\");e.width=s.videoWidth,e.height=s.videoHeight;try{o.drawImage(s,0,0,e.width,e.height),n.posters.push(e.toDataURL(\"image/png\")),s.setAttribute(O,n.posters.length-1),n.markedElements.push(s)}catch(e){}}}\"IFRAME\"==r&&i&&o.removeHiddenElements&&(s.setAttribute(N,\"\"),n.markedElements.push(s));\"INPUT\"==r&&(\"password\"!=s.type&&(s.setAttribute(F,s.value),n.markedElements.push(s)),\"radio\"!=s.type&&\"checkbox\"!=s.type||(s.setAttribute(k,s.checked),n.markedElements.push(s)));\"TEXTAREA\"==r&&(s.setAttribute(F,s.value),n.markedElements.push(s));\"SELECT\"==r&&s.querySelectorAll(\"option\").forEach(e=>{e.selected&&(e.setAttribute(F,\"\"),n.markedElements.push(e))});\"SCRIPT\"==r&&(s.async&&\"\"!=s.getAttribute(\"async\")&&\"async\"!=s.getAttribute(\"async\")&&(s.setAttribute(B,\"\"),n.markedElements.push(s)),s.textContent=s.textContent.replace(/<\\/script>/gi,\"<\\\\/script>\"))}(e,t,s,o,n,r,d);const c=!(s instanceof e.SVGElement||s instanceof globalThis.SVGElement)&&re(s);if(c&&!s.classList.contains(K)&&\"single-file-infobar\"!=s.tagName.toLowerCase()){const a={};s.setAttribute(M,n.shadowRoots.length),n.markedElements.push(s),n.shadowRoots.push(a);try{if(c.adoptedStyleSheets){const e=e=>a.adoptedStyleSheets=e.detail.adoptedStyleSheets;c.addEventListener(w,e),c.dispatchEvent(new Q(y,{bubbles:!0})),a.adoptedStyleSheets||s.dispatchEvent(new Q(y,{bubbles:!0})),c.removeEventListener(w,e)}}catch(e){}ne(e,t,c,o,n,i,r),a.content=c.innerHTML,a.mode=c.mode,a.delegateFocus=c.delegatesFocus,a.clonable=c.clonable,a.serializable=c.serializable;try{c.adoptedStyleSheets&&void 0===c.adoptedStyleSheets.length&&c.dispatchEvent(new Q(I,{bubbles:!0}))}catch(e){}}ne(e,t,s,o,n,i,r),!o.autoSaveExternalSave&&o.removeHiddenElements&&a&&(l||\"\"==s.getAttribute(R)?s.parentElement&&(s.parentElement.setAttribute(R,\"\"),n.markedElements.push(s.parentElement)):r&&(s.setAttribute(v,\"\"),n.markedElements.push(s)))})}return n}function ie(e,t=new Map){if(e){const s=[];for(const o of Array.from(e))if(t.has(o))s.push(t.get(o));else{let e=\"\";if(o&&o.cssRules)for(const t of o.cssRules)e+=t.cssText+\"\\n\";t.set(o,e),s.push(e)}return s}return[]}function ae(e,t,s){if(e){const o=e.getPropertyValue(\"font-style\")||\"normal\";e.getPropertyValue(\"font-family\").split(\",\").forEach(n=>{if(n=le(n),!t.loadedFonts||t.loadedFonts.find(e=>le(e.family)==n&&e.style==o)){const t=(i=e.getPropertyValue(\"font-weight\"),G[i.toLowerCase().trim()]||i),a=e.getPropertyValue(\"font-variant\")||\"normal\",r=[n,t,o,a];s.set(J.stringify(r),[n,t,o,a])}var i})}}function re(e){const t=globalThis.chrome;if(e.openOrClosedShadowRoot)return e.openOrClosedShadowRoot;if(!(t&&t.dom&&t.dom.openOrClosedShadowRoot))return e.shadowRoot;try{return t.dom.openOrClosedShadowRoot(e)}catch(t){return e.shadowRoot}}function le(e=\"\"){return function(e){e=e.match(Y)?e.replace(Y,\"$1\"):e.replace(j,\"$1\");return e.trim()}((t=e.trim(),t.replace(h,(e,t,s)=>{const o=\"0x\"+t-65536;return o!=o||s?t:o<0?String.fromCharCode(o+65536):String.fromCharCode(o>>10|55296,1023&o|56320)}))).toLowerCase();var t}function de(e,t){let s=!1;if(t){const o=t.getPropertyValue(\"display\"),n=t.getPropertyValue(\"opacity\"),i=t.getPropertyValue(\"visibility\");if(s=\"none\"==o,!s&&(\"0\"==n||\"hidden\"==i)&&e.getBoundingClientRect){const t=e.getBoundingClientRect();s=!t.width&&!t.height}}return Boolean(s)}function ce(e,t,s){if(e.querySelectorAll(\"[\"+H+\"]\").forEach(e=>{e.textContent=e.getAttribute(H),e.removeAttribute(H)}),e.querySelectorAll(\"meta[disabled-http-equiv]\").forEach(e=>{e.setAttribute(\"http-equiv\",e.getAttribute(\"disabled-http-equiv\")),e.removeAttribute(\"disabled-http-equiv\")}),e.head&&e.head.querySelectorAll(\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\").forEach(e=>e.removeAttribute(\"hidden\")),!t){const s=[v,N,S,P,C,O,D,_,F,k,M,q,B];t=e.querySelectorAll(s.map(e=>\"[\"+e+\"]\").join(\",\"))}t.forEach(e=>{e.removeAttribute(v),e.removeAttribute(S),e.removeAttribute(R),e.removeAttribute(N),e.removeAttribute(P),e.removeAttribute(C),e.removeAttribute(O),e.removeAttribute(D),e.removeAttribute(_),e.removeAttribute(F),e.removeAttribute(k),e.removeAttribute(M),e.removeAttribute(q),e.removeAttribute(B),e.removeAttribute(x)}),s&&s.forEach((e,t)=>e.replaceWith(t))}function ue(e){if(e){const t=[];return e.querySelectorAll(\"style\").forEach((s,o)=>{try{if(!s.sheet.disabled){const n=e.createElement(\"style\");n.textContent=s.textContent,e.body.appendChild(n);const i=n.sheet;n.remove();const a=Array.from(i.cssRules).map(e=>e.cssText).join(\"\\n\"),r=Array.from(s.sheet.cssRules).map(e=>e.cssText).join(\"\\n\");i&&a==r||(s.setAttribute(q,o),t[o]=Array.from(s.sheet.cssRules).map(e=>e.cssText).join(\"\\n\"))}}catch(e){}}),t}}function me(e,t){if(t.getPropertyValue(e).endsWith(\"px\"))return parseFloat(t.getPropertyValue(e))}function ge(e){const t=e.doctype;let s=\"\";return t&&(s=\"<!DOCTYPE \"+t.nodeName,t.publicId?(s+=' PUBLIC \"'+t.publicId+'\"',t.systemId&&(s+=' \"'+t.systemId+'\"')):t.systemId&&(s+=' SYSTEM \"'+t.systemId+'\"'),t.internalSubset&&(s+=\" [\"+t.internalSubset+\"]\"),s+=\"> \"),s+e.documentElement.outerHTML}function he(e,t,s){try{return e.getComputedStyle(t,s)}catch(e){}}const pe={LAZY_SRC_ATTRIBUTE_NAME:U,SINGLE_FILE_UI_ELEMENT_CLASS:K},fe=\"attributes\",Te=globalThis.browser,be=globalThis.document,Ee=globalThis.MutationObserver,ye=new Map;let we;async function Ie(e){if(be.documentElement){ye.clear();const o=be.body?Math.max(be.body.scrollHeight,be.documentElement.scrollHeight):be.documentElement.scrollHeight,n=be.body?Math.max(be.body.scrollWidth,be.documentElement.scrollWidth):be.documentElement.scrollWidth;if(o>globalThis.innerHeight||n>globalThis.innerWidth){const r=Math.max(o-1.5*globalThis.innerHeight,0),l=Math.max(n-1.5*globalThis.innerWidth,0);if(globalThis.scrollY<r||globalThis.scrollX<l)return function(e){return we=0,new Promise(async o=>{let n;const r=new Set,l=new Ee(async t=>{if((t=t.filter(e=>e.type==fe)).length){t.filter(e=>{if(\"src\"==e.attributeName&&(e.target.setAttribute(pe.LAZY_SRC_ATTRIBUTE_NAME,e.target.src),e.target.addEventListener(\"load\",c)),\"src\"==e.attributeName||\"srcset\"==e.attributeName||e.target.tagName&&\"SOURCE\"==e.target.tagName.toUpperCase())return!e.target.classList||!e.target.classList.contains(pe.SINGLE_FILE_UI_ELEMENT_CLASS)}).length&&(n=!0,await ve(l,e,g),r.size||await Ae(l,e,g))}});async function d(t){await Re(\"idleTimeout\",async()=>{n?we<10&&(we++,Pe(\"idleTimeout\"),await d(Math.max(500,t/2))):(Pe(\"loadTimeout\"),Pe(\"maxTimeout\"),Se(l,e,g))},t,e.loadDeferredImagesNativeTimeout)}function c(e){const t=e.target;t.removeAttribute(pe.LAZY_SRC_ATTRIBUTE_NAME),t.removeEventListener(\"load\",c)}async function u(t){n=!0,await ve(l,e,g),await Ae(l,e,g),t.detail&&r.add(t.detail)}async function m(t){await ve(l,e,g),await Ae(l,e,g),r.delete(t.detail),r.size||await Ae(l,e,g)}function g(e){l.disconnect(),be.removeEventListener(t,u),be.removeEventListener(s,m),o(e)}await d(2*e.loadDeferredImagesMaxIdleTime),await ve(l,e,g),l.observe(be,{subtree:!0,childList:!0,attributes:!0}),be.addEventListener(t,u),be.addEventListener(s,m),function(e){e.loadDeferredImagesBlockCookies&&a.dispatchEvent(new i(\"single-file-block-cookies-start\")),e.loadDeferredImagesBlockStorage&&a.dispatchEvent(new i(\"single-file-block-storage-start\")),e.loadDeferredImagesDispatchScrollEvent&&a.dispatchEvent(new i(\"single-file-dispatch-scroll-event-start\")),e.loadDeferredImagesKeepZoomLevel?a.dispatchEvent(new i(\"single-file-load-deferred-images-keep-zoom-level-start\")):a.dispatchEvent(new i(\"single-file-load-deferred-images-start\"))}(e)})}(e)}}}async function Ae(e,t,s){await Re(\"loadTimeout\",()=>Se(e,t,s),t.loadDeferredImagesMaxIdleTime,t.loadDeferredImagesNativeTimeout)}async function ve(e,t,s){await Re(\"maxTimeout\",async()=>{await Pe(\"loadTimeout\"),await Se(e,t,s)},10*t.loadDeferredImagesMaxIdleTime,t.loadDeferredImagesNativeTimeout)}async function Se(e,t,s){await Pe(\"idleTimeout\"),function(e){e.loadDeferredImagesBlockCookies&&a.dispatchEvent(new i(\"single-file-block-cookies-end\")),e.loadDeferredImagesBlockStorage&&a.dispatchEvent(new i(\"single-file-block-storage-end\")),e.loadDeferredImagesDispatchScrollEvent&&a.dispatchEvent(new i(\"single-file-dispatch-scroll-event-end\")),e.loadDeferredImagesKeepZoomLevel?a.dispatchEvent(new i(\"single-file-load-deferred-images-keep-zoom-level-end\")):a.dispatchEvent(new i(\"single-file-load-deferred-images-end\"))}(t),await Re(\"endTimeout\",async()=>{await Pe(\"maxTimeout\"),s()},t.loadDeferredImagesMaxIdleTime/2,t.loadDeferredImagesNativeTimeout),e.disconnect()}async function Re(e,t,s,o){if(Te&&Te.runtime&&Te.runtime.sendMessage&&!o){if(!ye.get(e)||!ye.get(e).pending){const o={callback:t,pending:!0};ye.set(e,o);try{await Te.runtime.sendMessage({method:\"singlefile.lazyTimeout.setTimeout\",type:e,delay:s})}catch(o){Ne(e,t,s)}o.pending=!1}}else Ne(e,t,s)}function Ne(e,t,s){const o=ye.get(e);o&&globalThis.clearTimeout(o),ye.set(e,t),globalThis.setTimeout(t,s)}async function Pe(e){if(Te&&Te.runtime&&Te.runtime.sendMessage)try{await Te.runtime.sendMessage({method:\"singlefile.lazyTimeout.clearTimeout\",type:e})}catch(t){Me(e)}else Me(e)}function Me(e){const t=ye.get(e);ye.delete(e),t&&globalThis.clearTimeout(t)}Te&&Te.runtime&&Te.runtime.onMessage&&Te.runtime.onMessage.addListener&&Te.runtime.onMessage.addListener(e=>{if(\"singlefile.lazyTimeout.onTimeout\"==e.method){const t=ye.get(e.type);if(t){ye.delete(e.type);try{t.callback()}catch(t){Me(e.type)}}}});const Le={ON_BEFORE_CAPTURE_EVENT_NAME:b,ON_AFTER_CAPTURE_EVENT_NAME:E,WIN_ID_ATTRIBUTE_NAME:L,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:f,preProcessDoc:oe,serialize:ge,postProcessDoc:ce,getShadowRoot:re},Ce=\"singlefile.frameTree.initRequest\",Oe=\"singlefile.frameTree.ackInitRequest\",De=\"singlefile.frameTree.cleanupRequest\",_e=\"singlefile.frameTree.initResponse\",xe=5e3,Fe=\".\",ke=globalThis.window==globalThis.top,Ue=globalThis.browser,qe=globalThis.top,He=globalThis.MessageChannel,Be=globalThis.document,Ve=globalThis.JSON,We=globalThis.MutationObserver,ze=globalThis.DOMParser;let Ye,je=globalThis.sessions;function Ge(){globalThis.addEventListener(\"message\",async e=>{if(\"string\"==typeof e.data&&e.data.startsWith(T)){e.preventDefault(),e.stopPropagation();const t=Ve.parse(e.data.substring(15));if(t.method==Ce)e.source&&ot(e.source,{method:Oe,windowId:t.windowId,sessionId:t.sessionId}),ke||(globalThis.stop(),t.options.loadDeferredImages&&Ie(t.options),await $e(t));else if(t.method==Oe)Qe(\"requestTimeouts\",t.sessionId,t.windowId),et(t.sessionId,t.windowId);else if(t.method==De)Xe(t);else if(t.method==_e&&je.get(t.sessionId)){e.ports[0].onmessage=e=>Ze(e.data)}}},!0)}function Ke(){return globalThis.crypto.getRandomValues(new Uint32Array(32)).join(\"\")}async function $e(e){const t=e.sessionId;delete globalThis._singleFile_cleaningUp,ke||(Ye=globalThis.frameId=e.windowId),Je(Be,e.options,Ye,t),ke||(st({frames:[nt(Be,globalThis,Ye,e.options,e.scrolling)],sessionId:t,requestedFrameId:Be.documentElement.dataset.requestedFrameId&&Ye}),delete Be.documentElement.dataset.requestedFrameId)}function Xe(e){if(!globalThis._singleFile_cleaningUp){globalThis._singleFile_cleaningUp=!0;const t=e.sessionId;tt(it(Be),e.windowId,t)}}function Ze(e){e.frames.forEach(t=>Qe(\"responseTimeouts\",e.sessionId,t.windowId));const t=je.get(e.sessionId);if(t){e.requestedFrameId&&(t.requestedFrameId=e.requestedFrameId),e.frames.forEach(e=>{let s=t.frames.find(t=>e.windowId==t.windowId);s||(s={windowId:e.windowId},t.frames.push(s)),s.processed||(s.content=e.content,s.baseURI=e.baseURI,s.title=e.title,s.url=e.url,s.canvases=e.canvases,s.fonts=e.fonts,s.worklets=e.worklets,s.stylesheets=e.stylesheets,s.images=e.images,s.posters=e.posters,s.videos=e.videos,s.usedFonts=e.usedFonts,s.shadowRoots=e.shadowRoots,s.processed=e.processed,s.scrollPosition=e.scrollPosition,s.scrolling=e.scrolling,s.adoptedStyleSheets=e.adoptedStyleSheets)});t.frames.filter(e=>!e.processed).length||(t.frames=t.frames.sort((e,t)=>t.windowId.split(Fe).length-e.windowId.split(Fe).length),t.resolve&&(t.requestedFrameId&&t.frames.forEach(e=>{e.windowId==t.requestedFrameId&&(e.requestedFrame=!0)}),t.resolve(t.frames)))}}function Je(e,t,s,o){const n=it(e);!function(e,t,s,o,n){const i=[];let a;je.get(n)?a=je.get(n).requestTimeouts:(a={},je.set(n,{requestTimeouts:a}));t.forEach((e,t)=>{const s=o+Fe+t;e.setAttribute(Le.WIN_ID_ATTRIBUTE_NAME,s),i.push({windowId:s})}),st({frames:i,sessionId:n,requestedFrameId:e.documentElement.dataset.requestedFrameId&&o}),t.forEach((e,t)=>{const i=o+Fe+t;try{ot(e.contentWindow,{method:Ce,windowId:i,sessionId:n,options:s,scrolling:e.scrolling})}catch(e){}a[i]=globalThis.setTimeout(()=>st({frames:[{windowId:i,processed:!0}],sessionId:n}),xe)}),delete e.documentElement.dataset.requestedFrameId}(e,n,t,s,o),n.length&&function(e,t,s,o,n){const i=[];t.forEach((e,t)=>{const a=o+Fe+t;let r,l;try{r=e.contentDocument,l=e.contentWindow,l.stop()}catch(e){}const d=e.getAttribute(\"srcdoc\");if(!r&&d){r=(new ze).parseFromString(d,\"text/html\"),l=globalThis}if(r)try{Qe(\"requestTimeouts\",n,a),Je(r,s,a,n),i.push(nt(r,l,a,s,e.scrolling))}catch(e){i.push({windowId:a,processed:!0})}}),st({frames:i,sessionId:n,requestedFrameId:e.documentElement.dataset.requestedFrameId&&o}),delete e.documentElement.dataset.requestedFrameId}(e,n,t,s,o)}function Qe(e,t,s){const o=je.get(t);if(o&&o[e]){const t=o[e][s];t&&(globalThis.clearTimeout(t),delete o[e][s])}}function et(e,t){const s=je.get(e);s&&s.responseTimeouts&&(s.responseTimeouts[t]=globalThis.setTimeout(()=>st({frames:[{windowId:t,processed:!0}],sessionId:e}),1e4))}function tt(e,t,s){e.forEach((e,o)=>{const n=t+Fe+o;e.removeAttribute(Le.WIN_ID_ATTRIBUTE_NAME);try{ot(e.contentWindow,{method:De,windowId:n,sessionId:s})}catch(e){}}),e.forEach((e,o)=>{const n=t+Fe+o;let i;try{i=e.contentDocument}catch(e){}if(i)try{tt(it(i),n,s)}catch(e){}})}function st(e){e.method=_e;try{qe.singlefile.processors.frameTree.initResponse(e)}catch(t){ot(qe,e,!0)}}function ot(e,t,s){if(e==qe&&Ue&&Ue.runtime&&Ue.runtime.sendMessage)Ue.runtime.sendMessage(t);else if(s){const s=new He;e.postMessage(T+Ve.stringify({method:t.method,sessionId:t.sessionId}),\"*\",[s.port2]),s.port1.postMessage(t)}else e.postMessage(T+Ve.stringify(t),\"*\")}function nt(e,t,s,o,n){const i=Le.preProcessDoc(e,t,o),a=Le.serialize(e);Le.postProcessDoc(e,i.markedElements,i.invalidElements);return{windowId:s,content:a,baseURI:e.baseURI.split(\"#\")[0],url:e.documentURI,title:e.title,canvases:i.canvases,fonts:i.fonts,worklets:i.worklets,stylesheets:i.stylesheets,images:i.images,posters:i.posters,videos:i.videos,usedFonts:i.usedFonts,shadowRoots:i.shadowRoots,scrollPosition:i.scrollPosition,scrolling:n,adoptedStyleSheets:i.adoptedStyleSheets,processed:!0}}function it(e){let t=Array.from(e.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]'));return e.querySelectorAll(\"*\").forEach(e=>{const s=Le.getShadowRoot(e);s&&(t=t.concat(...it(s)))}),t}je||(je=globalThis.sessions=new Map),ke&&(Ye=\"0\",Ue&&Ue.runtime&&Ue.runtime.onMessage&&Ue.runtime.onMessage.addListener&&Ue.runtime.onMessage.addListener(e=>e.method==_e?(Ze(e),Promise.resolve({})):e.method==Oe?(Qe(\"requestTimeouts\",e.sessionId,e.windowId),et(e.sessionId,e.windowId),Promise.resolve({})):void 0)),Ge(),function e(){Z(A,({detail:e})=>globalThis[f]=async(t,s)=>{const o=Object.assign({},s);let n;delete o.win,delete o.doc,delete o.onprogress,delete o.frames,delete o.taskId,delete o._migratedTemplateFormat,delete o.woleetKey;try{n=\"jsonDetail\"==e?J.stringify({options:o}):{options:o}}catch(e){}const i=new Q(t+\"-request\",{cancelable:!0,detail:n});let a;const r=new Promise(e=>{a=e,Z(t+\"-response\",t=>{if(t.detail)try{const e=\"string\"==typeof t.detail?J.parse(t.detail):t.detail;e.options&&Object.assign(s,e.options)}catch(e){}e()})});(e=>{try{globalThis.dispatchEvent(e)}catch(e){}})(i),i.defaultPrevented?await r:a()}),new ee(e).observe(globalThis.document,{childList:!0})}(),new We(Ge).observe(Be,{childList:!0});const at=[\"AREA\",\"BASE\",\"BASEFONT\",\"BGSOUND\",\"BR\",\"COL\",\"COMMAND\",\"EMBED\",\"FRAME\",\"HR\",\"IMG\",\"INPUT\",\"KEYGEN\",\"LINK\",\"META\",\"PARAM\",\"SOURCE\",\"TRACK\",\"WBR\"],rt=[{tagName:\"HEAD\",accept:e=>!e.childNodes.length||1==e.childNodes[0].nodeType},{tagName:\"BODY\",accept:e=>!e.childNodes.length}],lt=[{tagName:\"HTML\",accept:e=>!e||8!=e.nodeType},{tagName:\"HEAD\",accept:e=>!e||8!=e.nodeType&&(3!=e.nodeType||!ut(e.textContent))},{tagName:\"BODY\",accept:e=>!e||8!=e.nodeType},{tagName:\"LI\",accept:(e,t)=>!e&&t.parentElement&&(\"UL\"==mt(t.parentElement)||\"OL\"==mt(t.parentElement))||e&&[\"LI\"].includes(mt(e))},{tagName:\"DT\",accept:e=>!e||[\"DT\",\"DD\"].includes(mt(e))},{tagName:\"P\",accept:e=>e&&[\"ADDRESS\",\"ARTICLE\",\"ASIDE\",\"BLOCKQUOTE\",\"DETAILS\",\"DIV\",\"DL\",\"FIELDSET\",\"FIGCAPTION\",\"FIGURE\",\"FOOTER\",\"FORM\",\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\",\"HEADER\",\"HR\",\"MAIN\",\"NAV\",\"OL\",\"P\",\"PRE\",\"SECTION\",\"TABLE\",\"UL\"].includes(mt(e))},{tagName:\"DD\",accept:e=>!e||[\"DT\",\"DD\"].includes(mt(e))},{tagName:\"RT\",accept:e=>!e||[\"RT\",\"RP\"].includes(mt(e))},{tagName:\"RP\",accept:e=>!e||[\"RT\",\"RP\"].includes(mt(e))},{tagName:\"OPTGROUP\",accept:e=>!e||[\"OPTGROUP\"].includes(mt(e))},{tagName:\"OPTION\",accept:e=>!e||[\"OPTION\",\"OPTGROUP\"].includes(mt(e))},{tagName:\"COLGROUP\",accept:e=>!e||8!=e.nodeType&&(3!=e.nodeType||!ut(e.textContent))},{tagName:\"CAPTION\",accept:e=>!e||8!=e.nodeType&&(3!=e.nodeType||!ut(e.textContent))},{tagName:\"THEAD\",accept:e=>!e||[\"TBODY\",\"TFOOT\"].includes(mt(e))},{tagName:\"TBODY\",accept:e=>!e||[\"TBODY\",\"TFOOT\"].includes(mt(e))},{tagName:\"TFOOT\",accept:e=>!e},{tagName:\"TR\",accept:e=>!e||[\"TR\"].includes(mt(e))},{tagName:\"TD\",accept:e=>!e||[\"TD\",\"TH\"].includes(mt(e))},{tagName:\"TH\",accept:e=>!e||[\"TD\",\"TH\"].includes(mt(e))}],dt=[\"STYLE\",\"SCRIPT\",\"XMP\",\"IFRAME\",\"NOEMBED\",\"NOFRAMES\",\"PLAINTEXT\",\"NOSCRIPT\"];function ct(e,t,s){return 3==e.nodeType?function(e){const t=e.parentNode;let s;t&&1==t.nodeType&&(s=mt(t));return!s||dt.includes(s)?(\"SCRIPT\"!=s||t.type&&\"text/javascript\"!=t.type)&&\"STYLE\"!=s?e.textContent:e.textContent.replace(/<\\//gi,\"<\\\\/\").replace(/\\/>/gi,\"\\\\/>\"):e.textContent.replace(/&/g,\"&amp;\").replace(/\\u00a0/g,\"&nbsp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}(e):8==e.nodeType?\"\\x3c!--\"+e.textContent+\"--\\x3e\":1==e.nodeType?function(e,t,s){const o=mt(e),n=t&&rt.find(t=>o==mt(t)&&t.accept(e));let i=\"\";n&&!e.attributes.length||(i=\"<\"+o.toLowerCase(),Array.from(e.attributes).forEach(s=>i+=function(e,t,s){const o=e.name;let n=\"\";if(!o.match(/[\"'>/=]/)){let i,a=e.value;s&&\"class\"==o&&(a=Array.from(t.classList).map(e=>e.trim()).join(\" \")),a=a.replace(/&/g,\"&amp;\").replace(/\\u00a0/g,\"&nbsp;\"),a.includes('\"')&&(a.includes(\"'\")||!s?a=a.replace(/\"/g,\"&quot;\"):i=!0);const r=!s||a.match(/[ \\t\\n\\f\\r'\"`=<>]/);n+=\" \";const l=e.namespaceURI,d=e.localName||o;l?\"http://www.w3.org/XML/1998/namespace\"==l?n+=\"xml:\"+d:\"http://www.w3.org/2000/xmlns/\"==l?n+=\"xmlns\"===d?\"xmlns\":\"xmlns:\"+d:\"http://www.w3.org/1999/xlink\"==l?n+=\"xlink:\"+d:e.prefix?n+=e.prefix+\":\"+d:n+=o:n+=o,\"\"!=a&&(n+=\"=\",r&&(n+=i?\"'\":'\"'),n+=a,r&&(n+=i?\"'\":'\"'))}return n}(s,e,t)),i+=\">\");\"TEMPLATE\"!=o||e.childNodes.length?Array.from(e.childNodes).forEach(e=>i+=ct(e,t,s||\"svg\"==o)):i+=e.innerHTML;const a=t&&lt.find(t=>o==mt(t)&&t.accept(e.nextSibling,e));(s||!a&&!at.includes(o))&&(i+=\"</\"+o.toLowerCase()+\">\");return i}(e,t,s):void 0}function ut(e){return Boolean(e.match(/^[ \\t\\n\\f\\r]/))}function mt(e){return e.tagName&&e.tagName.toUpperCase()}const gt={frameTree:Object.freeze({__proto__:null,TIMEOUT_INIT_REQUEST_MESSAGE:xe,cleanup:function(e){je.delete(e),Xe({windowId:Ye,sessionId:e})},getAsync:function(e){const t=Ke();return e=Ve.parse(Ve.stringify(e)),new Promise(s=>{je.set(t,{frames:[],requestTimeouts:{},responseTimeouts:{},resolve:e=>{e.sessionId=t,s(e)}}),$e({windowId:Ye,sessionId:t,options:e})})},getSync:function(e){const t=Ke();e=Ve.parse(Ve.stringify(e)),je.set(t,{frames:[],requestTimeouts:{},responseTimeouts:{}}),function(e){const t=e.sessionId;delete globalThis._singleFile_cleaningUp,ke||(Ye=globalThis.frameId=e.windowId);Je(Be,e.options,Ye,t),ke||(st({frames:[nt(Be,globalThis,Ye,e.options,e.scrolling)],sessionId:t,requestedFrameId:Be.documentElement.dataset.requestedFrameId&&Ye}),delete Be.documentElement.dataset.requestedFrameId)}({windowId:Ye,sessionId:t,options:e});const s=je.get(t).frames;return s.sessionId=t,s},initResponse:Ze})},ht={COMMENT_HEADER:\"Page saved with SingleFile\",COMMENT_HEADER_LEGACY:\"Archive processed by SingleFile\",ON_BEFORE_CAPTURE_EVENT_NAME:b,ON_AFTER_CAPTURE_EVENT_NAME:E,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:f,preProcessDoc:oe,postProcessDoc:ce,serialize:(e,t)=>function(e,t){const s=e.doctype;let o=\"\";return s&&(o=\"<!DOCTYPE \"+s.nodeName,s.publicId?(o+=' PUBLIC \"'+s.publicId+'\"',s.systemId&&(o+=' \"'+s.systemId+'\"')):s.systemId&&(o+=' SYSTEM \"'+s.systemId+'\"'),s.internalSubset&&(o+=\" [\"+s.internalSubset+\"]\"),o+=\"> \"),o+ct(e.documentElement,t)}(e,t),getShadowRoot:re};e.helper=ht,e.processors=gt});\n"
  },
  {
    "path": "lib/single-file-extension-background.js",
    "content": "!function(){\"use strict\";self.oninstall=()=>skipWaiting(),self.onactivate=()=>clients.claim(),\"undefined\"==typeof globalThis&&(window.globalThis=window),(()=>{const e=globalThis.chrome;globalThis.__defineGetter__(\"browser\",()=>({action:{onClicked:{addListener:t=>e.action.onClicked.addListener(t)},setBadgeText:t=>e.action.setBadgeText(t),setBadgeBackgroundColor:t=>e.action.setBadgeBackgroundColor(t),setTitle:t=>e.action.setTitle(t),setIcon:t=>e.action.setIcon(t)},bookmarks:{get:t=>e.bookmarks.get(t),onCreated:{addListener:t=>e.bookmarks.onCreated.addListener(t),removeListener:t=>e.bookmarks.onCreated.removeListener(t)},onChanged:{addListener:t=>e.bookmarks.onChanged.addListener(t),removeListener:t=>e.bookmarks.onChanged.removeListener(t)},onMoved:{addListener:t=>e.bookmarks.onMoved.addListener(t),removeListener:t=>e.bookmarks.onMoved.removeListener(t)},update:(t,a)=>e.bookmarks.update(t,a)},commands:{onCommand:{addListener:t=>e.commands.onCommand.addListener(t)}},downloads:{download:t=>e.downloads.download(t),onChanged:{addListener:t=>e.downloads.onChanged.addListener(t),removeListener:t=>e.downloads.onChanged.removeListener(t)},search:t=>e.downloads.search(t)},i18n:{getUILanguage:()=>e.i18n.getUILanguage(),getMessage:(t,a)=>e.i18n.getMessage(t,a)},identity:{getRedirectURL:()=>e.identity.getRedirectURL(),getAuthToken:t=>e.identity.getAuthToken(t),launchWebAuthFlow:t=>e.identity.launchWebAuthFlow(t),removeCachedAuthToken:t=>e.identity.removeCachedAuthToken(t)},contextMenus:{onClicked:{addListener:t=>e.contextMenus.onClicked.addListener(t)},create:t=>e.contextMenus.create(t),update:(t,a)=>e.contextMenus.update(t,a),removeAll:()=>e.contextMenus.removeAll()},permissions:{request:t=>e.permissions.request(t),remove:t=>e.permissions.remove(t)},runtime:{id:e.runtime.id,sendNativeMessage:(t,a)=>new Promise((n,o)=>{e.runtime.sendNativeMessage(t,a,t=>{e.runtime.lastError?o(e.runtime.lastError):n(t)})}),getManifest:()=>e.runtime.getManifest(),onMessage:{addListener:t=>e.runtime.onMessage.addListener((e,a,n)=>{const o=t(e,a);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{n(e)}catch(e){}}),!0}),removeListener:t=>e.runtime.onMessage.removeListener(t)},onMessageExternal:{addListener:t=>e.runtime.onMessageExternal.addListener((e,a,n)=>{const o=t(e,a);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{n(e)}catch(e){}}),!0})},sendMessage:t=>new Promise((a,n)=>{e.runtime.sendMessage(t,t=>{e.runtime.lastError?n(e.runtime.lastError):a(t)}),e.runtime.lastError&&n(e.runtime.lastError)}),getURL:t=>e.runtime.getURL(t),getContexts:t=>e.runtime.getContexts(t),get lastError(){return e.runtime.lastError}},scripting:{executeScript:t=>e.scripting.executeScript(t)},storage:{local:{set:t=>e.storage.local.set(t),get:t=>e.storage.local.get(t),clear:()=>e.storage.local.clear(),remove:t=>e.storage.local.remove(t)},sync:{set:t=>e.storage.sync.set(t),get:t=>e.storage.sync.get(t),clear:()=>e.storage.sync.clear(),remove:t=>e.storage.sync.remove(t)}},tabs:{onCreated:{addListener:t=>e.tabs.onCreated.addListener(t)},onActivated:{addListener:t=>e.tabs.onActivated.addListener(t)},onUpdated:{addListener:t=>e.tabs.onUpdated.addListener(t),removeListener:t=>e.tabs.onUpdated.removeListener(t)},onRemoved:{addListener:t=>e.tabs.onRemoved.addListener(t),removeListener:t=>e.tabs.onRemoved.removeListener(t)},onReplaced:{addListener:t=>e.tabs.onReplaced.addListener(t),removeListener:t=>e.tabs.onReplaced.removeListener(t)},captureVisibleTab:(t,a)=>e.tabs.captureVisibleTab(t,a),sendMessage:(t,a,n={})=>new Promise((o,r)=>{e.tabs.sendMessage(t,a,n,t=>{e.runtime.lastError?r(e.runtime.lastError):o(t)}),e.runtime.lastError&&r(e.runtime.lastError)}),query:t=>e.tabs.query(t),create:t=>e.tabs.create(t),get:t=>e.tabs.get(t),remove:t=>e.tabs.remove(t),update:(t,a)=>e.tabs.update(t,a)},devtools:{inspectedWindow:{onResourceContentCommitted:{addListener:t=>e.devtools.inspectedWindow.onResourceContentCommitted.addListener(t)},get tabId(){return e.devtools.inspectedWindow.tabId}}},offscreen:{createDocument:t=>e.offscreen.createDocument(t)},declarativeNetRequest:{updateSessionRules:t=>e.declarativeNetRequest.updateSessionRules(t)}}))})(),\"undefined\"==typeof globalThis&&(window.globalThis=window),(()=>{const e=globalThis.chrome;globalThis.__defineGetter__(\"browser\",()=>({action:{onClicked:{addListener:t=>e.action.onClicked.addListener(t)},setBadgeText:t=>e.action.setBadgeText(t),setBadgeBackgroundColor:t=>e.action.setBadgeBackgroundColor(t),setTitle:t=>e.action.setTitle(t),setIcon:t=>e.action.setIcon(t)},bookmarks:{get:t=>e.bookmarks.get(t),onCreated:{addListener:t=>e.bookmarks.onCreated.addListener(t),removeListener:t=>e.bookmarks.onCreated.removeListener(t)},onChanged:{addListener:t=>e.bookmarks.onChanged.addListener(t),removeListener:t=>e.bookmarks.onChanged.removeListener(t)},onMoved:{addListener:t=>e.bookmarks.onMoved.addListener(t),removeListener:t=>e.bookmarks.onMoved.removeListener(t)},update:(t,a)=>e.bookmarks.update(t,a)},commands:{onCommand:{addListener:t=>e.commands.onCommand.addListener(t)}},downloads:{download:t=>e.downloads.download(t),onChanged:{addListener:t=>e.downloads.onChanged.addListener(t),removeListener:t=>e.downloads.onChanged.removeListener(t)},search:t=>e.downloads.search(t)},i18n:{getUILanguage:()=>e.i18n.getUILanguage(),getMessage:(t,a)=>e.i18n.getMessage(t,a)},identity:{getRedirectURL:()=>e.identity.getRedirectURL(),getAuthToken:t=>e.identity.getAuthToken(t),launchWebAuthFlow:t=>e.identity.launchWebAuthFlow(t),removeCachedAuthToken:t=>e.identity.removeCachedAuthToken(t)},contextMenus:{onClicked:{addListener:t=>e.contextMenus.onClicked.addListener(t)},create:t=>e.contextMenus.create(t),update:(t,a)=>e.contextMenus.update(t,a),removeAll:()=>e.contextMenus.removeAll()},permissions:{request:t=>e.permissions.request(t),remove:t=>e.permissions.remove(t)},runtime:{id:e.runtime.id,sendNativeMessage:(t,a)=>new Promise((n,o)=>{e.runtime.sendNativeMessage(t,a,t=>{e.runtime.lastError?o(e.runtime.lastError):n(t)})}),getManifest:()=>e.runtime.getManifest(),onMessage:{addListener:t=>e.runtime.onMessage.addListener((e,a,n)=>{const o=t(e,a);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{n(e)}catch(e){}}),!0}),removeListener:t=>e.runtime.onMessage.removeListener(t)},onMessageExternal:{addListener:t=>e.runtime.onMessageExternal.addListener((e,a,n)=>{const o=t(e,a);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{n(e)}catch(e){}}),!0})},sendMessage:t=>new Promise((a,n)=>{e.runtime.sendMessage(t,t=>{e.runtime.lastError?n(e.runtime.lastError):a(t)}),e.runtime.lastError&&n(e.runtime.lastError)}),getURL:t=>e.runtime.getURL(t),getContexts:t=>e.runtime.getContexts(t),get lastError(){return e.runtime.lastError}},scripting:{executeScript:t=>e.scripting.executeScript(t)},storage:{local:{set:t=>e.storage.local.set(t),get:t=>e.storage.local.get(t),clear:()=>e.storage.local.clear(),remove:t=>e.storage.local.remove(t)},sync:{set:t=>e.storage.sync.set(t),get:t=>e.storage.sync.get(t),clear:()=>e.storage.sync.clear(),remove:t=>e.storage.sync.remove(t)}},tabs:{onCreated:{addListener:t=>e.tabs.onCreated.addListener(t)},onActivated:{addListener:t=>e.tabs.onActivated.addListener(t)},onUpdated:{addListener:t=>e.tabs.onUpdated.addListener(t),removeListener:t=>e.tabs.onUpdated.removeListener(t)},onRemoved:{addListener:t=>e.tabs.onRemoved.addListener(t),removeListener:t=>e.tabs.onRemoved.removeListener(t)},onReplaced:{addListener:t=>e.tabs.onReplaced.addListener(t),removeListener:t=>e.tabs.onReplaced.removeListener(t)},captureVisibleTab:(t,a)=>e.tabs.captureVisibleTab(t,a),sendMessage:(t,a,n={})=>new Promise((o,r)=>{e.tabs.sendMessage(t,a,n,t=>{e.runtime.lastError?r(e.runtime.lastError):o(t)}),e.runtime.lastError&&r(e.runtime.lastError)}),query:t=>e.tabs.query(t),create:t=>e.tabs.create(t),get:t=>e.tabs.get(t),remove:t=>e.tabs.remove(t),update:(t,a)=>e.tabs.update(t,a)},devtools:{inspectedWindow:{onResourceContentCommitted:{addListener:t=>e.devtools.inspectedWindow.onResourceContentCommitted.addListener(t)},get tabId(){return e.devtools.inspectedWindow.tabId}}},offscreen:{createDocument:t=>e.offscreen.createDocument(t)},declarativeNetRequest:{updateSessionRules:t=>e.declarativeNetRequest.updateSessionRules(t)}}))})();const e=8388608;let t=1;async function a(t,a,n){for(let o=0;o*e<=n.array.length;o++){const r={method:\"singlefile.fetchResponse\",requestId:a,headers:n.headers,status:n.status,error:n.error};r.truncated=n.array.length>e,r.truncated?(r.finished=(o+1)*e>n.array.length,r.array=n.array.slice(o*e,(o+1)*e)):r.array=n.array,await browser.tabs.sendMessage(t,r)}return{}}browser.runtime.onMessage.addListener((e,n)=>{if(e.method&&e.method.startsWith(\"singlefile.fetch\"))return new Promise(o=>{(async function(e,n){if(\"singlefile.fetch\"==e.method)try{const o=await async function(e,a={}){a.cache=\"no-store\";const n=await fetch(e,a);if(a.referrer&&(401==n.status||403==n.status||404==n.status)){const n=await async function(e,a){const n=t++;return await browser.declarativeNetRequest.updateSessionRules({addRules:[{action:{type:\"modifyHeaders\",requestHeaders:[{header:\"Referer\",operation:\"set\",value:a}]},condition:{initiatorDomains:[browser.runtime.id],urlFilter:e,resourceTypes:[\"xmlhttprequest\"]},id:n}]}),n}(e,a.referrer);await new Promise(e=>setTimeout(e,1e3));try{const t=await fetch(e,a),n=Array.from(new Uint8Array(await t.arrayBuffer())),o={\"content-type\":t.headers.get(\"content-type\")};return{array:n,headers:o,status:t.status}}finally{await async function(e){await browser.declarativeNetRequest.updateSessionRules({removeRuleIds:[e]})}(n)}}const o=Array.from(new Uint8Array(await n.arrayBuffer())),r={\"content-type\":n.headers.get(\"content-type\")},i=n.status;return{array:o,headers:r,status:i}}(e.url,{referrer:e.referrer,headers:e.headers});return a(n.tab.id,e.requestId,o)}catch(t){return a(n.tab.id,e.requestId,{error:t.message,array:[]})}else if(\"singlefile.fetchFrame\"==e.method)return browser.tabs.sendMessage(n.tab.id,e)})(e,n).then(o).catch(e=>o({error:e&&(e.message||e.toString())}))})}),browser.runtime.onMessage.addListener((e,t)=>{if(\"singlefile.frameTree.initResponse\"==e.method||\"singlefile.frameTree.ackInitRequest\"==e.method)return browser.tabs.sendMessage(t.tab.id,e,{frameId:0}),Promise.resolve({})});const n=new Map;function o(e,t){e.delete(t)}browser.runtime.onMessage.addListener((e,t)=>{if(\"singlefile.lazyTimeout.setTimeout\"==e.method){let a,r=n.get(t.tab.id);if(r)if(a=r.get(t.frameId),a){const t=a.get(e.type);t&&clearTimeout(t)}else a=new Map;const i=setTimeout(async()=>{try{const a=n.get(t.tab.id),r=a.get(t.frameId);a&&r&&o(r,e.type),await browser.tabs.sendMessage(t.tab.id,{method:\"singlefile.lazyTimeout.onTimeout\",type:e.type})}catch(e){}},e.delay);return r||(r=new Map,a=new Map,r.set(t.frameId,a),n.set(t.tab.id,r)),a.set(e.type,i),Promise.resolve({})}if(\"singlefile.lazyTimeout.clearTimeout\"==e.method){let a=n.get(t.tab.id);if(a){const n=a.get(t.frameId);if(n){const t=n.get(e.type);t&&clearTimeout(t),o(n,e.type)}}return Promise.resolve({})}}),browser.tabs.onRemoved.addListener(e=>n.delete(e));async function r(e,t){let a;const n=new Promise((e,t)=>{browser.downloads.onChanged.addListener(function n(o){o.id==a&&o.state&&(\"complete\"==o.state.current&&(browser.downloads.search({id:a}).then(t=>e({filename:t[0]&&t[0].filename})).catch(()=>e({})),browser.downloads.onChanged.removeListener(n)),\"interrupted\"==o.state.current&&(o.error&&\"USER_CANCELED\"==o.error.current?e({cancelled:!0}):t(new Error(o.state.current)),browser.downloads.onChanged.removeListener(n)))})});try{a=await browser.downloads.download(e)}catch(a){if(a.message){const n=a.message.toLowerCase(),o=n.includes(\"illegal characters\")||n.includes(\"invalid filename\");if(o&&e.filename.startsWith(\".\"))return e.filename=t+e.filename,r(e,t);if(o&&e.filename.includes(\",\"))return e.filename=e.filename.replace(/,/g,t),r(e,t);if(o&&e.filename.match(/\\u200C|\\u200D|\\u200E|\\u200F/))return e.filename=e.filename.replace(/\\u200C|\\u200D|\\u200E|\\u200F/g,t),r(e,t);if(o&&!e.filename.match(/^[\\x00-\\x7F]+$/))return e.filename=e.filename.replace(/[^\\x00-\\x7F]+/g,t),r(e,t);if((n.includes(\"'incognito'\")||n.includes('\"incognito\"'))&&e.incognito)return delete e.incognito,r(e,t);if(\"conflictaction prompt not yet implemented\"==n&&e.conflictAction)return delete e.conflictAction,r(e,t);if(n.includes(\"canceled\"))return{cancelled:!0};throw a}throw a}return n}let i,s,c;async function l(e,t,a){e[a]&&!e[t]&&(e[t]=e[a],delete e[a])}async function d(e){s&&delete s[e];const t=await f();if(t[e]){const a=t[e].autoSave;t[e]={autoSave:a},await m(t)}}function u(e){return s||(s={}),void 0===e||s[e]||(s[e]={}),s}async function f(e){if(!i){const e=await browser.storage.local.get();i=e.tabsData||{}}return async function(){if(!c){c=!0;const e=await browser.tabs.query({currentWindow:!0,highlighted:!0});Object.keys(i).filter(t=>{if(\"autoSaveAll\"!=t&&\"autoSaveUnpinned\"!=t&&\"profileName\"!=t)return!e.find(e=>e.id==t)}).forEach(e=>delete i[e]),await browser.storage.local.set({tabsData:i})}}(),void 0===e||i[e]||(i[e]={}),i}async function m(e){i=e,await browser.storage.local.set({tabsData:e})}setTimeout(()=>f().then(e=>i=e),0);const h=\"-\",w=\"__Default_Settings__\",p=\"__Disabled_Settings__\",b=\"regexp:\",g=\"profile_\",y=!/Mobile.*Firefox/.test(navigator.userAgent),v=navigator.canShare&&navigator.canShare({files:[new File([new Blob([\"\"],{type:\"text/html\"})],\"test.html\")]}),k=[\"~\",\"+\",\"\\\\\\\\\",\"?\",\"%\",\"*\",\":\",\"|\",'\"',\"<\",\">\",\"\\0-\u001f\",\"\"],A=[\"~\",\"+\",\"?\",\"%\",\"*\",\":\",\"|\",'\"',\"<\",\">\",\"\\\\\\\\\",\"\\0-\u001f\",\"\"],x=[\"～\",\"＋\",\"？\",\"％\",\"＊\",\"：\",\"｜\",\"＂\",\"＜\",\"＞\",\"＼\"],T={removeHiddenElements:!0,removedElementsSelector:\"\",removeUnusedStyles:!0,removeUnusedFonts:!0,removeFrames:!1,compressHTML:!0,compressCSS:!1,loadDeferredImages:!0,loadDeferredImagesMaxIdleTime:1500,loadDeferredImagesBlockCookies:!1,loadDeferredImagesBlockStorage:!1,loadDeferredImagesKeepZoomLevel:!1,loadDeferredImagesDispatchScrollEvent:!1,loadDeferredImagesBeforeFrames:!1,filenameTemplate:\"%if-empty<{page-title}|No title> ({date-locale} {time-locale}).{filename-extension}\",infobarTemplate:\"\",includeInfobar:!1,openInfobar:!1,confirmInfobarContent:!1,autoClose:!1,confirmFilename:!1,filenameConflictAction:\"uniquify\",filenameMaxLength:192,filenameMaxLengthUnit:\"bytes\",filenameReplacedCharacters:A,filenameReplacementCharacter:\"_\",filenameReplacementCharacters:x,replaceEmojisInFilename:!1,saveFilenameTemplateData:!1,contextMenuEnabled:!0,tabMenuEnabled:!0,browserActionMenuEnabled:!0,shadowEnabled:!0,logsEnabled:!0,progressBarEnabled:!0,maxResourceSizeEnabled:!1,maxResourceSize:10,displayInfobar:!0,displayStats:!1,backgroundSave:y,defaultEditorMode:\"normal\",applySystemTheme:!0,contentWidth:70,autoSaveDelay:1,autoSaveLoad:!1,autoSaveUnload:!1,autoSaveLoadOrUnload:!0,autoSaveDiscard:!1,autoSaveRemove:!1,autoSaveRepeat:!1,autoSaveRepeatDelay:10,removeAlternativeFonts:!0,removeAlternativeMedias:!0,removeAlternativeImages:!0,groupDuplicateImages:!0,maxSizeDuplicateImages:524288,saveRawPage:!1,saveToClipboard:!1,addProof:!1,saveToGDrive:!1,saveToDropbox:!1,saveWithWebDAV:!1,webDAVURL:\"\",webDAVUser:\"\",webDAVPassword:\"\",saveWithMCP:!1,mcpServerUrl:\"\",mcpAuthToken:\"\",saveToGitHub:!1,saveToRestFormApi:!1,saveToS3:!1,githubToken:\"\",githubUser:\"\",githubRepository:\"SingleFile-Archives\",githubBranch:\"main\",saveWithCompanion:!1,sharePage:!1,forceWebAuthFlow:!1,resolveFragmentIdentifierURLs:!1,userScriptEnabled:!1,openEditor:!1,openSavedPage:!1,autoOpenEditor:!1,saveCreatedBookmarks:!1,allowedBookmarkFolders:[],ignoredBookmarkFolders:[],replaceBookmarkURL:!0,saveFavicon:!0,includeBOM:!1,warnUnsavedPage:!0,displayInfobarInEditor:!1,compressContent:!1,createRootDirectory:!1,selfExtractingArchive:!1,disableCompression:!1,extractDataFromPage:!1,preventAppendedData:!1,insertEmbeddedImage:!1,insertEmbeddedScreenshotImage:!1,insertTextBody:!1,autoSaveExternalSave:!1,insertMetaNoIndex:!1,insertMetaCSP:!0,passReferrerOnError:!1,password:\"\",insertSingleFileComment:!0,removeSavedDate:!1,blockMixedContent:!1,saveOriginalURLs:!1,acceptHeaders:{font:\"application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8\",image:\"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8\",stylesheet:\"text/css,*/*;q=0.1\",script:\"*/*\",document:\"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",video:\"video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5\",audio:\"audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5\"},moveStylesInHead:!1,networkTimeout:0,woleetKey:\"\",blockImages:!1,blockAlternativeImages:!0,blockStylesheets:!1,blockFonts:!1,blockScripts:!0,blockVideos:!0,blockAudios:!0,delayBeforeProcessing:0,delayAfterProcessing:0,_migratedTemplateFormat:!0,saveToRestFormApiUrl:\"\",saveToRestFormApiFileFieldName:\"\",saveToRestFormApiUrlFieldName:\"\",saveToRestFormApiToken:\"\",S3Domain:\"s3.amazonaws.com\",S3Region:\"\",S3Bucket:\"\",S3AccessKey:\"\",S3SecretKey:\"\",resolveLinks:!0,groupDuplicateStylesheets:!1,infobarPositionAbsolute:!1,infobarPositionTop:\"16px\",infobarPositionRight:\"16px\",infobarPositionBottom:\"\",infobarPositionLeft:\"\",removeNoScriptTags:!0,customShortcut:null,imageReductionFactor:1},I=[{url:\"file:\",profile:\"__Default_Settings__\",autoSaveProfile:\"__Disabled_Settings__\"}],C={\"page-title\":\"No title\",\"page-heading\":\"No heading\",\"page-language\":\"No language\",\"page-description\":\"No description\",\"page-author\":\"No author\",\"page-creator\":\"No creator\",\"page-publisher\":\"No publisher\",\"url-hash\":\"No hash\",\"url-host\":\"No host\",\"url-hostname\":\"No hostname\",\"url-href\":\"No href\",\"url-href-digest-sha-1\":\"No hash\",\"url-href-flat\":\"No href\",\"url-referrer\":\"No referrer\",\"url-referrer-flat\":\"No referrer\",\"url-password\":\"No password\",\"url-pathname\":\"No pathname\",\"url-pathname-flat\":\"No pathname\",\"url-port\":\"No port\",\"url-protocol\":\"No protocol\",\"url-search\":\"No search\",\"url-username\":\"No username\",\"tab-id\":\"No tab id\",\"tab-index\":\"No tab index\",\"url-last-segment\":\"No last segment\"};let S,P=E();async function E(){const{sync:e}=await browser.storage.local.get();S=e?browser.storage.sync:browser.storage.local;const t=await S.get();if(t[g+w])t.profiles&&await S.remove([\"profiles\"]);else if(t.profiles){const e=Object.keys(t.profiles);for(const a of e)await j(a,t.profiles[a])}else await j(w,T);t.rules||await S.set({rules:I}),t.maxParallelWorkers||await S.set({maxParallelWorkers:navigator.hardwareConcurrency||4}),t.processInForeground||await S.set({processInForeground:!1});(await _()).map(async e=>{const t=await O(e);t._migratedTemplateFormat||(t.filenameTemplate=function(e){try{return Object.keys(C).forEach(t=>{const a=C[t];e=e.replaceAll(`{${t}}`,`%if-empty<{${t}}|${a}>`)}),e}catch(e){}}(t.filenameTemplate),t._migratedTemplateFormat=!0);for(const e of Object.keys(T))void 0===t[e]&&(t[e]=T[e]);Y(t.filenameReplacedCharacters,k)&&Y(t.filenameReplacementCharacters,x)&&(t.filenameReplacedCharacters=A),await j(e,t)})}async function L(e,t){const{rules:a}=await S.get([\"rules\"]),n=a.filter(e=>U(e));let o=n.sort(M).find(t=>e&&e.match(new RegExp(t.url.split(b)[1])));if(!o){const n=a.filter(e=>!U(e));o=n.sort(M).find(a=>!t&&\"*\"==a.url||e&&e.includes(a.url))}return o}async function R(){await P;const{maxParallelWorkers:e,processInForeground:t}=await S.get([\"maxParallelWorkers\",\"processInForeground\"]),a=await N();return{profiles:await D(),rules:a,maxParallelWorkers:e,processInForeground:t}}function M(e,t){return t.url.length-e.url.length}function U(e){return e.url.toLowerCase().startsWith(b)}async function W(e){if(e.method.endsWith(\".get\"))return await R();if(e.method.endsWith(\".set\")){const{config:t}=e,a=t.profiles,n=t.rules,o=t.maxParallelWorkers,r=t.processInForeground,i=await B();await S.remove([...i,\"rules\",\"maxParallelWorkers\",\"processInForeground\"]),await S.set({rules:n,maxParallelWorkers:o,processInForeground:r}),Object.keys(a).forEach(e=>j(e,a[e]))}if(e.method.endsWith(\".deleteRules\")&&await async function(e){const t=await N();await S.set({rules:e?t.filter(t=>t.autoSaveProfile!=e&&t.profile!=e):[]})}(e.profileName),e.method.endsWith(\".deleteRule\")&&await async function(e){if(!e)throw new Error(\"URL is empty\");const t=await N();await S.set({rules:t.filter(t=>t.url!=e)})}(e.url),e.method.endsWith(\".addRule\")&&await z(e.url,e.profileName,e.autoSaveProfileName),e.method.endsWith(\".createProfile\")&&await async function(e,t){if((await _()).includes(e))throw new Error(\"Duplicate profile name\");const a=await O(t),n=JSON.parse(JSON.stringify(a));n.customShortcut=null,await j(e,n)}(e.profileName,e.fromProfileName||w),e.method.endsWith(\".renameProfile\")&&await async function(e,t){const a=await _(),n=await f(),o=await N();if(!a.includes(e))throw new Error(\"Profile not found\");if(a.includes(t))throw new Error(\"Duplicate profile name\");if(e==w)throw new Error(\"Default settings cannot be renamed\");n.profileName==e&&(n.profileName=t,await m(n));o.forEach(a=>{a.profile==e&&(a.profile=t),a.autoSaveProfile==e&&(a.autoSaveProfile=t)});const r=await O(e);await S.remove([g+e]),await S.set({[g+t]:r,rules:o})}(e.profileName,e.newProfileName),e.method.endsWith(\".deleteProfile\")&&await async function(e){const t=await _(),a=await f(),n=await N();if(!t.includes(e))throw new Error(\"Profile not found\");if(e==w)throw new Error(\"Default settings cannot be deleted\");a.profileName==e&&(delete a.profileName,await m(a));n.forEach(t=>{t.profile==e&&(t.profile=w),t.autoSaveProfile==e&&(t.autoSaveProfile=w)}),S.remove([g+e]),await S.set({rules:n})}(e.profileName),e.method.endsWith(\".resetProfiles\")&&await async function(){await P;const e=await f();delete e.profileName,await m(e);let t=await B();await S.remove([...t,\"rules\",\"maxParallelWorkers\",\"processInForeground\"]),await E()}(),e.method.endsWith(\".resetProfile\")&&await async function(e){if(!(await _()).includes(e))throw new Error(\"Profile not found\");await j(e,T)}(e.profileName),e.method.endsWith(\".importConfig\")&&await async function(e){const t=await _(),a=await B(),n=await f();t.includes(n.profileName)&&(delete n.profileName,await m(n));await S.remove([...a,\"rules\",\"maxParallelWorkers\",\"processInForeground\"]);const o={rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground};Object.keys(e.profiles).forEach(t=>o[g+t]=e.profiles[t]),await S.set(o),await E()}(e.config),e.method.endsWith(\".updateProfile\")&&await async function(e,t){if(!(await _()).includes(e))throw new Error(\"Profile not found\");const a=await O(e);Object.keys(a).forEach(e=>{t[e]=void 0===t[e]?a[e]:t[e]}),await j(e,t)}(e.profileName,e.profile),e.method.endsWith(\".updateRule\")&&await q(e.url,e.newUrl,e.profileName,e.autoSaveProfileName),e.method.endsWith(\".getConstants\"))return{DISABLED_PROFILE_NAME:p,DEFAULT_PROFILE_NAME:w,CURRENT_PROFILE_NAME:h,BACKGROUND_SAVE_SUPPORTED:y,SHARE_API_SUPPORTED:v};if(e.method.endsWith(\".getRules\"))return N();if(e.method.endsWith(\".getProfiles\"))return D();if(e.method.endsWith(\".exportConfig\"))return async function(){const e=await R(),t=JSON.stringify({profiles:e.profiles,rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground},null,2),a=`singlefile-settings-${(new Date).toISOString().replace(/:/g,\"_\")}.json`,n={url:\"data:text/json;base64,\"+btoa(unescape(encodeURIComponent(t))),filename:a,saveAs:!0};await r(n,\"_\")}();if(e.method.endsWith(\".enableSync\")){await browser.storage.local.set({sync:!0});const e=await browser.storage.sync.get();if(!e||!e.rules){const e=await B(),t=await browser.storage.local.get([\"rules\",\"maxParallelWorkers\",\"processInForeground\",...e]);await browser.storage.sync.set(t)}return S=browser.storage.sync,await E(),{}}if(e.method.endsWith(\".disableSync\")){await browser.storage.local.set({sync:!1});const e=await browser.storage.sync.get(),t=await browser.storage.local.get();if(e&&e.rules&&(!t||!t.rules)){await browser.storage.local.set({rules:e.rules,maxParallelWorkers:e.maxParallelWorkers,processInForeground:e.processInForeground});const t={};await browser.storage.local.set(t)}return S=browser.storage.local,await E(),{}}return e.method.endsWith(\".isSync\")?{sync:(await browser.storage.local.get()).sync}:{}}async function D(){await P;const e=await B(),t=await S.get(e),a={};return Object.keys(t).forEach(e=>a[e.substring(8)]=t[e]),a}async function F(e,t){await P;const[a,n]=await Promise.all([L(e),f()]),o=n.profileName||w;let r;if(a){const e=a[t?\"autoSaveProfile\":\"profile\"];r=e==h?o:e}else r=o;const i=await O(r);return Object.assign({profileName:r},i)}async function N(){return(await S.get([\"rules\"])).rules}async function _(){return Object.keys(await S.get()).filter(e=>e.startsWith(g)).map(e=>e.substring(8))}async function B(){return Object.keys(await S.get()).filter(e=>e.startsWith(g))}async function O(e){const t=g+e;return(await S.get([t]))[t]}async function j(e,t){const a=g+e;await S.set({[a]:t})}async function z(e,t,a){if(!e)throw new Error(\"URL is empty\");const n=await N();if(n.find(t=>t.url==e))throw new Error(\"URL already exists\");n.push({url:e,profile:t,autoSaveProfile:a}),await S.set({rules:n})}async function q(e,t,a,n){if(!e||!t)throw new Error(\"URL is empty\");const o=await N(),r=o.find(t=>t.url==e);if(!r)throw new Error(\"URL not found\");if(o.find(a=>a.url==t&&a.url!=e))throw new Error(\"New URL already exists\");r.url=t,r.profile=a,r.autoSaveProfile=n,await S.set({rules:o})}async function K(){return(await S.get()).authInfo}async function $(){return(await S.get()).dropboxAuthInfo}async function V(e){await S.set({authInfo:e})}async function G(e){await S.set({dropboxAuthInfo:e})}async function J(){let e=K();e.revokableAccessToken?V({revokableAccessToken:e.revokableAccessToken}):await S.remove([\"authInfo\"])}async function H(){let e=$();e.revokableAccessToken?G({revokableAccessToken:e.revokableAccessToken}):await S.remove([\"dropboxAuthInfo\"])}function Y(e,t){return e.length==t.length&&e.every((e,a)=>e==t[a])}async function Z(e){if(e){const[t,a]=await Promise.all([f(),L(e.url)]);return Boolean(t.autoSaveAll||t.autoSaveUnpinned&&!e.pinned||t[e.id]&&t[e.id].autoSave)&&(!a||a.autoSaveProfile!=p)}}const Q=33554432,X=\"/src/ui/pages/editor.html\",ee=new Map,te=new Map,ae=browser.runtime.getURL(X);async function ne({tabIndex:e,content:t,filename:a,compressContent:n,selfExtractingArchive:o,disableCompression:r,extractDataFromPage:i,insertTextBody:s,insertMetaCSP:c,embeddedImage:l,url:d}){const u={active:!0,url:X};null!=e&&(u.index=e);const f=await browser.tabs.create(u);ee.set(f.id,{url:d,content:t,filename:a,compressContent:n,selfExtractingArchive:o,disableCompression:r,extractDataFromPage:i,insertTextBody:s,insertMetaCSP:c,embeddedImage:l})}function oe(e){return e.url==ae}async function re(e){return(await browser.tabs.query(e)).sort((e,t)=>e.index-t.index)}function ie(e){return new Promise((t,a)=>{browser.tabs.onUpdated.addListener(function n(o,r){if(r&&r.url&&r.url.startsWith(e)){browser.tabs.onUpdated.removeListener(n);const e=new URLSearchParams(new URL(r.url).search).get(\"code\");e?(browser.tabs.remove(o),t(e)):a()}})})}async function se(e){const t=await browser.tabs.create({url:e.url,active:!0});return new Promise((e,a)=>{browser.tabs.onRemoved.addListener(function e(n){n==t.id&&(browser.tabs.onRemoved.removeListener(e),a(new Error(\"code_required\")))})})}const ce=\"/src/ui/resources/icon_128.png\",le=\"/src/ui/resources/icon_128_wait\",de=browser.i18n.getMessage(\"buttonDefaultTooltip\"),ue=browser.i18n.getMessage(\"buttonBlockedTooltip\"),fe=browser.i18n.getMessage(\"buttonInitializingBadge\"),me=browser.i18n.getMessage(\"buttonInitializingTooltip\"),he=browser.i18n.getMessage(\"buttonErrorBadge\"),we=browser.i18n.getMessage(\"buttonBlockedBadge\"),pe=browser.i18n.getMessage(\"buttonOKBadge\"),be=browser.i18n.getMessage(\"buttonSaveProgressTooltip\"),ge=browser.i18n.getMessage(\"buttonUploadProgressTooltip\"),ye=browser.i18n.getMessage(\"buttonAutoSaveActiveBadge\"),ve=browser.i18n.getMessage(\"buttonAutoSaveActiveTooltip\"),ke=[2,147,20,192],Ae=[4,229,36,192],xe={default:{setBadgeBackgroundColor:{color:ke},setBadgeText:{text:\"\"},setTitle:{title:de},setIcon:{path:ce}},inject:{setBadgeBackgroundColor:{color:ke},setBadgeText:{text:fe},setTitle:{title:me}},execute:{setBadgeBackgroundColor:{color:Ae},setBadgeText:{text:fe}},progress:{setBadgeBackgroundColor:{color:Ae},setBadgeText:{text:\"\"}},edit:{setBadgeBackgroundColor:{color:ke},setBadgeText:{text:\"\"},setTitle:{title:de},setIcon:{path:ce}},end:{setBadgeBackgroundColor:{color:Ae},setBadgeText:{text:pe},setTitle:{title:de},setIcon:{path:ce}},error:{setBadgeBackgroundColor:{color:[229,4,12,192]},setBadgeText:{text:he},setTitle:{title:\"\"},setIcon:{path:ce}},forbidden:{setBadgeBackgroundColor:{color:[255,255,255,1]},setBadgeText:{text:we},setTitle:{title:ue},setIcon:{path:ce}},autosave:{inject:{setBadgeBackgroundColor:{color:[64,64,64,192]},setBadgeText:{text:ye},setTitle:{title:ve},setIcon:{path:ce}},default:{setBadgeBackgroundColor:{color:[208,208,208,192]},setBadgeText:{text:ye},setTitle:{title:ve},setIcon:{path:ce}}}};let Te;function Ie(e,t){if(e.method.endsWith(\".processInit\")){delete u(t.tab.id)[t.tab.id].button,Le(t.tab)}var a,n,o;return e.method.endsWith(\".processProgress\")&&e.maxIndex&&(a=t.tab.id,n=e.index,o=e.maxIndex,Ee(a,n,o,be)),e.method.endsWith(\".processEnd\")&&Se(t.tab.id),e.method.endsWith(\".processError\")&&(e.error&&console.error(\"Initialization error\",e.error),Ce(t.tab.id)),e.method.endsWith(\".processCancelled\")&&Pe(t.tab),Promise.resolve({})}function Ce(e){Re(e,Ue(\"error\"))}function Se(e,t){Re(e,t?Ue(\"default\",!0):Ue(\"end\"))}function Pe(e){Le(e)}function Ee(e,t,a,n){const o=Math.max(Math.min(20,Math.floor(t/a*20)),0),r=Math.min(Math.floor(t/a*8),8),i=le+r+\".png\",s=Ue(\"progress\");s.setTitle={title:n+5*o+\"%\"},s.setIcon={path:i},Re(e,s)}async function Le(e){const t=Ue(\"default\",await Z(e));await Re(e.id,t)}async function Re(e,t){try{const a=u(e);if(t){a[e].button||(a[e].button={lastState:null});const n=a[e].button.lastState||{},o={};Object.keys(t).forEach(e=>{void 0!==t[e]&&JSON.stringify(n[e])!=JSON.stringify(t[e])&&(o[e]=t[e])}),Object.keys(o).length&&(a[e].button.lastState=t,await async function(e,t){for(const a of Object.keys(t))await Me(e,a,t[a])}(e,o))}}catch(e){}}async function Me(e,t,a){if(browser.action[t]){const n=JSON.parse(JSON.stringify(a));n.tabId=e,await browser.action[t](n)}}function Ue(e,t){return JSON.parse(JSON.stringify(t?xe.autosave[e]:xe[e]))}browser.action.onClicked.addListener(async e=>{const t=(await re({currentWindow:!0,highlighted:!0})).filter(t=>t.windowId===e.windowId&&(void 0===e.workspaceId||t.workspaceId===e.workspaceId));t.length<=1?function(e){Te.isSavingTab(e)?Te.cancelTab(e.id):Te.saveTabs([e])}(e):Te.saveTabs(t)});const We=browser.contextMenus,De=\"save-page\",Fe=\"edit-and-save-page\",Ne=\"save-with-profile\",_e=\"save-selected-links\",Be=\"view-pendings\",Oe=\"select-profile\",je=\"wasve-with-profile-\",ze=\"select-profile-\",qe=\"associate-with-profile\",Ke=\"associate-with-profile-\",$e=\"save-selected\",Ve=\"save-frame\",Ge=\"save-tabs\",Je=\"save-selected-tabs\",He=\"save-unpinned-tabs\",Ye=\"save-all-tabs\",Ze=\"batch-save-urls\",Qe=\"button-\"+Je,Xe=\"button-\"+He,et=\"button-\"+Ye,tt=\"auto-save\",at=\"auto-save-disabled\",nt=\"auto-save-tab\",ot=\"auto-save-unpinned\",rt=\"auto-save-all\",it=browser.i18n.getMessage(\"menuCreateDomainRule\"),st=browser.i18n.getMessage(\"menuUpdateRule\"),ct=browser.i18n.getMessage(\"menuSavePage\"),lt=browser.i18n.getMessage(\"menuSaveWithProfile\"),dt=browser.i18n.getMessage(\"menuSaveSelectedLinks\"),ut=browser.i18n.getMessage(\"menuEditPage\"),ft=browser.i18n.getMessage(\"menuEditAndSavePage\"),mt=browser.i18n.getMessage(\"menuViewPendingSaves\"),ht=browser.i18n.getMessage(\"menuSaveSelection\"),wt=browser.i18n.getMessage(\"menuSaveFrame\"),pt=browser.i18n.getMessage(\"menuSaveTabs\"),bt=browser.i18n.getMessage(\"menuSaveSelectedTabs\"),gt=browser.i18n.getMessage(\"menuSaveUnpinnedTabs\"),yt=browser.i18n.getMessage(\"menuSaveAllTabs\"),vt=browser.i18n.getMessage(\"menuBatchSaveUrls\"),kt=browser.i18n.getMessage(\"menuSelectProfile\"),At=browser.i18n.getMessage(\"profileDefaultSettings\"),xt=browser.i18n.getMessage(\"menuAutoSave\"),Tt=browser.i18n.getMessage(\"menuAutoSaveDisabled\"),It=browser.i18n.getMessage(\"menuAutoSaveTab\"),Ct=browser.i18n.getMessage(\"menuAutoSaveUnpinnedTabs\"),St=browser.i18n.getMessage(\"menuAutoSaveAllTabs\"),Pt=[Fe,_e,$e,Ve,tt,qe],Et=new Map,Lt=new Map;let Rt,Mt,Ut,Wt=!0,Dt=!0,Ft=new Map;async function Nt(e){const[t,a]=await Promise.all([D(),f()]);let n=await F(e&&e.url);if(n){const o=[\"page\",\"frame\",\"image\",\"link\",\"video\",\"audio\",\"selection\"],r=[];if(n.profileName==p&&(n=await F(),n.profileName=p),n.browserActionMenuEnabled&&r.push(\"action\"),n.tabMenuEnabled)try{await We.create({id:\"temporary-id\",contexts:[\"tab\"],title:\"title\"}),r.push(\"tab\")}catch(e){n.tabMenuEnabled=!1}await We.removeAll();const i=r.concat(...o),s=n.contextMenuEnabled?i:r;if(We.create({id:De,contexts:s,title:ct}),We.create({id:Fe,contexts:s,title:ft}),We.create({id:_e,contexts:n.contextMenuEnabled?r.concat([\"selection\"]):r,title:dt}),Object.keys(t).length>1&&We.create({id:Ne,contexts:s,title:lt}),n.contextMenuEnabled&&We.create({id:\"separator-1\",contexts:o,type:\"separator\"}),We.create({id:$e,contexts:s,title:ht}),n.contextMenuEnabled&&We.create({id:Ve,contexts:[\"frame\"],title:wt}),We.create({id:Ge,contexts:r,title:pt}),We.create({id:Qe,contexts:r,title:bt,parentId:Ge}),We.create({id:Xe,contexts:r,title:gt,parentId:Ge}),We.create({id:et,contexts:r,title:yt,parentId:Ge}),n.contextMenuEnabled&&(We.create({id:Je,contexts:o,title:bt}),We.create({id:He,contexts:o,title:gt}),We.create({id:Ye,contexts:o,title:yt}),We.create({id:\"separator-2\",contexts:o,type:\"separator\"})),Object.keys(t).length>1){We.create({id:Oe,title:kt,contexts:s}),We.create({id:je+\"default\",contexts:s,title:At,parentId:Ne});const r=ze+\"default\",i=!a.profileName||a.profileName==w;let c;We.create({id:r,type:\"radio\",contexts:s,title:At,checked:i,parentId:Oe}),Et.set(r,i),We.create({id:qe,title:it,contexts:s}),Lt.set(qe,it),e&&e.url&&(c=await L(e.url,!0));const l=Ke+\"current\",d=!c||c.profile==h;We.create({id:l,type:\"radio\",contexts:s,title:h,checked:d,parentId:qe}),Et.set(l,d);const u=Ke+\"default\",f=Boolean(c)&&c.profile==w;We.create({id:u,type:\"radio\",contexts:s,title:At,checked:f,parentId:qe}),Et.set(u,f),Ft=new Map,Object.keys(t).forEach((e,t)=>{if(e!=w){let n=je+t;We.create({id:n,contexts:s,title:e,parentId:Ne}),n=ze+t;let o=a.profileName==e;We.create({id:n,type:\"radio\",contexts:s,title:e,checked:o,parentId:Oe}),Et.set(n,o),n=Ke+t,o=Boolean(c)&&c.profile==e,We.create({id:n,type:\"radio\",contexts:s,title:e,checked:o,parentId:qe}),Et.set(n,o),Ft.set(e,t)}}),n.contextMenuEnabled&&We.create({id:\"separator-3\",contexts:o,type:\"separator\"})}We.create({id:tt,contexts:s,title:xt}),We.create({id:at,type:\"radio\",title:Tt,contexts:s,checked:!0,parentId:tt}),Et.set(at,!0),We.create({id:nt,type:\"radio\",title:It,contexts:s,checked:!1,parentId:tt}),Et.set(nt,!1),We.create({id:ot,type:\"radio\",title:Ct,contexts:s,checked:!1,parentId:tt}),Et.set(ot,!1),We.create({id:rt,type:\"radio\",title:St,contexts:s,checked:!1,parentId:tt}),Et.set(rt,!1),We.create({id:\"separator-4\",contexts:s,type:\"separator\"}),We.create({id:Ze,contexts:s,title:vt}),We.create({id:Be,contexts:s,title:mt})}Rt=!0,Mt&&(Mt=!1,(await browser.tabs.query({})).forEach(async e=>await Bt(e)))}async function _t(e){const t=await f(e.id);await async function(){const e=await browser.tabs.query({});return Promise.all(e.map(async e=>{const[t,a]=await Promise.all([F(e.url,!0),Z(e)]);try{await browser.tabs.sendMessage(e.id,{method:\"content.init\",autoSaveEnabled:a,options:t})}catch(e){}}))}(),await Le(e);try{await browser.runtime.sendMessage({method:\"options.refresh\",profileName:t.profileName})}catch(e){}}async function Bt(e){if(Rt){const t=[],a=await f(e.id);if(a[e.id].editorDetected)Ot(!1);else if(Ot(!0),t.push(zt(at,!a[e.id].autoSave)),t.push(zt(nt,a[e.id].autoSave)),t.push(zt(ot,Boolean(a.autoSaveUnpinned))),t.push(zt(rt,Boolean(a.autoSaveAll))),e&&e.url){const n=await F(e.url);t.push(async function(e,t){const a=Wt;Wt=t,(void 0===a||a!=t)&&await Nt(e)}(e,n.contextMenuEnabled)),t.push(jt(Fe,a[e.id].savedPageDetected?ut:ft)),t.push(We.update($e,{visible:!n.saveRawPage})),t.push(We.update(Fe,{visible:!n.openEditor||a[e.id].savedPageDetected}));let o=Ke+\"default\",r=it;const[i,s]=await Promise.all([D(),L(e.url)]);if(s){const e=Ft.get(s.profile);e&&(o=Ke+e,r=st)}Object.keys(i).length>1&&(Object.keys(i).forEach((e,a)=>{e==w?t.push(zt(Ke+\"default\",o==Ke+\"default\")):t.push(zt(Ke+a,o==Ke+a))}),t.push(jt(qe,r)))}await Promise.all(t)}}async function Ot(e){const t=Dt;if(Dt=e,void 0===t||t!=e){const t=[];try{Pt.forEach(a=>t.push(We.update(a,{visible:e}))),await Promise.all(t)}catch(e){}}}async function jt(e,t){const a=Lt.get(e);try{(void 0===a||a!=t)&&await We.update(e,{title:t}),Lt.set(e,t)}catch(e){}}async function zt(e,t){t=Boolean(t);try{await We.update(e,{checked:t}),Et.set(e,t)}catch(e){}}Promise.resolve().then(async function(){Nt(),We.onClicked.addListener(async(e,t)=>{if(e.menuItemId==De&&(e.linkUrl?Ut.saveUrls([e.linkUrl]):Ut.saveTabs([t])),e.menuItemId==Fe){(await f(t.id))[t.id].savedPageDetected?Ut.openEditor(t):e.linkUrl?Ut.saveUrls([e.linkUrl],{openEditor:!0}):Ut.saveTabs([t],{openEditor:!0})}if(e.menuItemId==_e&&Ut.saveSelectedLinks(t),e.menuItemId==Be&&await browser.tabs.create({active:!0,url:\"/src/ui/pages/pendings.html\"}),e.menuItemId==$e&&Ut.saveTabs([t],{selected:!0}),e.menuItemId==Ve&&Ut.saveTabs([t],{frameId:e.frameId}),e.menuItemId==Je||e.menuItemId==Qe){const e=await re({currentWindow:!0,highlighted:!0});Ut.saveTabs(e)}if(e.menuItemId==He||e.menuItemId==Xe){const e=await re({currentWindow:!0,pinned:!1});Ut.saveTabs(e)}if(e.menuItemId==Ye||e.menuItemId==et){const e=await re({currentWindow:!0});Ut.saveTabs(e)}if(e.menuItemId==Ze&&Ut.batchSaveUrls(),e.menuItemId==nt){const e=await f(t.id);e[t.id].autoSave=!0,await m(e),_t(t)}if(e.menuItemId==at){const e=await f();Object.keys(e).forEach(t=>{\"object\"==typeof e[t]&&e[t].autoSave&&(e[t].autoSave=!1)}),e.autoSaveUnpinned=e.autoSaveAll=!1,await m(e),_t(t)}if(e.menuItemId==rt){const a=await f();a.autoSaveAll=e.checked,await m(a),_t(t)}if(e.menuItemId==ot){const a=await f();a.autoSaveUnpinned=e.checked,await m(a),_t(t)}if(e.menuItemId.startsWith(je)){const a=await D(),n=e.menuItemId.split(je)[1];let o;if(\"default\"==n)o=w;else{const e=Number(n);o=Object.keys(a)[e]}a[o].profileName=o,Ut.saveTabs([t],a[o])}if(e.menuItemId.startsWith(ze)){const[a,n]=await Promise.all([D(),f()]),o=e.menuItemId.split(ze)[1];if(\"default\"==o)n.profileName=w;else{const e=Number(o);n.profileName=Object.keys(a)[e]}await m(n),_t(t)}if(e.menuItemId.startsWith(Ke)){const[a,n]=await Promise.all([D(),L(t.url,!0)]),o=e.menuItemId.split(Ke)[1];let r;if(\"default\"==o)r=w;else if(\"current\"==o)r=h;else{const e=Number(o);r=Object.keys(a)[e]}n?await q(n.url,n.url,r,r):(await jt(qe,st),await z(new URL(t.url).hostname,r,r))}}),Rt?Mt=!0:(await browser.tabs.query({})).forEach(async e=>await Bt(e))});let qt;function Kt(e,t){return e.method.endsWith(\".refreshMenu\")?function(e){if(e.method.endsWith(\"refreshMenu\"))return Nt(),Promise.resolve({})}(e):Ie(e,t)}function $t(e){!function(e){Re(e.id,Ue(\"forbidden\"))}(e)}function Vt(e,t,a){!function(e,t,a){let n;a?n=Ue(\"inject\",!0):(n=Ue(1==t?\"inject\":\"execute\"),n.setTitle={title:me+\" (\"+t+\"/2)\"},n.setIcon={path:le+\"0.png\"}),Re(e,n)}(e,t,a)}async function Gt(e,t,a){Ce(e);try{t&&await browser.tabs.sendMessage(e,{method:\"content.error\",error:t.toString(),link:a})}catch(e){}}function Jt(e){!function(e){Re(e,Ue(\"edit\"))}(e)}function Ht(e,t){Se(e,t)}function Yt(e,t,a){!function(e,t,a){Ee(e,t,a,ge)}(e,t,a)}function Zt(e){Bt(e)}browser.commands.onCommand.addListener(async e=>{if(\"save-selected-tabs\"==e){const e=await re({currentWindow:!0,highlighted:!0});qt.saveTabs(e,{optionallySelected:!0})}else if(\"save-all-tabs\"==e){const e=await re({currentWindow:!0});qt.saveTabs(e)}else if(e.startsWith(\"custom-command-\")){const t=await D();let a;if(Object.keys(t).some(n=>t[n].customShortcut==e&&(a=n,!0)),a){const e=await re({currentWindow:!0,highlighted:!0});qt.saveTabs(e,t[a])}}});const Qt=\"Could not establish connection. Receiving end does not exist.\",Xt=\"The message port closed before a response was received.\",ea=\"Message manager disconnected\",ta=\"Cannot access contents of url \",aa=\"A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received\",na=\"pending\",oa=\"processing\",ra=[\"lib/single-file.js\",\"lib/single-file-extension.js\"],ia=[\"lib/chrome-browser-polyfill.js\",\"lib/single-file-frames.js\",\"lib/single-file-extension-frames.js\"],sa=[\"lib/single-file-hooks-frames.js\"],ca=[\"lib/chrome-browser-polyfill.js\",\"lib/single-file-bootstrap.js\",\"lib/single-file-extension-bootstrap.js\",\"lib/single-file-infobar.js\"],la=[];let da,ua,fa=0;var ma;async function ha(e){let t;try{t=await xa(e.id)}catch(e){}if(t){const t=await browser.tabs.sendMessage(e.id,{method:\"content.getSelectedLinks\"});if(t.urls&&t.urls.length){const e=await wa(),a=(n,o)=>{\"complete\"==o.status&&n==e.id&&(browser.tabs.onUpdated.removeListener(a),browser.tabs.sendMessage(e.id,{method:\"newUrls.addURLs\",urls:t.urls}))};browser.tabs.onUpdated.addListener(a)}}else $t(e)}async function wa(){return browser.tabs.create({active:!0,url:\"/src/ui/pages/batch-save-urls.html\"})}async function pa(e,t={}){await ya(),await Promise.all(e.map(async e=>{const a=await F(e);a.profileName!=p&&(Object.keys(t).forEach(e=>a[e]=t[e]),a.autoClose=!0,a.originalUrl=e,ga({tab:{url:e},status:na,options:a,method:\"content.save\"}))})),va()}async function ba(e,t={}){await ya(),await Promise.all(e.map(async e=>{const a=e.id,n=await F(e.url);if(n.profileName!=p){Object.keys(t).forEach(e=>n[e]=t[e]),n.tabId=a,n.tabIndex=e.index;const o={id:e.id,index:e.index,url:e.url,title:e.title};if(t.autoSave){if(Z(e)){ka(ga({status:oa,tab:o,options:n,method:\"content.autosave\"}))}}else{let t;Vt(a,1);try{t=await xa(a,n)}catch(e){}t||oe(e)?(Vt(a,2),ga({status:na,tab:o,options:n,method:\"content.save\"})):$t(e)}}else $t(e)})),va()}function ga(e){const t={id:fa,status:e.status,tab:e.tab,options:e.options,method:e.method,done:function(e=!0){const t=la.findIndex(e=>e.id==this.id);t>-1&&(la.splice(t,1),e&&va())}};return la.push(t),fa++,t}async function ya(){if(!da){const e=await R();ua=e.processInForeground,da=ua?1:e.maxParallelWorkers}}function va(){const e=la.filter(e=>e.status==oa).length;for(let t=0;t<Math.min(la.length-e,da-e);t++){const e=la.find(e=>e.status==na);e&&ka(e)}}async function ka(e){const t=e.id;if(e.status=oa,!e.tab.id){let t;try{const a=await async function(e){const t=await browser.tabs.create(e);return new Promise((e,a)=>{function n(a,r){a==t.id&&\"complete\"==r.status&&(e(t),browser.tabs.onUpdated.removeListener(n),browser.tabs.onRemoved.removeListener(o))}function o(e){e==t.id&&(a(e),browser.tabs.onRemoved.removeListener(o))}browser.tabs.onUpdated.addListener(n),browser.tabs.onRemoved.addListener(o)})}({url:e.tab.url,active:!1});e.tab.id=e.options.tabId=a.id,e.tab.index=e.options.tabIndex=a.index,Vt(e.tab.id,1);try{t=await xa(e.tab.id,e.options)}catch(e){}}catch(t){e.tab.id=t}if(!t)return void e.done();Vt(e.tab.id,2)}e.options.taskId=t;try{ua&&await browser.tabs.update(e.tab.id,{active:!0}),await browser.tabs.sendMessage(e.tab.id,{method:e.method,options:e.options})}catch(t){!t||t.message&&function(e){return e.message==Xt||e.message==Qt||e.message==ea||e.message==aa||e.message.startsWith(ta+JSON.stringify(ae))}(t)||(console.log(t.message?t.message:t),Gt(e.tab.id,t.message,t.link),e.done())}}function Aa(e){const t=la.find(t=>t.id==e);t&&(t.options.autoClose&&!t.cancelled&&browser.tabs.remove(t.tab.id),t.done())}async function xa(e,t={},a=!0){let n;const o=(await browser.scripting.executeScript({target:{tabId:e},func:()=>Boolean(window.singlefile)}))[0];if(n=o&&o.result,n)try{await browser.scripting.executeScript({target:{tabId:e},files:ra})}catch(e){}else try{if(await browser.scripting.executeScript({target:{tabId:e,allFrames:!0},files:ia}),await browser.scripting.executeScript({target:{tabId:e},files:ca}),await browser.scripting.executeScript({target:{tabId:e,allFrames:!0},files:sa,world:\"MAIN\"}),a)return await xa(e,t,!1)}catch(e){}return n&&t.frameId&&await browser.scripting.executeScript({target:{tabId:e,frameIds:[t.frameId]},func:()=>document.documentElement.dataset.requestedFrameId=!0}),n}function Ta(e,t){const a=la.find(t=>t.id==e);a&&(a.cancel=t)}function Ia(e,t=!0){Array.from(la).filter(a=>a.tab.id==e&&!a.options.autoSave&&(t||a.status!=oa)).forEach(Sa)}function Ca(e){return la.find(t=>t.id==e)}function Sa(e,t){const a=e.tab.id;e.cancelled=!0,a&&(browser.tabs.sendMessage(a,{method:\"content.cancelSave\",options:{loadDeferredImages:e.options.loadDeferredImages,loadDeferredImagesKeepZoomLevel:e.options.loadDeferredImagesKeepZoomLevel}}).catch(()=>{}),\"content.autosave\"==e.method&&Ht(a,!0),function(e){Pe(e)}(e.tab)),e.cancel&&e.cancel(),e.done(t)}function Pa(e){return{id:e.id,tabId:e.tab.id,index:e.tab.index,url:e.tab.url,title:e.tab.title,cancelled:e.cancelled,status:e.status}}(function(e){Ut=e})(ma={isSavingTab:function(e){return Boolean(la.find(t=>t.tab.id==e.id))},saveTabs:ba,saveUrls:pa,cancelTab:Ia,openEditor:function(e){browser.tabs.sendMessage(e.id,{method:\"content.openEditor\"})},saveSelectedLinks:ha,batchSaveUrls:wa}),function(e){Te=e}(ma),function(e){qt=e}(ma);async function Ea(e){let t;try{t=await browser.runtime.sendNativeMessage(\"singlefile_companion\",{method:\"save\",pageData:e})}catch(e){if(!e.message||!e.message.includes(\"Native host has exited\"))throw e}if(t&&t.error)throw new Error(t.error+\" (Companion)\")}const La=new Set;async function Ra(e){return e.method.endsWith(\".saveCreatedBookmarks\")?(Ma(),{}):e.method.endsWith(\".disable\")?(async function(){let e;const t=await D();Object.keys(t).forEach(a=>e=e||!t[a].saveCreatedBookmarks),e&&(browser.bookmarks.onCreated.removeListener(Wa),browser.bookmarks.onMoved.removeListener(Da))}(),{}):void 0}async function Ma(){try{browser.bookmarks.onCreated.removeListener(Wa),browser.bookmarks.onMoved.removeListener(Da)}catch(e){}let e;const t=await D();Object.keys(t).forEach(a=>{t[a].saveCreatedBookmarks&&(e=!0)}),e&&(browser.bookmarks.onCreated.addListener(Wa),browser.bookmarks.onMoved.addListener(Da))}async function Ua(e,t){try{await browser.bookmarks.update(e,t)}catch(e){}}async function Wa(e,t){La.add(e),await Fa(e,t.url,t)}async function Da(e,t){if(La.has(e)){const a=await browser.bookmarks.get(e);a[0]&&await Fa(e,a[0].url,t)}}async function Fa(e,t,a){const n=await browser.tabs.query({lastFocusedWindow:!0,active:!0}),o=await F(t);if(o.saveCreatedBookmarks){const i=await async function e(t,a=[]){if(t){const n=(await browser.bookmarks.get(t))[0];n&&n.title&&(a.unshift(n.title),await e(n.parentId,a))}return a}(a.parentId),s=o.allowedBookmarkFolders.toString(),c=i.find(e=>o.allowedBookmarkFolders.includes(e)),l=o.ignoredBookmarkFolders.toString(),d=i.find(e=>o.ignoredBookmarkFolders.includes(e));if((s&&c||!s)&&(l&&!d||!l))if(n.length&&n[0].url==t)La.delete(e),ba(n,{bookmarkId:e,bookmarkFolders:i});else{const a=await browser.tabs.query({});if(a.length){const n=a.find(e=>e.url==t);n?(La.delete(e),ba([n],{bookmarkId:e,bookmarkFolders:i})):t&&(\"about:blank\"==t?browser.bookmarks.onChanged.addListener(function t(a,n){a==e&&n.url&&(browser.bookmarks.onChanged.removeListener(t),r(n.url))}):r(t))}}}function r(t){La.delete(e),pa([t],{bookmarkId:e})}}Promise.resolve().then(Ma);async function Na(e,t){let a=t||\"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhYzZmZTMzMi0wODNjLTRjZmMtYmYxNC0xNWU5MTJmMWY4OWIiLCJpYXQiOjE1NzYxNzQzNDV9.n31j9ctJj7R1Vjwyc5yd1d6Cmg0NDnpwSaLWsqtZJQA\";const n=await fetch(\"https://api.woleet.io/v1/anchor\",{method:\"POST\",headers:{Accept:\"application/json\",\"Content-Type\":\"application/json\",Authorization:\"Bearer \"+a},body:JSON.stringify({name:e,hash:e,public:!0})});if(401==n.status){const e=new Error(\"Your access token on Woleet is invalid. Go to __DOC_LINK__ to create your account.\");throw e.link=\"https://app.woleet.io/\",e}if(402==n.status){const e=new Error(\"You have no more credits on Woleet. Go to __DOC_LINK__ to recharge them.\");throw e.link=\"https://app.woleet.io/\",e}if(n.status>=400)throw new Error((n.statusText||\"Error \"+n.status)+\" (Woleet)\");return n.json()}const _a=\"https://oauth2.googleapis.com/token\",Ba=\"https://www.googleapis.com/drive/v3/files\",Oa=\"uniquify\";let ja=class{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||\"application/octet-stream\",this.metadata={name:e.filename,mimeType:this.contentType,parents:e.parents||[\"root\"]},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||524288,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(e=1){let t,a=\"POST\";const n=Ja(await fetch(Ba+`?q=name = '${this.metadata.name}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:\"Bearer \"+this.token,\"Content-Type\":\"application/json\"}})),o=await n.json();if(o.files.length)if(\"overwrite\"==this.filenameConflictAction)a=\"PATCH\",t=o.files[0].id,this.metadata.parents=null;else if(this.filenameConflictAction==Oa){let t=this.metadata.name,a=\"\";const n=this.metadata.name.lastIndexOf(\".\");n>-1&&(t=this.metadata.name.substring(0,n),a=this.metadata.name.substring(n+1));const o=t+\" (\"+e+\").\"+a,r=Ja(await fetch(Ba+`?q=name = '${o}' and trashed != true and '${this.metadata.parents[0]}' in parents`,{headers:{Authorization:\"Bearer \"+this.token,\"Content-Type\":\"application/json\"}}));if((await r.json()).files.length)return this.upload(e+1);this.metadata.name=o}else{if(\"prompt\"==this.filenameConflictAction){if(this.prompt){const t=await this.prompt(this.metadata.name);return t?(this.metadata.name=t,this.upload(e)):o}return this.filenameConflictAction=Oa,this.upload(e)}if(\"skip\"==this.filenameConflictAction)return o}const r=Ja(await fetch(\"https://www.googleapis.com/upload/drive/v3/files\"+(t?\"/\"+t:\"\")+\"?uploadType=resumable\",{method:a,headers:{Authorization:\"Bearer \"+this.token,\"Content-Type\":\"application/json\",\"X-Upload-Content-Length\":this.file.size,\"X-Upload-Content-Type\":this.contentType},body:JSON.stringify(this.metadata)})).headers.get(\"Location\");if(this.url=r,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),Va(this)}};async function za(e,t){const a=await fetch(_a,{method:\"POST\",headers:{\"Content-Type\":\"application/x-www-form-urlencoded\"},body:\"client_id=\"+e.clientId+\"&client_secret=\"+e.clientKey+\"&grant_type=authorization_code&code=\"+t.code+\"&redirect_uri=\"+browser.identity.getRedirectURL()}),n=await Ga(a);return e.accessToken=n.access_token,e.refreshToken=n.refresh_token,e.expirationDate=Date.now()+1e3*n.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}function qa(e={}){return Boolean(browser.identity&&browser.identity.getAuthToken)&&!e.forceWebAuthFlow}async function Ka(e,t,a=!0){const n=t.split(\"/\");n.pop();const o=e.folderIds.get(n.join(\"/\"));if(o)return o;let r=\"root\";if(n.length){let o=\"\";for(const i of n){o&&(o+=\"/\"),o+=i;const n=e.folderIds.get(o);if(n)r=n;else try{r=await $a(e,i,r),e.folderIds.set(o,r)}catch(n){if(\"path_not_found\"==n.message&&a)return e.folderIds.clear(),Ka(e,t,!1);throw n}}}return r}async function $a(e,t,a){const n=await async function(e,t,a){const n=await fetch(Ba+\"?q=mimeType = 'application/vnd.google-apps.folder' and name = '\"+t+\"' and trashed != true and '\"+a+\"' in parents\",{headers:{Authorization:\"Bearer \"+e.accessToken}});return Ga(n)}(e,t,a);if(n.files.length)return n.files[0].id;{const n=await async function(e,t,a){const n=await fetch(Ba,{method:\"POST\",headers:{Authorization:\"Bearer \"+e.accessToken,\"Content-Type\":\"application/json\"},body:JSON.stringify({name:t,parents:[a],mimeType:\"application/vnd.google-apps.folder\"})});return Ga(n)}(e,t,a);return n.id}}async function Va(e){let t=e.file,a=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(a=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,a));const n=await fetch(e.url,{method:\"PUT\",headers:{Authorization:\"Bearer \"+e.token,\"Content-Type\":e.contentType,\"Content-Range\":\"bytes \"+e.offset+\"-\"+(a-1)+\"/\"+e.file.size,\"X-Upload-Content-Type\":e.contentType},body:t});if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==n.status||201==n.status)return n.json();if(308==n.status){const t=n.headers.get(\"Range\");if(t&&(e.offset=parseInt(t.match(/\\d+/g).pop(),10)+1),e.cancelled)throw new Error(\"upload_cancelled\");return Va(e)}Ja(n)}async function Ga(e){e=Ja(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function Ja(e){if(200==e.status)return e;throw 404==e.status?new Error(\"path_not_found\"):401==e.status?new Error(\"invalid_token\"):new Error(\"unknown_error (\"+e.status+\")\")}const Ha=\"https://api.dropboxapi.com/oauth2/token\",Ya=\"uniquify\",Za=\"prompt\",Qa=/[\\u007f-\\uffff]/g;class Xa{constructor(e){this.file=e.file,this.onProgress=e.onProgress,this.contentType=this.file.type||\"application/octet-stream\",this.metadata={name:e.filename,mimeType:this.contentType},this.token=e.token,this.offset=0,this.chunkSize=e.chunkSize||8388608,this.filenameConflictAction=e.filenameConflictAction,this.prompt=e.prompt}async upload(){const e=nn(await fetch(\"https://api.dropboxapi.com/2/files/search_v2\",{method:\"POST\",headers:{Authorization:\"Bearer \"+this.token,\"Content-Type\":\"application/json\"},body:on({query:this.metadata.name,options:{filename:!0}})})),t=await an(e);if(t.matches.length)if(this.filenameConflictAction==Za)if(this.prompt){const e=await this.prompt(this.metadata.name);if(!e)return t;this.metadata.name=e}else this.filenameConflictAction=Ya;else if(\"skip\"==this.filenameConflictAction)return t;const a=nn(await fetch(\"https://content.dropboxapi.com/2/files/upload_session/start\",{method:\"POST\",headers:{Authorization:\"Bearer \"+this.token,\"Dropbox-API-Arg\":on({close:!1}),\"Content-Type\":\"application/octet-stream\"}})),n=(await an(a)).session_id;if(this.sessionId=n,!this.cancelled)return this.onProgress&&this.onProgress(0,this.file.size),tn(this)}}async function en(e,t){const a=await fetch(Ha,{method:\"POST\",headers:{\"Content-Type\":\"application/x-www-form-urlencoded\"},body:\"client_id=\"+e.clientId+\"&client_secret=\"+e.clientKey+\"&grant_type=authorization_code&code=\"+t.code+\"&redirect_uri=\"+browser.identity.getRedirectURL()}),n=await an(a);return e.accessToken=n.access_token,e.refreshToken=n.refresh_token,e.expirationDate=Date.now()+1e3*n.expires_in,{accessToken:e.accessToken,refreshToken:e.refreshToken,expirationDate:e.expirationDate}}async function tn(e){let t=e.file,a=e.file.size;(e.offset||e.chunkSize)&&(e.chunkSize&&(a=Math.min(e.offset+e.chunkSize,e.file.size)),t=t.slice(e.offset,a));const n=nn(await fetch(\"https://content.dropboxapi.com/2/files/upload_session/append_v2\",{method:\"POST\",headers:{Authorization:\"Bearer \"+e.token,\"Content-Type\":\"application/octet-stream\",\"Dropbox-API-Arg\":on({cursor:{session_id:e.sessionId,offset:e.offset},close:a==e.file.size})},body:t}));if(e.onProgress&&!e.cancelled&&e.onProgress(e.offset+e.chunkSize,e.file.size),200==n.status&&(e.offset=a,e.offset<e.file.size))return tn(e);let o=e.metadata.name;o.startsWith(\"/\")||(o=\"/\"+o);const r=await fetch(\"https://content.dropboxapi.com/2/files/upload_session/finish\",{method:\"POST\",headers:{Authorization:\"Bearer \"+e.token,\"Content-Type\":\"application/octet-stream\",\"Dropbox-API-Arg\":on({cursor:{session_id:e.sessionId,offset:e.offset},commit:{path:o,mode:\"overwrite\"==e.filenameConflictAction?\"overwrite\":\"add\",autorename:e.filenameConflictAction==Ya}})}});if(200==r.status)return an(r);if(409==r.status&&e.filenameConflictAction==Za)return e.offset=0,e.upload();throw new Error(\"unknown_error (\"+r.status+\")\")}async function an(e){e=nn(e);const t=await e.json();if(t.error)throw new Error(t.error);return t}function nn(e){if(200==e.status)return e;throw 401==e.status?new Error(\"invalid_token\"):new Error(\"unknown_error (\"+e.status+\")\")}function on(e){return JSON.stringify(e).replace(Qa,function(e){return\"\\\\u\"+(\"000\"+e.charCodeAt(0).toString(16)).slice(-4)})}const rn=\"\",sn=\"prompt\",cn=\"Authorization\",ln=\"/\",dn=\".\",un=\"Error \",fn=/\\s\\((\\d+)\\)$/,mn=\"PROPFIND\",hn=\"MKCOL\",wn=400;class pn{constructor(e,t,a){e.endsWith(ln)||(e+=ln),this.url=e,this.authorization=\"Basic \"+btoa(t+\":\"+a)}upload(e,t,a){return this.controller=new AbortController,a.signal=this.controller.signal,a.authorization=this.authorization,a.url=this.url,bn(e,t,a)}abort(){this.controller&&this.controller.abort()}}async function bn(e,t,a){const{authorization:n,filenameConflictAction:o,prompt:r,signal:i,preventRetry:s}=a;let{url:c}=a;try{if(\"overwrite\"==o){let n=await l(e,\"PUT\",t);if(201==n.status)return n;if(n.status>=wn){if(n=await l(e,\"DELETE\"),n.status>=wn)throw new Error(un+n.status);return await bn(e,t,a)}}else{let n=await l(e,\"HEAD\");if(200==n.status){if(\"uniquify\"==o||o==sn&&!r){const{filenameWithoutExtension:n,extension:o,indexFilename:r}=function(e){let t=e,a=rn;const n=e.lastIndexOf(\".\");n>-1&&(t=e.substring(0,n),a=e.substring(n+1));let o;return({filenameWithoutExtension:t,indexFilename:o}=function(e){const t=e.match(fn);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(fn,rn))}return{filenameWithoutExtension:e,indexFilename:a}}(t)),{filenameWithoutExtension:t,extension:a,indexFilename:o}}(e);return a.indexFilename=r+1,await bn(function(e,t){return e+\" (\"+a.indexFilename+\")\"+(t?dn+t:rn)}(n,o),t,a)}if(o==sn)return(e=await r(e))?bn(e,t,a):n;if(\"skip\"==o)return n}else{if(404==n.status){if(n=await l(e,\"PUT\",t),n.status>=wn&&!s){if(e.includes(ln))return await async function(){const t=e.split(ln);t.pop();let a=rn;for(const e of t)if(e){a+=e;if(404==(await l(a,mn)).status){const e=await l(a,hn);if(e.status>=wn)throw new Error(un+e.status)}a+=ln}}(),a.preventRetry=!0,await bn(e,t,a);throw new Error(un+n.status)}return n}if(n.status>=wn)throw new Error(un+n.status)}}}catch(e){if(\"AbortError\"!=e.name)throw e}function l(e,t,a){const o={[cn]:n};return a&&(o[\"Content-Type\"]=\"text/html\"),fetch(c+e,{method:t,headers:o,signal:i,body:a,credentials:\"omit\"})}}const gn=\"\",yn=\"skip\",vn=\"uniquify\",kn=\"overwrite\",An=\"prompt\",xn=\".\",Tn=/\\s\\((\\d+)\\)$/,In=\"AbortError\",Cn=\"https://github.com\",Sn=\"https://api.github.com\",Pn=\"blob\",En=\"repos\",Ln=\"contents\";let Rn;class Mn{constructor(e,t,a,n){this.headers=new Map([[\"Authorization\",\"Bearer \"+e],[\"Accept\",\"application/vnd.github+json\"],[\"X-GitHub-Api-Version\",\"2022-11-28\"]]),this.userName=t,this.repositoryName=a,this.branch=n}async upload(e,t,a){this.controller=new AbortController,a.signal=this.controller.signal,a.headers=this.headers;const n=t instanceof Blob?await(o=t,new Promise((e,t)=>{const a=new FileReader;a.onloadend=()=>e(a.result.match(/^data:[^,]+,(.*)$/)[1]),a.onerror=e=>t(e.detail),a.readAsDataURL(o)})):btoa(unescape(encodeURIComponent(t)));var o;return async function(e,t,a,n,o,r){const{filenameConflictAction:i,prompt:s,signal:c,headers:l}=r;for(;Rn;)await Rn;try{Rn=await d({path:n,content:o})}finally{Rn=null}return{url:`${Cn}/${e}/${t}/${Pn}/${a}/${n}`};async function d({path:n,content:o,message:f=\"\",sha:h}){try{const e=await w(\"PUT\",JSON.stringify({content:o,message:f,branch:a,sha:h})),t=await e.json();if(422==e.status){if(i==kn){const e=await w(\"GET\"),t=(await e.json()).sha;return await d({path:n,content:o,message:f,sha:t})}if(i==vn){const{filenameWithoutExtension:e,extension:t,indexFilename:a}=u(n);return r.indexFilename=a+1,n=m(e,t),await d({path:n,content:o,message:f})}if(i==yn)return t;if(i==An)return s?(n=await s(n))?await d({path:n,content:o,message:f}):t:(r.filenameConflictAction=vn,await d({path:n,content:o,message:f}))}if(e.status<400)return t;throw new Error(t.message)}catch(e){if(e.name!=In)throw e}function w(a,o){return fetch(`${Sn}/${En}/${e}/${t}/${Ln}/${n}`,{method:a,headers:l,body:o,signal:c})}}function u(e){let t=e,a=gn;const n=e.lastIndexOf(xn);let o;return n>-1&&(t=e.substring(0,n),a=e.substring(n+1)),({filenameWithoutExtension:t,indexFilename:o}=f(t)),{filenameWithoutExtension:t,extension:a,indexFilename:o}}function f(e){const t=e.match(Tn);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(Tn,gn))}return{filenameWithoutExtension:e,indexFilename:a}}function m(e,t){return e+\" (\"+r.indexFilename+\")\"+(t?xn+t:gn)}}(this.userName,this.repositoryName,this.branch,e,n,a)}abort(){this.controller&&this.controller.abort()}}const Un=\"\",Wn=\"uniquify\",Dn=\".\",Fn=/\\s\\((\\d+)\\)$/;class Nn{constructor(e,t,a,n,o=\"s3.amazonaws.com\"){this.api=new zn({domain:o,region:e,bucket:t,accessKey:a,secretKey:n}),this.headObjectSupported=!0,this.listObjectsSupported=!0}async upload(e,t,a){const{filenameConflictAction:n,prompt:o}=a;this.controller=new AbortController,a.signal=this.controller.signal;try{if(\"overwrite\"==n)return this.api.putObject({path:e},{body:await _n(t)});{let r;if(this.headObjectSupported&&(r=await this.api.headObject({path:e},a)),this.headObjectSupported&&403!=r.status||(this.headObjectSupported=!1,this.listObjectsSupported&&(r=await this.api.listObjects({path:e},a)),this.listObjectsSupported&&403!=r.status||(this.listObjectsSupported=!1,r=await this.api.getObject({path:e},a))),200!=r.status){if(404==r.status)return t=new Uint8Array(await t.arrayBuffer()),this.api.putObject({path:e},{body:await _n(t)});throw new Error(r.statusText||\"Error \"+r.status)}if(\"prompt\"==n)return o?(e=await o(e))?this.upload(e,t,a):r:(a.filenameConflictAction=Wn,this.upload(e,t,a));if(n==Wn){const{filenameWithoutExtension:n,extension:o,indexFilename:r}=function(e){let t=e,a=\"\";const n=e.lastIndexOf(\".\");n>-1&&(t=e.substring(0,n),a=e.substring(n+1));let o;return({filenameWithoutExtension:t,indexFilename:o}=function(e){const t=e.match(Fn);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(Fn,\"\"))}return{filenameWithoutExtension:e,indexFilename:a}}(t)),{filenameWithoutExtension:t,extension:a,indexFilename:o}}(e);return a.indexFilename=r+1,e=function(e,t,a){return e+\" (\"+t+\")\"+(a?Dn+a:Un)}(n,a.indexFilename,o),this.upload(e,t,a)}}}catch(e){if(\"AbortError\"!=e.name)throw e}}abort(){this.controller&&this.controller.abort()}}async function _n(e){return new Uint8Array(await new Response(e).arrayBuffer())}const Bn=\"AWS4\",On=Bn+\"-HMAC-SHA256\",jn=\"aws4_request\";class zn{constructor({domain:e,region:t,bucket:a,accessKey:n,secretKey:o}){this.domain=e,this.region=t,this.bucket=a,this.accessKey=n,this.secretKey=o}async putObject({path:e},{headers:t={},body:a}){return qn(this,{path:e},{method:\"PUT\",headers:t,body:a})}async getObject({path:e},{headers:t={}}={}){return qn(this,{path:e},{method:\"GET\",headers:t})}async headObject({path:e},{headers:t={}}={}){return qn(this,{path:e},{method:\"HEAD\",headers:t})}async listObjects({path:e},{headers:t={},continuationToken:a,delimiter:n,encodingType:o,prefix:r,maxKeys:i}={}){const s=new URLSearchParams;return s.set(\"list-type\",\"2\"),a&&s.set(\"continuation-token\",a),n&&s.set(\"delimiter\",n),o&&s.set(\"encoding-type\",o),r&&s.set(\"prefix\",r),i&&s.set(\"max-keys\",i),qn(this,{path:e,searchParams:s},{method:\"GET\",headers:t})}}async function qn({region:e,bucket:t,accessKey:a,secretKey:n,domain:o},{path:r=\"/\",searchParams:i=new URLSearchParams},{method:s,headers:c={},body:l}){const d=function(e){const t=new Date(e);return t.toISOString().replace(/[:-]|\\.\\d{3}/g,\"\")}(new Date);r.startsWith(\"/\")||(r=\"/\"+r),c.host=t+\".\"+o,l&&(c[\"content-length\"]=l.byteLength),c[\"x-amz-content-sha256\"]=await Vn(l),c[\"x-amz-date\"]=d,c.authorization=On+\" Credential=\"+a+\"/\"+Gn(d,e,\"s3\")+\",SignedHeaders=\"+$n(c)+\",Signature=\"+await async function({region:e,secretKey:t,service:a},{path:n,searchParams:o},{method:r,headers:i,body:s,isoDate:c}){const l=await async function(e,t,a,n,o,r,i,s){const c=await async function(e,t,a,n,o=new Uint8Array(0)){return n+\"\\n\"+function(e){return decodeURIComponent(e).replace(/[^A-Za-z0-9-._~/]/g,Kn)}(e)+\"\\n\"+function(e){if(e){let t=\"\";e.sort();for(const[a,n]of e)t+=encodeURIComponent(a)+\"=\"+encodeURIComponent(n)+\"&\";return t.slice(0,-1)}return\"\"}(t)+\"\\n\"+function(e){let t=\"\";const a=Object.keys(e).sort();for(const n of a)t+=n+\":\"+e[n]+\"\\n\";return t}(a)+\"\\n\"+$n(a)+\"\\n\"+await Vn(o)}(e,t,a,i,n);return On+\"\\n\"+o+\"\\n\"+Gn(o,r,s)+\"\\n\"+Zn(await Jn(Yn(c)))}(n,o,i,s,c,e,r,a),d=await async function(e,t,a,n){const o=await Hn(Yn(Bn+e),Yn(t.substring(0,8))),r=await Hn(o,Yn(a)),i=await Hn(r,Yn(n));return Hn(i,Yn(jn))}(t,c,e,a);return Zn(await Hn(d,Yn(l)))}({region:e,secretKey:n,service:\"s3\"},{path:r,searchParams:i},{method:s,headers:c,body:l,isoDate:d});const u=\"https://\"+t+\".\"+o+r+(i.size?\"?\"+i:\"\"),f={method:s,headers:c};return l&&(f.body=l),fetch(u,f)}function Kn(e){let t=encodeURIComponent(e);return t=t.startsWith(\"%\")?t.toUpperCase():\"%\"+t.charCodeAt(0).toString(16).toUpperCase(),t}function $n(e){return Object.keys(e).map(e=>e.toLowerCase()).sort().join(\";\")}async function Vn(e=new Uint8Array(0)){return Zn(await Jn(e))}function Gn(e,t,a){return e.substring(0,8)+\"/\"+t+\"/\"+a+\"/\"+jn}async function Jn(e){return crypto.subtle.digest(\"SHA-256\",e)}async function Hn(e,t){const a={name:\"HMAC\",hash:{name:\"SHA-256\"}},n=await crypto.subtle.importKey(\"raw\",e,a,!1,[\"sign\"]);return crypto.subtle.sign(a,n,t)}function Yn(e){return(new TextEncoder).encode(e)}function Zn(e){return Array.from(new Uint8Array(e)).map(e=>e.toString(16).padStart(2,\"0\")).join(\"\")}const Qn=\"\",Xn=\"uniquify\",eo=\".\",to=/\\s\\((\\d+)\\)$/,ao=\"Content-Type\",no=\"application/json\",oo=\"2.0\";class ro{constructor(e,t){this.serverUrl=e,this.authToken=t,this.requestId=0}async upload(e,t,a){let n;return this.controller=new AbortController,a.signal=this.controller.signal,a.serverUrl=this.serverUrl,a.authToken=this.authToken,a.getRequestId=()=>++this.requestId,n=t instanceof Blob?await t.text():t,io(e,n,a)}abort(){this.controller&&this.controller.abort()}}async function io(e,t,a){const{filenameConflictAction:n,prompt:o,signal:r,serverUrl:i,authToken:s,getRequestId:c}=a;try{const l=await async function(e,t,a,n,o){const r={jsonrpc:oo,id:o(),method:\"tools/call\",params:{name:\"get_file_info\",arguments:{path:a}}},i={[ao]:no,Accept:\"application/json, text/event-stream\"};t&&(i.Authorization=`Bearer ${t}`);const s=await fetch(e,{method:\"POST\",headers:i,body:JSON.stringify(r),signal:n});if(!s.ok)throw new Error(`MCP server error: ${s.status} ${s.statusText}`);const c=await s.json();if(c.error)return{exists:!1};if(c.result&&c.result.isError)return{exists:!1};if(c.result)return{exists:!0};return{exists:!1}}(i,s,e,r,c);if(l.exists){if(\"skip\"==n)return{url:e,skipped:!0};if(\"overwrite\"==n);else{if(n==Xn){const{filenameWithoutExtension:n,extension:o,indexFilename:r}=function(e){let t=e,a=\"\";const n=e.lastIndexOf(\".\");n>-1&&(t=e.substring(0,n),a=e.substring(n+1));let o;return({filenameWithoutExtension:t,indexFilename:o}=function(e){const t=e.match(to);let a=0;if(t&&t.length>1){const n=Number(t[t.length-1]);Number.isNaN(n)||(a=n,e=e.replace(to,\"\"))}return{filenameWithoutExtension:e,indexFilename:a}}(t)),{filenameWithoutExtension:t,extension:a,indexFilename:o}}(e);return a.indexFilename=r+1,e=function(e,t,a){return e+\" (\"+a+\")\"+(t?eo+t:Qn)}(n,o,a.indexFilename),await io(e,t,a)}if(\"prompt\"==n)return o?(e=await o(e))?await io(e,t,a):{url:e,skipped:!0}:(a.filenameConflictAction=Xn,await io(e,t,a))}}const d=await async function(e,t,a,n,o,r){const i={jsonrpc:oo,id:r(),method:\"tools/call\",params:{name:\"write_file\",arguments:{path:a,content:n}}},s={[ao]:no,Accept:\"application/json, text/event-stream\"};t&&(s.Authorization=`Bearer ${t}`);const c=await fetch(e,{method:\"POST\",headers:s,body:JSON.stringify(i),signal:o});if(!c.ok)throw new Error(`MCP server error: ${c.status} ${c.statusText}`);const l=await c.json();if(l.error)throw new Error(l.error.message);return{success:!0}}(i,s,e,t,r,c);if(d.success)return{url:e};throw new Error(d.error||\"Failed to write file via MCP\")}catch(e){if(\"AbortError\"!=e.name)throw e}}const so=[0],co=Symbol(),lo=new TextEncoder,uo=new TextDecoder,fo=new Array(256);let mo=0;function ho(e,t,a,n){if(void 0===n){if(mo++,!(fo.length-mo>=so.length))throw new Error(\"Reached maximum number of custom types\");fo[fo.length-mo]={serialize:e,parse:t,test:a}}else fo[n]={serialize:e,parse:t,test:a}}ho(async function(e,t){const a=e.objects.indexOf(t);await go(e,a)},async function(e){const t=await Po(e);return new To(t,e)},Uo,0),ho(null,function(){return{}},Do),ho(yo,Eo,Fo),ho(vo,Lo,function(e){return\"string\"==typeof e}),ho(ko,async function(e){const t=await Po(e),a=await e.consume(8*t);return new Float64Array(a.buffer)},function(e){return\"Float64Array\"==e.constructor.name}),ho(ko,async function(e){const t=await Po(e),a=await e.consume(4*t);return new Float32Array(a.buffer)},function(e){return\"Float32Array\"==e.constructor.name}),ho(ko,async function(e){const t=await Po(e),a=await e.consume(4*t);return new Uint32Array(a.buffer)},function(e){return\"Uint32Array\"==e.constructor.name}),ho(ko,async function(e){const t=await Po(e),a=await e.consume(4*t);return new Int32Array(a.buffer)},function(e){return\"Int32Array\"==e.constructor.name}),ho(ko,async function(e){const t=await Po(e),a=await e.consume(2*t);return new Uint16Array(a.buffer)},function(e){return\"Uint16Array\"==e.constructor.name}),ho(ko,async function(e){const t=await Po(e),a=await e.consume(2*t);return new Int16Array(a.buffer)},function(e){return\"Int16Array\"==e.constructor.name}),ho(ko,async function(e){const t=await Po(e),a=await e.consume(t);return new Uint8ClampedArray(a.buffer)},function(e){return\"Uint8ClampedArray\"==e.constructor.name}),ho(ko,async function(e){const t=await Po(e);return await e.consume(t)},function(e){return\"Uint8Array\"==e.constructor.name}),ho(ko,async function(e){const t=await Po(e),a=await e.consume(t);return new Int8Array(a.buffer)},function(e){return\"Int8Array\"==e.constructor.name}),ho(async function(e,t){await go(e,t.byteLength),await e.append(new Uint8Array(t))},async function(e){const t=await Po(e);return(await e.consume(t)).buffer},function(e){return\"ArrayBuffer\"==e.constructor.name}),ho(Ao,Ro,_o),ho(async function(e,t){const a=new Uint8Array(new Uint32Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(4);return new Uint32Array(t.buffer)[0]},function(e){return Bo(e)&&e>=0&&e<=4294967295}),ho(async function(e,t){const a=new Uint8Array(new Int32Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(4);return new Int32Array(t.buffer)[0]},function(e){return Bo(e)&&e>=-2147483648&&e<=2147483647}),ho(async function(e,t){const a=new Uint8Array(new Uint16Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(2);return new Uint16Array(t.buffer)[0]},function(e){return Bo(e)&&e>=0&&e<=65535}),ho(async function(e,t){const a=new Uint8Array(new Int16Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(2);return new Int16Array(t.buffer)[0]},function(e){return Bo(e)&&e>=-32768&&e<=32767}),ho(async function(e,t){const a=new Uint8Array([t]);await e.append(a)},async function(e){const t=await e.consume(1);return new Uint8Array(t.buffer)[0]},function(e){return Bo(e)&&e>=0&&e<=255}),ho(async function(e,t){const a=new Uint8Array(new Int8Array([t]).buffer);await e.append(a)},async function(e){const t=await e.consume(1);return new Int8Array(t.buffer)[0]},function(e){return Bo(e)&&e>=-128&&e<=127}),ho(null,function(){return},function(e){return void 0===e}),ho(null,function(){return null},function(e){return null===e}),ho(null,function(){return NaN},function(e){return Number.isNaN(e)}),ho(xo,Mo,function(e){return\"boolean\"==typeof e}),ho(async function(e,t){await vo(e,t.description)},async function(e){const t=await Lo(e);return Symbol(t)},Oo),ho(null,function(){return co},No),ho(async function(e,t){const a=t.entries();await go(e,t.size);for(const[t,n]of a)await go(e,t),await go(e,n)},async function(e){const t=await Po(e),a=new Map;t&&await async function n(o=0){const r=await Po(e),i=await Po(e);e.setObject([r,i],(e,t)=>a.set(e,t)),o<t-1&&await n(o+1)}();return a},function(e){return e instanceof Map}),ho(async function(e,t){await go(e,t.size);for(const a of t)await go(e,a)},async function(e){const t=await Po(e),a=new Set;t&&await async function n(o=0){const r=await Po(e);e.setObject([r],e=>a.add(e)),o<t-1&&await n(o+1)}();return a},function(e){return e instanceof Set}),ho(async function(e,t){await Ao(e,t.getTime())},async function(e){const t=await Ro(e);return new Date(t)},function(e){return e instanceof Date}),ho(async function(e,t){await vo(e,t.message),await vo(e,t.stack)},async function(e){const t=await Lo(e),a=await Lo(e),n=new Error(t);return n.stack=a,n},function(e){return e instanceof Error}),ho(async function(e,t){await vo(e,t.source),await vo(e,t.flags)},async function(e){const t=await Lo(e),a=await Lo(e);return new RegExp(t,a)},function(e){return e instanceof RegExp}),ho(async function(e,t){await vo(e,t.valueOf())},async function(e){return new String(await Lo(e))},function(e){return e instanceof String}),ho(async function(e,t){await Ao(e,t.valueOf())},async function(e){return new Number(await Ro(e))},function(e){return e instanceof Number}),ho(async function(e,t){await xo(e,t.valueOf())},async function(e){return new Boolean(await Mo(e))},function(e){return e instanceof Boolean});class wo{constructor(e,t){this.stream=new po(e,t),this.objects=[]}append(e){return this.stream.append(e)}flush(){return this.stream.flush()}addObject(e){this.objects.push(jo(e)&&!Uo(e,this)?e:void 0)}}class po{constructor(e,t){this.offset=0,this.appendData=e,this.value=new Uint8Array(t)}async append(e){if(this.offset+e.length>this.value.length){const t=this.value.length-this.offset;await this.append(new Uint8Array(e).subarray(0,t)),await this.appendData({value:this.value}),this.offset=0,await this.append(new Uint8Array(e).subarray(t))}else this.value.set(e,this.offset),this.offset+=e.length}async flush(){this.offset&&await this.appendData({value:new Uint8Array(this.value).subarray(0,this.offset),done:!0})}}function bo(e,{chunkSize:t=8388608}={}){let a,n,o,r,i,s;return{[Symbol.asyncIterator]:()=>({next:()=>r?{done:r}:async function(){s?s():c().catch(()=>{});i=new Promise(e=>s=e);const e=await async function(){const{value:e,done:t}=await n;r=t,t||l();return e}();return{value:e}}(),return:()=>({done:!0})})};async function c(){l(),a=new wo(d,t),await go(a,e),await a.flush()}function l(){n=new Promise(e=>o=e)}async function d(e){o(e),await i}}async function go(e,t){const a=fo.findIndex(({test:a}={})=>a&&a(t,e));e.addObject(t),await e.append(new Uint8Array([a]));const n=fo[a].serialize;n&&await n(e,t),0!=a&&Do(t)&&(await async function(e,t){const a=Object.getOwnPropertySymbols(t),n=a.map(e=>[e,t[e]]);await yo(e,n)}(e,t),await async function(e,t){if(ArrayBuffer.isView(t))await go(e,0);else{let a=Object.entries(t);Fo(t)&&(a=a.filter(([e])=>!Bo(Number(e)))),await go(e,a.length);for(const[t,n]of a)await vo(e,t),await go(e,n)}}(e,t))}async function yo(e,t){await go(e,t.length);const a=Object.keys(t).filter(e=>Bo(Number(e))).map(e=>Number(e));let n=0,o=a[n];for(const[r,i]of t.entries())o==r?(o=a[++n],await go(e,i)):await go(e,co)}async function vo(e,t){const a=lo.encode(t);await go(e,a.length),await e.append(a)}async function ko(e,t){await go(e,t.length),await e.append(\"Uint8Array\"==t.constructor.name?t:new Uint8Array(t.buffer))}async function Ao(e,t){const a=new Uint8Array(new Float64Array([t]).buffer);await e.append(a)}async function xo(e,t){const a=new Uint8Array([Number(t)]);await e.append(a)}class To{constructor(e,t){this.index=e,this.data=t}getObject(){return this.data.objects[this.index]}}class Io{constructor(e){this.stream=new Co(e),this.objects=[],this.setters=[]}consume(e){return this.stream.consume(e)}getObjectId(){const e=this.objects.length;return this.objects.push(void 0),e}resolveObject(e,t){jo(t)&&!Wo(t)&&(this.objects[e]=t)}setObject(e,t){this.setters.push({functionArguments:e,setterFunction:t})}executeSetters(){this.setters.forEach(({functionArguments:e,setterFunction:t})=>{t(...e.map(e=>Wo(e)?e.getObject():e))})}}class Co{constructor(e){this.offset=0,this.value=new Uint8Array(0),this.consumeData=e}async consume(e){if(this.offset+e>this.value.length){const t=new Uint8Array(this.value).subarray(this.offset,this.value.length),a=await this.consumeData();return t.length+a.length!=this.value.length&&(this.value=new Uint8Array(t.length+a.length)),this.value.set(t),this.value.set(a,t.length),this.offset=0,this.consume(e)}{const t=this.value.slice(this.offset,this.offset+e);return this.offset+=t.length,t}}}function So(){let e,t,a,n,o,r;return{next:async t=>t?async function(t){o?await o:async function(){let t;n=new Promise(e=>t=e),e=new Io(s),i();const a=await Po(e);e.executeSetters(),t(a)}().catch(()=>{});return function(){o=new Promise(e=>r=e)}(),a(t),{done:!1}}(t):{value:await n,done:!0},return:()=>({done:!0})};function i(){t=new Promise(e=>a=e)}async function s(){const e=await t;return i(),r&&r(),e}}async function Po(e){const t=(await e.consume(1))[0],a=fo[t].parse,n=e.getObjectId(),o=await a(e);return 0!=t&&Do(o)&&(await async function(e,t){const a=await Eo(e);e.setObject([a],e=>e.forEach(([e,a])=>t[e]=a))}(e,o),await async function(e,t){const a=await Po(e);a&&await n();async function n(o=0){const r=await Lo(e),i=await Po(e);e.setObject([i],e=>t[r]=e),o<a-1&&await n(o+1)}}(e,o)),e.resolveObject(n,o),o}async function Eo(e){const t=await Po(e),a=new Array(t);return t&&await async function n(o=0){const r=await Po(e);No(r)||e.setObject([r],e=>a[o]=e);o<t-1&&await n(o+1)}(),a}async function Lo(e){const t=await Po(e),a=await e.consume(t);return uo.decode(a)}async function Ro(e){const t=await e.consume(8);return new Float64Array(t.buffer)[0]}async function Mo(e){const t=await e.consume(1);return Boolean(t[0])}function Uo(e,t){return Do(e)&&t.objects.includes(e)}function Wo(e){return e instanceof To}function Do(e){return e===Object(e)}function Fo(e){return\"number\"==typeof e.length}function No(e){return e===co}function _o(e){return\"number\"==typeof e}function Bo(e){return _o(e)&&Number.isInteger(e)}function Oo(e){return\"symbol\"==typeof e}function jo(e){return Do(e)||Oo(e)}class zo{constructor(e,t,a,n){this.headers=new Map([[\"Authorization\",\"Bearer \"+e],[\"Accept\",\"application/json\"]]),this.restApiUrl=t,this.fileFieldName=a,this.urlFieldName=n}async upload(e,t,a){this.controller=new AbortController;const n=t instanceof Blob?t:new Blob([t],{type:\"text/html\"});let o=new FormData;this.fileFieldName&&o.append(this.fileFieldName,n,e),this.urlFieldName&&o.append(this.urlFieldName,a);const r=await fetch(this.restApiUrl,{method:\"POST\",body:o,headers:this.headers,signal:this.controller.signal});if([200,201,202].includes(r.status))return r.json();throw new Error(await r.text())}abort(){this.controller&&this.controller.abort()}}const qo=\"/src/ui/pages/offscreen-document.html\",Ko=16777216;let $o,Vo=0;async function Go(e){return await Yo(),browser.runtime.sendMessage({method:\"revokeObjectURL\",url:e})}async function Jo(e,t){return await Yo(),Zo({method:\"getBlobURL\",mimeType:t,requestId:Vo},e)}async function Ho(e,t,a){return await Yo(),browser.runtime.sendMessage({method:\"getImageData\",url:e,width:t,height:a})}async function Yo(){const e=browser.runtime.getURL(qo);(await browser.runtime.getContexts({contextTypes:[\"OFFSCREEN_DOCUMENT\"],documentUrls:[e]})).length>0||($o?await $o:($o=await browser.offscreen.createDocument({url:qo,justification:\"Auto-save/Compression features\",reasons:[\"DOM_PARSER\",\"WORKERS\",\"CLIPBOARD\",\"BLOBS\"]}),$o=null))}async function Zo(e,t){let a;Vo++;for(let n=0;n*Ko<t.length;n++)e.truncated=t.length>Ko,e.truncated?(e.finished=(n+1)*Ko>t.length,e.data=t.slice(n*Ko,(n+1)*Ko)):e.data=t,a=await browser.runtime.sendMessage(e);return a}const Qo=new Map,Xo=new Map,er=/([{}()^$&.*?/+|[\\\\\\\\]|\\]|-)/g;let tr=\"207618107333-h1220p1oasj3050kr5r416661adm091a.apps.googleusercontent.com\",ar=\"VQJ8Gq8Vxx72QyxPyeLtWvUt\";const nr=browser.runtime.getManifest().oauth2;nr&&(tr=nr.client_id,ar=nr.client_secret);const or=new class{constructor(e,t,a){this.clientId=e,this.clientKey=t,this.scopes=a,this.folderIds=new Map,setInterval(()=>this.folderIds.clear(),6e4)}async auth(e={interactive:!0}){return qa(e)?(this.accessToken=await browser.identity.getAuthToken({interactive:e.interactive}),{revokableAccessToken:this.accessToken}):(this.authURL=\"https://accounts.google.com/o/oauth2/v2/auth?client_id=\"+this.clientId+\"&response_type=code&access_type=offline&redirect_uri=\"+browser.identity.getRedirectURL()+\"&scope=\"+this.scopes.join(\" \"),e.code?za(this,e):async function(e,t){let a;try{if(browser.identity&&browser.identity.launchWebAuthFlow&&!t.forceWebAuthFlow){const a=await browser.identity.launchWebAuthFlow({interactive:t.interactive,url:e.authURL});return t.code=new URLSearchParams(new URL(a).search).get(\"code\"),await za(e,t)}if(t.launchWebAuthFlow)return t.extractAuthCode(browser.identity.getRedirectURL()).then(e=>a=e).catch(()=>{}),await t.launchWebAuthFlow({url:e.authURL});throw new Error(\"auth_not_supported\")}catch(n){if(n.message&&(\"code_required\"==n.message||n.message.includes(\"access\"))){if(a)return t.code=a,await za(e,t);throw new Error(\"code_required\")}throw n}}(this,e))}setAuthInfo(e,t){qa(t)||(e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate))}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(_a,{method:\"POST\",headers:{\"Content-Type\":\"application/x-www-form-urlencoded\"},body:\"client_id=\"+this.clientId+\"&refresh_token=\"+this.refreshToken+\"&grant_type=refresh_token&client_secret=\"+this.clientKey});if(400==e.status)throw new Error(\"unknown_token\");const t=await Ga(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}try{return browser.identity&&browser.identity.removeCachedAuthToken&&this.accessToken&&await browser.identity.removeCachedAuthToken({token:this.accessToken}),this.accessToken=await browser.identity.getAuthToken({interactive:!1}),{revokableAccessToken:this.accessToken}}catch(e){delete this.accessToken}}async revokeAuthToken(e){if(e){if(browser.identity&&browser.identity.removeCachedAuthToken)try{await browser.identity.removeCachedAuthToken({token:e})}catch(e){}const t=await fetch(\"https://accounts.google.com/o/oauth2/revoke\",{method:\"POST\",headers:{\"Content-Type\":\"application/x-www-form-urlencoded\"},body:\"token=\"+e});try{await Ga(t)}catch(e){if(\"invalid_token\"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,a,n,o=!0){const r=await Ka(this,e),i=e.split(\"/\").pop(),s=new ja({token:this.accessToken,file:t,parents:[r],filename:i,onProgress:a.onProgress,filenameConflictAction:a.filenameConflictAction,prompt:a.prompt});try{n&&n(()=>s.cancelled=!0),await s.upload()}catch(r){if(\"path_not_found\"==r.message&&o)return this.folderIds.clear(),this.upload(e,t,a,n);throw r}}}(tr,ar,[\"https://www.googleapis.com/auth/drive.file\"]),rr=new class{constructor(e,t){this.clientId=e,this.clientKey=t}async auth(e={interactive:!0}){return this.authURL=\"https://www.dropbox.com/oauth2/authorize?client_id=\"+this.clientId+\"&response_type=code&token_access_type=offline&redirect_uri=\"+browser.identity.getRedirectURL(),e.code?en(this,e):async function(e,t){let a;try{return t.extractAuthCode(browser.identity.getRedirectURL()).then(e=>a=e).catch(()=>{}),await t.launchWebAuthFlow({url:e.authURL})}catch(n){if(n.message&&(\"code_required\"==n.message||n.message.includes(\"access\"))){if(a)return t.code=a,await en(e,t);throw new Error(\"code_required\")}throw n}}(this,e)}setAuthInfo(e){e?(this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.expirationDate=e.expirationDate):(delete this.accessToken,delete this.refreshToken,delete this.expirationDate)}async refreshAuthToken(){if(this.refreshToken){const e=await fetch(Ha,{method:\"POST\",headers:{\"Content-Type\":\"application/x-www-form-urlencoded\"},body:\"client_id=\"+this.clientId+\"&refresh_token=\"+this.refreshToken+\"&grant_type=refresh_token&client_secret=\"+this.clientKey});if(400==e.status)throw new Error(\"unknown_token\");const t=await an(e);return this.accessToken=t.access_token,t.refresh_token&&(this.refreshToken=t.refresh_token),t.expires_in&&(this.expirationDate=Date.now()+1e3*t.expires_in),{accessToken:this.accessToken,refreshToken:this.refreshToken,expirationDate:this.expirationDate}}delete this.accessToken}async revokeAuthToken(e){if(e){const t=await fetch(\"https://api.dropboxapi.com/2/auth/token/revoke\",{method:\"POST\",headers:{Authorization:\"Bearer \"+e}});try{await t.text()}catch(e){if(\"invalid_token\"!=e.message)throw e}finally{delete this.accessToken,delete this.refreshToken,delete this.expirationDate}}}async upload(e,t,a,n){const o=new Xa({token:this.accessToken,file:t,filename:e,onProgress:a.onProgress,filenameConflictAction:a.filenameConflictAction,prompt:a.prompt});n&&n(()=>o.cancelled=!0),await o.upload()}}(\"s50p6litdvuzrtb\",\"i1vzwllesr14fzd\");async function ir(e,t){if(e.method.endsWith(\".download\"))return async function(e,t){const a=t.id;let n;if(e.blobURL)try{e.url=e.blobURL,e.compressContent?(e.pageData=await async function(e){const t=So();return await t.next(e),(await t.next()).value}(new Uint8Array(await(await fetch(e.blobURL)).arrayBuffer())),await cr(e,t)):(e.content=await(await fetch(e.blobURL)).text(),await sr(e,t))}catch(e){return{error:!0}}finally{try{await Go(e.blobURL)}catch(e){}}else if(e.compressContent){let n=Xo.get(a);if(n||(n=So(),Xo.set(a,n)),e.data)await n.next(new Uint8Array(e.data));else{Xo.delete(a);const e=(await n.next()).value;await cr(e,t)}}else if(e.truncated?(n=Qo.get(a),n||(n=[],Qo.set(a,n)),n.push(e.content),e.finished&&Qo.delete(a)):e.content&&(n=[e.content]),!e.truncated||e.finished){e.content=n.join(\"\");try{e.url=await Jo(Array.from((new TextEncoder).encode(e.content)),e.mimeType),await sr(e,t)}finally{try{await Go(e.url)}catch(e){}}}return{}}(e,t.tab);if(e.method.endsWith(\".disableGDrive\")){const e=await K();return J(),await or.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(\".disableDropbox\")){const e=await $();return H(),await rr.revokeAuthToken(e&&(e.accessToken||e.revokableAccessToken)),{}}if(e.method.endsWith(\".end\")){if(e.hash)try{await Na(e.hash,e.woleetKey)}catch(e){Gt(t.tab.id,e.message,e.link)}return Aa(e.taskId),{}}return e.method.endsWith(\".getInfo\")?la.map(Pa):e.method.endsWith(\".cancel\")?(e.taskId?function(e){const t=la.find(t=>t.id==e);t&&Sa(t)}(e.taskId):Ia(t.tab.id),{}):e.method.endsWith(\".cancelAll\")?(Array.from(la).forEach(e=>Sa(e,!1)),{}):e.method.endsWith(\".saveUrls\")?(pa(e.urls),{}):void 0}async function sr(e,t){const a=t.id;try{let n;if(e.backgroundSave&&!e.saveToGDrive&&!e.saveToDropbox&&!e.saveWithWebDAV&&!e.saveToGitHub&&!e.saveToRestFormApi&&!e.saveToS3){const t=await gr(e.filename,e);e.filenameConflictAction=t.filenameConflictAction,n=t.skipped}if(n)Ht(a);else{const n=e=>yr(a,e);let o;if(e.openEditor)Jt(a),await ne({tabIndex:t.index+1,filename:e.filename,content:e.content,url:e.originalUrl});else if(e.saveToClipboard)await async function(e,t){return await Yo(),Zo({method:\"saveToClipboard\",mimeType:t,requestId:Vo},Array.from((new TextEncoder).encode(e)))}(e.content,e.mimeType);else if(e.saveWithWebDAV)o=await hr(e.taskId,lr(e.filename),e.content,e.webDAVURL,e.webDAVUser,e.webDAVPassword,{filenameConflictAction:e.filenameConflictAction,prompt:n});else if(e.saveWithMCP)o=await wr(e.taskId,lr(e.filename),e.content,e.mcpServerUrl,e.mcpAuthToken,{filenameConflictAction:e.filenameConflictAction,prompt:n});else if(e.saveToGDrive)await pr(e.taskId,lr(e.filename),new Blob([e.content],{type:e.mimeType}),{forceWebAuthFlow:e.forceWebAuthFlow},{onProgress:(e,t)=>Yt(a,e,t),filenameConflictAction:e.filenameConflictAction,prompt:n});else if(e.saveToDropbox)await br(e.taskId,lr(e.filename),new Blob([e.content],{type:e.mimeType}),{onProgress:(e,t)=>Yt(a,e,t),filenameConflictAction:e.filenameConflictAction,prompt:n});else if(e.saveToGitHub)o=await fr(e.taskId,lr(e.filename),e.content,e.githubToken,e.githubUser,e.githubRepository,e.githubBranch,{filenameConflictAction:e.filenameConflictAction,prompt:n}),await o.pushPromise;else if(e.saveWithCompanion)await Ea({filename:e.filename,content:e.content,title:e.title,url:e.originalUrl,filenameConflictAction:e.filenameConflictAction});else if(e.saveToRestFormApi)o=await kr(e.taskId,e.filename,e.content,t.url,e.saveToRestFormApiToken,e.saveToRestFormApiUrl,e.saveToRestFormApiFileFieldName,e.saveToRestFormApiUrlFieldName);else if(e.saveToS3)o=await mr(e.taskId,lr(e.filename),new Blob([e.content],{type:e.mimeType}),e.S3Domain,e.S3Region,e.S3Bucket,e.S3AccessKey,e.S3SecretKey,{filenameConflictAction:e.filenameConflictAction,prompt:n});else if(o=await vr(e,{confirmFilename:e.confirmFilename,incognito:t.incognito,filenameConflictAction:e.filenameConflictAction,filenameReplacementCharacter:e.filenameReplacementCharacter,bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,includeInfobar:e.includeInfobar,openInfobar:e.openInfobar,infobarPositionAbsolute:e.infobarPositionAbsolute,infobarPositionTop:e.infobarPositionTop,infobarPositionBottom:e.infobarPositionBottom,infobarPositionLeft:e.infobarPositionLeft,infobarPositionRight:e.infobarPositionRight}),!o)throw new Error(\"upload_cancelled\");if(e.bookmarkId&&e.replaceBookmarkURL&&o&&o.url&&await Ua(e.bookmarkId,{url:o.url}),Ht(a),e.openSavedPage&&!e.openEditor){const a={active:!0,url:\"/src/ui/pages/viewer.html?blobURI=\"+e.url};null!=t.index&&(a.index=t.index+1),browser.tabs.create(a)}}}catch(e){e.message&&\"upload_cancelled\"==e.message||(console.error(e),Gt(a,e.message,e.link))}finally{if(!e.openSavedPage&&e.url)try{await Go(e.url)}catch(e){}}}async function cr(e,t){const a=t.id;let n;try{const o=e=>yr(a,e);let r,i;if(e.backgroundSave&&!e.saveToGDrive&&!e.saveToDropbox&&!e.saveWithWebDAV&&!e.saveWithMCP&&!e.saveToGitHub&&!e.saveToRestFormApi&&!e.sharePage){const t=await gr(e.filename,e);e.filenameConflictAction=t.filenameConflictAction,r=t.skipped}if(r)Ht(a);else{if(n=await async function(e,t){await Yo();const a=bo(e);for await(const e of a)await browser.runtime.sendMessage({method:\"compressPage\",tabId:t.tabId,data:Array.from(e)});return browser.runtime.sendMessage({method:\"compressPage\",tabId:t.tabId,options:t})}(e.pageData,{insertTextBody:e.insertTextBody,url:e.pageData.url||t.url,createRootDirectory:e.createRootDirectory,tabId:a,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPage:e.extractDataFromPage,preventAppendedData:e.preventAppendedData,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,insertMetaCSP:e.insertMetaCSP,password:e.password,embeddedImage:e.embeddedImage}),e.openEditor){Jt(a);const o=Array.from(new Uint8Array(await(await fetch(n)).arrayBuffer()));await ne({tabIndex:t.index+1,filename:e.filename,content:o,compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPage:e.extractDataFromPage,insertTextBody:e.insertTextBody,insertMetaCSP:e.insertMetaCSP,embeddedImage:e.embeddedImage,url:e.originalUrl})}else if(e.foregroundSave||e.sharePage){const t=(await fetch(n)).blob();await Ar(e.taskId,e.filename,t,e.pageData.mimeType,a,{foregroundSave:e.foregroundSave,sharePage:e.sharePage})}else if(e.saveWithWebDAV){const t=await(await fetch(n)).blob();i=await hr(e.taskId,lr(e.filename),t,e.webDAVURL,e.webDAVUser,e.webDAVPassword,{filenameConflictAction:e.filenameConflictAction,prompt:o})}else if(e.saveWithMCP){const t=await(await fetch(n)).blob();i=await wr(e.taskId,lr(e.filename),t,e.mcpServerUrl,e.mcpAuthToken,{filenameConflictAction:e.filenameConflictAction,prompt:o})}else if(e.saveToGDrive){const t=await(await fetch(n)).blob();await pr(e.taskId,lr(e.filename),t,{forceWebAuthFlow:e.forceWebAuthFlow},{onProgress:(e,t)=>Yt(a,e,t),filenameConflictAction:e.filenameConflictAction,prompt:o})}else if(e.saveToDropbox){const t=await(await fetch(n)).blob();await br(e.taskId,lr(e.filename),t,{onProgress:(e,t)=>Yt(a,e,t),filenameConflictAction:e.filenameConflictAction,prompt:o})}else if(e.saveToGitHub){const t=await(await fetch(n)).blob();i=await fr(e.taskId,lr(e.filename),t,e.githubToken,e.githubUser,e.githubRepository,e.githubBranch,{filenameConflictAction:e.filenameConflictAction,prompt:o}),await i.pushPromise}else if(e.saveToRestFormApi){const a=await(await fetch(n)).blob();i=await kr(e.taskId,e.filename,a,t.url,e.saveToRestFormApiToken,e.saveToRestFormApiUrl,e.saveToRestFormApiFileFieldName,e.saveToRestFormApiUrlFieldName)}else if(e.saveToS3){const t=await(await fetch(n)).blob();i=await mr(e.taskId,lr(e.filename),t,e.S3Domain,e.S3Region,e.S3Bucket,e.S3AccessKey,e.S3SecretKey,{filenameConflictAction:e.filenameConflictAction,prompt:o})}else if(e.backgroundSave)e.url=n,i=await vr(e,{confirmFilename:e.confirmFilename,incognito:t.incognito,filenameConflictAction:e.filenameConflictAction,filenameReplacementCharacter:e.filenameReplacementCharacter,bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,includeInfobar:e.includeInfobar,openInfobar:e.openInfobar,infobarPositionAbsolute:e.infobarPositionAbsolute,infobarPositionTop:e.infobarPositionTop,infobarPositionBottom:e.infobarPositionBottom,infobarPositionLeft:e.infobarPositionLeft,infobarPositionRight:e.infobarPositionRight});else{const t=await(await fetch(n)).blob();await Ar(e.taskId,e.filename,t,e.mimeType,a)}if(e.bookmarkId&&e.replaceBookmarkURL&&i&&i.url&&await Ua(e.bookmarkId,{url:i.url}),Ht(a),e.openSavedPage&&!e.openEditor){const e={active:!0,url:\"/src/ui/pages/viewer.html?compressed&blobURI=\"+n,windowId:t.windowId};null!=t.index&&(e.index=t.index+1),browser.tabs.create(e)}}}catch(e){e.message&&\"upload_cancelled\"==e.message||(console.error(e),Gt(a,e.message,e.link))}finally{if(!e.openSavedPage&&n)try{await Go(n)}catch(e){}}}function lr(e){return e.replace(/#/g,\"%23\")}async function dr(e,t){let a=await K();const n={interactive:!0,forceWebAuthFlow:e.forceWebAuthFlow,launchWebAuthFlow:e=>se(e),extractAuthCode:e=>ie(e)};return or.setAuthInfo(a,n),a&&a.accessToken&&!t||(a=await or.auth(n),a?await V(a):await J()),a}async function ur(e){let t=await $();const a={launchWebAuthFlow:e=>se(e),extractAuthCode:e=>ie(e)};return rr.setAuthInfo(t),t&&t.accessToken&&!e||(t=await rr.auth(a),t?await G(t):await H()),t}async function fr(e,t,a,n,o,r,i,{filenameConflictAction:s,prompt:c}){try{const l=Ca(e);if(!l||!l.cancelled){const l=new Mn(n,o,r,i);return Ta(e,()=>l.abort()),await l.upload(t,a,{filenameConflictAction:s,prompt:c})}}catch(e){throw new Error(e.message+\" (GitHub)\")}}async function mr(e,t,a,n,o,r,i,s,{filenameConflictAction:c,prompt:l}){try{const d=Ca(e);if(!d||!d.cancelled){const d=new Nn(o,r,i,s,n);return Ta(e,()=>d.abort()),await d.upload(t,a,{filenameConflictAction:c,prompt:l})}}catch(e){throw new Error(e.message+\" (S3)\")}}async function hr(e,t,a,n,o,r,{filenameConflictAction:i,prompt:s}){try{const c=Ca(e);if(!c||!c.cancelled){const c=new pn(n,o,r);return Ta(e,()=>c.abort()),await c.upload(t,a,{filenameConflictAction:i,prompt:s})}}catch(e){throw new Error(e.message+\" (WebDAV)\")}}async function wr(e,t,a,n,o,{filenameConflictAction:r,prompt:i}){try{const s=Ca(e);if(!s||!s.cancelled){const s=new ro(n,o);return Ta(e,()=>s.abort()),await s.upload(t,a,{filenameConflictAction:r,prompt:i})}}catch(e){throw new Error(e.message+\" (MCP)\")}}async function pr(e,t,a,n,o){try{await dr(n);const r=Ca(e);if(!r||!r.cancelled)return await or.upload(t,a,o,t=>Ta(e,t))}catch(r){if(\"invalid_token\"==r.message){let r;try{r=await or.refreshAuthToken()}catch(e){if(\"unknown_token\"!=e.message)throw new Error(e.message+\" (Google Drive)\");r=await dr(n,!0)}return r?await V(r):await J(),await pr(e,t,a,n,o)}throw new Error(r.message+\" (Google Drive)\")}}async function br(e,t,a,n){try{await ur();const o=Ca(e);if(!o||!o.cancelled)return await rr.upload(t,a,n,t=>Ta(e,t))}catch(o){if(\"invalid_token\"==o.message){let o;try{o=await rr.refreshAuthToken()}catch(e){if(\"unknown_token\"!=e.message)throw new Error(e.message+\" (Dropbox)\");o=await ur(!0)}return o?await G(o):await H(),await br(e,t,a,n)}throw new Error(o.message+\" (Dropbox)\")}}async function gr(e,t){let a,n=t.filenameConflictAction;if(\"skip\"==n){(await browser.downloads.search({filenameRegex:\"(\\\\\\\\|/)\"+(o=e,o.replace(er,\"\\\\$1\")+\"$\"),exists:!0})).length?a=!0:n=\"uniquify\"}var o;return{skipped:a,filenameConflictAction:n}}function yr(e,t){return browser.tabs.sendMessage(e,{method:\"content.prompt\",message:\"Filename conflict, please enter a new filename\",value:t})}async function vr(e,t){const a={url:e.url,saveAs:t.confirmFilename,filename:e.filename,conflictAction:t.filenameConflictAction};t.incognito&&(a.incognito=!0);const n=await r(a,t.filenameReplacementCharacter);if(n.filename){let e=n.filename;return e.startsWith(\"file:\")||(e.startsWith(\"/\")&&(e=e.substring(1)),e=\"file:///\"+lr(e)),{url:e}}}async function kr(e,t,a,n,o,r,i,s){try{const c=Ca(e);if(!c||!c.cancelled){const c=new zo(o,r,i,s);return Ta(e,()=>c.abort()),await c.upload(t,a,n)}}catch(e){throw new Error(e.message+\" (RestFormApi)\")}}async function Ar(e,t,a,n,o,{foregroundSave:r,sharePage:i}={}){const s=bo({filename:t,taskId:e,foregroundSave:r,sharePage:i,content:await a.arrayBuffer(),mimeType:n});for await(const e of s)await browser.tabs.sendMessage(o,{method:\"content.download\",data:Array.from(e)});return browser.tabs.sendMessage(o,{method:\"content.download\"})}const xr={},Tr={};async function Ir(e,t){if(\"enableAutoSave\"==e.method){const a=await f(t.id);a[t.id].autoSave=e.enabled,await m(a),async function(e){Promise.all([Nt(e),Le(e)])}(t)}if(\"isAutoSaveEnabled\"==e.method)return Z(t)}async function Cr(e,t){const a=t.id,n=await F(t.url,!0);if(n){let o;Vt(a,1,!0),n.content=e.content,n.url=e.url,n.frames=e.frames,n.canvases=e.canvases,n.fonts=e.fonts,n.stylesheets=e.stylesheets,n.images=e.images,n.posters=e.posters,n.videos=e.videos,n.usedFonts=e.usedFonts,n.shadowRoots=e.shadowRoots,n.referrer=e.referrer,n.updatedResources=e.updatedResources,n.worklets=e.worklets,n.adoptedStyleSheets=e.adoptedStyleSheets,n.visitDate=new Date(e.visitDate),n.backgroundTab=!0,n.autoSave=!0,n.incognito=t.incognito,n.tabId=a,n.tabIndex=t.index;try{if(n.autoSaveExternalSave)await async function(e){let t;e.autoSaveExternalSave=!1;try{t=await browser.runtime.sendNativeMessage(\"singlefile_companion\",{method:\"externalSave\",pageData:e})}catch(e){if(!e.message||!e.message.includes(\"Native host has exited\"))throw e}if(t&&t.error)throw new Error(t.error+\" (Companion)\")}(n);else{let r;if(o=await async function(e){return await Yo(),browser.runtime.sendMessage({method:\"processPage\",options:e})}(n),!(n.saveToGDrive||n.saveWithWebDAV||n.saveWithMCP||n.saveToGitHub||n.saveToDropbox||n.saveWithCompanion||n.saveToRestFormApi||n.saveToS3)){const e=await gr(o.filename,n);r=e.skipped,n.filenameConflictAction=e.filenameConflictAction}if(!r){if(n.saveToGDrive){const t=await(await fetch(o.url)).blob();await pr(e.taskId,lr(o.filename),t,n,{forceWebAuthFlow:n.forceWebAuthFlow},n.filenameConflictAction)}if(n.saveToDropbox){const t=await(await fetch(o.url)).blob();await br(e.taskId,lr(o.filename),t,{filenameConflictAction:n.filenameConflictAction})}else if(n.saveWithWebDAV){const t=await(await fetch(o.url)).blob();await hr(e.taskId,lr(o.filename),t,n.webDAVURL,n.webDAVUser,n.webDAVPassword,{filenameConflictAction:n.filenameConflictAction})}else if(n.saveWithMCP){const t=await(await fetch(o.url)).blob();await wr(e.taskId,lr(o.filename),t,n.mcpServerUrl,n.mcpAuthToken,{filenameConflictAction:n.filenameConflictAction})}else if(n.saveToGitHub){const t=await(await fetch(o.url)).blob();await(await fr(e.taskId,lr(o.filename),t,n.githubToken,n.githubUser,n.githubRepository,n.githubBranch,{filenameConflictAction:n.filenameConflictAction})).pushPromise}else if(n.saveWithCompanion&&!n.compressContent){const e=await(await fetch(o.url)).text();await Ea({filename:o.filename,content:e,title:o.title,url:n.url,filenameConflictAction:n.filenameConflictAction})}else if(n.saveToRestFormApi){const t=await(await fetch(o.url)).blob();await kr(e.taskId,o.filename,t,n.url,n.saveToRestFormApiToken,n.saveToRestFormApiUrl,n.saveToRestFormApiFileFieldName,n.saveToRestFormApiUrlFieldName)}else if(n.saveToS3){const t=await(await fetch(o.url)).blob();await mr(e.taskId,o.filename,t,n.S3Domain,n.S3Region,n.S3Bucket,n.S3AccessKey,n.S3SecretKey,{filenameConflictAction:n.filenameConflictAction})}else await vr(o,n);if(n.openSavedPage){const e={active:!0,url:\"/src/ui/pages/viewer.html?compressed=true&blobURI=\"+o.url,windowId:t.windowId},n=t.index;try{await browser.tabs.get(a),e.index=n+1}catch(t){e.index=n}browser.tabs.create(e)}o.hash&&await Na(o.hash,n.woleetKey)}}}finally{e.taskId?Aa(e.taskId):n.autoClose&&(browser.tabs.remove(Tr[a]||a),delete Tr[a]),o&&o.url&&!n.openSavedPage&&Go(o.url),Ht(a,!0)}}}async function Sr(e,t){return e.method.endsWith(\".init\")&&(await async function(e,t){await d(e.id);const a=await f(e.id);a[e.id].savedPageDetected=t.savedPageDetected,await m(a)}(t.tab,e),Bt(t.tab),function(e){Ia(e.id,!1)}(t.tab),async function(e){const[t,a]=await Promise.all([F(e.url,!0),Z(e)]);t&&(t.autoSaveLoad||t.autoSaveLoadOrUnload)&&a&&ba([e],{autoSave:!0})}(t.tab)),e.method.endsWith(\".getOptions\")?F(e.url):(e.method.endsWith(\".activate\")&&await browser.tabs.update(e.tabId,{active:!0}),e.method.endsWith(\".getScreenshot\")?Pr(t.tab.id,e):void 0)}async function Pr(e,t){const{width:a,height:n,scale:o=1}=t,r=Math.floor(a*o),i=Math.floor(n*o);let s,c,l,d=0,u=0;browser.tabs.captureTab?c=4096:(c=t.innerHeight,l=(await browser.tabs.query({active:!0,currentWindow:!0}))[0].id);const f=Math.floor(c*o);await browser.tabs.sendMessage(e,{method:\"content.beginScrollTo\"});try{s=new OffscreenCanvas(r,i);const t=s.getContext(\"2d\");for(;d<n;){let o;browser.tabs.captureTab?o=await browser.tabs.captureTab(e,{format:\"png\",rect:{x:0,y:d,width:a,height:Math.min(n-d,c)}}):(await browser.tabs.sendMessage(e,{method:\"content.scrollTo\",y:d}),await browser.tabs.update(e,{active:!0}),o=await browser.tabs.captureVisibleTab(null,{format:\"png\"}));const s=Math.min(i-u,f),l=(await Ho(o,r,s)).url,m=await fetch(l).then(e=>e.arrayBuffer());await Go(l);const h=new ImageData(new Uint8ClampedArray(m),a);t.putImageData(h,0,d),d+=c,u+=f}browser.tabs.captureTab||await browser.tabs.update(l,{active:!0})}catch(a){if(o>.1)return t.scale=.75*o,Pr(e,t);throw a}finally{await browser.tabs.sendMessage(e,{method:\"content.endScrollTo\"})}if(s){await browser.tabs.sendMessage(e,{method:\"content.endScrollTo\"});const t=await s.convertToBlob({type:\"image/png\"});return await Jo(Array.from(new Uint8Array(await t.arrayBuffer())))}}browser.tabs.onCreated.addListener(e=>function(e){!function(e){Bt(e)}(e)}(e)),browser.tabs.onActivated.addListener(e=>async function(e){const t=await browser.tabs.get(e.tabId);Zt(t)}(e)),browser.tabs.onRemoved.addListener(e=>function(e){Ia(e),d(e),function(e){ee.delete(e)}(e),async function(e){const t=xr[e];t?t.autoSaveRemove&&(delete xr[e],await Cr(t,t.tab)):xr[e]={removed:!0}}(e)}(e)),browser.tabs.onUpdated.addListener((e,t)=>async function(e,t){if(\"complete\"==t.status){setTimeout(async()=>{try{await browser.tabs.sendMessage(e,{method:\"content.maybeInit\"})}catch(e){}},1500),function(e){delete xr[e]}(e);const t=await browser.tabs.get(e);if(oe(t)){const e=await f(t.id);e[t.id].editorDetected=!0,await m(e),Zt(t)}}t.discarded&&async function(e){const t=xr[e];t?(delete xr[e],await Cr(t,t.tab)):xr[e]={discarded:!0}}(e)}(e,t)),browser.tabs.onReplaced.addListener((e,t)=>function(e,t){(async function(e,t){let a=await f();await l(a,e,t),m(a),await l(s,e,t)})(e,t),async function(e,t){xr[t]&&!xr[e]&&(xr[e]=xr[t],delete xr[t],Tr[t]=e)}(e,t),function(e,t){la.forEach(a=>{a.tab.id==t&&(a.tab.id=e)})}(e,t)}(e,t));async function Er(e){return(await browser.tabs.query(e)).sort((e,t)=>e.index-t.index)}browser.runtime.onMessage.addListener((e,t)=>e.method.startsWith(\"tabs.\")?Sr(e,t):e.method.startsWith(\"downloads.\")?ir(e,t):e.method.startsWith(\"autosave.\")?async function(e,t){if(e.method.endsWith(\".save\"))return e.autoSaveDiscard||e.autoSaveRemove?(t.tab?(e.tab=t.tab,xr[t.tab.id]=e):xr[e.tabId]&&(xr[e.tabId].removed&&e.autoSaveRemove||xr[e.tabId].discarded&&e.autoSaveDiscard)&&(delete xr[e.tabId],await Cr(e,{id:e.tabId,index:e.tabIndex,url:t.url})),e.autoSaveUnload&&(delete xr[e.tabId],await Cr(e,t.tab))):(delete xr[e.tabId],await Cr(e,t.tab)),{}}(e,t):e.method.startsWith(\"ui.\")?Kt(e,t):e.method.startsWith(\"config.\")?W(e):e.method.startsWith(\"tabsData.\")?function(e){return e.method.endsWith(\".get\")?f():e.method.endsWith(\".set\")?m(e.tabsData):void 0}(e):e.method.startsWith(\"devtools.\")?async function(e){e.method.endsWith(\".resourceCommitted\")&&e.tabId&&e.url&&(\"stylesheet\"==e.type||\"script\"==e.type)&&await browser.tabs.sendMessage(e.tabId,e)}(e):e.method.startsWith(\"editor.\")?async function(e,t){if(e.method.endsWith(\".getTabData\")){const e=t.tab,a=ee.get(e.id);if(a){const t=await F(a.url),n=JSON.stringify(a);for(let o=0;o*Q<n.length;o++){const r={method:\"editor.setTabData\",compressContent:a.compressContent,tabId:e.id,url:a.url};r.truncated=n.length>Q,r.truncated?(r.finished=(o+1)*Q>n.length,r.content=n.substring(o*Q,(o+1)*Q),r.finished&&(r.options=t)):(r.content=n,t.embeddedImage=a.embeddedImage,r.options=t),await browser.tabs.sendMessage(e.id,r)}}else{const t={method:\"editor.setTabData\",tabId:e.id};await browser.tabs.sendMessage(e.id,t)}return{}}if(e.method.endsWith(\".open\")){let a;const n=t.tab;if(e.truncated?(a=te.get(n.id),a||(a=[],te.set(n.id,a)),a.push(e.content),e.finished&&te.delete(n.id)):e.content&&(a=[e.content]),!e.truncated||e.finished){const t={url:X};await browser.tabs.update(n.id,t);const o=e.compressContent?a.flat():a.join(\"\");ee.set(n.id,{url:n.url,content:o,filename:e.filename,compressContent:e.compressContent,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPageTags:e.extractDataFromPageTags,insertTextBody:e.insertTextBody,insertMetaCSP:e.insertMetaCSP,embeddedImage:e.embeddedImage})}return{}}}(e,t):e.method.startsWith(\"bookmarks.\")?Ra(e):e.method.startsWith(\"companion.\")?async function(e){if(e.method.endsWith(\".state\"))return{enabled:!0}}(e):e.method.startsWith(\"bootstrap.\")?async function(e,t){if(e.method.endsWith(\".init\")){const[e,a,n]=await Promise.all([F(t.tab.url,!0),F(t.tab.url),Z(t.tab)]);return{optionsAutoSave:e,options:a,autoSaveEnabled:n,tabId:t.tab.id,tabIndex:t.tab.index}}}(e,t):\"ping\"==e.method?Promise.resolve({}):void 0),browser.runtime.onMessageExternal&&browser.runtime.onMessageExternal.addListener(async function(e,t){if(\"save-page\"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await ba(e)}else if(\"edit-and-save-page\"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});e.length=1,await ba(e,{openEditor:!0})}else if(\"save-selected-links\"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await ha(e[0])}else if(\"save-selected-content\"==e){const e=await browser.tabs.query({currentWindow:!0,active:!0});await ba(e,{selected:!0})}else if(\"save-selected-tabs\"==e){const e=await Er({currentWindow:!0,highlighted:!0});await ba(e)}else if(\"save-unpinned-tabs\"==e){const e=await Er({currentWindow:!0,pinned:!1});await ba(e)}else if(\"save-all-tabs\"==e){const e=await Er({currentWindow:!0});await ba(e)}else if(e.method){const t=(await browser.tabs.query({currentWindow:!0,active:!0}))[0];return!!t&&Ir(e,t)}})}();\n"
  },
  {
    "path": "lib/single-file-extension-bootstrap.js",
    "content": "!function(){\"use strict\";const e=33554432,t=\"data-sf-nesting-track-id\",o=globalThis.singlefileBootstrap,n=new Map;let a,r,s,d,i,c,l,u,m,f,h,v,y,E;async function p(){if(document.documentElement.dataset&&void 0!==document.documentElement.dataset.sfz){const e=await g();document.querySelectorAll(\"#sfz-error-message\").forEach(e=>e.remove()),function(e){document.dispatchEvent(new CustomEvent(\"single-file-bootstrap\",{detail:{data:e}}))}(e)}else if(document.body&&1==document.body.childNodes.length&&\"PRE\"==document.body.childNodes[0].tagName&&/<html[^>]* data-sfz[^>]*>/i.test(document.body.childNodes[0].textContent)){const e=(new DOMParser).parseFromString(document.body.childNodes[0].textContent,\"text/html\");document.replaceChild(e.documentElement,document.documentElement),document.querySelectorAll(\"script\").forEach(e=>{const t=document.createElement(\"script\");t.textContent=e.textContent,e.parentElement.replaceChild(t,e)}),await p()}}function g(){return new Promise((e,t)=>{const o=new XMLHttpRequest;o.open(\"GET\",location.href),o.send(),o.responseType=\"arraybuffer\",o.onload=()=>e(new Uint8Array(o.response)),o.onerror=()=>{const o=document.getElementById(\"sfz-error-message\");o&&o.remove();const a=n.size;n.set(a,{resolve:e,reject:t}),browser.runtime.sendMessage({method:\"singlefile.fetch\",requestId:a,url:location.href})}})}async function b(e){return i&&\"content.autosave\"==e.method?(async function(e){r=e.options,\"complete\"!=document.readyState&&await new Promise(e=>globalThis.addEventListener(\"load\",e));await w(),r.autoSaveRepeat&&setTimeout(()=>{i&&!l&&(u=!1,r.autoSaveDelay=0,b(e))},1e3*r.autoSaveRepeatDelay)}(e),{}):\"content.maybeInit\"==e.method?(S(),{}):\"content.init\"==e.method?(r=e.options,i=e.autoSaveEnabled,T(),{}):\"content.openEditor\"==e.method?(O(document)?D(document):T(),{}):\"devtools.resourceCommitted\"==e.method?(o.pageInfo.updatedResources[e.url]={content:e.content,type:e.type,encoding:e.encoding},{}):\"singlefile.fetchResponse\"==e.method?await async function(e){const t=n.get(e.requestId);if(t)return e.error?(t.reject(new Error(e.error)),n.delete(e.requestId)):(e.truncated&&(t.array?t.array=t.array.concat(e.array):(t.array=e.array,n.set(e.requestId,t)),e.finished&&(e.array=t.array)),e.truncated&&!e.finished||(t.resolve(e.array),n.delete(e.requestId))),{}}(e):void 0}function S(){const e=document.querySelector(\"singlefile-infobar\");e&&e.remove(),m==location.href||o.pageInfo.processing||(u=!1,m=location.href,browser.runtime.sendMessage({method:\"tabs.init\",savedPageDetected:O(document)}).catch(()=>{}),browser.runtime.sendMessage({method:\"ui.processInit\"}).catch(()=>{}))}async function w(){const e=o.helper;if((!l||c)&&!u)if(l=!0,r.autoSaveDelay&&!c)await new Promise(e=>c=setTimeout(e,1e3*r.autoSaveDelay)),await w();else{const t=globalThis[e.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];let n,a=[];c=null,!r.removeFrames&&globalThis.frames&&globalThis.frames.length&&(a=await o.processors.frameTree.getAsync(r)),n=a&&a.sessionId,r.userScriptEnabled&&t&&await t(e.ON_BEFORE_CAPTURE_EVENT_NAME);const s=e.preProcessDoc(document,globalThis,r);C(s,a),n&&o.processors.frameTree.cleanup(n),e.postProcessDoc(document,s.markedElements,s.invalidElements),r.userScriptEnabled&&t&&await t(e.ON_AFTER_CAPTURE_EVENT_NAME),u=!0,l=!1}}function T(){i&&r&&(r.autoSaveUnload||r.autoSaveLoadOrUnload||r.autoSaveDiscard||r.autoSaveRemove)?a||(globalThis.addEventListener(\"unload\",R),document.addEventListener(\"visibilitychange\",A),a=!0):(globalThis.removeEventListener(\"unload\",R),document.removeEventListener(\"visibilitychange\",A),a=!1)}function A(){\"hidden\"==document.visibilityState&&r.autoSaveDiscard&&I({autoSaveDiscard:r.autoSaveDiscard})}function R(){!u&&(r.autoSaveUnload||r.autoSaveLoadOrUnload||r.autoSaveRemove)&&I({autoSaveUnload:r.autoSaveUnload,autoSaveRemove:r.autoSaveRemove})}function I({autoSaveUnload:e,autoSaveDiscard:t,autoSaveRemove:n}){const a=o.helper,s=globalThis[a.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];let d=[];!r.removeFrames&&globalThis.frames&&globalThis.frames.length&&(d=o.processors.frameTree.getSync(r)),r.userScriptEnabled&&s&&s(a.ON_BEFORE_CAPTURE_EVENT_NAME);C(a.preProcessDoc(document,globalThis,r),d,{autoSaveUnload:e,autoSaveDiscard:t,autoSaveRemove:n})}function C(e,t,{autoSaveUnload:n,autoSaveDiscard:a,autoSaveRemove:i}={}){const c=o.helper,l=o.pageInfo.updatedResources,u=o.pageInfo.visitDate.getTime();Object.keys(l).forEach(e=>l[e].retrieved=!1),browser.runtime.sendMessage({method:\"autosave.save\",tabId:s,tabIndex:d,taskId:r.taskId,content:c.serialize(document),canvases:e.canvases,fonts:e.fonts,stylesheets:e.stylesheets,images:e.images,posters:e.posters,usedFonts:e.usedFonts,shadowRoots:e.shadowRoots,videos:e.videos,referrer:e.referrer,adoptedStyleSheets:e.adoptedStyleSheets,worklets:e.worklets,frames:t,url:location.href,updatedResources:l,visitDate:u,autoSaveUnload:n,autoSaveDiscard:a,autoSaveRemove:i})}async function D(n){let a;h?a=await g():(P(n),function(e){s(e.body);const o=function(e,t){const o=(new DOMParser).parseFromString(e,\"text/html\");o.head||o.documentElement.insertBefore(o.createElement(\"HEAD\"),o.body);let n=o.querySelector(\"base\");n&&n.getAttribute(\"href\")||(n&&n.remove(),n=o.createElement(\"base\"),n.setAttribute(\"href\",t),o.head.insertBefore(n,o.head.firstChild));return o}(function(e){const t=e.doctype;let o=\"\";t&&(o=\"<!DOCTYPE \"+t.nodeName,t.publicId?(o+=' PUBLIC \"'+t.publicId+'\"',t.systemId&&(o+=' \"'+t.systemId+'\"')):t.systemId&&(o+=' SYSTEM \"'+t.systemId+'\"'),t.internalSubset&&(o+=\" [\"+t.internalSubset+\"]\"),o+=\"> \");return o+e.documentElement.outerHTML}(e)),n=d(e.body),a=d(o.body),r=new Set;function s(e,o=0,n=\"\"){const a=n?`${n}.${o+1}`:`${o+1}`;e.setAttribute(t,a),Array.from(e.children).forEach((e,t)=>s(e,t,a))}function d(e){const o={};return n(e),o;function n(e){if(e.getAttribute){const a=e.getAttribute(t);a&&(o[a]=e),Array.from(e.children).forEach(n)}}}function i(e,o){const n=e.getAttribute(t);n&&!o.has(n)&&e.removeAttribute(t),Array.from(e.children).forEach(e=>i(e,o))}Object.keys(n).forEach(o=>{if(o in a){if((n[o].parentElement?.getAttribute(t)||null)!==(a[o]?.parentElement?.getAttribute(t)||null)){let a=n[o];for(;a&&a!==e.body;){const e=a.getAttribute(t);e&&r.add(e),a=a.parentElement}}}}),i(e.body,r)}(n),a=o.helper.serialize(n));for(let t=0;t*e<a.length;t++){const o={method:\"editor.open\",filename:decodeURIComponent(location.href.match(/^.*\\/(.*)$/)[1]),compressContent:h,extractDataFromPageTags:v,insertTextBody:y,insertMetaCSP:E,selfExtractingArchive:h};o.truncated=a.length>e,o.truncated?(o.finished=(t+1)*e>a.length,a instanceof Uint8Array?o.content=Array.from(a.subarray(t*e,(t+1)*e)):o.content=a.substring(t*e,(t+1)*e)):(o.embeddedImage=await M(a),o.content=a instanceof Uint8Array?Array.from(a):a),await browser.runtime.sendMessage(o)}}async function M(e){if(137==e[0]&&80==e[1]&&78==e[2]&&71==e[3]){let t=new Blob([new Uint8Array(e)],{type:\"image/png\"});const o=URL.createObjectURL(t),n=new Image;n.src=o,await new Promise((e,t)=>{n.onload=e,n.onerror=t});const a=new OffscreenCanvas(n.width,n.height);a.getContext(\"2d\").drawImage(n,0,0),t=await a.convertToBlob({type:\"image/png\"});const r=await t.arrayBuffer();return Array.from(new Uint8Array(r))}}function O(e){if(void 0===f){const t=o.helper,n=e.documentElement.firstChild;h=e.documentElement.dataset&&\"\"==e.documentElement.dataset.sfz,v=Boolean(e.querySelector(\"sfz-extra-data\")),y=Boolean(e.querySelector(\"body > main[hidden]\")),E=Boolean(e.querySelector(\"meta[http-equiv=content-security-policy]\")),f=h||n.nodeType==Node.COMMENT_NODE&&(n.textContent.includes(t.COMMENT_HEADER)||n.textContent.includes(t.COMMENT_HEADER_LEGACY))}return f}function P(e){e.querySelectorAll(\"*\").forEach(e=>{const t=o.helper.getShadowRoot(e);if(t){P(t);const o=document.createElement(\"template\");o.setAttribute(\"shadowrootmode\",\"open\"),Array.from(t.childNodes).forEach(e=>o.appendChild(e)),e.appendChild(o)}})}o.pageInfo={updatedResources:{},visitDate:new Date},browser.runtime.sendMessage({method:\"bootstrap.init\"}).then(e=>{r=e.optionsAutoSave;const t=e.options;s=e.tabId,d=e.tabIndex,i=e.autoSaveEnabled,t&&t.autoOpenEditor&&O(document)?\"loading\"==document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>D(document)):D(document):\"loading\"==document.readyState?document.addEventListener(\"DOMContentLoaded\",T):T()}),browser.runtime.onMessage.addListener(e=>{if(i&&\"content.autosave\"==e.method||\"content.maybeInit\"==e.method||\"content.init\"==e.method||\"content.openEditor\"==e.method||\"devtools.resourceCommitted\"==e.method||\"singlefile.fetchResponse\"==e.method)return b(e)}),document.addEventListener(\"DOMContentLoaded\",S,!1),globalThis.window==globalThis.top&&location&&location.href&&(location.href.startsWith(\"file://\")||location.href.startsWith(\"content://\"))&&(\"loading\"==document.readyState?document.addEventListener(\"DOMContentLoaded\",p,!1):p())}();\n"
  },
  {
    "path": "lib/single-file-extension-core.js",
    "content": "!function(){\"use strict\";const e=\"single-file-response-fetch\",r=\"Host fetch error (SingleFile)\",t=Boolean(window.wrappedJSObject),a=window.fetch.bind(window);let s,n=0,i=new Map;async function o(c,d={},u=!0){try{const n={cache:d.cache||\"force-cache\",headers:d.headers,referrerPolicy:d.referrerPolicy||\"strict-origin-when-cross-origin\"};let i;try{i=d.referrer&&!t||!u?await a(c,n):await async function(t,a){if(void 0===s&&(s=!1,document.addEventListener(\"single-file-response-fetch-supported\",()=>s=!0,!1),document.dispatchEvent(new CustomEvent(\"single-file-request-fetch-supported\"))),s)return new Promise((r,s)=>{document.dispatchEvent(new CustomEvent(\"single-file-request-fetch\",{detail:JSON.stringify({url:t,options:a})})),document.addEventListener(e,function a(n){n.detail?n.detail.url==t&&(document.removeEventListener(e,a,!1),n.detail.response?r({status:n.detail.status,headers:new Map(n.detail.headers),arrayBuffer:async()=>n.detail.response}):s(n.detail.error)):s()},!1)});throw new Error(r)}(c,n),401!=i.status&&403!=i.status&&404!=i.status||\"no-referrer\"==n.referrerPolicy||d.referrer||(i=await o(c,{...n,referrerPolicy:\"no-referrer\"},u))}catch(e){if(e&&e.message==r)i=await o(c,{...n},!1);else{if(\"no-referrer\"==n.referrerPolicy||d.referrer)throw e;i=await o(c,{...n,referrerPolicy:\"no-referrer\"},u)}}return i}catch(e){n++;const r=new Promise((e,r)=>i.set(n,{resolve:e,reject:r}));return await f({method:\"singlefile.fetch\",url:c,requestId:n,referrer:d.referrer,headers:d.headers}),r}}async function c(e,r){const t=await f({method:\"singlefile.fetchFrame\",url:e,frameId:r.frameId,referrer:r.referrer,headers:r.headers});return{status:t.status,headers:new Map(t.headers),arrayBuffer:async()=>new Uint8Array(t.array).buffer}}async function f(e){const r=await browser.runtime.sendMessage(e);if(!r||r.error)throw new Error(r&&r.error&&r.error.toString());return r}browser.runtime.onMessage.addListener(e=>\"singlefile.fetchFrame\"==e.method&&window.frameId&&window.frameId==e.frameId?async function(e){try{const r=await a(e.url,{cache:\"force-cache\",headers:e.headers,referrerPolicy:\"strict-origin-when-cross-origin\"});return{status:r.status,headers:[...r.headers],array:Array.from(new Uint8Array(await r.arrayBuffer()))}}catch(e){return{error:e&&(e.message||e.toString())}}}(e):\"singlefile.fetchResponse\"==e.method?async function(e){const r=i.get(e.requestId);r&&(e.error?(r.reject(new Error(e.error)),i.delete(e.requestId)):(e.truncated&&(r.array?r.array=r.array.concat(e.array):(r.array=e.array,i.set(e.requestId,r)),e.finished&&(e.array=r.array)),e.truncated&&!e.finished||(r.resolve({status:e.status,headers:{get:r=>e.headers&&e.headers[r]},arrayBuffer:async()=>new Uint8Array(e.array).buffer}),i.delete(e.requestId))));return{}}(e):void 0);const d={getPageData:globalThis.singlefile.getPageData};globalThis.singlefile.getPageData=function(e,r={fetch:o,frameFetch:c},t,a){return d.getPageData(e,r,t,a)}}();\n"
  },
  {
    "path": "lib/single-file-extension-editor-helper.js",
    "content": "!function(n,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],e):e((n=\"undefined\"!=typeof globalThis?globalThis:n||self).singlefile={})}(this,function(n){\"use strict\";var e=\"undefined\"!=typeof document?document.currentScript:null;const t=[\"AREA\",\"BASE\",\"BASEFONT\",\"BGSOUND\",\"BR\",\"COL\",\"COMMAND\",\"EMBED\",\"FRAME\",\"HR\",\"IMG\",\"INPUT\",\"KEYGEN\",\"LINK\",\"META\",\"PARAM\",\"SOURCE\",\"TRACK\",\"WBR\"],a=[{tagName:\"HEAD\",accept:n=>!n.childNodes.length||1==n.childNodes[0].nodeType},{tagName:\"BODY\",accept:n=>!n.childNodes.length}],o=[{tagName:\"HTML\",accept:n=>!n||8!=n.nodeType},{tagName:\"HEAD\",accept:n=>!n||8!=n.nodeType&&(3!=n.nodeType||!l(n.textContent))},{tagName:\"BODY\",accept:n=>!n||8!=n.nodeType},{tagName:\"LI\",accept:(n,e)=>!n&&e.parentElement&&(\"UL\"==c(e.parentElement)||\"OL\"==c(e.parentElement))||n&&[\"LI\"].includes(c(n))},{tagName:\"DT\",accept:n=>!n||[\"DT\",\"DD\"].includes(c(n))},{tagName:\"P\",accept:n=>n&&[\"ADDRESS\",\"ARTICLE\",\"ASIDE\",\"BLOCKQUOTE\",\"DETAILS\",\"DIV\",\"DL\",\"FIELDSET\",\"FIGCAPTION\",\"FIGURE\",\"FOOTER\",\"FORM\",\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\",\"HEADER\",\"HR\",\"MAIN\",\"NAV\",\"OL\",\"P\",\"PRE\",\"SECTION\",\"TABLE\",\"UL\"].includes(c(n))},{tagName:\"DD\",accept:n=>!n||[\"DT\",\"DD\"].includes(c(n))},{tagName:\"RT\",accept:n=>!n||[\"RT\",\"RP\"].includes(c(n))},{tagName:\"RP\",accept:n=>!n||[\"RT\",\"RP\"].includes(c(n))},{tagName:\"OPTGROUP\",accept:n=>!n||[\"OPTGROUP\"].includes(c(n))},{tagName:\"OPTION\",accept:n=>!n||[\"OPTION\",\"OPTGROUP\"].includes(c(n))},{tagName:\"COLGROUP\",accept:n=>!n||8!=n.nodeType&&(3!=n.nodeType||!l(n.textContent))},{tagName:\"CAPTION\",accept:n=>!n||8!=n.nodeType&&(3!=n.nodeType||!l(n.textContent))},{tagName:\"THEAD\",accept:n=>!n||[\"TBODY\",\"TFOOT\"].includes(c(n))},{tagName:\"TBODY\",accept:n=>!n||[\"TBODY\",\"TFOOT\"].includes(c(n))},{tagName:\"TFOOT\",accept:n=>!n},{tagName:\"TR\",accept:n=>!n||[\"TR\"].includes(c(n))},{tagName:\"TD\",accept:n=>!n||[\"TD\",\"TH\"].includes(c(n))},{tagName:\"TH\",accept:n=>!n||[\"TD\",\"TH\"].includes(c(n))}],i=[\"STYLE\",\"SCRIPT\",\"XMP\",\"IFRAME\",\"NOEMBED\",\"NOFRAMES\",\"PLAINTEXT\",\"NOSCRIPT\"];function r(n,e){const t=n.doctype;let a=\"\";return t&&(a=\"<!DOCTYPE \"+t.nodeName,t.publicId?(a+=' PUBLIC \"'+t.publicId+'\"',t.systemId&&(a+=' \"'+t.systemId+'\"')):t.systemId&&(a+=' SYSTEM \"'+t.systemId+'\"'),t.internalSubset&&(a+=\" [\"+t.internalSubset+\"]\"),a+=\"> \"),a+s(n.documentElement,e)}function s(n,e,r){return 3==n.nodeType?function(n){const e=n.parentNode;let t;e&&1==e.nodeType&&(t=c(e));return!t||i.includes(t)?(\"SCRIPT\"!=t||e.type&&\"text/javascript\"!=e.type)&&\"STYLE\"!=t?n.textContent:n.textContent.replace(/<\\//gi,\"<\\\\/\").replace(/\\/>/gi,\"\\\\/>\"):n.textContent.replace(/&/g,\"&amp;\").replace(/\\u00a0/g,\"&nbsp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}(n):8==n.nodeType?\"\\x3c!--\"+n.textContent+\"--\\x3e\":1==n.nodeType?function(n,e,i){const r=c(n),l=e&&a.find(e=>r==c(e)&&e.accept(n));let m=\"\";l&&!n.attributes.length||(m=\"<\"+r.toLowerCase(),Array.from(n.attributes).forEach(t=>m+=function(n,e,t){const a=n.name;let o=\"\";if(!a.match(/[\"'>/=]/)){let i,r=n.value;t&&\"class\"==a&&(r=Array.from(e.classList).map(n=>n.trim()).join(\" \")),r=r.replace(/&/g,\"&amp;\").replace(/\\u00a0/g,\"&nbsp;\"),r.includes('\"')&&(r.includes(\"'\")||!t?r=r.replace(/\"/g,\"&quot;\"):i=!0);const s=!t||r.match(/[ \\t\\n\\f\\r'\"`=<>]/);o+=\" \";const l=n.namespaceURI,c=n.localName||a;l?\"http://www.w3.org/XML/1998/namespace\"==l?o+=\"xml:\"+c:\"http://www.w3.org/2000/xmlns/\"==l?o+=\"xmlns\"===c?\"xmlns\":\"xmlns:\"+c:\"http://www.w3.org/1999/xlink\"==l?o+=\"xlink:\"+c:n.prefix?o+=n.prefix+\":\"+c:o+=a:o+=a,\"\"!=r&&(o+=\"=\",s&&(o+=i?\"'\":'\"'),o+=r,s&&(o+=i?\"'\":'\"'))}return o}(t,n,e)),m+=\">\");\"TEMPLATE\"!=r||n.childNodes.length?Array.from(n.childNodes).forEach(n=>m+=s(n,e,i||\"svg\"==r)):m+=n.innerHTML;const d=e&&o.find(e=>r==c(e)&&e.accept(n.nextSibling,n));(i||!d&&!t.includes(r))&&(m+=\"</\"+r.toLowerCase()+\">\");return m}(n,e,r):void 0}function l(n){return Boolean(n.match(/^[ \\t\\n\\f\\r]/))}function c(n){return n.tagName&&n.tagName.toUpperCase()}function m(n,e,t,a){this.message=n,this.expected=e,this.found=t,this.location=a,this.name=\"SyntaxError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,m)}async function d(n,e){e=void 0!==e?e:{};var t,a={},o={start:an},i=an,r=function(n){return n.join(\"\")},s=\"|\",l=X(\"|\",!1),c=function(n){return n},d=\"%\",h=X(\"%\",!1),p=\"<\",u=X(\"<\",!1),g=\">\",w=X(\">\",!1),b=function(n,t,a){return e.callFunction(n,t,a)},f=\"{\",k=X(\"{\",!1),y=\"}\",v=X(\"}\",!1),j=function(n,t){return e.getVariableValue(n,t)},S=\"[\",x=X(\"[\",!1),C=\"]\",z=X(\"]\",!1),L=function(n,e){return{length:n,unit:e}},A=\"ch\",T=X(\"ch\",!1),I=/^[a-z0-9-]/,R=Q([[\"a\",\"z\"],[\"0\",\"9\"],\"-\"],!1,!1),E=function(){return $()},D=/^[0-9]/,M=Q([[\"0\",\"9\"]],!1,!1),B=function(){return Number($())},N=\"\\\\\\\\%\",P=X(\"\\\\\\\\%\",!1),O=\"\\\\\\\\{\",_=X(\"\\\\\\\\{\",!1),F=\"\\\\\\\\|\",q=X(\"\\\\\\\\|\",!1),U=\"\\\\\\\\>\",H=X(\"\\\\\\\\>\",!1),W={type:\"any\"},G=0,V=0,K=[{line:1,column:1}],J=0,Y=[],Z=0;if(\"startRule\"in e){if(!(e.startRule in o))throw new Error(\"Can't start parsing from rule \\\"\"+e.startRule+'\".');i=o[e.startRule]}function $(){return n.substring(V,G)}function X(n,e){return{type:\"literal\",text:n,ignoreCase:e}}function Q(n,e,t){return{type:\"class\",parts:n,inverted:e,ignoreCase:t}}function nn(e){var t,a=K[e];if(a)return a;for(t=e-1;!K[t];)t--;for(a={line:(a=K[t]).line,column:a.column};t<e;)10===n.charCodeAt(t)?(a.line++,a.column=1):a.column++,t++;return K[e]=a,a}function en(n,e){var t=nn(n),a=nn(e);return{start:{offset:n,line:t.line,column:t.column},end:{offset:e,line:a.line,column:a.column}}}function tn(n){G<J||(G>J&&(J=G,Y=[]),Y.push(n))}async function an(){return await on()}async function on(){var n,e,t;for(n=G,e=[],t=await rn();t!==a;)e.push(t),t=await rn();return e!==a&&(V=n,e=r(e)),n=e}async function rn(){var e;return(e=await async function(){var e,t,o,i,r,s,l;e=G,37===n.charCodeAt(G)?(t=d,G++):(t=a,0===Z&&tn(h));t!==a&&(o=cn())!==a?(60===n.charCodeAt(G)?(i=p,G++):(i=a,0===Z&&tn(u)),i!==a?(r=await async function(){var n,e,t;n=G,e=await on(),e!==a?(t=await async function(){var n,e;if(n=[],e=await sn(),e!==a)for(;e!==a;)n.push(e),e=await sn();else n=a;return n}(),t===a&&(t=null),t!==a?n=e=[e,t]:(G=n,n=a)):(G=n,n=a);return n}(),r!==a?(62===n.charCodeAt(G)?(s=g,G++):(s=a,0===Z&&tn(w)),s!==a?((l=ln())===a&&(l=null),l!==a?(V=e,e=t=await b(o,r,l)):(G=e,e=a)):(G=e,e=a)):(G=e,e=a)):(G=e,e=a)):(G=e,e=a);return e}())===a&&(e=await async function(){var e,t,o,i,r;e=G,123===n.charCodeAt(G)?(t=f,G++):(t=a,0===Z&&tn(k));t!==a&&(o=cn())!==a?(125===n.charCodeAt(G)?(i=y,G++):(i=a,0===Z&&tn(v)),i!==a?((r=ln())===a&&(r=null),r!==a?(V=e,e=t=await j(o,r)):(G=e,e=a)):(G=e,e=a)):(G=e,e=a);return e}())===a&&(e=function(){var n,e,t;if(n=G,e=[],(t=mn())!==a)for(;t!==a;)e.push(t),t=mn();else e=a;e!==a&&(V=n,e=E());return n=e,n}()),e}async function sn(){var e,t,o;return e=G,124===n.charCodeAt(G)?(t=s,G++):(t=a,0===Z&&tn(l)),t!==a&&(o=await on())!==a?(V=e,e=t=c(o)):(G=e,e=a),e}function ln(){var e,t,o,i,r;return e=G,91===n.charCodeAt(G)?(t=S,G++):(t=a,0===Z&&tn(x)),t!==a?(o=function(){var e,t,o;e=G,t=[],D.test(n.charAt(G))?(o=n.charAt(G),G++):(o=a,0===Z&&tn(M));if(o!==a)for(;o!==a;)t.push(o),D.test(n.charAt(G))?(o=n.charAt(G),G++):(o=a,0===Z&&tn(M));else t=a;t!==a&&(V=e,t=B());return e=t,e}(),o!==a?(i=function(){var e;n.substr(G,2)===A?(e=A,G+=2):(e=a,0===Z&&tn(T));e===a&&(e=null);return e}(),i!==a?(93===n.charCodeAt(G)?(r=C,G++):(r=a,0===Z&&tn(z)),r!==a?(V=e,e=t=L(o,i)):(G=e,e=a)):(G=e,e=a)):(G=e,e=a)):(G=e,e=a),e}function cn(){var e,t,o;if(e=G,t=[],I.test(n.charAt(G))?(o=n.charAt(G),G++):(o=a,0===Z&&tn(R)),o!==a)for(;o!==a;)t.push(o),I.test(n.charAt(G))?(o=n.charAt(G),G++):(o=a,0===Z&&tn(R));else t=a;return t!==a&&(V=e,t=E()),e=t}function mn(){var e,t,o,i,r,c;return e=G,t=G,Z++,37===n.charCodeAt(G)?(o=d,G++):(o=a,0===Z&&tn(h)),Z--,o===a?t=void 0:(G=t,t=a),t!==a?(o=G,Z++,123===n.charCodeAt(G)?(i=f,G++):(i=a,0===Z&&tn(k)),Z--,i===a?o=void 0:(G=o,o=a),o!==a?(i=G,Z++,124===n.charCodeAt(G)?(r=s,G++):(r=a,0===Z&&tn(l)),Z--,r===a?i=void 0:(G=i,i=a),i!==a?(r=G,Z++,62===n.charCodeAt(G)?(c=g,G++):(c=a,0===Z&&tn(w)),Z--,c===a?r=void 0:(G=r,r=a),r!==a?(c=function(){var e;n.substr(G,3)===N?(e=N,G+=3):(e=a,0===Z&&tn(P));e===a&&(n.substr(G,3)===O?(e=O,G+=3):(e=a,0===Z&&tn(_)),e===a&&(n.substr(G,3)===F?(e=F,G+=3):(e=a,0===Z&&tn(q)),e===a&&(n.substr(G,3)===U?(e=U,G+=3):(e=a,0===Z&&tn(H)),e===a&&(n.length>G?(e=n.charAt(G),G++):(e=a,0===Z&&tn(W))))));return e}(),c!==a?e=t=[t,o,i,r,c]:(G=e,e=a)):(G=e,e=a)):(G=e,e=a)):(G=e,e=a)):(G=e,e=a),e}if((t=await i())!==a&&G===n.length)return t;throw t!==a&&G<n.length&&tn({type:\"end\"}),function(n,e,t){return new m(m.buildMessage(n,e),n,e,t)}(Y,J<n.length?n.charAt(J):null,J<n.length?en(J,J+1):en(J,J))}!function(n,e){function t(){this.constructor=n}t.prototype=e.prototype,n.prototype=new t}(m,Error),m.buildMessage=function(n,e){var t={literal:function(n){return'\"'+o(n.text)+'\"'},class:function(n){var e,t=\"\";for(e=0;e<n.parts.length;e++)t+=n.parts[e]instanceof Array?i(n.parts[e][0])+\"-\"+i(n.parts[e][1]):i(n.parts[e]);return\"[\"+(n.inverted?\"^\":\"\")+t+\"]\"},any:function(){return\"any character\"},end:function(){return\"end of input\"},other:function(n){return n.description}};function a(n){return n.charCodeAt(0).toString(16).toUpperCase()}function o(n){return n.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(n){return\"\\\\x0\"+a(n)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(n){return\"\\\\x\"+a(n)})}function i(n){return n.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(n){return\"\\\\x0\"+a(n)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(n){return\"\\\\x\"+a(n)})}function r(n){return t[n.type](n)}return\"Expected \"+function(n){var e,t,a=new Array(n.length);for(e=0;e<n.length;e++)a[e]=r(n[e]);if(a.sort(),a.length>0){for(e=1,t=1;e<a.length;e++)a[e-1]!==a[e]&&(a[t]=a[e],t++);a.length=t}switch(a.length){case 1:return a[0];case 2:return a[0]+\" or \"+a[1];default:return a.slice(0,-1).join(\", \")+\", or \"+a[a.length-1]}}(n)+\" but \"+function(n){return n?'\"'+o(n)+'\"':\"end of input\"}(e)+\" found.\"};const h=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",p=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+h+\"?|(\"+h+\")|.)\",\"ig\");function u(n){return n.replace(p,(n,e,t)=>{const a=\"0x\"+e-65536;return a!=a||t?e:a<0?String.fromCharCode(a+65536):String.fromCharCode(a>>10|55296,1023&a|56320)})}const g=\"_singleFile_fontFaces\",w=\"_singleFile_worklets\",b=globalThis.document,f=globalThis.Document,k=globalThis.JSON,y=globalThis.MutationObserver;let v,j;function S(){b instanceof f&&(b.addEventListener(\"single-file-new-font-face\",n=>{const e=n.detail,t=Object.assign({},e);delete t.src,v.set(k.stringify(t),e)}),b.addEventListener(\"single-file-delete-font\",n=>{const e=n.detail,t=Object.assign({},e);delete t.src,v.delete(k.stringify(t))}),b.addEventListener(\"single-file-clear-fonts\",()=>v=new Map),b.addEventListener(\"single-file-new-worklet\",n=>{const e=n.detail;j.set(e.moduleURL,e)}))}v=globalThis.window[g]?globalThis.window[g]:globalThis.window[g]=new Map,j=globalThis.window[w]?globalThis.window[w]:globalThis.window[w]=new Map,S(),new y(S).observe(b,{childList:!0});const x=\"single-file-\",C=\"SingleFile\",z=\"single-file-infobar\";function L(n,e,t){if(!n.querySelector(z)){let a;e.infobarContent?a=e.infobarContent.replace(/\\\\n/g,\"\\n\").replace(/\\\\t/g,\"\\t\"):e.saveDate&&(a=e.saveDate),a=a||\"No info\";const o=\"BODY\"==n.body.tagName?n.body:n.documentElement,i=function(n,e,t){const a=n.createElement(e);return t.appendChild(a),Array.from(getComputedStyle(a)).forEach(n=>a.style.setProperty(n,\"initial\",\"important\")),a}(n,z,o);let r;if(t)r=i.attachShadow({mode:\"open\"});else{const e=n.createElement(\"template\");e.setAttribute(\"shadowrootmode\",\"open\"),i.appendChild(e),r=e}const s=n.createElement(\"div\"),l=n.createElement(\"style\");if(l.textContent=\"\\n.infobar,\\n.infobar .infobar-icon,\\n.infobar .infobar-link-icon {\\n  min-inline-size: 28px;\\n  min-block-size: 28px;\\n  box-sizing: border-box;\\n}\\n\\n.infobar,\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  opacity: 0.7;\\n  transition: opacity 250ms;\\n}\\n\\n.infobar:hover,\\n.infobar .infobar-close-icon:hover,\\n.infobar .infobar-link-icon:hover {\\n  opacity: 1;\\n}\\n\\n.infobar,\\n.infobar-content {\\n  display: flex;\\n}\\n\\n.infobar {\\n  position: fixed;\\n  max-height: calc(100% - 32px);\\n  top: 16px;\\n  right: 16px;\\n  margin-inline-start: 16px;\\n  margin-block-end: 16px;\\n  color: #2d2d2d;\\n  background-color: #737373;\\n  border: 2px solid;\\n  border-color: #eee;\\n  border-radius: 16px;\\n  z-index: 2147483647;\\n  animation-name: flash;\\n  animation-duration: .5s;\\n  animation-timing-function: cubic-bezier(0.39, 0.58, 0.57, 1);\\n  animation-delay: 1s;\\n  animation-iteration-count: 2;\\n}\\n\\n.infobar:valid, .infobar:not(:focus-within):not(.infobar-focus) .infobar-content {\\n  display: none;\\n}\\n\\n.infobar:focus-within, .infobar.infobar-focus {\\n  background-color: #f9f9f9;\\n  border-color: #878787;\\n  border-radius: 8px;\\n  opacity: 1;\\n  transition-property: opacity, background-color, border-color, border-radius, color;\\n}\\n\\n.infobar-content {\\n  border: 2px solid;\\n  border-color: #f9f9f9;\\n  border-radius: 6px;\\n  background-color: #f9f9f9;\\n  overflow: auto;\\n}\\n\\n.infobar-content span {\\n  font-family: Arial, Helvetica, sans-serif;\\n  font-size: 14px;\\n  line-height: 18px;\\n  word-break: break-word;\\n  white-space: pre-wrap;\\n  margin-inline: 4px;\\n  margin-block: 4px;\\n}\\n\\n.infobar .infobar-icon,\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  cursor: pointer;\\n  background-position: center;\\n  background-repeat: no-repeat;\\n}\\n\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  align-self: flex-start;\\n}\\n\\n.infobar .infobar-icon {\\n  position: absolute;\\n  min-inline-size: 24px;\\n  min-block-size: 24px;\\n}\\n\\n@keyframes flash {\\n  0%, 100% {\\n\\tbackground-color: #737373;\\n  }\\n  50% {\\n\\tbackground-color: #dd6a00;\\n  }\\n}\\n\\n.infobar:focus-within .infobar-icon, .infobar.infobar-focus .infobar-icon {\\n  z-index: -1;\\n  background-image: none;\\n  margin: 4px;\\n}\\n\\n.infobar .infobar-close-icon {\\n  min-inline-size: 22px;\\n  min-block-size: 22px;\\n}\\n\\n.infobar .infobar-icon {\\n  background-color: transparent;\\n  background-size: 70%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHADIRLMaOHwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAPUExURQAAAIqKioyNjY2OjvDw8L2y1DEAAAABdFJOUwBA5thmAAAAAWJLR0QB/wIt3gAAAGNJREFUSMdjYCAJsLi4OBCQx6/CBQwIGIDPCBcXAkYQUsACU+AwlBVQHg6Eg5pgZBGOboIJZugDFwRwoJECJCUOhJI1wZwzqmBUwagCuipgIqTABG9h7YIKaKGAURAFEF/6AQAO4HqSoDP8bgAAAABJRU5ErkJggg==);\\n}\\n\\n.infobar .infobar-link-icon {\\n  right: 4px;\\n  background-size: 60%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8H+DhhoQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJJJREFUOI3t070NRCEMA2CnYAOyDyPwpHj/Va7hJ3FzV7zy3ET5JIwoAF6Jk4wzAJAkzxAYG9YRTgB+24wBgKmfrGAKTcEfAY4KRlRoIeBTgKOCERVaCPgU4Khge2GqKOBTgKOCERVaAEC/4PNcnyoSWHpjqkhwKxbcig0Q6AorXYF/+A6eIYD1lVbwG/jdA6/kA2THRAURVubcAAAAAElFTkSuQmCC);\\n}\\n\\n.infobar .infobar-close-icon {\\n  appearance: none;\\n  background-size: 80%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8VC4EQ6QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJtJREFUOI3NkrsBgCAMRLFwBPdxBArcfxXFkO8rbKWAAJfHJ9faf9vuYX/749T5NmShm3bEwbe2SxeuM4+2oxDL1cDoKtVUjRy+tH78Cv2CS+wIiQNC1AEhk4AQeUTMWUJMfUJMSEJMSEY8kIx4IONroaYAimNxsXp1PA7PxwfVL8QnowwoVC0lig07wDDVUjAdbAnjwtow/z/bDW7eI4M2KruJAAAAAElFTkSuQmCC);\\n}\\n\",e.infobarPositionAbsolute){l.textContent+=\".infobar { position: absolute; }\";\"static\"==getComputedStyle(o).position&&o.style.setProperty(\"position\",\"relative\",\"important\")}e.infobarPositionTop?l.textContent+=`.infobar { top: ${e.infobarPositionTop}; bottom: auto; }`:e.infobarPositionBottom&&(l.textContent+=`.infobar { bottom: ${e.infobarPositionBottom}; top: auto; }`),e.infobarPositionRight?l.textContent+=`.infobar { right: ${e.infobarPositionRight}; left: auto; }`:e.infobarPositionLeft&&(l.textContent+=`.infobar { left: ${e.infobarPositionLeft}; right: auto; }`),l.textContent=l.textContent.replace(/ {2}/g,\"\").replace(/\\n/g,\"\").replace(/: /g,\":\").replace(/, /g,\",\"),s.appendChild(l);const c=n.createElement(\"form\");c.classList.add(\"infobar\"),e.openInfobar&&c.classList.add(\"infobar-focus\"),s.appendChild(c);const m=n.createElement(\"span\");m.tabIndex=-1,m.classList.add(\"infobar-icon\"),c.appendChild(m);const d=n.createElement(\"span\");d.tabIndex=-1,d.classList.add(\"infobar-content\");const h=n.createElement(\"input\");h.type=\"checkbox\",h.required=!0,h.classList.add(\"infobar-close-icon\"),h.title=\"Close\",d.appendChild(h);const p=n.createElement(\"span\");p.textContent=a,d.appendChild(p);const u=n.createElement(\"a\");if(u.classList.add(\"infobar-link-icon\"),u.target=\"_blank\",u.rel=\"noopener noreferrer\",u.title=\"Open source URL: \"+e.saveUrl,u.href=e.saveUrl,d.appendChild(u),c.appendChild(d),t)r.appendChild(s);else{const e=n.createElement(\"script\");let t=T.toString()+\";\";t+=A.toString()+\";\",t+=\"(\"+I.toString()+\")(document, \"+JSON.stringify(C)+\");\",e.textContent=t,s.appendChild(e),r.innerHTML=s.outerHTML}}}function A(n,e=C){const t=n.evaluate(\"//comment()\",n,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);let a=t&&t.singleNodeValue;if(a&&a.nodeType==Node.COMMENT_NODE&&a.textContent.includes(e)){const n=a.textContent.split(\"\\n\"),[,,e,...t]=n,o=e.match(/^ url: (.*) ?$/),i=o&&o[1];if(i){let n,e;if(t.length&&(e=t[0].split(\"saved date: \")[1],e&&t.shift(),t.length>1)){let e=t[0].split(\"info: \")[1].trim();for(let n=1;n<t.length-1;n++)e+=\"\\n\"+t[n].trim();n=e.trim()}return{saveUrl:i,infobarContent:n,saveDate:e}}}}function T(n,{saveUrl:e,infobarContent:t,saveDate:a}){if(e){const o=n.querySelector(\"single-file-infobar\").shadowRoot;o.querySelector(\".infobar-content span\").textContent=t||a;const i=o.querySelector(\".infobar-content .infobar-link-icon\");i.href=e,i.title=\"Open source URL: \"+e}}function I(n,e){const t=A(n,e);t&&t.saveUrl&&T(n,t)}const R=x+\"on-before-capture\",E=x+\"on-after-capture\",D=x+\"request-get-adopted-stylesheets\",M=x+\"response-get-adopted-stylesheets\",B=x+\"unregister-request-get-adopted-stylesheets\",N=\"data-\"+x+\"removed-content\",P=\"data-\"+x+\"hidden-content\",O=\"data-\"+x+\"kept-content\",_=\"data-\"+x+\"hidden-frame\",F=\"data-\"+x+\"preserved-space-element\",q=\"data-\"+x+\"shadow-root-element\",U=\"data-\"+x+\"win-id\",H=\"data-\"+x+\"image\",W=\"data-\"+x+\"poster\",G=\"data-\"+x+\"video\",V=\"data-\"+x+\"canvas\",K=\"data-\"+x+\"movable-style\",J=\"data-\"+x+\"input-value\",Y=\"data-\"+x+\"input-checked\",Z=\"data-\"+x+\"lazy-loaded-src\",$=\"data-\"+x+\"stylesheet\",X=\"data-\"+x+\"disabled-noscript\",Q=\"data-\"+x+\"selected-content\",nn=\"data-\"+x+\"invalid-element\",en=\"data-\"+x+\"async-script\",tn=\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\",an=[\"NOSCRIPT\",\"DISABLED-NOSCRIPT\",\"META\",\"LINK\",\"STYLE\",\"TITLE\",\"TEMPLATE\",\"SOURCE\",\"OBJECT\",\"SCRIPT\",\"HEAD\",\"BODY\"],on=[\"SCRIPT\",\"NOSCRIPT\",\"META\",\"LINK\",\"TEMPLATE\"],rn=/^'(.*?)'$/,sn=/^\"(.*?)\"$/,ln={regular:\"400\",normal:\"400\",bold:\"700\",bolder:\"700\",lighter:\"100\"},cn=\"single-file-ui-element\",mn=z,dn=\"data:,\",hn=[\"~\",\"+\",\"?\",\"%\",\"*\",\":\",\"|\",'\"',\"<\",\">\",\"\\\\\\\\\",\"\\0-\u001f\",\"\"],pn=[\"～\",\"＋\",\"？\",\"％\",\"＊\",\"：\",\"｜\",\"＂\",\"＜\",\"＞\",\"＼\"],un=\"data-sf-nesting-track-id\",gn=globalThis.JSON,wn=globalThis.crypto,bn=globalThis.TextEncoder,fn=globalThis.Blob,kn=globalThis.CustomEvent,yn=globalThis.URL,vn=globalThis.DOMParser;function jn(n,e,t){n.querySelectorAll(\"noscript:not([\"+X+\"])\").forEach(n=>{n.setAttribute(X,n.textContent),n.textContent=\"\"}),function(n){n.querySelectorAll(\"meta[http-equiv=refresh]\").forEach(n=>{n.removeAttribute(\"http-equiv\"),n.setAttribute(\"disabled-http-equiv\",\"refresh\")})}(n),n.head&&n.head.querySelectorAll(tn).forEach(n=>n.hidden=!0),n.querySelectorAll(\"svg foreignObject\").forEach(n=>{const e=n.querySelectorAll(\"html > head > \"+tn+\", html > body > \"+tn);e.length&&(Array.from(n.childNodes).forEach(n=>n.remove()),e.forEach(e=>n.appendChild(e)))});const a=new Map;let o;e&&n.documentElement?(Sn(n),o=Cn(e,n,n.documentElement,t),t.moveStylesInHead&&n.querySelectorAll(\"body style, body ~ style\").forEach(n=>{const t=Pn(e,n);t&&Tn(n,t)&&(n.setAttribute(K,\"\"),o.markedElements.push(n))})):o={canvases:[],images:[],posters:[],videos:[],usedFonts:[],shadowRoots:[],markedElements:[]};let i=\"\";if(n.referrer)try{i=new yn(\"/\",new yn(n.referrer).origin).href}catch(n){}return{canvases:o.canvases,fonts:Array.from(v.values()),worklets:Array.from(j.values()),stylesheets:In(n),images:o.images,posters:o.posters,videos:o.videos,usedFonts:Array.from(o.usedFonts.values()),shadowRoots:o.shadowRoots,referrer:i,markedElements:o.markedElements,invalidElements:a,scrollPosition:{x:e.scrollX,y:e.scrollY},adoptedStyleSheets:zn(n.adoptedStyleSheets)}}function Sn(n){!function n(e,t=0,a=\"\"){const o=a?`${a}.${t+1}`:`${t+1}`;e.setAttribute(un,o),Array.from(e.children).forEach((e,t)=>n(e,t,o))}(n.body);const e=_n(function(n){const e=n.doctype;let t=\"\";e&&(t=\"<!DOCTYPE \"+e.nodeName,e.publicId?(t+=' PUBLIC \"'+e.publicId+'\"',e.systemId&&(t+=' \"'+e.systemId+'\"')):e.systemId&&(t+=' SYSTEM \"'+e.systemId+'\"'),e.internalSubset&&(t+=\" [\"+e.internalSubset+\"]\"),t+=\"> \");return t+n.documentElement.outerHTML}(n)),t=i(n.body),a=i(e.body),o=new Set;function i(n){const e={};return function n(t){if(t.getAttribute){const a=t.getAttribute(un);a&&(e[a]=t),Array.from(t.children).forEach(n)}}(n),e}Object.keys(t).forEach(e=>{if(e in a){if((t[e].parentElement?.getAttribute(un)||null)!==(a[e]?.parentElement?.getAttribute(un)||null)){let a=t[e];for(;a&&a!==n.body;){const n=a.getAttribute(un);n&&o.add(n),a=a.parentElement}}}}),function n(e,t){const a=e.getAttribute(un);a&&!t.has(a)&&e.removeAttribute(un);Array.from(e.children).forEach(e=>n(e,t))}(n.body,o)}function xn(n,e,t=!1){const a={};n.currentScript&&n.currentScript.remove(),function n(t){const o=t.getAttribute(e);o&&(a[o]=t);Array.from(t.children).forEach(n)}(n.body),Object.keys(a).forEach(n=>{const e=a[n],t=n.split(\".\");if(t.length>1){const n=t.slice(0,-1).join(\".\"),o=a[n];o&&e.parentElement!==o&&o.appendChild(e)}}),t||n.querySelectorAll(\"[\"+e+\"]\").forEach(n=>n.removeAttribute(e))}function Cn(n,e,t,a,o={usedFonts:new Map,canvases:[],images:[],posters:[],videos:[],shadowRoots:[],markedElements:[]},i=new Map,r){if(t.childNodes){Array.from(t.childNodes).filter(e=>e instanceof n.HTMLElement||e instanceof n.SVGElement||e instanceof globalThis.HTMLElement||e instanceof globalThis.SVGElement).forEach(t=>{let s,l,c;if(!a.autoSaveExternalSave&&(a.removeHiddenElements||a.removeUnusedFonts||a.compressHTML)&&(c=Pn(n,t),(t instanceof n.HTMLElement||t instanceof globalThis.HTMLElement)&&a.removeHiddenElements&&(l=(r||t.closest(\"html > head\"))&&an.includes(t.tagName.toUpperCase())||t.closest(\"details\"),l||(s=r||Tn(t,c),s&&!on.includes(t.tagName.toUpperCase())&&(t.setAttribute(P,\"\"),o.markedElements.push(t)))),!s)){if(a.compressHTML&&c){const n=c.getPropertyValue(\"white-space\");n&&n.startsWith(\"pre\")&&(t.setAttribute(F,\"\"),o.markedElements.push(t))}a.removeUnusedFonts&&(Ln(c,a,o.usedFonts),Ln(Pn(n,t,\":first-letter\"),a,o.usedFonts),Ln(Pn(n,t,\":before\"),a,o.usedFonts),Ln(Pn(n,t,\":after\"),a,o.usedFonts))}!function(n,e,t,a,o,i,r){const s=t.tagName&&t.tagName.toUpperCase();if(\"CANVAS\"==s)try{o.canvases.push({dataURI:t.toDataURL(\"image/png\"),backgroundColor:r.getPropertyValue(\"background-color\")}),t.setAttribute(V,o.canvases.length-1),o.markedElements.push(t)}catch(n){}if(\"IMG\"==s){const e={currentSrc:i?dn:a.loadDeferredImages&&t.getAttribute(Z)||t.currentSrc};if(o.images.push(e),t.setAttribute(H,o.images.length-1),o.markedElements.push(t),t.removeAttribute(Z),r=r||Pn(n,t)){e.size=function(n,e,t){let a=e.naturalWidth,o=e.naturalHeight;if(!a&&!o){const i=null==e.getAttribute(\"style\");if(t=t||Pn(n,e)){let n,r,s,l,c,m,d,h,p=!1;if(\"content-box\"==t.getPropertyValue(\"box-sizing\")){const n=e.style.getPropertyValue(\"box-sizing\"),t=e.style.getPropertyPriority(\"box-sizing\"),a=e.clientWidth;e.style.setProperty(\"box-sizing\",\"border-box\",\"important\"),p=e.clientWidth!=a,n?e.style.setProperty(\"box-sizing\",n,t):e.style.removeProperty(\"box-sizing\")}n=Rn(\"padding-left\",t),r=Rn(\"padding-right\",t),s=Rn(\"padding-top\",t),l=Rn(\"padding-bottom\",t),p?(c=Rn(\"border-left-width\",t),m=Rn(\"border-right-width\",t),d=Rn(\"border-top-width\",t),h=Rn(\"border-bottom-width\",t)):c=m=d=h=0,a=Math.max(0,e.clientWidth-n-r-c-m),o=Math.max(0,e.clientHeight-s-l-d-h),i&&e.removeAttribute(\"style\")}}return{pxWidth:a,pxHeight:o}}(n,t,r);const a=r.getPropertyValue(\"box-shadow\"),o=r.getPropertyValue(\"background-image\");a&&\"none\"!=a||o&&\"none\"!=o||!(e.size.pxWidth>1||e.size.pxHeight>1)||(e.replaceable=!0,e.backgroundColor=r.getPropertyValue(\"background-color\"),e.objectFit=r.getPropertyValue(\"object-fit\"),e.boxSizing=r.getPropertyValue(\"box-sizing\"),e.objectPosition=r.getPropertyValue(\"object-position\"))}}if(\"VIDEO\"==s){const a=t.currentSrc;if(a&&!a.startsWith(\"blob:\")&&!a.startsWith(\"data:\")){const e=Pn(n,t.parentNode);o.videos.push({positionParent:e&&e.getPropertyValue(\"position\"),src:a,size:{pxWidth:t.clientWidth,pxHeight:t.clientHeight,videoWidth:t.videoWidth,videoHeight:t.videoHeight},currentTime:t.currentTime}),t.setAttribute(G,o.videos.length-1)}if(!t.getAttribute(\"poster\")){const n=e.createElement(\"canvas\"),a=n.getContext(\"2d\");n.width=t.videoWidth,n.height=t.videoHeight;try{a.drawImage(t,0,0,n.width,n.height),o.posters.push(n.toDataURL(\"image/png\")),t.setAttribute(W,o.posters.length-1),o.markedElements.push(t)}catch(n){}}}\"IFRAME\"==s&&i&&a.removeHiddenElements&&(t.setAttribute(_,\"\"),o.markedElements.push(t));\"INPUT\"==s&&(\"password\"!=t.type&&(t.setAttribute(J,t.value),o.markedElements.push(t)),\"radio\"!=t.type&&\"checkbox\"!=t.type||(t.setAttribute(Y,t.checked),o.markedElements.push(t)));\"TEXTAREA\"==s&&(t.setAttribute(J,t.value),o.markedElements.push(t));\"SELECT\"==s&&t.querySelectorAll(\"option\").forEach(n=>{n.selected&&(n.setAttribute(J,\"\"),o.markedElements.push(n))});\"SCRIPT\"==s&&(t.async&&\"\"!=t.getAttribute(\"async\")&&\"async\"!=t.getAttribute(\"async\")&&(t.setAttribute(en,\"\"),o.markedElements.push(t)),t.textContent=t.textContent.replace(/<\\/script>/gi,\"<\\\\/script>\"))}(n,e,t,a,o,s,c);const m=!(t instanceof n.SVGElement||t instanceof globalThis.SVGElement)&&function(n){const e=globalThis.chrome;if(n.openOrClosedShadowRoot)return n.openOrClosedShadowRoot;if(!(e&&e.dom&&e.dom.openOrClosedShadowRoot))return n.shadowRoot;try{return e.dom.openOrClosedShadowRoot(n)}catch(e){return n.shadowRoot}}(t);if(m&&!t.classList.contains(cn)&&t.tagName.toLowerCase()!=mn){const r={};t.setAttribute(q,o.shadowRoots.length),o.markedElements.push(t),o.shadowRoots.push(r);try{if(m.adoptedStyleSheets){const n=n=>r.adoptedStyleSheets=n.detail.adoptedStyleSheets;m.addEventListener(M,n),m.dispatchEvent(new kn(D,{bubbles:!0})),r.adoptedStyleSheets||t.dispatchEvent(new kn(D,{bubbles:!0})),m.removeEventListener(M,n)}}catch(n){}Cn(n,e,m,a,o,i,s),r.content=m.innerHTML,r.mode=m.mode,r.delegateFocus=m.delegatesFocus,r.clonable=m.clonable,r.serializable=m.serializable;try{m.adoptedStyleSheets&&void 0===m.adoptedStyleSheets.length&&m.dispatchEvent(new kn(B,{bubbles:!0}))}catch(n){}}Cn(n,e,t,a,o,i,s),!a.autoSaveExternalSave&&a.removeHiddenElements&&r&&(l||\"\"==t.getAttribute(O)?t.parentElement&&(t.parentElement.setAttribute(O,\"\"),o.markedElements.push(t.parentElement)):s&&(t.setAttribute(N,\"\"),o.markedElements.push(t)))})}return o}function zn(n,e=new Map){if(n){const t=[];for(const a of Array.from(n))if(e.has(a))t.push(e.get(a));else{let n=\"\";if(a&&a.cssRules)for(const e of a.cssRules)n+=e.cssText+\"\\n\";e.set(a,n),t.push(n)}return t}return[]}function Ln(n,e,t){if(n){const a=n.getPropertyValue(\"font-style\")||\"normal\";n.getPropertyValue(\"font-family\").split(\",\").forEach(o=>{if(o=An(o),!e.loadedFonts||e.loadedFonts.find(n=>An(n.family)==o&&n.style==a)){const e=Dn(n.getPropertyValue(\"font-weight\")),i=n.getPropertyValue(\"font-variant\")||\"normal\",r=[o,e,a,i];t.set(gn.stringify(r),[o,e,a,i])}})}}function An(n=\"\"){return En(u(n.trim())).toLowerCase()}function Tn(n,e){let t=!1;if(e){const a=e.getPropertyValue(\"display\"),o=e.getPropertyValue(\"opacity\"),i=e.getPropertyValue(\"visibility\");if(t=\"none\"==a,!t&&(\"0\"==o||\"hidden\"==i)&&n.getBoundingClientRect){const e=n.getBoundingClientRect();t=!e.width&&!e.height}}return Boolean(t)}function In(n){if(n){const e=[];return n.querySelectorAll(\"style\").forEach((t,a)=>{try{if(!t.sheet.disabled){const o=n.createElement(\"style\");o.textContent=t.textContent,n.body.appendChild(o);const i=o.sheet;o.remove();const r=Array.from(i.cssRules).map(n=>n.cssText).join(\"\\n\"),s=Array.from(t.sheet.cssRules).map(n=>n.cssText).join(\"\\n\");i&&r==s||(t.setAttribute($,a),e[a]=Array.from(t.sheet.cssRules).map(n=>n.cssText).join(\"\\n\"))}}catch(n){}}),e}}function Rn(n,e){if(e.getPropertyValue(n).endsWith(\"px\"))return parseFloat(e.getPropertyValue(n))}function En(n){return(n=n.match(rn)?n.replace(rn,\"$1\"):n.replace(sn,\"$1\")).trim()}function Dn(n){return ln[n.toLowerCase().trim()]||n}function Mn(n){return new fn([n]).size}async function Bn(n,e){try{return function(n){const e=[],t=new DataView(n);for(let n=0;n<t.byteLength;n+=4){const a=\"00000000\",o=(a+t.getUint32(n).toString(16)).slice(-a.length);e.push(o)}return e.join(\"\")}(await wn.subtle.digest(n,new bn(\"utf-8\").encode(e)))}catch(n){return\"\"}}function Nn(n){return n.flat?n.flat():n.reduce((n,e)=>n.concat(Array.isArray(e)?Nn(e):e),[])}function Pn(n,e,t){try{return n.getComputedStyle(e,t)}catch(n){}}function On(n,e=hn,t=\"_\",a=pn){return a.forEach((t,o)=>n=n.replace(new RegExp(\"[\"+e[o]+\"]+\",\"g\"),a[o])),e.forEach(e=>n=n.replace(new RegExp(\"[\"+e+\"]+\",\"g\"),t)),n=n.replace(/\\.\\.\\//g,\"\").replace(/^\\/+/,\"\").replace(/\\/+/g,\"/\").replace(/\\/$/,\"\").replace(/\\.$/,\"\").replace(/\\.\\//g,\".\"+t).replace(/\\/\\./g,\"/\"+t)}function _n(n,e){const t=(new vn).parseFromString(n,\"text/html\");t.head||t.documentElement.insertBefore(t.createElement(\"HEAD\"),t.body);let a=t.querySelector(\"base\");return a&&a.getAttribute(\"href\")||(a&&a.remove(),a=t.createElement(\"base\"),a.setAttribute(\"href\",e),t.head.insertBefore(a,t.head.firstChild)),t}const Fn=globalThis.Blob,qn=globalThis.FileReader,Un=globalThis.URL,Hn=globalThis.Intl,Wn=globalThis.URLSearchParams,Gn=globalThis.navigator,Vn=/([{}()^$&.*?/+|[\\\\\\\\]|\\]|-)/g,Kn={\"😀\":\"grinning-face\",\"😃\":\"grinning-face-with-big-eyes\",\"😄\":\"grinning-face-with-smiling-eyes\",\"😁\":\"beaming-face-with-smiling-eyes\",\"😆\":\"grinning-squinting-face\",\"😅\":\"grinning-face-with-sweat\",\"🤣\":\"rolling-on-the-floor-laughing\",\"😂\":\"face-with-tears-of-joy\",\"🙂\":\"slightly-smiling-face\",\"🙃\":\"upside-down-face\",\"🫠\":\"melting-face\",\"😉\":\"winking-face\",\"😊\":\"smiling-face-with-smiling-eyes\",\"😇\":\"smiling-face-with-halo\",\"🥰\":\"smiling-face-with-hearts\",\"😍\":\"smiling-face-with-heart-eyes\",\"🤩\":\"star-struck\",\"😘\":\"face-blowing-a-kiss\",\"😗\":\"kissing-face\",\"☺\":\"smiling-face\",\"😚\":\"kissing-face-with-closed-eyes\",\"😙\":\"kissing-face-with-smiling-eyes\",\"🥲\":\"smiling-face-with-tear\",\"😋\":\"face-savoring-food\",\"😛\":\"face-with-tongue\",\"😜\":\"winking-face-with-tongue\",\"🤪\":\"zany-face\",\"😝\":\"squinting-face-with-tongue\",\"🤑\":\"money-mouth-face\",\"🤗\":\"smiling-face-with-open-hands\",\"🤭\":\"face-with-hand-over-mouth\",\"🫢\":\"face-with-open-eyes-and-hand-over-mouth\",\"🫣\":\"face-with-peeking-eye\",\"🤫\":\"shushing-face\",\"🤔\":\"thinking-face\",\"🫡\":\"saluting-face\",\"🤐\":\"zipper-mouth-face\",\"🤨\":\"face-with-raised-eyebrow\",\"😐\":\"neutral-face\",\"😑\":\"expressionless-face\",\"😶\":\"face-without-mouth\",\"🫥\":\"dotted-line-face\",\"😶‍🌫️\":\"face-in-clouds\",\"😏\":\"smirking-face\",\"😒\":\"unamused-face\",\"🙄\":\"face-with-rolling-eyes\",\"😬\":\"grimacing-face\",\"😮‍💨\":\"face-exhaling\",\"🤥\":\"lying-face\",\"🫨\":\"⊛-shaking-face\",\"😌\":\"relieved-face\",\"😔\":\"pensive-face\",\"😪\":\"sleepy-face\",\"🤤\":\"drooling-face\",\"😴\":\"sleeping-face\",\"😷\":\"face-with-medical-mask\",\"🤒\":\"face-with-thermometer\",\"🤕\":\"face-with-head-bandage\",\"🤢\":\"nauseated-face\",\"🤮\":\"face-vomiting\",\"🤧\":\"sneezing-face\",\"🥵\":\"hot-face\",\"🥶\":\"cold-face\",\"🥴\":\"woozy-face\",\"😵\":\"face-with-crossed-out-eyes\",\"😵‍💫\":\"face-with-spiral-eyes\",\"🤯\":\"exploding-head\",\"🤠\":\"cowboy-hat-face\",\"🥳\":\"partying-face\",\"🥸\":\"disguised-face\",\"😎\":\"smiling-face-with-sunglasses\",\"🤓\":\"nerd-face\",\"🧐\":\"face-with-monocle\",\"😕\":\"confused-face\",\"🫤\":\"face-with-diagonal-mouth\",\"😟\":\"worried-face\",\"🙁\":\"slightly-frowning-face\",\"☹\":\"frowning-face\",\"😮\":\"face-with-open-mouth\",\"😯\":\"hushed-face\",\"😲\":\"astonished-face\",\"😳\":\"flushed-face\",\"🥺\":\"pleading-face\",\"🥹\":\"face-holding-back-tears\",\"😦\":\"frowning-face-with-open-mouth\",\"😧\":\"anguished-face\",\"😨\":\"fearful-face\",\"😰\":\"anxious-face-with-sweat\",\"😥\":\"sad-but-relieved-face\",\"😢\":\"crying-face\",\"😭\":\"loudly-crying-face\",\"😱\":\"face-screaming-in-fear\",\"😖\":\"confounded-face\",\"😣\":\"persevering-face\",\"😞\":\"disappointed-face\",\"😓\":\"downcast-face-with-sweat\",\"😩\":\"weary-face\",\"😫\":\"tired-face\",\"🥱\":\"yawning-face\",\"😤\":\"face-with-steam-from-nose\",\"😡\":\"enraged-face\",\"😠\":\"angry-face\",\"🤬\":\"face-with-symbols-on-mouth\",\"😈\":\"smiling-face-with-horns\",\"👿\":\"angry-face-with-horns\",\"💀\":\"skull\",\"☠\":\"skull-and-crossbones\",\"💩\":\"pile-of-poo\",\"🤡\":\"clown-face\",\"👹\":\"ogre\",\"👺\":\"goblin\",\"👻\":\"ghost\",\"👽\":\"alien\",\"👾\":\"alien-monster\",\"🤖\":\"robot\",\"😺\":\"grinning-cat\",\"😸\":\"grinning-cat-with-smiling-eyes\",\"😹\":\"cat-with-tears-of-joy\",\"😻\":\"smiling-cat-with-heart-eyes\",\"😼\":\"cat-with-wry-smile\",\"😽\":\"kissing-cat\",\"🙀\":\"weary-cat\",\"😿\":\"crying-cat\",\"😾\":\"pouting-cat\",\"🙈\":\"see-no-evil-monkey\",\"🙉\":\"hear-no-evil-monkey\",\"🙊\":\"speak-no-evil-monkey\",\"💌\":\"love-letter\",\"💘\":\"heart-with-arrow\",\"💝\":\"heart-with-ribbon\",\"💖\":\"sparkling-heart\",\"💗\":\"growing-heart\",\"💓\":\"beating-heart\",\"💞\":\"revolving-hearts\",\"💕\":\"two-hearts\",\"💟\":\"heart-decoration\",\"❣\":\"heart-exclamation\",\"💔\":\"broken-heart\",\"❤️‍🔥\":\"heart-on-fire\",\"❤️‍🩹\":\"mending-heart\",\"❤\":\"red-heart\",\"🩷\":\"⊛-pink-heart\",\"🧡\":\"orange-heart\",\"💛\":\"yellow-heart\",\"💚\":\"green-heart\",\"💙\":\"blue-heart\",\"🩵\":\"⊛-light-blue-heart\",\"💜\":\"purple-heart\",\"🤎\":\"brown-heart\",\"🖤\":\"black-heart\",\"🩶\":\"⊛-grey-heart\",\"🤍\":\"white-heart\",\"💋\":\"kiss-mark\",\"💯\":\"hundred-points\",\"💢\":\"anger-symbol\",\"💥\":\"collision\",\"💫\":\"dizzy\",\"💦\":\"sweat-droplets\",\"💨\":\"dashing-away\",\"🕳\":\"hole\",\"💬\":\"speech-balloon\",\"👁️‍🗨️\":\"eye-in-speech-bubble\",\"🗨\":\"left-speech-bubble\",\"🗯\":\"right-anger-bubble\",\"💭\":\"thought-balloon\",\"💤\":\"zzz\",\"👋\":\"waving-hand\",\"🤚\":\"raised-back-of-hand\",\"🖐\":\"hand-with-fingers-splayed\",\"✋\":\"raised-hand\",\"🖖\":\"vulcan-salute\",\"🫱\":\"rightwards-hand\",\"🫲\":\"leftwards-hand\",\"🫳\":\"palm-down-hand\",\"🫴\":\"palm-up-hand\",\"🫷\":\"⊛-leftwards-pushing-hand\",\"🫸\":\"⊛-rightwards-pushing-hand\",\"👌\":\"ok-hand\",\"🤌\":\"pinched-fingers\",\"🤏\":\"pinching-hand\",\"✌\":\"victory-hand\",\"🤞\":\"crossed-fingers\",\"🫰\":\"hand-with-index-finger-and-thumb-crossed\",\"🤟\":\"love-you-gesture\",\"🤘\":\"sign-of-the-horns\",\"🤙\":\"call-me-hand\",\"👈\":\"backhand-index-pointing-left\",\"👉\":\"backhand-index-pointing-right\",\"👆\":\"backhand-index-pointing-up\",\"🖕\":\"middle-finger\",\"👇\":\"backhand-index-pointing-down\",\"☝\":\"index-pointing-up\",\"🫵\":\"index-pointing-at-the-viewer\",\"👍\":\"thumbs-up\",\"👎\":\"thumbs-down\",\"✊\":\"raised-fist\",\"👊\":\"oncoming-fist\",\"🤛\":\"left-facing-fist\",\"🤜\":\"right-facing-fist\",\"👏\":\"clapping-hands\",\"🙌\":\"raising-hands\",\"🫶\":\"heart-hands\",\"👐\":\"open-hands\",\"🤲\":\"palms-up-together\",\"🤝\":\"handshake\",\"🙏\":\"folded-hands\",\"✍\":\"writing-hand\",\"💅\":\"nail-polish\",\"🤳\":\"selfie\",\"💪\":\"flexed-biceps\",\"🦾\":\"mechanical-arm\",\"🦿\":\"mechanical-leg\",\"🦵\":\"leg\",\"🦶\":\"foot\",\"👂\":\"ear\",\"🦻\":\"ear-with-hearing-aid\",\"👃\":\"nose\",\"🧠\":\"brain\",\"🫀\":\"anatomical-heart\",\"🫁\":\"lungs\",\"🦷\":\"tooth\",\"🦴\":\"bone\",\"👀\":\"eyes\",\"👁\":\"eye\",\"👅\":\"tongue\",\"👄\":\"mouth\",\"🫦\":\"biting-lip\",\"👶\":\"baby\",\"🧒\":\"child\",\"👦\":\"boy\",\"👧\":\"girl\",\"🧑\":\"person\",\"👱\":\"person-blond-hair\",\"👨\":\"man\",\"🧔\":\"person-beard\",\"🧔‍♂️\":\"man-beard\",\"🧔‍♀️\":\"woman-beard\",\"👨‍🦰\":\"man-red-hair\",\"👨‍🦱\":\"man-curly-hair\",\"👨‍🦳\":\"man-white-hair\",\"👨‍🦲\":\"man-bald\",\"👩\":\"woman\",\"👩‍🦰\":\"woman-red-hair\",\"🧑‍🦰\":\"person-red-hair\",\"👩‍🦱\":\"woman-curly-hair\",\"🧑‍🦱\":\"person-curly-hair\",\"👩‍🦳\":\"woman-white-hair\",\"🧑‍🦳\":\"person-white-hair\",\"👩‍🦲\":\"woman-bald\",\"🧑‍🦲\":\"person-bald\",\"👱‍♀️\":\"woman-blond-hair\",\"👱‍♂️\":\"man-blond-hair\",\"🧓\":\"older-person\",\"👴\":\"old-man\",\"👵\":\"old-woman\",\"🙍\":\"person-frowning\",\"🙍‍♂️\":\"man-frowning\",\"🙍‍♀️\":\"woman-frowning\",\"🙎\":\"person-pouting\",\"🙎‍♂️\":\"man-pouting\",\"🙎‍♀️\":\"woman-pouting\",\"🙅\":\"person-gesturing-no\",\"🙅‍♂️\":\"man-gesturing-no\",\"🙅‍♀️\":\"woman-gesturing-no\",\"🙆\":\"person-gesturing-ok\",\"🙆‍♂️\":\"man-gesturing-ok\",\"🙆‍♀️\":\"woman-gesturing-ok\",\"💁\":\"person-tipping-hand\",\"💁‍♂️\":\"man-tipping-hand\",\"💁‍♀️\":\"woman-tipping-hand\",\"🙋\":\"person-raising-hand\",\"🙋‍♂️\":\"man-raising-hand\",\"🙋‍♀️\":\"woman-raising-hand\",\"🧏\":\"deaf-person\",\"🧏‍♂️\":\"deaf-man\",\"🧏‍♀️\":\"deaf-woman\",\"🙇\":\"person-bowing\",\"🙇‍♂️\":\"man-bowing\",\"🙇‍♀️\":\"woman-bowing\",\"🤦\":\"person-facepalming\",\"🤦‍♂️\":\"man-facepalming\",\"🤦‍♀️\":\"woman-facepalming\",\"🤷\":\"person-shrugging\",\"🤷‍♂️\":\"man-shrugging\",\"🤷‍♀️\":\"woman-shrugging\",\"🧑‍⚕️\":\"health-worker\",\"👨‍⚕️\":\"man-health-worker\",\"👩‍⚕️\":\"woman-health-worker\",\"🧑‍🎓\":\"student\",\"👨‍🎓\":\"man-student\",\"👩‍🎓\":\"woman-student\",\"🧑‍🏫\":\"teacher\",\"👨‍🏫\":\"man-teacher\",\"👩‍🏫\":\"woman-teacher\",\"🧑‍⚖️\":\"judge\",\"👨‍⚖️\":\"man-judge\",\"👩‍⚖️\":\"woman-judge\",\"🧑‍🌾\":\"farmer\",\"👨‍🌾\":\"man-farmer\",\"👩‍🌾\":\"woman-farmer\",\"🧑‍🍳\":\"cook\",\"👨‍🍳\":\"man-cook\",\"👩‍🍳\":\"woman-cook\",\"🧑‍🔧\":\"mechanic\",\"👨‍🔧\":\"man-mechanic\",\"👩‍🔧\":\"woman-mechanic\",\"🧑‍🏭\":\"factory-worker\",\"👨‍🏭\":\"man-factory-worker\",\"👩‍🏭\":\"woman-factory-worker\",\"🧑‍💼\":\"office-worker\",\"👨‍💼\":\"man-office-worker\",\"👩‍💼\":\"woman-office-worker\",\"🧑‍🔬\":\"scientist\",\"👨‍🔬\":\"man-scientist\",\"👩‍🔬\":\"woman-scientist\",\"🧑‍💻\":\"technologist\",\"👨‍💻\":\"man-technologist\",\"👩‍💻\":\"woman-technologist\",\"🧑‍🎤\":\"singer\",\"👨‍🎤\":\"man-singer\",\"👩‍🎤\":\"woman-singer\",\"🧑‍🎨\":\"artist\",\"👨‍🎨\":\"man-artist\",\"👩‍🎨\":\"woman-artist\",\"🧑‍✈️\":\"pilot\",\"👨‍✈️\":\"man-pilot\",\"👩‍✈️\":\"woman-pilot\",\"🧑‍🚀\":\"astronaut\",\"👨‍🚀\":\"man-astronaut\",\"👩‍🚀\":\"woman-astronaut\",\"🧑‍🚒\":\"firefighter\",\"👨‍🚒\":\"man-firefighter\",\"👩‍🚒\":\"woman-firefighter\",\"👮\":\"police-officer\",\"👮‍♂️\":\"man-police-officer\",\"👮‍♀️\":\"woman-police-officer\",\"🕵\":\"detective\",\"🕵️‍♂️\":\"man-detective\",\"🕵️‍♀️\":\"woman-detective\",\"💂\":\"guard\",\"💂‍♂️\":\"man-guard\",\"💂‍♀️\":\"woman-guard\",\"🥷\":\"ninja\",\"👷\":\"construction-worker\",\"👷‍♂️\":\"man-construction-worker\",\"👷‍♀️\":\"woman-construction-worker\",\"🫅\":\"person-with-crown\",\"🤴\":\"prince\",\"👸\":\"princess\",\"👳\":\"person-wearing-turban\",\"👳‍♂️\":\"man-wearing-turban\",\"👳‍♀️\":\"woman-wearing-turban\",\"👲\":\"person-with-skullcap\",\"🧕\":\"woman-with-headscarf\",\"🤵\":\"person-in-tuxedo\",\"🤵‍♂️\":\"man-in-tuxedo\",\"🤵‍♀️\":\"woman-in-tuxedo\",\"👰\":\"person-with-veil\",\"👰‍♂️\":\"man-with-veil\",\"👰‍♀️\":\"woman-with-veil\",\"🤰\":\"pregnant-woman\",\"🫃\":\"pregnant-man\",\"🫄\":\"pregnant-person\",\"🤱\":\"breast-feeding\",\"👩‍🍼\":\"woman-feeding-baby\",\"👨‍🍼\":\"man-feeding-baby\",\"🧑‍🍼\":\"person-feeding-baby\",\"👼\":\"baby-angel\",\"🎅\":\"santa-claus\",\"🤶\":\"mrs-claus\",\"🧑‍🎄\":\"mx-claus\",\"🦸\":\"superhero\",\"🦸‍♂️\":\"man-superhero\",\"🦸‍♀️\":\"woman-superhero\",\"🦹\":\"supervillain\",\"🦹‍♂️\":\"man-supervillain\",\"🦹‍♀️\":\"woman-supervillain\",\"🧙\":\"mage\",\"🧙‍♂️\":\"man-mage\",\"🧙‍♀️\":\"woman-mage\",\"🧚\":\"fairy\",\"🧚‍♂️\":\"man-fairy\",\"🧚‍♀️\":\"woman-fairy\",\"🧛\":\"vampire\",\"🧛‍♂️\":\"man-vampire\",\"🧛‍♀️\":\"woman-vampire\",\"🧜\":\"merperson\",\"🧜‍♂️\":\"merman\",\"🧜‍♀️\":\"mermaid\",\"🧝\":\"elf\",\"🧝‍♂️\":\"man-elf\",\"🧝‍♀️\":\"woman-elf\",\"🧞\":\"genie\",\"🧞‍♂️\":\"man-genie\",\"🧞‍♀️\":\"woman-genie\",\"🧟\":\"zombie\",\"🧟‍♂️\":\"man-zombie\",\"🧟‍♀️\":\"woman-zombie\",\"🧌\":\"troll\",\"💆\":\"person-getting-massage\",\"💆‍♂️\":\"man-getting-massage\",\"💆‍♀️\":\"woman-getting-massage\",\"💇\":\"person-getting-haircut\",\"💇‍♂️\":\"man-getting-haircut\",\"💇‍♀️\":\"woman-getting-haircut\",\"🚶\":\"person-walking\",\"🚶‍♂️\":\"man-walking\",\"🚶‍♀️\":\"woman-walking\",\"🧍\":\"person-standing\",\"🧍‍♂️\":\"man-standing\",\"🧍‍♀️\":\"woman-standing\",\"🧎\":\"person-kneeling\",\"🧎‍♂️\":\"man-kneeling\",\"🧎‍♀️\":\"woman-kneeling\",\"🧑‍🦯\":\"person-with-white-cane\",\"👨‍🦯\":\"man-with-white-cane\",\"👩‍🦯\":\"woman-with-white-cane\",\"🧑‍🦼\":\"person-in-motorized-wheelchair\",\"👨‍🦼\":\"man-in-motorized-wheelchair\",\"👩‍🦼\":\"woman-in-motorized-wheelchair\",\"🧑‍🦽\":\"person-in-manual-wheelchair\",\"👨‍🦽\":\"man-in-manual-wheelchair\",\"👩‍🦽\":\"woman-in-manual-wheelchair\",\"🏃\":\"person-running\",\"🏃‍♂️\":\"man-running\",\"🏃‍♀️\":\"woman-running\",\"💃\":\"woman-dancing\",\"🕺\":\"man-dancing\",\"🕴\":\"person-in-suit-levitating\",\"👯\":\"people-with-bunny-ears\",\"👯‍♂️\":\"men-with-bunny-ears\",\"👯‍♀️\":\"women-with-bunny-ears\",\"🧖\":\"person-in-steamy-room\",\"🧖‍♂️\":\"man-in-steamy-room\",\"🧖‍♀️\":\"woman-in-steamy-room\",\"🧗\":\"person-climbing\",\"🧗‍♂️\":\"man-climbing\",\"🧗‍♀️\":\"woman-climbing\",\"🤺\":\"person-fencing\",\"🏇\":\"horse-racing\",\"⛷\":\"skier\",\"🏂\":\"snowboarder\",\"🏌\":\"person-golfing\",\"🏌️‍♂️\":\"man-golfing\",\"🏌️‍♀️\":\"woman-golfing\",\"🏄\":\"person-surfing\",\"🏄‍♂️\":\"man-surfing\",\"🏄‍♀️\":\"woman-surfing\",\"🚣\":\"person-rowing-boat\",\"🚣‍♂️\":\"man-rowing-boat\",\"🚣‍♀️\":\"woman-rowing-boat\",\"🏊\":\"person-swimming\",\"🏊‍♂️\":\"man-swimming\",\"🏊‍♀️\":\"woman-swimming\",\"⛹\":\"person-bouncing-ball\",\"⛹️‍♂️\":\"man-bouncing-ball\",\"⛹️‍♀️\":\"woman-bouncing-ball\",\"🏋\":\"person-lifting-weights\",\"🏋️‍♂️\":\"man-lifting-weights\",\"🏋️‍♀️\":\"woman-lifting-weights\",\"🚴\":\"person-biking\",\"🚴‍♂️\":\"man-biking\",\"🚴‍♀️\":\"woman-biking\",\"🚵\":\"person-mountain-biking\",\"🚵‍♂️\":\"man-mountain-biking\",\"🚵‍♀️\":\"woman-mountain-biking\",\"🤸\":\"person-cartwheeling\",\"🤸‍♂️\":\"man-cartwheeling\",\"🤸‍♀️\":\"woman-cartwheeling\",\"🤼\":\"people-wrestling\",\"🤼‍♂️\":\"men-wrestling\",\"🤼‍♀️\":\"women-wrestling\",\"🤽\":\"person-playing-water-polo\",\"🤽‍♂️\":\"man-playing-water-polo\",\"🤽‍♀️\":\"woman-playing-water-polo\",\"🤾\":\"person-playing-handball\",\"🤾‍♂️\":\"man-playing-handball\",\"🤾‍♀️\":\"woman-playing-handball\",\"🤹\":\"person-juggling\",\"🤹‍♂️\":\"man-juggling\",\"🤹‍♀️\":\"woman-juggling\",\"🧘\":\"person-in-lotus-position\",\"🧘‍♂️\":\"man-in-lotus-position\",\"🧘‍♀️\":\"woman-in-lotus-position\",\"🛀\":\"person-taking-bath\",\"🛌\":\"person-in-bed\",\"🧑‍🤝‍🧑\":\"people-holding-hands\",\"👭\":\"women-holding-hands\",\"👫\":\"woman-and-man-holding-hands\",\"👬\":\"men-holding-hands\",\"💏\":\"kiss\",\"👩‍❤️‍💋‍👨\":\"kiss-woman,-man\",\"👨‍❤️‍💋‍👨\":\"kiss-man,-man\",\"👩‍❤️‍💋‍👩\":\"kiss-woman,-woman\",\"💑\":\"couple-with-heart\",\"👩‍❤️‍👨\":\"couple-with-heart-woman,-man\",\"👨‍❤️‍👨\":\"couple-with-heart-man,-man\",\"👩‍❤️‍👩\":\"couple-with-heart-woman,-woman\",\"👪\":\"family\",\"👨‍👩‍👦\":\"family-man,-woman,-boy\",\"👨‍👩‍👧\":\"family-man,-woman,-girl\",\"👨‍👩‍👧‍👦\":\"family-man,-woman,-girl,-boy\",\"👨‍👩‍👦‍👦\":\"family-man,-woman,-boy,-boy\",\"👨‍👩‍👧‍👧\":\"family-man,-woman,-girl,-girl\",\"👨‍👨‍👦\":\"family-man,-man,-boy\",\"👨‍👨‍👧\":\"family-man,-man,-girl\",\"👨‍👨‍👧‍👦\":\"family-man,-man,-girl,-boy\",\"👨‍👨‍👦‍👦\":\"family-man,-man,-boy,-boy\",\"👨‍👨‍👧‍👧\":\"family-man,-man,-girl,-girl\",\"👩‍👩‍👦\":\"family-woman,-woman,-boy\",\"👩‍👩‍👧\":\"family-woman,-woman,-girl\",\"👩‍👩‍👧‍👦\":\"family-woman,-woman,-girl,-boy\",\"👩‍👩‍👦‍👦\":\"family-woman,-woman,-boy,-boy\",\"👩‍👩‍👧‍👧\":\"family-woman,-woman,-girl,-girl\",\"👨‍👦\":\"family-man,-boy\",\"👨‍👦‍👦\":\"family-man,-boy,-boy\",\"👨‍👧\":\"family-man,-girl\",\"👨‍👧‍👦\":\"family-man,-girl,-boy\",\"👨‍👧‍👧\":\"family-man,-girl,-girl\",\"👩‍👦\":\"family-woman,-boy\",\"👩‍👦‍👦\":\"family-woman,-boy,-boy\",\"👩‍👧\":\"family-woman,-girl\",\"👩‍👧‍👦\":\"family-woman,-girl,-boy\",\"👩‍👧‍👧\":\"family-woman,-girl,-girl\",\"🗣\":\"speaking-head\",\"👤\":\"bust-in-silhouette\",\"👥\":\"busts-in-silhouette\",\"🫂\":\"people-hugging\",\"👣\":\"footprints\",\"🦰\":\"red-hair\",\"🦱\":\"curly-hair\",\"🦳\":\"white-hair\",\"🦲\":\"bald\",\"🐵\":\"monkey-face\",\"🐒\":\"monkey\",\"🦍\":\"gorilla\",\"🦧\":\"orangutan\",\"🐶\":\"dog-face\",\"🐕\":\"dog\",\"🦮\":\"guide-dog\",\"🐕‍🦺\":\"service-dog\",\"🐩\":\"poodle\",\"🐺\":\"wolf\",\"🦊\":\"fox\",\"🦝\":\"raccoon\",\"🐱\":\"cat-face\",\"🐈\":\"cat\",\"🐈‍⬛\":\"black-cat\",\"🦁\":\"lion\",\"🐯\":\"tiger-face\",\"🐅\":\"tiger\",\"🐆\":\"leopard\",\"🐴\":\"horse-face\",\"🫎\":\"⊛-moose\",\"🫏\":\"⊛-donkey\",\"🐎\":\"horse\",\"🦄\":\"unicorn\",\"🦓\":\"zebra\",\"🦌\":\"deer\",\"🦬\":\"bison\",\"🐮\":\"cow-face\",\"🐂\":\"ox\",\"🐃\":\"water-buffalo\",\"🐄\":\"cow\",\"🐷\":\"pig-face\",\"🐖\":\"pig\",\"🐗\":\"boar\",\"🐽\":\"pig-nose\",\"🐏\":\"ram\",\"🐑\":\"ewe\",\"🐐\":\"goat\",\"🐪\":\"camel\",\"🐫\":\"two-hump-camel\",\"🦙\":\"llama\",\"🦒\":\"giraffe\",\"🐘\":\"elephant\",\"🦣\":\"mammoth\",\"🦏\":\"rhinoceros\",\"🦛\":\"hippopotamus\",\"🐭\":\"mouse-face\",\"🐁\":\"mouse\",\"🐀\":\"rat\",\"🐹\":\"hamster\",\"🐰\":\"rabbit-face\",\"🐇\":\"rabbit\",\"🐿\":\"chipmunk\",\"🦫\":\"beaver\",\"🦔\":\"hedgehog\",\"🦇\":\"bat\",\"🐻\":\"bear\",\"🐻‍❄️\":\"polar-bear\",\"🐨\":\"koala\",\"🐼\":\"panda\",\"🦥\":\"sloth\",\"🦦\":\"otter\",\"🦨\":\"skunk\",\"🦘\":\"kangaroo\",\"🦡\":\"badger\",\"🐾\":\"paw-prints\",\"🦃\":\"turkey\",\"🐔\":\"chicken\",\"🐓\":\"rooster\",\"🐣\":\"hatching-chick\",\"🐤\":\"baby-chick\",\"🐥\":\"front-facing-baby-chick\",\"🐦\":\"bird\",\"🐧\":\"penguin\",\"🕊\":\"dove\",\"🦅\":\"eagle\",\"🦆\":\"duck\",\"🦢\":\"swan\",\"🦉\":\"owl\",\"🦤\":\"dodo\",\"🪶\":\"feather\",\"🦩\":\"flamingo\",\"🦚\":\"peacock\",\"🦜\":\"parrot\",\"🪽\":\"⊛-wing\",\"🐦‍⬛\":\"⊛-black-bird\",\"🪿\":\"⊛-goose\",\"🐸\":\"frog\",\"🐊\":\"crocodile\",\"🐢\":\"turtle\",\"🦎\":\"lizard\",\"🐍\":\"snake\",\"🐲\":\"dragon-face\",\"🐉\":\"dragon\",\"🦕\":\"sauropod\",\"🦖\":\"t-rex\",\"🐳\":\"spouting-whale\",\"🐋\":\"whale\",\"🐬\":\"dolphin\",\"🦭\":\"seal\",\"🐟\":\"fish\",\"🐠\":\"tropical-fish\",\"🐡\":\"blowfish\",\"🦈\":\"shark\",\"🐙\":\"octopus\",\"🐚\":\"spiral-shell\",\"🪸\":\"coral\",\"🪼\":\"⊛-jellyfish\",\"🐌\":\"snail\",\"🦋\":\"butterfly\",\"🐛\":\"bug\",\"🐜\":\"ant\",\"🐝\":\"honeybee\",\"🪲\":\"beetle\",\"🐞\":\"lady-beetle\",\"🦗\":\"cricket\",\"🪳\":\"cockroach\",\"🕷\":\"spider\",\"🕸\":\"spider-web\",\"🦂\":\"scorpion\",\"🦟\":\"mosquito\",\"🪰\":\"fly\",\"🪱\":\"worm\",\"🦠\":\"microbe\",\"💐\":\"bouquet\",\"🌸\":\"cherry-blossom\",\"💮\":\"white-flower\",\"🪷\":\"lotus\",\"🏵\":\"rosette\",\"🌹\":\"rose\",\"🥀\":\"wilted-flower\",\"🌺\":\"hibiscus\",\"🌻\":\"sunflower\",\"🌼\":\"blossom\",\"🌷\":\"tulip\",\"🪻\":\"⊛-hyacinth\",\"🌱\":\"seedling\",\"🪴\":\"potted-plant\",\"🌲\":\"evergreen-tree\",\"🌳\":\"deciduous-tree\",\"🌴\":\"palm-tree\",\"🌵\":\"cactus\",\"🌾\":\"sheaf-of-rice\",\"🌿\":\"herb\",\"☘\":\"shamrock\",\"🍀\":\"four-leaf-clover\",\"🍁\":\"maple-leaf\",\"🍂\":\"fallen-leaf\",\"🍃\":\"leaf-fluttering-in-wind\",\"🪹\":\"empty-nest\",\"🪺\":\"nest-with-eggs\",\"🍄\":\"mushroom\",\"🍇\":\"grapes\",\"🍈\":\"melon\",\"🍉\":\"watermelon\",\"🍊\":\"tangerine\",\"🍋\":\"lemon\",\"🍌\":\"banana\",\"🍍\":\"pineapple\",\"🥭\":\"mango\",\"🍎\":\"red-apple\",\"🍏\":\"green-apple\",\"🍐\":\"pear\",\"🍑\":\"peach\",\"🍒\":\"cherries\",\"🍓\":\"strawberry\",\"🫐\":\"blueberries\",\"🥝\":\"kiwi-fruit\",\"🍅\":\"tomato\",\"🫒\":\"olive\",\"🥥\":\"coconut\",\"🥑\":\"avocado\",\"🍆\":\"eggplant\",\"🥔\":\"potato\",\"🥕\":\"carrot\",\"🌽\":\"ear-of-corn\",\"🌶\":\"hot-pepper\",\"🫑\":\"bell-pepper\",\"🥒\":\"cucumber\",\"🥬\":\"leafy-green\",\"🥦\":\"broccoli\",\"🧄\":\"garlic\",\"🧅\":\"onion\",\"🥜\":\"peanuts\",\"🫘\":\"beans\",\"🌰\":\"chestnut\",\"🫚\":\"⊛-ginger-root\",\"🫛\":\"⊛-pea-pod\",\"🍞\":\"bread\",\"🥐\":\"croissant\",\"🥖\":\"baguette-bread\",\"🫓\":\"flatbread\",\"🥨\":\"pretzel\",\"🥯\":\"bagel\",\"🥞\":\"pancakes\",\"🧇\":\"waffle\",\"🧀\":\"cheese-wedge\",\"🍖\":\"meat-on-bone\",\"🍗\":\"poultry-leg\",\"🥩\":\"cut-of-meat\",\"🥓\":\"bacon\",\"🍔\":\"hamburger\",\"🍟\":\"french-fries\",\"🍕\":\"pizza\",\"🌭\":\"hot-dog\",\"🥪\":\"sandwich\",\"🌮\":\"taco\",\"🌯\":\"burrito\",\"🫔\":\"tamale\",\"🥙\":\"stuffed-flatbread\",\"🧆\":\"falafel\",\"🥚\":\"egg\",\"🍳\":\"cooking\",\"🥘\":\"shallow-pan-of-food\",\"🍲\":\"pot-of-food\",\"🫕\":\"fondue\",\"🥣\":\"bowl-with-spoon\",\"🥗\":\"green-salad\",\"🍿\":\"popcorn\",\"🧈\":\"butter\",\"🧂\":\"salt\",\"🥫\":\"canned-food\",\"🍱\":\"bento-box\",\"🍘\":\"rice-cracker\",\"🍙\":\"rice-ball\",\"🍚\":\"cooked-rice\",\"🍛\":\"curry-rice\",\"🍜\":\"steaming-bowl\",\"🍝\":\"spaghetti\",\"🍠\":\"roasted-sweet-potato\",\"🍢\":\"oden\",\"🍣\":\"sushi\",\"🍤\":\"fried-shrimp\",\"🍥\":\"fish-cake-with-swirl\",\"🥮\":\"moon-cake\",\"🍡\":\"dango\",\"🥟\":\"dumpling\",\"🥠\":\"fortune-cookie\",\"🥡\":\"takeout-box\",\"🦀\":\"crab\",\"🦞\":\"lobster\",\"🦐\":\"shrimp\",\"🦑\":\"squid\",\"🦪\":\"oyster\",\"🍦\":\"soft-ice-cream\",\"🍧\":\"shaved-ice\",\"🍨\":\"ice-cream\",\"🍩\":\"doughnut\",\"🍪\":\"cookie\",\"🎂\":\"birthday-cake\",\"🍰\":\"shortcake\",\"🧁\":\"cupcake\",\"🥧\":\"pie\",\"🍫\":\"chocolate-bar\",\"🍬\":\"candy\",\"🍭\":\"lollipop\",\"🍮\":\"custard\",\"🍯\":\"honey-pot\",\"🍼\":\"baby-bottle\",\"🥛\":\"glass-of-milk\",\"☕\":\"hot-beverage\",\"🫖\":\"teapot\",\"🍵\":\"teacup-without-handle\",\"🍶\":\"sake\",\"🍾\":\"bottle-with-popping-cork\",\"🍷\":\"wine-glass\",\"🍸\":\"cocktail-glass\",\"🍹\":\"tropical-drink\",\"🍺\":\"beer-mug\",\"🍻\":\"clinking-beer-mugs\",\"🥂\":\"clinking-glasses\",\"🥃\":\"tumbler-glass\",\"🫗\":\"pouring-liquid\",\"🥤\":\"cup-with-straw\",\"🧋\":\"bubble-tea\",\"🧃\":\"beverage-box\",\"🧉\":\"mate\",\"🧊\":\"ice\",\"🥢\":\"chopsticks\",\"🍽\":\"fork-and-knife-with-plate\",\"🍴\":\"fork-and-knife\",\"🥄\":\"spoon\",\"🔪\":\"kitchen-knife\",\"🫙\":\"jar\",\"🏺\":\"amphora\",\"🌍\":\"globe-showing-europe-africa\",\"🌎\":\"globe-showing-americas\",\"🌏\":\"globe-showing-asia-australia\",\"🌐\":\"globe-with-meridians\",\"🗺\":\"world-map\",\"🗾\":\"map-of-japan\",\"🧭\":\"compass\",\"🏔\":\"snow-capped-mountain\",\"⛰\":\"mountain\",\"🌋\":\"volcano\",\"🗻\":\"mount-fuji\",\"🏕\":\"camping\",\"🏖\":\"beach-with-umbrella\",\"🏜\":\"desert\",\"🏝\":\"desert-island\",\"🏞\":\"national-park\",\"🏟\":\"stadium\",\"🏛\":\"classical-building\",\"🏗\":\"building-construction\",\"🧱\":\"brick\",\"🪨\":\"rock\",\"🪵\":\"wood\",\"🛖\":\"hut\",\"🏘\":\"houses\",\"🏚\":\"derelict-house\",\"🏠\":\"house\",\"🏡\":\"house-with-garden\",\"🏢\":\"office-building\",\"🏣\":\"japanese-post-office\",\"🏤\":\"post-office\",\"🏥\":\"hospital\",\"🏦\":\"bank\",\"🏨\":\"hotel\",\"🏩\":\"love-hotel\",\"🏪\":\"convenience-store\",\"🏫\":\"school\",\"🏬\":\"department-store\",\"🏭\":\"factory\",\"🏯\":\"japanese-castle\",\"🏰\":\"castle\",\"💒\":\"wedding\",\"🗼\":\"tokyo-tower\",\"🗽\":\"statue-of-liberty\",\"⛪\":\"church\",\"🕌\":\"mosque\",\"🛕\":\"hindu-temple\",\"🕍\":\"synagogue\",\"⛩\":\"shinto-shrine\",\"🕋\":\"kaaba\",\"⛲\":\"fountain\",\"⛺\":\"tent\",\"🌁\":\"foggy\",\"🌃\":\"night-with-stars\",\"🏙\":\"cityscape\",\"🌄\":\"sunrise-over-mountains\",\"🌅\":\"sunrise\",\"🌆\":\"cityscape-at-dusk\",\"🌇\":\"sunset\",\"🌉\":\"bridge-at-night\",\"♨\":\"hot-springs\",\"🎠\":\"carousel-horse\",\"🛝\":\"playground-slide\",\"🎡\":\"ferris-wheel\",\"🎢\":\"roller-coaster\",\"💈\":\"barber-pole\",\"🎪\":\"circus-tent\",\"🚂\":\"locomotive\",\"🚃\":\"railway-car\",\"🚄\":\"high-speed-train\",\"🚅\":\"bullet-train\",\"🚆\":\"train\",\"🚇\":\"metro\",\"🚈\":\"light-rail\",\"🚉\":\"station\",\"🚊\":\"tram\",\"🚝\":\"monorail\",\"🚞\":\"mountain-railway\",\"🚋\":\"tram-car\",\"🚌\":\"bus\",\"🚍\":\"oncoming-bus\",\"🚎\":\"trolleybus\",\"🚐\":\"minibus\",\"🚑\":\"ambulance\",\"🚒\":\"fire-engine\",\"🚓\":\"police-car\",\"🚔\":\"oncoming-police-car\",\"🚕\":\"taxi\",\"🚖\":\"oncoming-taxi\",\"🚗\":\"automobile\",\"🚘\":\"oncoming-automobile\",\"🚙\":\"sport-utility-vehicle\",\"🛻\":\"pickup-truck\",\"🚚\":\"delivery-truck\",\"🚛\":\"articulated-lorry\",\"🚜\":\"tractor\",\"🏎\":\"racing-car\",\"🏍\":\"motorcycle\",\"🛵\":\"motor-scooter\",\"🦽\":\"manual-wheelchair\",\"🦼\":\"motorized-wheelchair\",\"🛺\":\"auto-rickshaw\",\"🚲\":\"bicycle\",\"🛴\":\"kick-scooter\",\"🛹\":\"skateboard\",\"🛼\":\"roller-skate\",\"🚏\":\"bus-stop\",\"🛣\":\"motorway\",\"🛤\":\"railway-track\",\"🛢\":\"oil-drum\",\"⛽\":\"fuel-pump\",\"🛞\":\"wheel\",\"🚨\":\"police-car-light\",\"🚥\":\"horizontal-traffic-light\",\"🚦\":\"vertical-traffic-light\",\"🛑\":\"stop-sign\",\"🚧\":\"construction\",\"⚓\":\"anchor\",\"🛟\":\"ring-buoy\",\"⛵\":\"sailboat\",\"🛶\":\"canoe\",\"🚤\":\"speedboat\",\"🛳\":\"passenger-ship\",\"⛴\":\"ferry\",\"🛥\":\"motor-boat\",\"🚢\":\"ship\",\"✈\":\"airplane\",\"🛩\":\"small-airplane\",\"🛫\":\"airplane-departure\",\"🛬\":\"airplane-arrival\",\"🪂\":\"parachute\",\"💺\":\"seat\",\"🚁\":\"helicopter\",\"🚟\":\"suspension-railway\",\"🚠\":\"mountain-cableway\",\"🚡\":\"aerial-tramway\",\"🛰\":\"satellite\",\"🚀\":\"rocket\",\"🛸\":\"flying-saucer\",\"🛎\":\"bellhop-bell\",\"🧳\":\"luggage\",\"⌛\":\"hourglass-done\",\"⏳\":\"hourglass-not-done\",\"⌚\":\"watch\",\"⏰\":\"alarm-clock\",\"⏱\":\"stopwatch\",\"⏲\":\"timer-clock\",\"🕰\":\"mantelpiece-clock\",\"🕛\":\"twelve-o-clock\",\"🕧\":\"twelve-thirty\",\"🕐\":\"one-o-clock\",\"🕜\":\"one-thirty\",\"🕑\":\"two-o-clock\",\"🕝\":\"two-thirty\",\"🕒\":\"three-o-clock\",\"🕞\":\"three-thirty\",\"🕓\":\"four-o-clock\",\"🕟\":\"four-thirty\",\"🕔\":\"five-o-clock\",\"🕠\":\"five-thirty\",\"🕕\":\"six-o-clock\",\"🕡\":\"six-thirty\",\"🕖\":\"seven-o-clock\",\"🕢\":\"seven-thirty\",\"🕗\":\"eight-o-clock\",\"🕣\":\"eight-thirty\",\"🕘\":\"nine-o-clock\",\"🕤\":\"nine-thirty\",\"🕙\":\"ten-o-clock\",\"🕥\":\"ten-thirty\",\"🕚\":\"eleven-o-clock\",\"🕦\":\"eleven-thirty\",\"🌑\":\"new-moon\",\"🌒\":\"waxing-crescent-moon\",\"🌓\":\"first-quarter-moon\",\"🌔\":\"waxing-gibbous-moon\",\"🌕\":\"full-moon\",\"🌖\":\"waning-gibbous-moon\",\"🌗\":\"last-quarter-moon\",\"🌘\":\"waning-crescent-moon\",\"🌙\":\"crescent-moon\",\"🌚\":\"new-moon-face\",\"🌛\":\"first-quarter-moon-face\",\"🌜\":\"last-quarter-moon-face\",\"🌡\":\"thermometer\",\"☀\":\"sun\",\"🌝\":\"full-moon-face\",\"🌞\":\"sun-with-face\",\"🪐\":\"ringed-planet\",\"⭐\":\"star\",\"🌟\":\"glowing-star\",\"🌠\":\"shooting-star\",\"🌌\":\"milky-way\",\"☁\":\"cloud\",\"⛅\":\"sun-behind-cloud\",\"⛈\":\"cloud-with-lightning-and-rain\",\"🌤\":\"sun-behind-small-cloud\",\"🌥\":\"sun-behind-large-cloud\",\"🌦\":\"sun-behind-rain-cloud\",\"🌧\":\"cloud-with-rain\",\"🌨\":\"cloud-with-snow\",\"🌩\":\"cloud-with-lightning\",\"🌪\":\"tornado\",\"🌫\":\"fog\",\"🌬\":\"wind-face\",\"🌀\":\"cyclone\",\"🌈\":\"rainbow\",\"🌂\":\"closed-umbrella\",\"☂\":\"umbrella\",\"☔\":\"umbrella-with-rain-drops\",\"⛱\":\"umbrella-on-ground\",\"⚡\":\"high-voltage\",\"❄\":\"snowflake\",\"☃\":\"snowman\",\"⛄\":\"snowman-without-snow\",\"☄\":\"comet\",\"🔥\":\"fire\",\"💧\":\"droplet\",\"🌊\":\"water-wave\",\"🎃\":\"jack-o-lantern\",\"🎄\":\"christmas-tree\",\"🎆\":\"fireworks\",\"🎇\":\"sparkler\",\"🧨\":\"firecracker\",\"✨\":\"sparkles\",\"🎈\":\"balloon\",\"🎉\":\"party-popper\",\"🎊\":\"confetti-ball\",\"🎋\":\"tanabata-tree\",\"🎍\":\"pine-decoration\",\"🎎\":\"japanese-dolls\",\"🎏\":\"carp-streamer\",\"🎐\":\"wind-chime\",\"🎑\":\"moon-viewing-ceremony\",\"🧧\":\"red-envelope\",\"🎀\":\"ribbon\",\"🎁\":\"wrapped-gift\",\"🎗\":\"reminder-ribbon\",\"🎟\":\"admission-tickets\",\"🎫\":\"ticket\",\"🎖\":\"military-medal\",\"🏆\":\"trophy\",\"🏅\":\"sports-medal\",\"🥇\":\"1st-place-medal\",\"🥈\":\"2nd-place-medal\",\"🥉\":\"3rd-place-medal\",\"⚽\":\"soccer-ball\",\"⚾\":\"baseball\",\"🥎\":\"softball\",\"🏀\":\"basketball\",\"🏐\":\"volleyball\",\"🏈\":\"american-football\",\"🏉\":\"rugby-football\",\"🎾\":\"tennis\",\"🥏\":\"flying-disc\",\"🎳\":\"bowling\",\"🏏\":\"cricket-game\",\"🏑\":\"field-hockey\",\"🏒\":\"ice-hockey\",\"🥍\":\"lacrosse\",\"🏓\":\"ping-pong\",\"🏸\":\"badminton\",\"🥊\":\"boxing-glove\",\"🥋\":\"martial-arts-uniform\",\"🥅\":\"goal-net\",\"⛳\":\"flag-in-hole\",\"⛸\":\"ice-skate\",\"🎣\":\"fishing-pole\",\"🤿\":\"diving-mask\",\"🎽\":\"running-shirt\",\"🎿\":\"skis\",\"🛷\":\"sled\",\"🥌\":\"curling-stone\",\"🎯\":\"bullseye\",\"🪀\":\"yo-yo\",\"🪁\":\"kite\",\"🔫\":\"water-pistol\",\"🎱\":\"pool-8-ball\",\"🔮\":\"crystal-ball\",\"🪄\":\"magic-wand\",\"🎮\":\"video-game\",\"🕹\":\"joystick\",\"🎰\":\"slot-machine\",\"🎲\":\"game-die\",\"🧩\":\"puzzle-piece\",\"🧸\":\"teddy-bear\",\"🪅\":\"piñata\",\"🪩\":\"mirror-ball\",\"🪆\":\"nesting-dolls\",\"♠\":\"spade-suit\",\"♥\":\"heart-suit\",\"♦\":\"diamond-suit\",\"♣\":\"club-suit\",\"♟\":\"chess-pawn\",\"🃏\":\"joker\",\"🀄\":\"mahjong-red-dragon\",\"🎴\":\"flower-playing-cards\",\"🎭\":\"performing-arts\",\"🖼\":\"framed-picture\",\"🎨\":\"artist-palette\",\"🧵\":\"thread\",\"🪡\":\"sewing-needle\",\"🧶\":\"yarn\",\"🪢\":\"knot\",\"👓\":\"glasses\",\"🕶\":\"sunglasses\",\"🥽\":\"goggles\",\"🥼\":\"lab-coat\",\"🦺\":\"safety-vest\",\"👔\":\"necktie\",\"👕\":\"t-shirt\",\"👖\":\"jeans\",\"🧣\":\"scarf\",\"🧤\":\"gloves\",\"🧥\":\"coat\",\"🧦\":\"socks\",\"👗\":\"dress\",\"👘\":\"kimono\",\"🥻\":\"sari\",\"🩱\":\"one-piece-swimsuit\",\"🩲\":\"briefs\",\"🩳\":\"shorts\",\"👙\":\"bikini\",\"👚\":\"woman-s-clothes\",\"🪭\":\"⊛-folding-hand-fan\",\"👛\":\"purse\",\"👜\":\"handbag\",\"👝\":\"clutch-bag\",\"🛍\":\"shopping-bags\",\"🎒\":\"backpack\",\"🩴\":\"thong-sandal\",\"👞\":\"man-s-shoe\",\"👟\":\"running-shoe\",\"🥾\":\"hiking-boot\",\"🥿\":\"flat-shoe\",\"👠\":\"high-heeled-shoe\",\"👡\":\"woman-s-sandal\",\"🩰\":\"ballet-shoes\",\"👢\":\"woman-s-boot\",\"🪮\":\"⊛-hair-pick\",\"👑\":\"crown\",\"👒\":\"woman-s-hat\",\"🎩\":\"top-hat\",\"🎓\":\"graduation-cap\",\"🧢\":\"billed-cap\",\"🪖\":\"military-helmet\",\"⛑\":\"rescue-worker-s-helmet\",\"📿\":\"prayer-beads\",\"💄\":\"lipstick\",\"💍\":\"ring\",\"💎\":\"gem-stone\",\"🔇\":\"muted-speaker\",\"🔈\":\"speaker-low-volume\",\"🔉\":\"speaker-medium-volume\",\"🔊\":\"speaker-high-volume\",\"📢\":\"loudspeaker\",\"📣\":\"megaphone\",\"📯\":\"postal-horn\",\"🔔\":\"bell\",\"🔕\":\"bell-with-slash\",\"🎼\":\"musical-score\",\"🎵\":\"musical-note\",\"🎶\":\"musical-notes\",\"🎙\":\"studio-microphone\",\"🎚\":\"level-slider\",\"🎛\":\"control-knobs\",\"🎤\":\"microphone\",\"🎧\":\"headphone\",\"📻\":\"radio\",\"🎷\":\"saxophone\",\"🪗\":\"accordion\",\"🎸\":\"guitar\",\"🎹\":\"musical-keyboard\",\"🎺\":\"trumpet\",\"🎻\":\"violin\",\"🪕\":\"banjo\",\"🥁\":\"drum\",\"🪘\":\"long-drum\",\"🪇\":\"maracas\",\"🪈\":\"flute\",\"📱\":\"mobile-phone\",\"📲\":\"mobile-phone-with-arrow\",\"☎\":\"telephone\",\"📞\":\"telephone-receiver\",\"📟\":\"pager\",\"📠\":\"fax-machine\",\"🔋\":\"battery\",\"🪫\":\"low-battery\",\"🔌\":\"electric-plug\",\"💻\":\"laptop\",\"🖥\":\"desktop-computer\",\"🖨\":\"printer\",\"⌨\":\"keyboard\",\"🖱\":\"computer-mouse\",\"🖲\":\"trackball\",\"💽\":\"computer-disk\",\"💾\":\"floppy-disk\",\"💿\":\"optical-disk\",\"📀\":\"dvd\",\"🧮\":\"abacus\",\"🎥\":\"movie-camera\",\"🎞\":\"film-frames\",\"📽\":\"film-projector\",\"🎬\":\"clapper-board\",\"📺\":\"television\",\"📷\":\"camera\",\"📸\":\"camera-with-flash\",\"📹\":\"video-camera\",\"📼\":\"videocassette\",\"🔍\":\"magnifying-glass-tilted-left\",\"🔎\":\"magnifying-glass-tilted-right\",\"🕯\":\"candle\",\"💡\":\"light-bulb\",\"🔦\":\"flashlight\",\"🏮\":\"red-paper-lantern\",\"🪔\":\"diya-lamp\",\"📔\":\"notebook-with-decorative-cover\",\"📕\":\"closed-book\",\"📖\":\"open-book\",\"📗\":\"green-book\",\"📘\":\"blue-book\",\"📙\":\"orange-book\",\"📚\":\"books\",\"📓\":\"notebook\",\"📒\":\"ledger\",\"📃\":\"page-with-curl\",\"📜\":\"scroll\",\"📄\":\"page-facing-up\",\"📰\":\"newspaper\",\"🗞\":\"rolled-up-newspaper\",\"📑\":\"bookmark-tabs\",\"🔖\":\"bookmark\",\"🏷\":\"label\",\"💰\":\"money-bag\",\"🪙\":\"coin\",\"💴\":\"yen-banknote\",\"💵\":\"dollar-banknote\",\"💶\":\"euro-banknote\",\"💷\":\"pound-banknote\",\"💸\":\"money-with-wings\",\"💳\":\"credit-card\",\"🧾\":\"receipt\",\"💹\":\"chart-increasing-with-yen\",\"✉\":\"envelope\",\"📧\":\"e-mail\",\"📨\":\"incoming-envelope\",\"📩\":\"envelope-with-arrow\",\"📤\":\"outbox-tray\",\"📥\":\"inbox-tray\",\"📦\":\"package\",\"📫\":\"closed-mailbox-with-raised-flag\",\"📪\":\"closed-mailbox-with-lowered-flag\",\"📬\":\"open-mailbox-with-raised-flag\",\"📭\":\"open-mailbox-with-lowered-flag\",\"📮\":\"postbox\",\"🗳\":\"ballot-box-with-ballot\",\"✏\":\"pencil\",\"✒\":\"black-nib\",\"🖋\":\"fountain-pen\",\"🖊\":\"pen\",\"🖌\":\"paintbrush\",\"🖍\":\"crayon\",\"📝\":\"memo\",\"💼\":\"briefcase\",\"📁\":\"file-folder\",\"📂\":\"open-file-folder\",\"🗂\":\"card-index-dividers\",\"📅\":\"calendar\",\"📆\":\"tear-off-calendar\",\"🗒\":\"spiral-notepad\",\"🗓\":\"spiral-calendar\",\"📇\":\"card-index\",\"📈\":\"chart-increasing\",\"📉\":\"chart-decreasing\",\"📊\":\"bar-chart\",\"📋\":\"clipboard\",\"📌\":\"pushpin\",\"📍\":\"round-pushpin\",\"📎\":\"paperclip\",\"🖇\":\"linked-paperclips\",\"📏\":\"straight-ruler\",\"📐\":\"triangular-ruler\",\"✂\":\"scissors\",\"🗃\":\"card-file-box\",\"🗄\":\"file-cabinet\",\"🗑\":\"wastebasket\",\"🔒\":\"locked\",\"🔓\":\"unlocked\",\"🔏\":\"locked-with-pen\",\"🔐\":\"locked-with-key\",\"🔑\":\"key\",\"🗝\":\"old-key\",\"🔨\":\"hammer\",\"🪓\":\"axe\",\"⛏\":\"pick\",\"⚒\":\"hammer-and-pick\",\"🛠\":\"hammer-and-wrench\",\"🗡\":\"dagger\",\"⚔\":\"crossed-swords\",\"💣\":\"bomb\",\"🪃\":\"boomerang\",\"🏹\":\"bow-and-arrow\",\"🛡\":\"shield\",\"🪚\":\"carpentry-saw\",\"🔧\":\"wrench\",\"🪛\":\"screwdriver\",\"🔩\":\"nut-and-bolt\",\"⚙\":\"gear\",\"🗜\":\"clamp\",\"⚖\":\"balance-scale\",\"🦯\":\"white-cane\",\"🔗\":\"link\",\"⛓\":\"chains\",\"🪝\":\"hook\",\"🧰\":\"toolbox\",\"🧲\":\"magnet\",\"🪜\":\"ladder\",\"⚗\":\"alembic\",\"🧪\":\"test-tube\",\"🧫\":\"petri-dish\",\"🧬\":\"dna\",\"🔬\":\"microscope\",\"🔭\":\"telescope\",\"📡\":\"satellite-antenna\",\"💉\":\"syringe\",\"🩸\":\"drop-of-blood\",\"💊\":\"pill\",\"🩹\":\"adhesive-bandage\",\"🩼\":\"crutch\",\"🩺\":\"stethoscope\",\"🩻\":\"x-ray\",\"🚪\":\"door\",\"🛗\":\"elevator\",\"🪞\":\"mirror\",\"🪟\":\"window\",\"🛏\":\"bed\",\"🛋\":\"couch-and-lamp\",\"🪑\":\"chair\",\"🚽\":\"toilet\",\"🪠\":\"plunger\",\"🚿\":\"shower\",\"🛁\":\"bathtub\",\"🪤\":\"mouse-trap\",\"🪒\":\"razor\",\"🧴\":\"lotion-bottle\",\"🧷\":\"safety-pin\",\"🧹\":\"broom\",\"🧺\":\"basket\",\"🧻\":\"roll-of-paper\",\"🪣\":\"bucket\",\"🧼\":\"soap\",\"🫧\":\"bubbles\",\"🪥\":\"toothbrush\",\"🧽\":\"sponge\",\"🧯\":\"fire-extinguisher\",\"🛒\":\"shopping-cart\",\"🚬\":\"cigarette\",\"⚰\":\"coffin\",\"🪦\":\"headstone\",\"⚱\":\"funeral-urn\",\"🧿\":\"nazar-amulet\",\"🪬\":\"hamsa\",\"🗿\":\"moai\",\"🪧\":\"placard\",\"🪪\":\"identification-card\",\"🏧\":\"atm-sign\",\"🚮\":\"litter-in-bin-sign\",\"🚰\":\"potable-water\",\"♿\":\"wheelchair-symbol\",\"🚹\":\"men-s-room\",\"🚺\":\"women-s-room\",\"🚻\":\"restroom\",\"🚼\":\"baby-symbol\",\"🚾\":\"water-closet\",\"🛂\":\"passport-control\",\"🛃\":\"customs\",\"🛄\":\"baggage-claim\",\"🛅\":\"left-luggage\",\"⚠\":\"warning\",\"🚸\":\"children-crossing\",\"⛔\":\"no-entry\",\"🚫\":\"prohibited\",\"🚳\":\"no-bicycles\",\"🚭\":\"no-smoking\",\"🚯\":\"no-littering\",\"🚱\":\"non-potable-water\",\"🚷\":\"no-pedestrians\",\"📵\":\"no-mobile-phones\",\"🔞\":\"no-one-under-eighteen\",\"☢\":\"radioactive\",\"☣\":\"biohazard\",\"⬆\":\"up-arrow\",\"↗\":\"up-right-arrow\",\"➡\":\"right-arrow\",\"↘\":\"down-right-arrow\",\"⬇\":\"down-arrow\",\"↙\":\"down-left-arrow\",\"⬅\":\"left-arrow\",\"↖\":\"up-left-arrow\",\"↕\":\"up-down-arrow\",\"↔\":\"left-right-arrow\",\"↩\":\"right-arrow-curving-left\",\"↪\":\"left-arrow-curving-right\",\"⤴\":\"right-arrow-curving-up\",\"⤵\":\"right-arrow-curving-down\",\"🔃\":\"clockwise-vertical-arrows\",\"🔄\":\"counterclockwise-arrows-button\",\"🔙\":\"back-arrow\",\"🔚\":\"end-arrow\",\"🔛\":\"on!-arrow\",\"🔜\":\"soon-arrow\",\"🔝\":\"top-arrow\",\"🛐\":\"place-of-worship\",\"⚛\":\"atom-symbol\",\"🕉\":\"om\",\"✡\":\"star-of-david\",\"☸\":\"wheel-of-dharma\",\"☯\":\"yin-yang\",\"✝\":\"latin-cross\",\"☦\":\"orthodox-cross\",\"☪\":\"star-and-crescent\",\"☮\":\"peace-symbol\",\"🕎\":\"menorah\",\"🔯\":\"dotted-six-pointed-star\",\"🪯\":\"⊛-khanda\",\"♈\":\"aries\",\"♉\":\"taurus\",\"♊\":\"gemini\",\"♋\":\"cancer\",\"♌\":\"leo\",\"♍\":\"virgo\",\"♎\":\"libra\",\"♏\":\"scorpio\",\"♐\":\"sagittarius\",\"♑\":\"capricorn\",\"♒\":\"aquarius\",\"♓\":\"pisces\",\"⛎\":\"ophiuchus\",\"🔀\":\"shuffle-tracks-button\",\"🔁\":\"repeat-button\",\"🔂\":\"repeat-single-button\",\"▶\":\"play-button\",\"⏩\":\"fast-forward-button\",\"⏭\":\"next-track-button\",\"⏯\":\"play-or-pause-button\",\"◀\":\"reverse-button\",\"⏪\":\"fast-reverse-button\",\"⏮\":\"last-track-button\",\"🔼\":\"upwards-button\",\"⏫\":\"fast-up-button\",\"🔽\":\"downwards-button\",\"⏬\":\"fast-down-button\",\"⏸\":\"pause-button\",\"⏹\":\"stop-button\",\"⏺\":\"record-button\",\"⏏\":\"eject-button\",\"🎦\":\"cinema\",\"🔅\":\"dim-button\",\"🔆\":\"bright-button\",\"📶\":\"antenna-bars\",\"🛜\":\"⊛-wireless\",\"📳\":\"vibration-mode\",\"📴\":\"mobile-phone-off\",\"♀\":\"female-sign\",\"♂\":\"male-sign\",\"⚧\":\"transgender-symbol\",\"✖\":\"multiply\",\"➕\":\"plus\",\"➖\":\"minus\",\"➗\":\"divide\",\"🟰\":\"heavy-equals-sign\",\"♾\":\"infinity\",\"‼\":\"double-exclamation-mark\",\"⁉\":\"exclamation-question-mark\",\"❓\":\"red-question-mark\",\"❔\":\"white-question-mark\",\"❕\":\"white-exclamation-mark\",\"❗\":\"red-exclamation-mark\",\"〰\":\"wavy-dash\",\"💱\":\"currency-exchange\",\"💲\":\"heavy-dollar-sign\",\"⚕\":\"medical-symbol\",\"♻\":\"recycling-symbol\",\"⚜\":\"fleur-de-lis\",\"🔱\":\"trident-emblem\",\"📛\":\"name-badge\",\"🔰\":\"japanese-symbol-for-beginner\",\"⭕\":\"hollow-red-circle\",\"✅\":\"check-mark-button\",\"☑\":\"check-box-with-check\",\"✔\":\"check-mark\",\"❌\":\"cross-mark\",\"❎\":\"cross-mark-button\",\"➰\":\"curly-loop\",\"➿\":\"double-curly-loop\",\"〽\":\"part-alternation-mark\",\"✳\":\"eight-spoked-asterisk\",\"✴\":\"eight-pointed-star\",\"❇\":\"sparkle\",\"©\":\"copyright\",\"®\":\"registered\",\"™\":\"trade-mark\",\"#️⃣\":\"keycap-#\",\"*️⃣\":\"keycap-*\",\"0️⃣\":\"keycap-0\",\"1️⃣\":\"keycap-1\",\"2️⃣\":\"keycap-2\",\"3️⃣\":\"keycap-3\",\"4️⃣\":\"keycap-4\",\"5️⃣\":\"keycap-5\",\"6️⃣\":\"keycap-6\",\"7️⃣\":\"keycap-7\",\"8️⃣\":\"keycap-8\",\"9️⃣\":\"keycap-9\",\"🔟\":\"keycap-10\",\"🔠\":\"input-latin-uppercase\",\"🔡\":\"input-latin-lowercase\",\"🔢\":\"input-numbers\",\"🔣\":\"input-symbols\",\"🔤\":\"input-latin-letters\",\"🅰\":\"a-button-(blood-type)\",\"🆎\":\"ab-button-(blood-type)\",\"🅱\":\"b-button-(blood-type)\",\"🆑\":\"cl-button\",\"🆒\":\"cool-button\",\"🆓\":\"free-button\",\"ℹ\":\"information\",\"🆔\":\"id-button\",\"Ⓜ\":\"circled-m\",\"🆕\":\"new-button\",\"🆖\":\"ng-button\",\"🅾\":\"o-button-(blood-type)\",\"🆗\":\"ok-button\",\"🅿\":\"p-button\",\"🆘\":\"sos-button\",\"🆙\":\"up!-button\",\"🆚\":\"vs-button\",\"🈁\":\"japanese-here-button\",\"🈂\":\"japanese-service-charge-button\",\"🈷\":\"japanese-monthly-amount-button\",\"🈶\":\"japanese-not-free-of-charge-button\",\"🈯\":\"japanese-reserved-button\",\"🉐\":\"japanese-bargain-button\",\"🈹\":\"japanese-discount-button\",\"🈚\":\"japanese-free-of-charge-button\",\"🈲\":\"japanese-prohibited-button\",\"🉑\":\"japanese-acceptable-button\",\"🈸\":\"japanese-application-button\",\"🈴\":\"japanese-passing-grade-button\",\"🈳\":\"japanese-vacancy-button\",\"㊗\":\"japanese-congratulations-button\",\"㊙\":\"japanese-secret-button\",\"🈺\":\"japanese-open-for-business-button\",\"🈵\":\"japanese-no-vacancy-button\",\"🔴\":\"red-circle\",\"🟠\":\"orange-circle\",\"🟡\":\"yellow-circle\",\"🟢\":\"green-circle\",\"🔵\":\"blue-circle\",\"🟣\":\"purple-circle\",\"🟤\":\"brown-circle\",\"⚫\":\"black-circle\",\"⚪\":\"white-circle\",\"🟥\":\"red-square\",\"🟧\":\"orange-square\",\"🟨\":\"yellow-square\",\"🟩\":\"green-square\",\"🟦\":\"blue-square\",\"🟪\":\"purple-square\",\"🟫\":\"brown-square\",\"⬛\":\"black-large-square\",\"⬜\":\"white-large-square\",\"◼\":\"black-medium-square\",\"◻\":\"white-medium-square\",\"◾\":\"black-medium-small-square\",\"◽\":\"white-medium-small-square\",\"▪\":\"black-small-square\",\"▫\":\"white-small-square\",\"🔶\":\"large-orange-diamond\",\"🔷\":\"large-blue-diamond\",\"🔸\":\"small-orange-diamond\",\"🔹\":\"small-blue-diamond\",\"🔺\":\"red-triangle-pointed-up\",\"🔻\":\"red-triangle-pointed-down\",\"💠\":\"diamond-with-a-dot\",\"🔘\":\"radio-button\",\"🔳\":\"white-square-button\",\"🔲\":\"black-square-button\",\"🏁\":\"chequered-flag\",\"🚩\":\"triangular-flag\",\"🎌\":\"crossed-flags\",\"🏴\":\"black-flag\",\"🏳\":\"white-flag\",\"🏳️‍🌈\":\"rainbow-flag\",\"🏳️‍⚧️\":\"transgender-flag\",\"🏴‍☠️\":\"pirate-flag\",\"🇦🇨\":\"flag-ascension-island\",\"🇦🇩\":\"flag-andorra\",\"🇦🇪\":\"flag-united-arab-emirates\",\"🇦🇫\":\"flag-afghanistan\",\"🇦🇬\":\"flag-antigua-and-barbuda\",\"🇦🇮\":\"flag-anguilla\",\"🇦🇱\":\"flag-albania\",\"🇦🇲\":\"flag-armenia\",\"🇦🇴\":\"flag-angola\",\"🇦🇶\":\"flag-antarctica\",\"🇦🇷\":\"flag-argentina\",\"🇦🇸\":\"flag-american-samoa\",\"🇦🇹\":\"flag-austria\",\"🇦🇺\":\"flag-australia\",\"🇦🇼\":\"flag-aruba\",\"🇦🇽\":\"flag-åland-islands\",\"🇦🇿\":\"flag-azerbaijan\",\"🇧🇦\":\"flag-bosnia-and-herzegovina\",\"🇧🇧\":\"flag-barbados\",\"🇧🇩\":\"flag-bangladesh\",\"🇧🇪\":\"flag-belgium\",\"🇧🇫\":\"flag-burkina-faso\",\"🇧🇬\":\"flag-bulgaria\",\"🇧🇭\":\"flag-bahrain\",\"🇧🇮\":\"flag-burundi\",\"🇧🇯\":\"flag-benin\",\"🇧🇱\":\"flag-st-barthelemy\",\"🇧🇲\":\"flag-bermuda\",\"🇧🇳\":\"flag-brunei\",\"🇧🇴\":\"flag-bolivia\",\"🇧🇶\":\"flag-caribbean-netherlands\",\"🇧🇷\":\"flag-brazil\",\"🇧🇸\":\"flag-bahamas\",\"🇧🇹\":\"flag-bhutan\",\"🇧🇻\":\"flag-bouvet-island\",\"🇧🇼\":\"flag-botswana\",\"🇧🇾\":\"flag-belarus\",\"🇧🇿\":\"flag-belize\",\"🇨🇦\":\"flag-canada\",\"🇨🇨\":\"flag-cocos-(keeling)-islands\",\"🇨🇩\":\"flag-congo---kinshasa\",\"🇨🇫\":\"flag-central-african-republic\",\"🇨🇬\":\"flag-congo---brazzaville\",\"🇨🇭\":\"flag-switzerland\",\"🇨🇮\":\"flag-côte-d-ivoire\",\"🇨🇰\":\"flag-cook-islands\",\"🇨🇱\":\"flag-chile\",\"🇨🇲\":\"flag-cameroon\",\"🇨🇳\":\"flag-china\",\"🇨🇴\":\"flag-colombia\",\"🇨🇵\":\"flag-clipperton-island\",\"🇨🇷\":\"flag-costa-rica\",\"🇨🇺\":\"flag-cuba\",\"🇨🇻\":\"flag-cape-verde\",\"🇨🇼\":\"flag-curaçao\",\"🇨🇽\":\"flag-christmas-island\",\"🇨🇾\":\"flag-cyprus\",\"🇨🇿\":\"flag-czechia\",\"🇩🇪\":\"flag-germany\",\"🇩🇬\":\"flag-diego-garcia\",\"🇩🇯\":\"flag-djibouti\",\"🇩🇰\":\"flag-denmark\",\"🇩🇲\":\"flag-dominica\",\"🇩🇴\":\"flag-dominican-republic\",\"🇩🇿\":\"flag-algeria\",\"🇪🇦\":\"flag-ceuta-and-melilla\",\"🇪🇨\":\"flag-ecuador\",\"🇪🇪\":\"flag-estonia\",\"🇪🇬\":\"flag-egypt\",\"🇪🇭\":\"flag-western-sahara\",\"🇪🇷\":\"flag-eritrea\",\"🇪🇸\":\"flag-spain\",\"🇪🇹\":\"flag-ethiopia\",\"🇪🇺\":\"flag-european-union\",\"🇫🇮\":\"flag-finland\",\"🇫🇯\":\"flag-fiji\",\"🇫🇰\":\"flag-falkland-islands\",\"🇫🇲\":\"flag-micronesia\",\"🇫🇴\":\"flag-faroe-islands\",\"🇫🇷\":\"flag-france\",\"🇬🇦\":\"flag-gabon\",\"🇬🇧\":\"flag-united-kingdom\",\"🇬🇩\":\"flag-grenada\",\"🇬🇪\":\"flag-georgia\",\"🇬🇫\":\"flag-french-guiana\",\"🇬🇬\":\"flag-guernsey\",\"🇬🇭\":\"flag-ghana\",\"🇬🇮\":\"flag-gibraltar\",\"🇬🇱\":\"flag-greenland\",\"🇬🇲\":\"flag-gambia\",\"🇬🇳\":\"flag-guinea\",\"🇬🇵\":\"flag-guadeloupe\",\"🇬🇶\":\"flag-equatorial-guinea\",\"🇬🇷\":\"flag-greece\",\"🇬🇸\":\"flag-south-georgia-and-south-sandwich-islands\",\"🇬🇹\":\"flag-guatemala\",\"🇬🇺\":\"flag-guam\",\"🇬🇼\":\"flag-guinea-bissau\",\"🇬🇾\":\"flag-guyana\",\"🇭🇰\":\"flag-hong-kong-sar-china\",\"🇭🇲\":\"flag-heard-and-mcdonald-islands\",\"🇭🇳\":\"flag-honduras\",\"🇭🇷\":\"flag-croatia\",\"🇭🇹\":\"flag-haiti\",\"🇭🇺\":\"flag-hungary\",\"🇮🇨\":\"flag-canary-islands\",\"🇮🇩\":\"flag-indonesia\",\"🇮🇪\":\"flag-ireland\",\"🇮🇱\":\"flag-israel\",\"🇮🇲\":\"flag-isle-of-man\",\"🇮🇳\":\"flag-india\",\"🇮🇴\":\"flag-british-indian-ocean-territory\",\"🇮🇶\":\"flag-iraq\",\"🇮🇷\":\"flag-iran\",\"🇮🇸\":\"flag-iceland\",\"🇮🇹\":\"flag-italy\",\"🇯🇪\":\"flag-jersey\",\"🇯🇲\":\"flag-jamaica\",\"🇯🇴\":\"flag-jordan\",\"🇯🇵\":\"flag-japan\",\"🇰🇪\":\"flag-kenya\",\"🇰🇬\":\"flag-kyrgyzstan\",\"🇰🇭\":\"flag-cambodia\",\"🇰🇮\":\"flag-kiribati\",\"🇰🇲\":\"flag-comoros\",\"🇰🇳\":\"flag-st-kitts-and-nevis\",\"🇰🇵\":\"flag-north-korea\",\"🇰🇷\":\"flag-south-korea\",\"🇰🇼\":\"flag-kuwait\",\"🇰🇾\":\"flag-cayman-islands\",\"🇰🇿\":\"flag-kazakhstan\",\"🇱🇦\":\"flag-laos\",\"🇱🇧\":\"flag-lebanon\",\"🇱🇨\":\"flag-st-lucia\",\"🇱🇮\":\"flag-liechtenstein\",\"🇱🇰\":\"flag-sri-lanka\",\"🇱🇷\":\"flag-liberia\",\"🇱🇸\":\"flag-lesotho\",\"🇱🇹\":\"flag-lithuania\",\"🇱🇺\":\"flag-luxembourg\",\"🇱🇻\":\"flag-latvia\",\"🇱🇾\":\"flag-libya\",\"🇲🇦\":\"flag-morocco\",\"🇲🇨\":\"flag-monaco\",\"🇲🇩\":\"flag-moldova\",\"🇲🇪\":\"flag-montenegro\",\"🇲🇫\":\"flag-st-martin\",\"🇲🇬\":\"flag-madagascar\",\"🇲🇭\":\"flag-marshall-islands\",\"🇲🇰\":\"flag-north-macedonia\",\"🇲🇱\":\"flag-mali\",\"🇲🇲\":\"flag-myanmar-(burma)\",\"🇲🇳\":\"flag-mongolia\",\"🇲🇴\":\"flag-macao-sar-china\",\"🇲🇵\":\"flag-northern-mariana-islands\",\"🇲🇶\":\"flag-martinique\",\"🇲🇷\":\"flag-mauritania\",\"🇲🇸\":\"flag-montserrat\",\"🇲🇹\":\"flag-malta\",\"🇲🇺\":\"flag-mauritius\",\"🇲🇻\":\"flag-maldives\",\"🇲🇼\":\"flag-malawi\",\"🇲🇽\":\"flag-mexico\",\"🇲🇾\":\"flag-malaysia\",\"🇲🇿\":\"flag-mozambique\",\"🇳🇦\":\"flag-namibia\",\"🇳🇨\":\"flag-new-caledonia\",\"🇳🇪\":\"flag-niger\",\"🇳🇫\":\"flag-norfolk-island\",\"🇳🇬\":\"flag-nigeria\",\"🇳🇮\":\"flag-nicaragua\",\"🇳🇱\":\"flag-netherlands\",\"🇳🇴\":\"flag-norway\",\"🇳🇵\":\"flag-nepal\",\"🇳🇷\":\"flag-nauru\",\"🇳🇺\":\"flag-niue\",\"🇳🇿\":\"flag-new-zealand\",\"🇴🇲\":\"flag-oman\",\"🇵🇦\":\"flag-panama\",\"🇵🇪\":\"flag-peru\",\"🇵🇫\":\"flag-french-polynesia\",\"🇵🇬\":\"flag-papua-new-guinea\",\"🇵🇭\":\"flag-philippines\",\"🇵🇰\":\"flag-pakistan\",\"🇵🇱\":\"flag-poland\",\"🇵🇲\":\"flag-st-pierre-and-miquelon\",\"🇵🇳\":\"flag-pitcairn-islands\",\"🇵🇷\":\"flag-puerto-rico\",\"🇵🇸\":\"flag-palestinian-territories\",\"🇵🇹\":\"flag-portugal\",\"🇵🇼\":\"flag-palau\",\"🇵🇾\":\"flag-paraguay\",\"🇶🇦\":\"flag-qatar\",\"🇷🇪\":\"flag-reunion\",\"🇷🇴\":\"flag-romania\",\"🇷🇸\":\"flag-serbia\",\"🇷🇺\":\"flag-russia\",\"🇷🇼\":\"flag-rwanda\",\"🇸🇦\":\"flag-saudi-arabia\",\"🇸🇧\":\"flag-solomon-islands\",\"🇸🇨\":\"flag-seychelles\",\"🇸🇩\":\"flag-sudan\",\"🇸🇪\":\"flag-sweden\",\"🇸🇬\":\"flag-singapore\",\"🇸🇭\":\"flag-st-helena\",\"🇸🇮\":\"flag-slovenia\",\"🇸🇯\":\"flag-svalbard-and-jan-mayen\",\"🇸🇰\":\"flag-slovakia\",\"🇸🇱\":\"flag-sierra-leone\",\"🇸🇲\":\"flag-san-marino\",\"🇸🇳\":\"flag-senegal\",\"🇸🇴\":\"flag-somalia\",\"🇸🇷\":\"flag-suriname\",\"🇸🇸\":\"flag-south-sudan\",\"🇸🇹\":\"flag-são-tome-and-príncipe\",\"🇸🇻\":\"flag-el-salvador\",\"🇸🇽\":\"flag-sint-maarten\",\"🇸🇾\":\"flag-syria\",\"🇸🇿\":\"flag-eswatini\",\"🇹🇦\":\"flag-tristan-da-cunha\",\"🇹🇨\":\"flag-turks-and-caicos-islands\",\"🇹🇩\":\"flag-chad\",\"🇹🇫\":\"flag-french-southern-territories\",\"🇹🇬\":\"flag-togo\",\"🇹🇭\":\"flag-thailand\",\"🇹🇯\":\"flag-tajikistan\",\"🇹🇰\":\"flag-tokelau\",\"🇹🇱\":\"flag-timor-leste\",\"🇹🇲\":\"flag-turkmenistan\",\"🇹🇳\":\"flag-tunisia\",\"🇹🇴\":\"flag-tonga\",\"🇹🇷\":\"flag-turkey\",\"🇹🇹\":\"flag-trinidad-and-tobago\",\"🇹🇻\":\"flag-tuvalu\",\"🇹🇼\":\"flag-taiwan\",\"🇹🇿\":\"flag-tanzania\",\"🇺🇦\":\"flag-ukraine\",\"🇺🇬\":\"flag-uganda\",\"🇺🇲\":\"flag-us-outlying-islands\",\"🇺🇳\":\"flag-united-nations\",\"🇺🇸\":\"flag-united-states\",\"🇺🇾\":\"flag-uruguay\",\"🇺🇿\":\"flag-uzbekistan\",\"🇻🇦\":\"flag-vatican-city\",\"🇻🇨\":\"flag-st-vincent-and-grenadines\",\"🇻🇪\":\"flag-venezuela\",\"🇻🇬\":\"flag-british-virgin-islands\",\"🇻🇮\":\"flag-us-virgin-islands\",\"🇻🇳\":\"flag-vietnam\",\"🇻🇺\":\"flag-vanuatu\",\"🇼🇫\":\"flag-wallis-and-futuna\",\"🇼🇸\":\"flag-samoa\",\"🇽🇰\":\"flag-kosovo\",\"🇾🇪\":\"flag-yemen\",\"🇾🇹\":\"flag-mayotte\",\"🇿🇦\":\"flag-south-africa\",\"🇿🇲\":\"flag-zambia\",\"🇿🇼\":\"flag-zimbabwe\",\"🏴󠁧󠁢󠁥󠁮󠁧󠁿\":\"flag-england\",\"🏴󠁧󠁢󠁳󠁣󠁴󠁿\":\"flag-scotland\",\"🏴󠁧󠁢󠁷󠁬󠁳󠁿\":\"flag-wales\"},Jn=Object.keys(Kn),Yn='\\n// This Source Code Form is subject to the terms of the Mozilla Public\\n// License, v. 2.0. If a copy of the MPL was not distributed with this\\n// file, You can obtain one at https://mozilla.org/MPL/2.0/.\\n\\n// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat,\\n// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported.\\n\\n// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/.\\n\\n// ===BEGIN ICANN DOMAINS===\\n\\n// ac : http://nic.ac/rules.htm\\nac\\ncom.ac\\nedu.ac\\ngov.ac\\nnet.ac\\nmil.ac\\norg.ac\\n\\n// ad : https://en.wikipedia.org/wiki/.ad\\nad\\nnom.ad\\n\\n// ae : https://tdra.gov.ae/en/aeda/ae-policies\\nae\\nco.ae\\nnet.ae\\norg.ae\\nsch.ae\\nac.ae\\ngov.ae\\nmil.ae\\n\\n// aero : see https://www.information.aero/index.php?id=66\\naero\\naccident-investigation.aero\\naccident-prevention.aero\\naerobatic.aero\\naeroclub.aero\\naerodrome.aero\\nagents.aero\\naircraft.aero\\nairline.aero\\nairport.aero\\nair-surveillance.aero\\nairtraffic.aero\\nair-traffic-control.aero\\nambulance.aero\\namusement.aero\\nassociation.aero\\nauthor.aero\\nballooning.aero\\nbroker.aero\\ncaa.aero\\ncargo.aero\\ncatering.aero\\ncertification.aero\\nchampionship.aero\\ncharter.aero\\ncivilaviation.aero\\nclub.aero\\nconference.aero\\nconsultant.aero\\nconsulting.aero\\ncontrol.aero\\ncouncil.aero\\ncrew.aero\\ndesign.aero\\ndgca.aero\\neducator.aero\\nemergency.aero\\nengine.aero\\nengineer.aero\\nentertainment.aero\\nequipment.aero\\nexchange.aero\\nexpress.aero\\nfederation.aero\\nflight.aero\\nfuel.aero\\ngliding.aero\\ngovernment.aero\\ngroundhandling.aero\\ngroup.aero\\nhanggliding.aero\\nhomebuilt.aero\\ninsurance.aero\\njournal.aero\\njournalist.aero\\nleasing.aero\\nlogistics.aero\\nmagazine.aero\\nmaintenance.aero\\nmedia.aero\\nmicrolight.aero\\nmodelling.aero\\nnavigation.aero\\nparachuting.aero\\nparagliding.aero\\npassenger-association.aero\\npilot.aero\\npress.aero\\nproduction.aero\\nrecreation.aero\\nrepbody.aero\\nres.aero\\nresearch.aero\\nrotorcraft.aero\\nsafety.aero\\nscientist.aero\\nservices.aero\\nshow.aero\\nskydiving.aero\\nsoftware.aero\\nstudent.aero\\ntrader.aero\\ntrading.aero\\ntrainer.aero\\nunion.aero\\nworkinggroup.aero\\nworks.aero\\n\\n// af : http://www.nic.af/help.jsp\\naf\\ngov.af\\ncom.af\\norg.af\\nnet.af\\nedu.af\\n\\n// ag : http://www.nic.ag/prices.htm\\nag\\ncom.ag\\norg.ag\\nnet.ag\\nco.ag\\nnom.ag\\n\\n// ai : http://nic.com.ai/\\nai\\noff.ai\\ncom.ai\\nnet.ai\\norg.ai\\n\\n// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31\\nal\\ncom.al\\nedu.al\\ngov.al\\nmil.al\\nnet.al\\norg.al\\n\\n// am : https://www.amnic.net/policy/en/Policy_EN.pdf\\nam\\nco.am\\ncom.am\\ncommune.am\\nnet.am\\norg.am\\n\\n// ao : https://en.wikipedia.org/wiki/.ao\\n// http://www.dns.ao/REGISTR.DOC\\nao\\ned.ao\\ngv.ao\\nog.ao\\nco.ao\\npb.ao\\nit.ao\\n\\n// aq : https://en.wikipedia.org/wiki/.aq\\naq\\n\\n// ar : https://nic.ar/es/nic-argentina/normativa\\nar\\nbet.ar\\ncom.ar\\ncoop.ar\\nedu.ar\\ngob.ar\\ngov.ar\\nint.ar\\nmil.ar\\nmusica.ar\\nmutual.ar\\nnet.ar\\norg.ar\\nsenasa.ar\\ntur.ar\\n\\n// arpa : https://en.wikipedia.org/wiki/.arpa\\n// Confirmed by registry <iana-questions@icann.org> 2008-06-18\\narpa\\ne164.arpa\\nin-addr.arpa\\nip6.arpa\\niris.arpa\\nuri.arpa\\nurn.arpa\\n\\n// as : https://en.wikipedia.org/wiki/.as\\nas\\ngov.as\\n\\n// asia : https://en.wikipedia.org/wiki/.asia\\nasia\\n\\n// at : https://en.wikipedia.org/wiki/.at\\n// Confirmed by registry <it@nic.at> 2008-06-17\\nat\\nac.at\\nco.at\\ngv.at\\nor.at\\nsth.ac.at\\n\\n// au : https://en.wikipedia.org/wiki/.au\\n// http://www.auda.org.au/\\nau\\n// 2LDs\\ncom.au\\nnet.au\\norg.au\\nedu.au\\ngov.au\\nasn.au\\nid.au\\n// Historic 2LDs (closed to new registration, but sites still exist)\\ninfo.au\\nconf.au\\noz.au\\n// CGDNs - http://www.cgdn.org.au/\\nact.au\\nnsw.au\\nnt.au\\nqld.au\\nsa.au\\ntas.au\\nvic.au\\nwa.au\\n// 3LDs\\nact.edu.au\\ncatholic.edu.au\\n// eq.edu.au - Removed at the request of the Queensland Department of Education\\nnsw.edu.au\\nnt.edu.au\\nqld.edu.au\\nsa.edu.au\\ntas.edu.au\\nvic.edu.au\\nwa.edu.au\\n// act.gov.au  Bug 984824 - Removed at request of Greg Tankard\\n// nsw.gov.au  Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au>\\n// nt.gov.au  Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au>\\nqld.gov.au\\nsa.gov.au\\ntas.gov.au\\nvic.gov.au\\nwa.gov.au\\n// 4LDs\\n// education.tas.edu.au - Removed at the request of the Department of Education Tasmania\\nschools.nsw.edu.au\\n\\n// aw : https://en.wikipedia.org/wiki/.aw\\naw\\ncom.aw\\n\\n// ax : https://en.wikipedia.org/wiki/.ax\\nax\\n\\n// az : https://en.wikipedia.org/wiki/.az\\naz\\ncom.az\\nnet.az\\nint.az\\ngov.az\\norg.az\\nedu.az\\ninfo.az\\npp.az\\nmil.az\\nname.az\\npro.az\\nbiz.az\\n\\n// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf\\nba\\ncom.ba\\nedu.ba\\ngov.ba\\nmil.ba\\nnet.ba\\norg.ba\\n\\n// bb : https://en.wikipedia.org/wiki/.bb\\nbb\\nbiz.bb\\nco.bb\\ncom.bb\\nedu.bb\\ngov.bb\\ninfo.bb\\nnet.bb\\norg.bb\\nstore.bb\\ntv.bb\\n\\n// bd : https://en.wikipedia.org/wiki/.bd\\n*.bd\\n\\n// be : https://en.wikipedia.org/wiki/.be\\n// Confirmed by registry <tech@dns.be> 2008-06-08\\nbe\\nac.be\\n\\n// bf : https://en.wikipedia.org/wiki/.bf\\nbf\\ngov.bf\\n\\n// bg : https://en.wikipedia.org/wiki/.bg\\n// https://www.register.bg/user/static/rules/en/index.html\\nbg\\na.bg\\nb.bg\\nc.bg\\nd.bg\\ne.bg\\nf.bg\\ng.bg\\nh.bg\\ni.bg\\nj.bg\\nk.bg\\nl.bg\\nm.bg\\nn.bg\\no.bg\\np.bg\\nq.bg\\nr.bg\\ns.bg\\nt.bg\\nu.bg\\nv.bg\\nw.bg\\nx.bg\\ny.bg\\nz.bg\\n0.bg\\n1.bg\\n2.bg\\n3.bg\\n4.bg\\n5.bg\\n6.bg\\n7.bg\\n8.bg\\n9.bg\\n\\n// bh : https://en.wikipedia.org/wiki/.bh\\nbh\\ncom.bh\\nedu.bh\\nnet.bh\\norg.bh\\ngov.bh\\n\\n// bi : https://en.wikipedia.org/wiki/.bi\\n// http://whois.nic.bi/\\nbi\\nco.bi\\ncom.bi\\nedu.bi\\nor.bi\\norg.bi\\n\\n// biz : https://en.wikipedia.org/wiki/.biz\\nbiz\\n\\n// bj : https://nic.bj/bj-suffixes.txt\\n// submitted by registry <contact@nic.bj>\\nbj\\nafrica.bj\\nagro.bj\\narchitectes.bj\\nassur.bj\\navocats.bj\\nco.bj\\ncom.bj\\neco.bj\\necono.bj\\nedu.bj\\ninfo.bj\\nloisirs.bj\\nmoney.bj\\nnet.bj\\norg.bj\\note.bj\\nresto.bj\\nrestaurant.bj\\ntourism.bj\\nuniv.bj\\n\\n// bm : http://www.bermudanic.bm/dnr-text.txt\\nbm\\ncom.bm\\nedu.bm\\ngov.bm\\nnet.bm\\norg.bm\\n\\n// bn : http://www.bnnic.bn/faqs\\nbn\\ncom.bn\\nedu.bn\\ngov.bn\\nnet.bn\\norg.bn\\n\\n// bo : https://nic.bo/delegacion2015.php#h-1.10\\nbo\\ncom.bo\\nedu.bo\\ngob.bo\\nint.bo\\norg.bo\\nnet.bo\\nmil.bo\\ntv.bo\\nweb.bo\\n// Social Domains\\nacademia.bo\\nagro.bo\\narte.bo\\nblog.bo\\nbolivia.bo\\nciencia.bo\\ncooperativa.bo\\ndemocracia.bo\\ndeporte.bo\\necologia.bo\\neconomia.bo\\nempresa.bo\\nindigena.bo\\nindustria.bo\\ninfo.bo\\nmedicina.bo\\nmovimiento.bo\\nmusica.bo\\nnatural.bo\\nnombre.bo\\nnoticias.bo\\npatria.bo\\npolitica.bo\\nprofesional.bo\\nplurinacional.bo\\npueblo.bo\\nrevista.bo\\nsalud.bo\\ntecnologia.bo\\ntksat.bo\\ntransporte.bo\\nwiki.bo\\n\\n// br : http://registro.br/dominio/categoria.html\\n// Submitted by registry <fneves@registro.br>\\nbr\\n9guacu.br\\nabc.br\\nadm.br\\nadv.br\\nagr.br\\naju.br\\nam.br\\nanani.br\\naparecida.br\\napp.br\\narq.br\\nart.br\\nato.br\\nb.br\\nbarueri.br\\nbelem.br\\nbhz.br\\nbib.br\\nbio.br\\nblog.br\\nbmd.br\\nboavista.br\\nbsb.br\\ncampinagrande.br\\ncampinas.br\\ncaxias.br\\ncim.br\\ncng.br\\ncnt.br\\ncom.br\\ncontagem.br\\ncoop.br\\ncoz.br\\ncri.br\\ncuiaba.br\\ncuritiba.br\\ndef.br\\ndes.br\\ndet.br\\ndev.br\\necn.br\\neco.br\\nedu.br\\nemp.br\\nenf.br\\neng.br\\nesp.br\\netc.br\\neti.br\\nfar.br\\nfeira.br\\nflog.br\\nfloripa.br\\nfm.br\\nfnd.br\\nfortal.br\\nfot.br\\nfoz.br\\nfst.br\\ng12.br\\ngeo.br\\nggf.br\\ngoiania.br\\ngov.br\\n// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil\\nac.gov.br\\nal.gov.br\\nam.gov.br\\nap.gov.br\\nba.gov.br\\nce.gov.br\\ndf.gov.br\\nes.gov.br\\ngo.gov.br\\nma.gov.br\\nmg.gov.br\\nms.gov.br\\nmt.gov.br\\npa.gov.br\\npb.gov.br\\npe.gov.br\\npi.gov.br\\npr.gov.br\\nrj.gov.br\\nrn.gov.br\\nro.gov.br\\nrr.gov.br\\nrs.gov.br\\nsc.gov.br\\nse.gov.br\\nsp.gov.br\\nto.gov.br\\ngru.br\\nimb.br\\nind.br\\ninf.br\\njab.br\\njampa.br\\njdf.br\\njoinville.br\\njor.br\\njus.br\\nleg.br\\nlel.br\\nlog.br\\nlondrina.br\\nmacapa.br\\nmaceio.br\\nmanaus.br\\nmaringa.br\\nmat.br\\nmed.br\\nmil.br\\nmorena.br\\nmp.br\\nmus.br\\nnatal.br\\nnet.br\\nniteroi.br\\n*.nom.br\\nnot.br\\nntr.br\\nodo.br\\nong.br\\norg.br\\nosasco.br\\npalmas.br\\npoa.br\\nppg.br\\npro.br\\npsc.br\\npsi.br\\npvh.br\\nqsl.br\\nradio.br\\nrec.br\\nrecife.br\\nrep.br\\nribeirao.br\\nrio.br\\nriobranco.br\\nriopreto.br\\nsalvador.br\\nsampa.br\\nsantamaria.br\\nsantoandre.br\\nsaobernardo.br\\nsaogonca.br\\nseg.br\\nsjc.br\\nslg.br\\nslz.br\\nsorocaba.br\\nsrv.br\\ntaxi.br\\ntc.br\\ntec.br\\nteo.br\\nthe.br\\ntmp.br\\ntrd.br\\ntur.br\\ntv.br\\nudi.br\\nvet.br\\nvix.br\\nvlog.br\\nwiki.br\\nzlg.br\\n\\n// bs : http://www.nic.bs/rules.html\\nbs\\ncom.bs\\nnet.bs\\norg.bs\\nedu.bs\\ngov.bs\\n\\n// bt : https://en.wikipedia.org/wiki/.bt\\nbt\\ncom.bt\\nedu.bt\\ngov.bt\\nnet.bt\\norg.bt\\n\\n// bv : No registrations at this time.\\n// Submitted by registry <jarle@uninett.no>\\nbv\\n\\n// bw : https://en.wikipedia.org/wiki/.bw\\n// http://www.gobin.info/domainname/bw.doc\\n// list of other 2nd level tlds ?\\nbw\\nco.bw\\norg.bw\\n\\n// by : https://en.wikipedia.org/wiki/.by\\n// http://tld.by/rules_2006_en.html\\n// list of other 2nd level tlds ?\\nby\\ngov.by\\nmil.by\\n// Official information does not indicate that com.by is a reserved\\n// second-level domain, but it\\'s being used as one (see www.google.com.by and\\n// www.yahoo.com.by, for example), so we list it here for safety\\'s sake.\\ncom.by\\n\\n// http://hoster.by/\\nof.by\\n\\n// bz : https://en.wikipedia.org/wiki/.bz\\n// http://www.belizenic.bz/\\nbz\\ncom.bz\\nnet.bz\\norg.bz\\nedu.bz\\ngov.bz\\n\\n// ca : https://en.wikipedia.org/wiki/.ca\\nca\\n// ca geographical names\\nab.ca\\nbc.ca\\nmb.ca\\nnb.ca\\nnf.ca\\nnl.ca\\nns.ca\\nnt.ca\\nnu.ca\\non.ca\\npe.ca\\nqc.ca\\nsk.ca\\nyk.ca\\n// gc.ca: https://en.wikipedia.org/wiki/.gc.ca\\n// see also: http://registry.gc.ca/en/SubdomainFAQ\\ngc.ca\\n\\n// cat : https://en.wikipedia.org/wiki/.cat\\ncat\\n\\n// cc : https://en.wikipedia.org/wiki/.cc\\ncc\\n\\n// cd : https://en.wikipedia.org/wiki/.cd\\n// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1\\ncd\\ngov.cd\\n\\n// cf : https://en.wikipedia.org/wiki/.cf\\ncf\\n\\n// cg : https://en.wikipedia.org/wiki/.cg\\ncg\\n\\n// ch : https://en.wikipedia.org/wiki/.ch\\nch\\n\\n// ci : https://en.wikipedia.org/wiki/.ci\\n// http://www.nic.ci/index.php?page=charte\\nci\\norg.ci\\nor.ci\\ncom.ci\\nco.ci\\nedu.ci\\ned.ci\\nac.ci\\nnet.ci\\ngo.ci\\nasso.ci\\naéroport.ci\\nint.ci\\npresse.ci\\nmd.ci\\ngouv.ci\\n\\n// ck : https://en.wikipedia.org/wiki/.ck\\n*.ck\\n!www.ck\\n\\n// cl : https://www.nic.cl\\n// Confirmed by .CL registry <hsalgado@nic.cl>\\ncl\\nco.cl\\ngob.cl\\ngov.cl\\nmil.cl\\n\\n// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927\\ncm\\nco.cm\\ncom.cm\\ngov.cm\\nnet.cm\\n\\n// cn : https://en.wikipedia.org/wiki/.cn\\n// Submitted by registry <tanyaling@cnnic.cn>\\ncn\\nac.cn\\ncom.cn\\nedu.cn\\ngov.cn\\nnet.cn\\norg.cn\\nmil.cn\\n公司.cn\\n网络.cn\\n網絡.cn\\n// cn geographic names\\nah.cn\\nbj.cn\\ncq.cn\\nfj.cn\\ngd.cn\\ngs.cn\\ngz.cn\\ngx.cn\\nha.cn\\nhb.cn\\nhe.cn\\nhi.cn\\nhl.cn\\nhn.cn\\njl.cn\\njs.cn\\njx.cn\\nln.cn\\nnm.cn\\nnx.cn\\nqh.cn\\nsc.cn\\nsd.cn\\nsh.cn\\nsn.cn\\nsx.cn\\ntj.cn\\nxj.cn\\nxz.cn\\nyn.cn\\nzj.cn\\nhk.cn\\nmo.cn\\ntw.cn\\n\\n// co : https://en.wikipedia.org/wiki/.co\\n// Submitted by registry <tecnico@uniandes.edu.co>\\nco\\narts.co\\ncom.co\\nedu.co\\nfirm.co\\ngov.co\\ninfo.co\\nint.co\\nmil.co\\nnet.co\\nnom.co\\norg.co\\nrec.co\\nweb.co\\n\\n// com : https://en.wikipedia.org/wiki/.com\\ncom\\n\\n// coop : https://en.wikipedia.org/wiki/.coop\\ncoop\\n\\n// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do\\ncr\\nac.cr\\nco.cr\\ned.cr\\nfi.cr\\ngo.cr\\nor.cr\\nsa.cr\\n\\n// cu : https://en.wikipedia.org/wiki/.cu\\ncu\\ncom.cu\\nedu.cu\\norg.cu\\nnet.cu\\ngov.cu\\ninf.cu\\n\\n// cv : https://en.wikipedia.org/wiki/.cv\\n// cv : http://www.dns.cv/tldcv_portal/do?com=DS;5446457100;111;+PAGE(4000018)+K-CAT-CODIGO(RDOM)+RCNT(100); <- registration rules\\ncv\\ncom.cv\\nedu.cv\\nint.cv\\nnome.cv\\norg.cv\\n\\n// cw : http://www.una.cw/cw_registry/\\n// Confirmed by registry <registry@una.net> 2013-03-26\\ncw\\ncom.cw\\nedu.cw\\nnet.cw\\norg.cw\\n\\n// cx : https://en.wikipedia.org/wiki/.cx\\n// list of other 2nd level tlds ?\\ncx\\ngov.cx\\n\\n// cy : http://www.nic.cy/\\n// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy>\\n// namespace policies URL https://www.nic.cy/portal//sites/default/files/symfonia_gia_eggrafi.pdf\\ncy\\nac.cy\\nbiz.cy\\ncom.cy\\nekloges.cy\\ngov.cy\\nltd.cy\\nmil.cy\\nnet.cy\\norg.cy\\npress.cy\\npro.cy\\ntm.cy\\n\\n// cz : https://en.wikipedia.org/wiki/.cz\\ncz\\n\\n// de : https://en.wikipedia.org/wiki/.de\\n// Confirmed by registry <ops@denic.de> (with technical\\n// reservations) 2008-07-01\\nde\\n\\n// dj : https://en.wikipedia.org/wiki/.dj\\ndj\\n\\n// dk : https://en.wikipedia.org/wiki/.dk\\n// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17\\ndk\\n\\n// dm : https://en.wikipedia.org/wiki/.dm\\ndm\\ncom.dm\\nnet.dm\\norg.dm\\nedu.dm\\ngov.dm\\n\\n// do : https://en.wikipedia.org/wiki/.do\\ndo\\nart.do\\ncom.do\\nedu.do\\ngob.do\\ngov.do\\nmil.do\\nnet.do\\norg.do\\nsld.do\\nweb.do\\n\\n// dz : http://www.nic.dz/images/pdf_nic/charte.pdf\\ndz\\nart.dz\\nasso.dz\\ncom.dz\\nedu.dz\\ngov.dz\\norg.dz\\nnet.dz\\npol.dz\\nsoc.dz\\ntm.dz\\n\\n// ec : http://www.nic.ec/reg/paso1.asp\\n// Submitted by registry <vabboud@nic.ec>\\nec\\ncom.ec\\ninfo.ec\\nnet.ec\\nfin.ec\\nk12.ec\\nmed.ec\\npro.ec\\norg.ec\\nedu.ec\\ngov.ec\\ngob.ec\\nmil.ec\\n\\n// edu : https://en.wikipedia.org/wiki/.edu\\nedu\\n\\n// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B\\nee\\nedu.ee\\ngov.ee\\nriik.ee\\nlib.ee\\nmed.ee\\ncom.ee\\npri.ee\\naip.ee\\norg.ee\\nfie.ee\\n\\n// eg : https://en.wikipedia.org/wiki/.eg\\neg\\ncom.eg\\nedu.eg\\neun.eg\\ngov.eg\\nmil.eg\\nname.eg\\nnet.eg\\norg.eg\\nsci.eg\\n\\n// er : https://en.wikipedia.org/wiki/.er\\n*.er\\n\\n// es : https://www.nic.es/site_ingles/ingles/dominios/index.html\\nes\\ncom.es\\nnom.es\\norg.es\\ngob.es\\nedu.es\\n\\n// et : https://en.wikipedia.org/wiki/.et\\net\\ncom.et\\ngov.et\\norg.et\\nedu.et\\nbiz.et\\nname.et\\ninfo.et\\nnet.et\\n\\n// eu : https://en.wikipedia.org/wiki/.eu\\neu\\n\\n// fi : https://en.wikipedia.org/wiki/.fi\\nfi\\n// aland.fi : https://en.wikipedia.org/wiki/.ax\\n// This domain is being phased out in favor of .ax. As there are still many\\n// domains under aland.fi, we still keep it on the list until aland.fi is\\n// completely removed.\\n// TODO: Check for updates (expected to be phased out around Q1/2009)\\naland.fi\\n\\n// fj : http://domains.fj/\\n// Submitted by registry <garth.miller@cocca.org.nz> 2020-02-11\\nfj\\nac.fj\\nbiz.fj\\ncom.fj\\ngov.fj\\ninfo.fj\\nmil.fj\\nname.fj\\nnet.fj\\norg.fj\\npro.fj\\n\\n// fk : https://en.wikipedia.org/wiki/.fk\\n*.fk\\n\\n// fm : https://en.wikipedia.org/wiki/.fm\\ncom.fm\\nedu.fm\\nnet.fm\\norg.fm\\nfm\\n\\n// fo : https://en.wikipedia.org/wiki/.fo\\nfo\\n\\n// fr : https://www.afnic.fr/ https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\nfr\\nasso.fr\\ncom.fr\\ngouv.fr\\nnom.fr\\nprd.fr\\ntm.fr\\n// Other SLDs now selfmanaged out of AFNIC range. Former \"domaines sectoriels\", still registration suffixes\\navoues.fr\\ncci.fr\\ngreta.fr\\nhuissier-justice.fr\\n\\n// ga : https://en.wikipedia.org/wiki/.ga\\nga\\n\\n// gb : This registry is effectively dormant\\n// Submitted by registry <Damien.Shaw@ja.net>\\ngb\\n\\n// gd : https://en.wikipedia.org/wiki/.gd\\nedu.gd\\ngov.gd\\ngd\\n\\n// ge : http://www.nic.net.ge/policy_en.pdf\\nge\\ncom.ge\\nedu.ge\\ngov.ge\\norg.ge\\nmil.ge\\nnet.ge\\npvt.ge\\n\\n// gf : https://en.wikipedia.org/wiki/.gf\\ngf\\n\\n// gg : http://www.channelisles.net/register-domains/\\n// Confirmed by registry <nigel@channelisles.net> 2013-11-28\\ngg\\nco.gg\\nnet.gg\\norg.gg\\n\\n// gh : https://en.wikipedia.org/wiki/.gh\\n// see also: http://www.nic.gh/reg_now.php\\n// Although domains directly at second level are not possible at the moment,\\n// they have been possible for some time and may come back.\\ngh\\ncom.gh\\nedu.gh\\ngov.gh\\norg.gh\\nmil.gh\\n\\n// gi : http://www.nic.gi/rules.html\\ngi\\ncom.gi\\nltd.gi\\ngov.gi\\nmod.gi\\nedu.gi\\norg.gi\\n\\n// gl : https://en.wikipedia.org/wiki/.gl\\n// http://nic.gl\\ngl\\nco.gl\\ncom.gl\\nedu.gl\\nnet.gl\\norg.gl\\n\\n// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm\\ngm\\n\\n// gn : http://psg.com/dns/gn/gn.txt\\n// Submitted by registry <randy@psg.com>\\ngn\\nac.gn\\ncom.gn\\nedu.gn\\ngov.gn\\norg.gn\\nnet.gn\\n\\n// gov : https://en.wikipedia.org/wiki/.gov\\ngov\\n\\n// gp : http://www.nic.gp/index.php?lang=en\\ngp\\ncom.gp\\nnet.gp\\nmobi.gp\\nedu.gp\\norg.gp\\nasso.gp\\n\\n// gq : https://en.wikipedia.org/wiki/.gq\\ngq\\n\\n// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html\\n// Submitted by registry <segred@ics.forth.gr>\\ngr\\ncom.gr\\nedu.gr\\nnet.gr\\norg.gr\\ngov.gr\\n\\n// gs : https://en.wikipedia.org/wiki/.gs\\ngs\\n\\n// gt : https://www.gt/sitio/registration_policy.php?lang=en\\ngt\\ncom.gt\\nedu.gt\\ngob.gt\\nind.gt\\nmil.gt\\nnet.gt\\norg.gt\\n\\n// gu : http://gadao.gov.gu/register.html\\n// University of Guam : https://www.uog.edu\\n// Submitted by uognoc@triton.uog.edu\\ngu\\ncom.gu\\nedu.gu\\ngov.gu\\nguam.gu\\ninfo.gu\\nnet.gu\\norg.gu\\nweb.gu\\n\\n// gw : https://en.wikipedia.org/wiki/.gw\\n// gw : https://nic.gw/regras/\\ngw\\n\\n// gy : https://en.wikipedia.org/wiki/.gy\\n// http://registry.gy/\\ngy\\nco.gy\\ncom.gy\\nedu.gy\\ngov.gy\\nnet.gy\\norg.gy\\n\\n// hk : https://www.hkirc.hk\\n// Submitted by registry <hk.tech@hkirc.hk>\\nhk\\ncom.hk\\nedu.hk\\ngov.hk\\nidv.hk\\nnet.hk\\norg.hk\\n公司.hk\\n教育.hk\\n敎育.hk\\n政府.hk\\n個人.hk\\n个人.hk\\n箇人.hk\\n網络.hk\\n网络.hk\\n组織.hk\\n網絡.hk\\n网絡.hk\\n组织.hk\\n組織.hk\\n組织.hk\\n\\n// hm : https://en.wikipedia.org/wiki/.hm\\nhm\\n\\n// hn : http://www.nic.hn/politicas/ps02,,05.html\\nhn\\ncom.hn\\nedu.hn\\norg.hn\\nnet.hn\\nmil.hn\\ngob.hn\\n\\n// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf\\nhr\\niz.hr\\nfrom.hr\\nname.hr\\ncom.hr\\n\\n// ht : http://www.nic.ht/info/charte.cfm\\nht\\ncom.ht\\nshop.ht\\nfirm.ht\\ninfo.ht\\nadult.ht\\nnet.ht\\npro.ht\\norg.ht\\nmed.ht\\nart.ht\\ncoop.ht\\npol.ht\\nasso.ht\\nedu.ht\\nrel.ht\\ngouv.ht\\nperso.ht\\n\\n// hu : http://www.domain.hu/domain/English/sld.html\\n// Confirmed by registry <pasztor@iszt.hu> 2008-06-12\\nhu\\nco.hu\\ninfo.hu\\norg.hu\\npriv.hu\\nsport.hu\\ntm.hu\\n2000.hu\\nagrar.hu\\nbolt.hu\\ncasino.hu\\ncity.hu\\nerotica.hu\\nerotika.hu\\nfilm.hu\\nforum.hu\\ngames.hu\\nhotel.hu\\ningatlan.hu\\njogasz.hu\\nkonyvelo.hu\\nlakas.hu\\nmedia.hu\\nnews.hu\\nreklam.hu\\nsex.hu\\nshop.hu\\nsuli.hu\\nszex.hu\\ntozsde.hu\\nutazas.hu\\nvideo.hu\\n\\n// id : https://pandi.id/en/domain/registration-requirements/\\nid\\nac.id\\nbiz.id\\nco.id\\ndesa.id\\ngo.id\\nmil.id\\nmy.id\\nnet.id\\nor.id\\nponpes.id\\nsch.id\\nweb.id\\n\\n// ie : https://en.wikipedia.org/wiki/.ie\\nie\\ngov.ie\\n\\n// il :         http://www.isoc.org.il/domains/\\n// see also:    https://en.isoc.org.il/il-cctld/registration-rules\\n// ISOC-IL      (operated by .il Registry)\\nil\\nac.il\\nco.il\\ngov.il\\nidf.il\\nk12.il\\nmuni.il\\nnet.il\\norg.il\\n// xn--4dbrk0ce (\"Israel\", Hebrew) : IL\\nישראל\\n// xn--4dbgdty6c.xn--4dbrk0ce.\\nאקדמיה.ישראל\\n// xn--5dbhl8d.xn--4dbrk0ce.\\nישוב.ישראל\\n// xn--8dbq2a.xn--4dbrk0ce.\\nצהל.ישראל\\n// xn--hebda8b.xn--4dbrk0ce.\\nממשל.ישראל\\n\\n// im : https://www.nic.im/\\n// Submitted by registry <info@nic.im>\\nim\\nac.im\\nco.im\\ncom.im\\nltd.co.im\\nnet.im\\norg.im\\nplc.co.im\\ntt.im\\ntv.im\\n\\n// in : https://en.wikipedia.org/wiki/.in\\n// see also: https://registry.in/policies\\n// Please note, that nic.in is not an official eTLD, but used by most\\n// government institutions.\\nin\\n5g.in\\n6g.in\\nac.in\\nai.in\\nam.in\\nbihar.in\\nbiz.in\\nbusiness.in\\nca.in\\ncn.in\\nco.in\\ncom.in\\ncoop.in\\ncs.in\\ndelhi.in\\ndr.in\\nedu.in\\ner.in\\nfirm.in\\ngen.in\\ngov.in\\ngujarat.in\\nind.in\\ninfo.in\\nint.in\\ninternet.in\\nio.in\\nme.in\\nmil.in\\nnet.in\\nnic.in\\norg.in\\npg.in\\npost.in\\npro.in\\nres.in\\ntravel.in\\ntv.in\\nuk.in\\nup.in\\nus.in\\n\\n// info : https://en.wikipedia.org/wiki/.info\\ninfo\\n\\n// int : https://en.wikipedia.org/wiki/.int\\n// Confirmed by registry <iana-questions@icann.org> 2008-06-18\\nint\\neu.int\\n\\n// io : http://www.nic.io/rules.htm\\n// list of other 2nd level tlds ?\\nio\\ncom.io\\n\\n// iq : http://www.cmc.iq/english/iq/iqregister1.htm\\niq\\ngov.iq\\nedu.iq\\nmil.iq\\ncom.iq\\norg.iq\\nnet.iq\\n\\n// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules\\n// Also see http://www.nic.ir/Internationalized_Domain_Names\\n// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16\\nir\\nac.ir\\nco.ir\\ngov.ir\\nid.ir\\nnet.ir\\norg.ir\\nsch.ir\\n// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH)\\nایران.ir\\n// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH)\\nايران.ir\\n\\n// is : http://www.isnic.is/domain/rules.php\\n// Confirmed by registry <marius@isgate.is> 2008-12-06\\nis\\nnet.is\\ncom.is\\nedu.is\\ngov.is\\norg.is\\nint.is\\n\\n// it : https://en.wikipedia.org/wiki/.it\\nit\\ngov.it\\nedu.it\\n// Reserved geo-names (regions and provinces):\\n// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf\\n// Regions\\nabr.it\\nabruzzo.it\\naosta-valley.it\\naostavalley.it\\nbas.it\\nbasilicata.it\\ncal.it\\ncalabria.it\\ncam.it\\ncampania.it\\nemilia-romagna.it\\nemiliaromagna.it\\nemr.it\\nfriuli-v-giulia.it\\nfriuli-ve-giulia.it\\nfriuli-vegiulia.it\\nfriuli-venezia-giulia.it\\nfriuli-veneziagiulia.it\\nfriuli-vgiulia.it\\nfriuliv-giulia.it\\nfriulive-giulia.it\\nfriulivegiulia.it\\nfriulivenezia-giulia.it\\nfriuliveneziagiulia.it\\nfriulivgiulia.it\\nfvg.it\\nlaz.it\\nlazio.it\\nlig.it\\nliguria.it\\nlom.it\\nlombardia.it\\nlombardy.it\\nlucania.it\\nmar.it\\nmarche.it\\nmol.it\\nmolise.it\\npiedmont.it\\npiemonte.it\\npmn.it\\npug.it\\npuglia.it\\nsar.it\\nsardegna.it\\nsardinia.it\\nsic.it\\nsicilia.it\\nsicily.it\\ntaa.it\\ntos.it\\ntoscana.it\\ntrentin-sud-tirol.it\\ntrentin-süd-tirol.it\\ntrentin-sudtirol.it\\ntrentin-südtirol.it\\ntrentin-sued-tirol.it\\ntrentin-suedtirol.it\\ntrentino-a-adige.it\\ntrentino-aadige.it\\ntrentino-alto-adige.it\\ntrentino-altoadige.it\\ntrentino-s-tirol.it\\ntrentino-stirol.it\\ntrentino-sud-tirol.it\\ntrentino-süd-tirol.it\\ntrentino-sudtirol.it\\ntrentino-südtirol.it\\ntrentino-sued-tirol.it\\ntrentino-suedtirol.it\\ntrentino.it\\ntrentinoa-adige.it\\ntrentinoaadige.it\\ntrentinoalto-adige.it\\ntrentinoaltoadige.it\\ntrentinos-tirol.it\\ntrentinostirol.it\\ntrentinosud-tirol.it\\ntrentinosüd-tirol.it\\ntrentinosudtirol.it\\ntrentinosüdtirol.it\\ntrentinosued-tirol.it\\ntrentinosuedtirol.it\\ntrentinsud-tirol.it\\ntrentinsüd-tirol.it\\ntrentinsudtirol.it\\ntrentinsüdtirol.it\\ntrentinsued-tirol.it\\ntrentinsuedtirol.it\\ntuscany.it\\numb.it\\numbria.it\\nval-d-aosta.it\\nval-daosta.it\\nvald-aosta.it\\nvaldaosta.it\\nvalle-aosta.it\\nvalle-d-aosta.it\\nvalle-daosta.it\\nvalleaosta.it\\nvalled-aosta.it\\nvalledaosta.it\\nvallee-aoste.it\\nvallée-aoste.it\\nvallee-d-aoste.it\\nvallée-d-aoste.it\\nvalleeaoste.it\\nvalléeaoste.it\\nvalleedaoste.it\\nvalléedaoste.it\\nvao.it\\nvda.it\\nven.it\\nveneto.it\\n// Provinces\\nag.it\\nagrigento.it\\nal.it\\nalessandria.it\\nalto-adige.it\\naltoadige.it\\nan.it\\nancona.it\\nandria-barletta-trani.it\\nandria-trani-barletta.it\\nandriabarlettatrani.it\\nandriatranibarletta.it\\nao.it\\naosta.it\\naoste.it\\nap.it\\naq.it\\naquila.it\\nar.it\\narezzo.it\\nascoli-piceno.it\\nascolipiceno.it\\nasti.it\\nat.it\\nav.it\\navellino.it\\nba.it\\nbalsan-sudtirol.it\\nbalsan-südtirol.it\\nbalsan-suedtirol.it\\nbalsan.it\\nbari.it\\nbarletta-trani-andria.it\\nbarlettatraniandria.it\\nbelluno.it\\nbenevento.it\\nbergamo.it\\nbg.it\\nbi.it\\nbiella.it\\nbl.it\\nbn.it\\nbo.it\\nbologna.it\\nbolzano-altoadige.it\\nbolzano.it\\nbozen-sudtirol.it\\nbozen-südtirol.it\\nbozen-suedtirol.it\\nbozen.it\\nbr.it\\nbrescia.it\\nbrindisi.it\\nbs.it\\nbt.it\\nbulsan-sudtirol.it\\nbulsan-südtirol.it\\nbulsan-suedtirol.it\\nbulsan.it\\nbz.it\\nca.it\\ncagliari.it\\ncaltanissetta.it\\ncampidano-medio.it\\ncampidanomedio.it\\ncampobasso.it\\ncarbonia-iglesias.it\\ncarboniaiglesias.it\\ncarrara-massa.it\\ncarraramassa.it\\ncaserta.it\\ncatania.it\\ncatanzaro.it\\ncb.it\\nce.it\\ncesena-forli.it\\ncesena-forlì.it\\ncesenaforli.it\\ncesenaforlì.it\\nch.it\\nchieti.it\\nci.it\\ncl.it\\ncn.it\\nco.it\\ncomo.it\\ncosenza.it\\ncr.it\\ncremona.it\\ncrotone.it\\ncs.it\\nct.it\\ncuneo.it\\ncz.it\\ndell-ogliastra.it\\ndellogliastra.it\\nen.it\\nenna.it\\nfc.it\\nfe.it\\nfermo.it\\nferrara.it\\nfg.it\\nfi.it\\nfirenze.it\\nflorence.it\\nfm.it\\nfoggia.it\\nforli-cesena.it\\nforlì-cesena.it\\nforlicesena.it\\nforlìcesena.it\\nfr.it\\nfrosinone.it\\nge.it\\ngenoa.it\\ngenova.it\\ngo.it\\ngorizia.it\\ngr.it\\ngrosseto.it\\niglesias-carbonia.it\\niglesiascarbonia.it\\nim.it\\nimperia.it\\nis.it\\nisernia.it\\nkr.it\\nla-spezia.it\\nlaquila.it\\nlaspezia.it\\nlatina.it\\nlc.it\\nle.it\\nlecce.it\\nlecco.it\\nli.it\\nlivorno.it\\nlo.it\\nlodi.it\\nlt.it\\nlu.it\\nlucca.it\\nmacerata.it\\nmantova.it\\nmassa-carrara.it\\nmassacarrara.it\\nmatera.it\\nmb.it\\nmc.it\\nme.it\\nmedio-campidano.it\\nmediocampidano.it\\nmessina.it\\nmi.it\\nmilan.it\\nmilano.it\\nmn.it\\nmo.it\\nmodena.it\\nmonza-brianza.it\\nmonza-e-della-brianza.it\\nmonza.it\\nmonzabrianza.it\\nmonzaebrianza.it\\nmonzaedellabrianza.it\\nms.it\\nmt.it\\nna.it\\nnaples.it\\nnapoli.it\\nno.it\\nnovara.it\\nnu.it\\nnuoro.it\\nog.it\\nogliastra.it\\nolbia-tempio.it\\nolbiatempio.it\\nor.it\\noristano.it\\not.it\\npa.it\\npadova.it\\npadua.it\\npalermo.it\\nparma.it\\npavia.it\\npc.it\\npd.it\\npe.it\\nperugia.it\\npesaro-urbino.it\\npesarourbino.it\\npescara.it\\npg.it\\npi.it\\npiacenza.it\\npisa.it\\npistoia.it\\npn.it\\npo.it\\npordenone.it\\npotenza.it\\npr.it\\nprato.it\\npt.it\\npu.it\\npv.it\\npz.it\\nra.it\\nragusa.it\\nravenna.it\\nrc.it\\nre.it\\nreggio-calabria.it\\nreggio-emilia.it\\nreggiocalabria.it\\nreggioemilia.it\\nrg.it\\nri.it\\nrieti.it\\nrimini.it\\nrm.it\\nrn.it\\nro.it\\nroma.it\\nrome.it\\nrovigo.it\\nsa.it\\nsalerno.it\\nsassari.it\\nsavona.it\\nsi.it\\nsiena.it\\nsiracusa.it\\nso.it\\nsondrio.it\\nsp.it\\nsr.it\\nss.it\\nsuedtirol.it\\nsüdtirol.it\\nsv.it\\nta.it\\ntaranto.it\\nte.it\\ntempio-olbia.it\\ntempioolbia.it\\nteramo.it\\nterni.it\\ntn.it\\nto.it\\ntorino.it\\ntp.it\\ntr.it\\ntrani-andria-barletta.it\\ntrani-barletta-andria.it\\ntraniandriabarletta.it\\ntranibarlettaandria.it\\ntrapani.it\\ntrento.it\\ntreviso.it\\ntrieste.it\\nts.it\\nturin.it\\ntv.it\\nud.it\\nudine.it\\nurbino-pesaro.it\\nurbinopesaro.it\\nva.it\\nvarese.it\\nvb.it\\nvc.it\\nve.it\\nvenezia.it\\nvenice.it\\nverbania.it\\nvercelli.it\\nverona.it\\nvi.it\\nvibo-valentia.it\\nvibovalentia.it\\nvicenza.it\\nviterbo.it\\nvr.it\\nvs.it\\nvt.it\\nvv.it\\n\\n// je : http://www.channelisles.net/register-domains/\\n// Confirmed by registry <nigel@channelisles.net> 2013-11-28\\nje\\nco.je\\nnet.je\\norg.je\\n\\n// jm : http://www.com.jm/register.html\\n*.jm\\n\\n// jo : http://www.dns.jo/Registration_policy.aspx\\njo\\ncom.jo\\norg.jo\\nnet.jo\\nedu.jo\\nsch.jo\\ngov.jo\\nmil.jo\\nname.jo\\n\\n// jobs : https://en.wikipedia.org/wiki/.jobs\\njobs\\n\\n// jp : https://en.wikipedia.org/wiki/.jp\\n// http://jprs.co.jp/en/jpdomain.html\\n// Submitted by registry <info@jprs.jp>\\njp\\n// jp organizational type names\\nac.jp\\nad.jp\\nco.jp\\ned.jp\\ngo.jp\\ngr.jp\\nlg.jp\\nne.jp\\nor.jp\\n// jp prefecture type names\\naichi.jp\\nakita.jp\\naomori.jp\\nchiba.jp\\nehime.jp\\nfukui.jp\\nfukuoka.jp\\nfukushima.jp\\ngifu.jp\\ngunma.jp\\nhiroshima.jp\\nhokkaido.jp\\nhyogo.jp\\nibaraki.jp\\nishikawa.jp\\niwate.jp\\nkagawa.jp\\nkagoshima.jp\\nkanagawa.jp\\nkochi.jp\\nkumamoto.jp\\nkyoto.jp\\nmie.jp\\nmiyagi.jp\\nmiyazaki.jp\\nnagano.jp\\nnagasaki.jp\\nnara.jp\\nniigata.jp\\noita.jp\\nokayama.jp\\nokinawa.jp\\nosaka.jp\\nsaga.jp\\nsaitama.jp\\nshiga.jp\\nshimane.jp\\nshizuoka.jp\\ntochigi.jp\\ntokushima.jp\\ntokyo.jp\\ntottori.jp\\ntoyama.jp\\nwakayama.jp\\nyamagata.jp\\nyamaguchi.jp\\nyamanashi.jp\\n栃木.jp\\n愛知.jp\\n愛媛.jp\\n兵庫.jp\\n熊本.jp\\n茨城.jp\\n北海道.jp\\n千葉.jp\\n和歌山.jp\\n長崎.jp\\n長野.jp\\n新潟.jp\\n青森.jp\\n静岡.jp\\n東京.jp\\n石川.jp\\n埼玉.jp\\n三重.jp\\n京都.jp\\n佐賀.jp\\n大分.jp\\n大阪.jp\\n奈良.jp\\n宮城.jp\\n宮崎.jp\\n富山.jp\\n山口.jp\\n山形.jp\\n山梨.jp\\n岩手.jp\\n岐阜.jp\\n岡山.jp\\n島根.jp\\n広島.jp\\n徳島.jp\\n沖縄.jp\\n滋賀.jp\\n神奈川.jp\\n福井.jp\\n福岡.jp\\n福島.jp\\n秋田.jp\\n群馬.jp\\n香川.jp\\n高知.jp\\n鳥取.jp\\n鹿児島.jp\\n// jp geographic type names\\n// http://jprs.jp/doc/rule/saisoku-1.html\\n*.kawasaki.jp\\n*.kitakyushu.jp\\n*.kobe.jp\\n*.nagoya.jp\\n*.sapporo.jp\\n*.sendai.jp\\n*.yokohama.jp\\n!city.kawasaki.jp\\n!city.kitakyushu.jp\\n!city.kobe.jp\\n!city.nagoya.jp\\n!city.sapporo.jp\\n!city.sendai.jp\\n!city.yokohama.jp\\n// 4th level registration\\naisai.aichi.jp\\nama.aichi.jp\\nanjo.aichi.jp\\nasuke.aichi.jp\\nchiryu.aichi.jp\\nchita.aichi.jp\\nfuso.aichi.jp\\ngamagori.aichi.jp\\nhanda.aichi.jp\\nhazu.aichi.jp\\nhekinan.aichi.jp\\nhigashiura.aichi.jp\\nichinomiya.aichi.jp\\ninazawa.aichi.jp\\ninuyama.aichi.jp\\nisshiki.aichi.jp\\niwakura.aichi.jp\\nkanie.aichi.jp\\nkariya.aichi.jp\\nkasugai.aichi.jp\\nkira.aichi.jp\\nkiyosu.aichi.jp\\nkomaki.aichi.jp\\nkonan.aichi.jp\\nkota.aichi.jp\\nmihama.aichi.jp\\nmiyoshi.aichi.jp\\nnishio.aichi.jp\\nnisshin.aichi.jp\\nobu.aichi.jp\\noguchi.aichi.jp\\noharu.aichi.jp\\nokazaki.aichi.jp\\nowariasahi.aichi.jp\\nseto.aichi.jp\\nshikatsu.aichi.jp\\nshinshiro.aichi.jp\\nshitara.aichi.jp\\ntahara.aichi.jp\\ntakahama.aichi.jp\\ntobishima.aichi.jp\\ntoei.aichi.jp\\ntogo.aichi.jp\\ntokai.aichi.jp\\ntokoname.aichi.jp\\ntoyoake.aichi.jp\\ntoyohashi.aichi.jp\\ntoyokawa.aichi.jp\\ntoyone.aichi.jp\\ntoyota.aichi.jp\\ntsushima.aichi.jp\\nyatomi.aichi.jp\\nakita.akita.jp\\ndaisen.akita.jp\\nfujisato.akita.jp\\ngojome.akita.jp\\nhachirogata.akita.jp\\nhappou.akita.jp\\nhigashinaruse.akita.jp\\nhonjo.akita.jp\\nhonjyo.akita.jp\\nikawa.akita.jp\\nkamikoani.akita.jp\\nkamioka.akita.jp\\nkatagami.akita.jp\\nkazuno.akita.jp\\nkitaakita.akita.jp\\nkosaka.akita.jp\\nkyowa.akita.jp\\nmisato.akita.jp\\nmitane.akita.jp\\nmoriyoshi.akita.jp\\nnikaho.akita.jp\\nnoshiro.akita.jp\\nodate.akita.jp\\noga.akita.jp\\nogata.akita.jp\\nsemboku.akita.jp\\nyokote.akita.jp\\nyurihonjo.akita.jp\\naomori.aomori.jp\\ngonohe.aomori.jp\\nhachinohe.aomori.jp\\nhashikami.aomori.jp\\nhiranai.aomori.jp\\nhirosaki.aomori.jp\\nitayanagi.aomori.jp\\nkuroishi.aomori.jp\\nmisawa.aomori.jp\\nmutsu.aomori.jp\\nnakadomari.aomori.jp\\nnoheji.aomori.jp\\noirase.aomori.jp\\nowani.aomori.jp\\nrokunohe.aomori.jp\\nsannohe.aomori.jp\\nshichinohe.aomori.jp\\nshingo.aomori.jp\\ntakko.aomori.jp\\ntowada.aomori.jp\\ntsugaru.aomori.jp\\ntsuruta.aomori.jp\\nabiko.chiba.jp\\nasahi.chiba.jp\\nchonan.chiba.jp\\nchosei.chiba.jp\\nchoshi.chiba.jp\\nchuo.chiba.jp\\nfunabashi.chiba.jp\\nfuttsu.chiba.jp\\nhanamigawa.chiba.jp\\nichihara.chiba.jp\\nichikawa.chiba.jp\\nichinomiya.chiba.jp\\ninzai.chiba.jp\\nisumi.chiba.jp\\nkamagaya.chiba.jp\\nkamogawa.chiba.jp\\nkashiwa.chiba.jp\\nkatori.chiba.jp\\nkatsuura.chiba.jp\\nkimitsu.chiba.jp\\nkisarazu.chiba.jp\\nkozaki.chiba.jp\\nkujukuri.chiba.jp\\nkyonan.chiba.jp\\nmatsudo.chiba.jp\\nmidori.chiba.jp\\nmihama.chiba.jp\\nminamiboso.chiba.jp\\nmobara.chiba.jp\\nmutsuzawa.chiba.jp\\nnagara.chiba.jp\\nnagareyama.chiba.jp\\nnarashino.chiba.jp\\nnarita.chiba.jp\\nnoda.chiba.jp\\noamishirasato.chiba.jp\\nomigawa.chiba.jp\\nonjuku.chiba.jp\\notaki.chiba.jp\\nsakae.chiba.jp\\nsakura.chiba.jp\\nshimofusa.chiba.jp\\nshirako.chiba.jp\\nshiroi.chiba.jp\\nshisui.chiba.jp\\nsodegaura.chiba.jp\\nsosa.chiba.jp\\ntako.chiba.jp\\ntateyama.chiba.jp\\ntogane.chiba.jp\\ntohnosho.chiba.jp\\ntomisato.chiba.jp\\nurayasu.chiba.jp\\nyachimata.chiba.jp\\nyachiyo.chiba.jp\\nyokaichiba.chiba.jp\\nyokoshibahikari.chiba.jp\\nyotsukaido.chiba.jp\\nainan.ehime.jp\\nhonai.ehime.jp\\nikata.ehime.jp\\nimabari.ehime.jp\\niyo.ehime.jp\\nkamijima.ehime.jp\\nkihoku.ehime.jp\\nkumakogen.ehime.jp\\nmasaki.ehime.jp\\nmatsuno.ehime.jp\\nmatsuyama.ehime.jp\\nnamikata.ehime.jp\\nniihama.ehime.jp\\nozu.ehime.jp\\nsaijo.ehime.jp\\nseiyo.ehime.jp\\nshikokuchuo.ehime.jp\\ntobe.ehime.jp\\ntoon.ehime.jp\\nuchiko.ehime.jp\\nuwajima.ehime.jp\\nyawatahama.ehime.jp\\nechizen.fukui.jp\\neiheiji.fukui.jp\\nfukui.fukui.jp\\nikeda.fukui.jp\\nkatsuyama.fukui.jp\\nmihama.fukui.jp\\nminamiechizen.fukui.jp\\nobama.fukui.jp\\nohi.fukui.jp\\nono.fukui.jp\\nsabae.fukui.jp\\nsakai.fukui.jp\\ntakahama.fukui.jp\\ntsuruga.fukui.jp\\nwakasa.fukui.jp\\nashiya.fukuoka.jp\\nbuzen.fukuoka.jp\\nchikugo.fukuoka.jp\\nchikuho.fukuoka.jp\\nchikujo.fukuoka.jp\\nchikushino.fukuoka.jp\\nchikuzen.fukuoka.jp\\nchuo.fukuoka.jp\\ndazaifu.fukuoka.jp\\nfukuchi.fukuoka.jp\\nhakata.fukuoka.jp\\nhigashi.fukuoka.jp\\nhirokawa.fukuoka.jp\\nhisayama.fukuoka.jp\\niizuka.fukuoka.jp\\ninatsuki.fukuoka.jp\\nkaho.fukuoka.jp\\nkasuga.fukuoka.jp\\nkasuya.fukuoka.jp\\nkawara.fukuoka.jp\\nkeisen.fukuoka.jp\\nkoga.fukuoka.jp\\nkurate.fukuoka.jp\\nkurogi.fukuoka.jp\\nkurume.fukuoka.jp\\nminami.fukuoka.jp\\nmiyako.fukuoka.jp\\nmiyama.fukuoka.jp\\nmiyawaka.fukuoka.jp\\nmizumaki.fukuoka.jp\\nmunakata.fukuoka.jp\\nnakagawa.fukuoka.jp\\nnakama.fukuoka.jp\\nnishi.fukuoka.jp\\nnogata.fukuoka.jp\\nogori.fukuoka.jp\\nokagaki.fukuoka.jp\\nokawa.fukuoka.jp\\noki.fukuoka.jp\\nomuta.fukuoka.jp\\nonga.fukuoka.jp\\nonojo.fukuoka.jp\\noto.fukuoka.jp\\nsaigawa.fukuoka.jp\\nsasaguri.fukuoka.jp\\nshingu.fukuoka.jp\\nshinyoshitomi.fukuoka.jp\\nshonai.fukuoka.jp\\nsoeda.fukuoka.jp\\nsue.fukuoka.jp\\ntachiarai.fukuoka.jp\\ntagawa.fukuoka.jp\\ntakata.fukuoka.jp\\ntoho.fukuoka.jp\\ntoyotsu.fukuoka.jp\\ntsuiki.fukuoka.jp\\nukiha.fukuoka.jp\\numi.fukuoka.jp\\nusui.fukuoka.jp\\nyamada.fukuoka.jp\\nyame.fukuoka.jp\\nyanagawa.fukuoka.jp\\nyukuhashi.fukuoka.jp\\naizubange.fukushima.jp\\naizumisato.fukushima.jp\\naizuwakamatsu.fukushima.jp\\nasakawa.fukushima.jp\\nbandai.fukushima.jp\\ndate.fukushima.jp\\nfukushima.fukushima.jp\\nfurudono.fukushima.jp\\nfutaba.fukushima.jp\\nhanawa.fukushima.jp\\nhigashi.fukushima.jp\\nhirata.fukushima.jp\\nhirono.fukushima.jp\\niitate.fukushima.jp\\ninawashiro.fukushima.jp\\nishikawa.fukushima.jp\\niwaki.fukushima.jp\\nizumizaki.fukushima.jp\\nkagamiishi.fukushima.jp\\nkaneyama.fukushima.jp\\nkawamata.fukushima.jp\\nkitakata.fukushima.jp\\nkitashiobara.fukushima.jp\\nkoori.fukushima.jp\\nkoriyama.fukushima.jp\\nkunimi.fukushima.jp\\nmiharu.fukushima.jp\\nmishima.fukushima.jp\\nnamie.fukushima.jp\\nnango.fukushima.jp\\nnishiaizu.fukushima.jp\\nnishigo.fukushima.jp\\nokuma.fukushima.jp\\nomotego.fukushima.jp\\nono.fukushima.jp\\notama.fukushima.jp\\nsamegawa.fukushima.jp\\nshimogo.fukushima.jp\\nshirakawa.fukushima.jp\\nshowa.fukushima.jp\\nsoma.fukushima.jp\\nsukagawa.fukushima.jp\\ntaishin.fukushima.jp\\ntamakawa.fukushima.jp\\ntanagura.fukushima.jp\\ntenei.fukushima.jp\\nyabuki.fukushima.jp\\nyamato.fukushima.jp\\nyamatsuri.fukushima.jp\\nyanaizu.fukushima.jp\\nyugawa.fukushima.jp\\nanpachi.gifu.jp\\nena.gifu.jp\\ngifu.gifu.jp\\nginan.gifu.jp\\ngodo.gifu.jp\\ngujo.gifu.jp\\nhashima.gifu.jp\\nhichiso.gifu.jp\\nhida.gifu.jp\\nhigashishirakawa.gifu.jp\\nibigawa.gifu.jp\\nikeda.gifu.jp\\nkakamigahara.gifu.jp\\nkani.gifu.jp\\nkasahara.gifu.jp\\nkasamatsu.gifu.jp\\nkawaue.gifu.jp\\nkitagata.gifu.jp\\nmino.gifu.jp\\nminokamo.gifu.jp\\nmitake.gifu.jp\\nmizunami.gifu.jp\\nmotosu.gifu.jp\\nnakatsugawa.gifu.jp\\nogaki.gifu.jp\\nsakahogi.gifu.jp\\nseki.gifu.jp\\nsekigahara.gifu.jp\\nshirakawa.gifu.jp\\ntajimi.gifu.jp\\ntakayama.gifu.jp\\ntarui.gifu.jp\\ntoki.gifu.jp\\ntomika.gifu.jp\\nwanouchi.gifu.jp\\nyamagata.gifu.jp\\nyaotsu.gifu.jp\\nyoro.gifu.jp\\nannaka.gunma.jp\\nchiyoda.gunma.jp\\nfujioka.gunma.jp\\nhigashiagatsuma.gunma.jp\\nisesaki.gunma.jp\\nitakura.gunma.jp\\nkanna.gunma.jp\\nkanra.gunma.jp\\nkatashina.gunma.jp\\nkawaba.gunma.jp\\nkiryu.gunma.jp\\nkusatsu.gunma.jp\\nmaebashi.gunma.jp\\nmeiwa.gunma.jp\\nmidori.gunma.jp\\nminakami.gunma.jp\\nnaganohara.gunma.jp\\nnakanojo.gunma.jp\\nnanmoku.gunma.jp\\nnumata.gunma.jp\\noizumi.gunma.jp\\nora.gunma.jp\\nota.gunma.jp\\nshibukawa.gunma.jp\\nshimonita.gunma.jp\\nshinto.gunma.jp\\nshowa.gunma.jp\\ntakasaki.gunma.jp\\ntakayama.gunma.jp\\ntamamura.gunma.jp\\ntatebayashi.gunma.jp\\ntomioka.gunma.jp\\ntsukiyono.gunma.jp\\ntsumagoi.gunma.jp\\nueno.gunma.jp\\nyoshioka.gunma.jp\\nasaminami.hiroshima.jp\\ndaiwa.hiroshima.jp\\netajima.hiroshima.jp\\nfuchu.hiroshima.jp\\nfukuyama.hiroshima.jp\\nhatsukaichi.hiroshima.jp\\nhigashihiroshima.hiroshima.jp\\nhongo.hiroshima.jp\\njinsekikogen.hiroshima.jp\\nkaita.hiroshima.jp\\nkui.hiroshima.jp\\nkumano.hiroshima.jp\\nkure.hiroshima.jp\\nmihara.hiroshima.jp\\nmiyoshi.hiroshima.jp\\nnaka.hiroshima.jp\\nonomichi.hiroshima.jp\\nosakikamijima.hiroshima.jp\\notake.hiroshima.jp\\nsaka.hiroshima.jp\\nsera.hiroshima.jp\\nseranishi.hiroshima.jp\\nshinichi.hiroshima.jp\\nshobara.hiroshima.jp\\ntakehara.hiroshima.jp\\nabashiri.hokkaido.jp\\nabira.hokkaido.jp\\naibetsu.hokkaido.jp\\nakabira.hokkaido.jp\\nakkeshi.hokkaido.jp\\nasahikawa.hokkaido.jp\\nashibetsu.hokkaido.jp\\nashoro.hokkaido.jp\\nassabu.hokkaido.jp\\natsuma.hokkaido.jp\\nbibai.hokkaido.jp\\nbiei.hokkaido.jp\\nbifuka.hokkaido.jp\\nbihoro.hokkaido.jp\\nbiratori.hokkaido.jp\\nchippubetsu.hokkaido.jp\\nchitose.hokkaido.jp\\ndate.hokkaido.jp\\nebetsu.hokkaido.jp\\nembetsu.hokkaido.jp\\neniwa.hokkaido.jp\\nerimo.hokkaido.jp\\nesan.hokkaido.jp\\nesashi.hokkaido.jp\\nfukagawa.hokkaido.jp\\nfukushima.hokkaido.jp\\nfurano.hokkaido.jp\\nfurubira.hokkaido.jp\\nhaboro.hokkaido.jp\\nhakodate.hokkaido.jp\\nhamatonbetsu.hokkaido.jp\\nhidaka.hokkaido.jp\\nhigashikagura.hokkaido.jp\\nhigashikawa.hokkaido.jp\\nhiroo.hokkaido.jp\\nhokuryu.hokkaido.jp\\nhokuto.hokkaido.jp\\nhonbetsu.hokkaido.jp\\nhorokanai.hokkaido.jp\\nhoronobe.hokkaido.jp\\nikeda.hokkaido.jp\\nimakane.hokkaido.jp\\nishikari.hokkaido.jp\\niwamizawa.hokkaido.jp\\niwanai.hokkaido.jp\\nkamifurano.hokkaido.jp\\nkamikawa.hokkaido.jp\\nkamishihoro.hokkaido.jp\\nkamisunagawa.hokkaido.jp\\nkamoenai.hokkaido.jp\\nkayabe.hokkaido.jp\\nkembuchi.hokkaido.jp\\nkikonai.hokkaido.jp\\nkimobetsu.hokkaido.jp\\nkitahiroshima.hokkaido.jp\\nkitami.hokkaido.jp\\nkiyosato.hokkaido.jp\\nkoshimizu.hokkaido.jp\\nkunneppu.hokkaido.jp\\nkuriyama.hokkaido.jp\\nkuromatsunai.hokkaido.jp\\nkushiro.hokkaido.jp\\nkutchan.hokkaido.jp\\nkyowa.hokkaido.jp\\nmashike.hokkaido.jp\\nmatsumae.hokkaido.jp\\nmikasa.hokkaido.jp\\nminamifurano.hokkaido.jp\\nmombetsu.hokkaido.jp\\nmoseushi.hokkaido.jp\\nmukawa.hokkaido.jp\\nmuroran.hokkaido.jp\\nnaie.hokkaido.jp\\nnakagawa.hokkaido.jp\\nnakasatsunai.hokkaido.jp\\nnakatombetsu.hokkaido.jp\\nnanae.hokkaido.jp\\nnanporo.hokkaido.jp\\nnayoro.hokkaido.jp\\nnemuro.hokkaido.jp\\nniikappu.hokkaido.jp\\nniki.hokkaido.jp\\nnishiokoppe.hokkaido.jp\\nnoboribetsu.hokkaido.jp\\nnumata.hokkaido.jp\\nobihiro.hokkaido.jp\\nobira.hokkaido.jp\\noketo.hokkaido.jp\\nokoppe.hokkaido.jp\\notaru.hokkaido.jp\\notobe.hokkaido.jp\\notofuke.hokkaido.jp\\notoineppu.hokkaido.jp\\noumu.hokkaido.jp\\nozora.hokkaido.jp\\npippu.hokkaido.jp\\nrankoshi.hokkaido.jp\\nrebun.hokkaido.jp\\nrikubetsu.hokkaido.jp\\nrishiri.hokkaido.jp\\nrishirifuji.hokkaido.jp\\nsaroma.hokkaido.jp\\nsarufutsu.hokkaido.jp\\nshakotan.hokkaido.jp\\nshari.hokkaido.jp\\nshibecha.hokkaido.jp\\nshibetsu.hokkaido.jp\\nshikabe.hokkaido.jp\\nshikaoi.hokkaido.jp\\nshimamaki.hokkaido.jp\\nshimizu.hokkaido.jp\\nshimokawa.hokkaido.jp\\nshinshinotsu.hokkaido.jp\\nshintoku.hokkaido.jp\\nshiranuka.hokkaido.jp\\nshiraoi.hokkaido.jp\\nshiriuchi.hokkaido.jp\\nsobetsu.hokkaido.jp\\nsunagawa.hokkaido.jp\\ntaiki.hokkaido.jp\\ntakasu.hokkaido.jp\\ntakikawa.hokkaido.jp\\ntakinoue.hokkaido.jp\\nteshikaga.hokkaido.jp\\ntobetsu.hokkaido.jp\\ntohma.hokkaido.jp\\ntomakomai.hokkaido.jp\\ntomari.hokkaido.jp\\ntoya.hokkaido.jp\\ntoyako.hokkaido.jp\\ntoyotomi.hokkaido.jp\\ntoyoura.hokkaido.jp\\ntsubetsu.hokkaido.jp\\ntsukigata.hokkaido.jp\\nurakawa.hokkaido.jp\\nurausu.hokkaido.jp\\nuryu.hokkaido.jp\\nutashinai.hokkaido.jp\\nwakkanai.hokkaido.jp\\nwassamu.hokkaido.jp\\nyakumo.hokkaido.jp\\nyoichi.hokkaido.jp\\naioi.hyogo.jp\\nakashi.hyogo.jp\\nako.hyogo.jp\\namagasaki.hyogo.jp\\naogaki.hyogo.jp\\nasago.hyogo.jp\\nashiya.hyogo.jp\\nawaji.hyogo.jp\\nfukusaki.hyogo.jp\\ngoshiki.hyogo.jp\\nharima.hyogo.jp\\nhimeji.hyogo.jp\\nichikawa.hyogo.jp\\ninagawa.hyogo.jp\\nitami.hyogo.jp\\nkakogawa.hyogo.jp\\nkamigori.hyogo.jp\\nkamikawa.hyogo.jp\\nkasai.hyogo.jp\\nkasuga.hyogo.jp\\nkawanishi.hyogo.jp\\nmiki.hyogo.jp\\nminamiawaji.hyogo.jp\\nnishinomiya.hyogo.jp\\nnishiwaki.hyogo.jp\\nono.hyogo.jp\\nsanda.hyogo.jp\\nsannan.hyogo.jp\\nsasayama.hyogo.jp\\nsayo.hyogo.jp\\nshingu.hyogo.jp\\nshinonsen.hyogo.jp\\nshiso.hyogo.jp\\nsumoto.hyogo.jp\\ntaishi.hyogo.jp\\ntaka.hyogo.jp\\ntakarazuka.hyogo.jp\\ntakasago.hyogo.jp\\ntakino.hyogo.jp\\ntamba.hyogo.jp\\ntatsuno.hyogo.jp\\ntoyooka.hyogo.jp\\nyabu.hyogo.jp\\nyashiro.hyogo.jp\\nyoka.hyogo.jp\\nyokawa.hyogo.jp\\nami.ibaraki.jp\\nasahi.ibaraki.jp\\nbando.ibaraki.jp\\nchikusei.ibaraki.jp\\ndaigo.ibaraki.jp\\nfujishiro.ibaraki.jp\\nhitachi.ibaraki.jp\\nhitachinaka.ibaraki.jp\\nhitachiomiya.ibaraki.jp\\nhitachiota.ibaraki.jp\\nibaraki.ibaraki.jp\\nina.ibaraki.jp\\ninashiki.ibaraki.jp\\nitako.ibaraki.jp\\niwama.ibaraki.jp\\njoso.ibaraki.jp\\nkamisu.ibaraki.jp\\nkasama.ibaraki.jp\\nkashima.ibaraki.jp\\nkasumigaura.ibaraki.jp\\nkoga.ibaraki.jp\\nmiho.ibaraki.jp\\nmito.ibaraki.jp\\nmoriya.ibaraki.jp\\nnaka.ibaraki.jp\\nnamegata.ibaraki.jp\\noarai.ibaraki.jp\\nogawa.ibaraki.jp\\nomitama.ibaraki.jp\\nryugasaki.ibaraki.jp\\nsakai.ibaraki.jp\\nsakuragawa.ibaraki.jp\\nshimodate.ibaraki.jp\\nshimotsuma.ibaraki.jp\\nshirosato.ibaraki.jp\\nsowa.ibaraki.jp\\nsuifu.ibaraki.jp\\ntakahagi.ibaraki.jp\\ntamatsukuri.ibaraki.jp\\ntokai.ibaraki.jp\\ntomobe.ibaraki.jp\\ntone.ibaraki.jp\\ntoride.ibaraki.jp\\ntsuchiura.ibaraki.jp\\ntsukuba.ibaraki.jp\\nuchihara.ibaraki.jp\\nushiku.ibaraki.jp\\nyachiyo.ibaraki.jp\\nyamagata.ibaraki.jp\\nyawara.ibaraki.jp\\nyuki.ibaraki.jp\\nanamizu.ishikawa.jp\\nhakui.ishikawa.jp\\nhakusan.ishikawa.jp\\nkaga.ishikawa.jp\\nkahoku.ishikawa.jp\\nkanazawa.ishikawa.jp\\nkawakita.ishikawa.jp\\nkomatsu.ishikawa.jp\\nnakanoto.ishikawa.jp\\nnanao.ishikawa.jp\\nnomi.ishikawa.jp\\nnonoichi.ishikawa.jp\\nnoto.ishikawa.jp\\nshika.ishikawa.jp\\nsuzu.ishikawa.jp\\ntsubata.ishikawa.jp\\ntsurugi.ishikawa.jp\\nuchinada.ishikawa.jp\\nwajima.ishikawa.jp\\nfudai.iwate.jp\\nfujisawa.iwate.jp\\nhanamaki.iwate.jp\\nhiraizumi.iwate.jp\\nhirono.iwate.jp\\nichinohe.iwate.jp\\nichinoseki.iwate.jp\\niwaizumi.iwate.jp\\niwate.iwate.jp\\njoboji.iwate.jp\\nkamaishi.iwate.jp\\nkanegasaki.iwate.jp\\nkarumai.iwate.jp\\nkawai.iwate.jp\\nkitakami.iwate.jp\\nkuji.iwate.jp\\nkunohe.iwate.jp\\nkuzumaki.iwate.jp\\nmiyako.iwate.jp\\nmizusawa.iwate.jp\\nmorioka.iwate.jp\\nninohe.iwate.jp\\nnoda.iwate.jp\\nofunato.iwate.jp\\noshu.iwate.jp\\notsuchi.iwate.jp\\nrikuzentakata.iwate.jp\\nshiwa.iwate.jp\\nshizukuishi.iwate.jp\\nsumita.iwate.jp\\ntanohata.iwate.jp\\ntono.iwate.jp\\nyahaba.iwate.jp\\nyamada.iwate.jp\\nayagawa.kagawa.jp\\nhigashikagawa.kagawa.jp\\nkanonji.kagawa.jp\\nkotohira.kagawa.jp\\nmanno.kagawa.jp\\nmarugame.kagawa.jp\\nmitoyo.kagawa.jp\\nnaoshima.kagawa.jp\\nsanuki.kagawa.jp\\ntadotsu.kagawa.jp\\ntakamatsu.kagawa.jp\\ntonosho.kagawa.jp\\nuchinomi.kagawa.jp\\nutazu.kagawa.jp\\nzentsuji.kagawa.jp\\nakune.kagoshima.jp\\namami.kagoshima.jp\\nhioki.kagoshima.jp\\nisa.kagoshima.jp\\nisen.kagoshima.jp\\nizumi.kagoshima.jp\\nkagoshima.kagoshima.jp\\nkanoya.kagoshima.jp\\nkawanabe.kagoshima.jp\\nkinko.kagoshima.jp\\nkouyama.kagoshima.jp\\nmakurazaki.kagoshima.jp\\nmatsumoto.kagoshima.jp\\nminamitane.kagoshima.jp\\nnakatane.kagoshima.jp\\nnishinoomote.kagoshima.jp\\nsatsumasendai.kagoshima.jp\\nsoo.kagoshima.jp\\ntarumizu.kagoshima.jp\\nyusui.kagoshima.jp\\naikawa.kanagawa.jp\\natsugi.kanagawa.jp\\nayase.kanagawa.jp\\nchigasaki.kanagawa.jp\\nebina.kanagawa.jp\\nfujisawa.kanagawa.jp\\nhadano.kanagawa.jp\\nhakone.kanagawa.jp\\nhiratsuka.kanagawa.jp\\nisehara.kanagawa.jp\\nkaisei.kanagawa.jp\\nkamakura.kanagawa.jp\\nkiyokawa.kanagawa.jp\\nmatsuda.kanagawa.jp\\nminamiashigara.kanagawa.jp\\nmiura.kanagawa.jp\\nnakai.kanagawa.jp\\nninomiya.kanagawa.jp\\nodawara.kanagawa.jp\\noi.kanagawa.jp\\noiso.kanagawa.jp\\nsagamihara.kanagawa.jp\\nsamukawa.kanagawa.jp\\ntsukui.kanagawa.jp\\nyamakita.kanagawa.jp\\nyamato.kanagawa.jp\\nyokosuka.kanagawa.jp\\nyugawara.kanagawa.jp\\nzama.kanagawa.jp\\nzushi.kanagawa.jp\\naki.kochi.jp\\ngeisei.kochi.jp\\nhidaka.kochi.jp\\nhigashitsuno.kochi.jp\\nino.kochi.jp\\nkagami.kochi.jp\\nkami.kochi.jp\\nkitagawa.kochi.jp\\nkochi.kochi.jp\\nmihara.kochi.jp\\nmotoyama.kochi.jp\\nmuroto.kochi.jp\\nnahari.kochi.jp\\nnakamura.kochi.jp\\nnankoku.kochi.jp\\nnishitosa.kochi.jp\\nniyodogawa.kochi.jp\\nochi.kochi.jp\\nokawa.kochi.jp\\notoyo.kochi.jp\\notsuki.kochi.jp\\nsakawa.kochi.jp\\nsukumo.kochi.jp\\nsusaki.kochi.jp\\ntosa.kochi.jp\\ntosashimizu.kochi.jp\\ntoyo.kochi.jp\\ntsuno.kochi.jp\\numaji.kochi.jp\\nyasuda.kochi.jp\\nyusuhara.kochi.jp\\namakusa.kumamoto.jp\\narao.kumamoto.jp\\naso.kumamoto.jp\\nchoyo.kumamoto.jp\\ngyokuto.kumamoto.jp\\nkamiamakusa.kumamoto.jp\\nkikuchi.kumamoto.jp\\nkumamoto.kumamoto.jp\\nmashiki.kumamoto.jp\\nmifune.kumamoto.jp\\nminamata.kumamoto.jp\\nminamioguni.kumamoto.jp\\nnagasu.kumamoto.jp\\nnishihara.kumamoto.jp\\noguni.kumamoto.jp\\nozu.kumamoto.jp\\nsumoto.kumamoto.jp\\ntakamori.kumamoto.jp\\nuki.kumamoto.jp\\nuto.kumamoto.jp\\nyamaga.kumamoto.jp\\nyamato.kumamoto.jp\\nyatsushiro.kumamoto.jp\\nayabe.kyoto.jp\\nfukuchiyama.kyoto.jp\\nhigashiyama.kyoto.jp\\nide.kyoto.jp\\nine.kyoto.jp\\njoyo.kyoto.jp\\nkameoka.kyoto.jp\\nkamo.kyoto.jp\\nkita.kyoto.jp\\nkizu.kyoto.jp\\nkumiyama.kyoto.jp\\nkyotamba.kyoto.jp\\nkyotanabe.kyoto.jp\\nkyotango.kyoto.jp\\nmaizuru.kyoto.jp\\nminami.kyoto.jp\\nminamiyamashiro.kyoto.jp\\nmiyazu.kyoto.jp\\nmuko.kyoto.jp\\nnagaokakyo.kyoto.jp\\nnakagyo.kyoto.jp\\nnantan.kyoto.jp\\noyamazaki.kyoto.jp\\nsakyo.kyoto.jp\\nseika.kyoto.jp\\ntanabe.kyoto.jp\\nuji.kyoto.jp\\nujitawara.kyoto.jp\\nwazuka.kyoto.jp\\nyamashina.kyoto.jp\\nyawata.kyoto.jp\\nasahi.mie.jp\\ninabe.mie.jp\\nise.mie.jp\\nkameyama.mie.jp\\nkawagoe.mie.jp\\nkiho.mie.jp\\nkisosaki.mie.jp\\nkiwa.mie.jp\\nkomono.mie.jp\\nkumano.mie.jp\\nkuwana.mie.jp\\nmatsusaka.mie.jp\\nmeiwa.mie.jp\\nmihama.mie.jp\\nminamiise.mie.jp\\nmisugi.mie.jp\\nmiyama.mie.jp\\nnabari.mie.jp\\nshima.mie.jp\\nsuzuka.mie.jp\\ntado.mie.jp\\ntaiki.mie.jp\\ntaki.mie.jp\\ntamaki.mie.jp\\ntoba.mie.jp\\ntsu.mie.jp\\nudono.mie.jp\\nureshino.mie.jp\\nwatarai.mie.jp\\nyokkaichi.mie.jp\\nfurukawa.miyagi.jp\\nhigashimatsushima.miyagi.jp\\nishinomaki.miyagi.jp\\niwanuma.miyagi.jp\\nkakuda.miyagi.jp\\nkami.miyagi.jp\\nkawasaki.miyagi.jp\\nmarumori.miyagi.jp\\nmatsushima.miyagi.jp\\nminamisanriku.miyagi.jp\\nmisato.miyagi.jp\\nmurata.miyagi.jp\\nnatori.miyagi.jp\\nogawara.miyagi.jp\\nohira.miyagi.jp\\nonagawa.miyagi.jp\\nosaki.miyagi.jp\\nrifu.miyagi.jp\\nsemine.miyagi.jp\\nshibata.miyagi.jp\\nshichikashuku.miyagi.jp\\nshikama.miyagi.jp\\nshiogama.miyagi.jp\\nshiroishi.miyagi.jp\\ntagajo.miyagi.jp\\ntaiwa.miyagi.jp\\ntome.miyagi.jp\\ntomiya.miyagi.jp\\nwakuya.miyagi.jp\\nwatari.miyagi.jp\\nyamamoto.miyagi.jp\\nzao.miyagi.jp\\naya.miyazaki.jp\\nebino.miyazaki.jp\\ngokase.miyazaki.jp\\nhyuga.miyazaki.jp\\nkadogawa.miyazaki.jp\\nkawaminami.miyazaki.jp\\nkijo.miyazaki.jp\\nkitagawa.miyazaki.jp\\nkitakata.miyazaki.jp\\nkitaura.miyazaki.jp\\nkobayashi.miyazaki.jp\\nkunitomi.miyazaki.jp\\nkushima.miyazaki.jp\\nmimata.miyazaki.jp\\nmiyakonojo.miyazaki.jp\\nmiyazaki.miyazaki.jp\\nmorotsuka.miyazaki.jp\\nnichinan.miyazaki.jp\\nnishimera.miyazaki.jp\\nnobeoka.miyazaki.jp\\nsaito.miyazaki.jp\\nshiiba.miyazaki.jp\\nshintomi.miyazaki.jp\\ntakaharu.miyazaki.jp\\ntakanabe.miyazaki.jp\\ntakazaki.miyazaki.jp\\ntsuno.miyazaki.jp\\nachi.nagano.jp\\nagematsu.nagano.jp\\nanan.nagano.jp\\naoki.nagano.jp\\nasahi.nagano.jp\\nazumino.nagano.jp\\nchikuhoku.nagano.jp\\nchikuma.nagano.jp\\nchino.nagano.jp\\nfujimi.nagano.jp\\nhakuba.nagano.jp\\nhara.nagano.jp\\nhiraya.nagano.jp\\niida.nagano.jp\\niijima.nagano.jp\\niiyama.nagano.jp\\niizuna.nagano.jp\\nikeda.nagano.jp\\nikusaka.nagano.jp\\nina.nagano.jp\\nkaruizawa.nagano.jp\\nkawakami.nagano.jp\\nkiso.nagano.jp\\nkisofukushima.nagano.jp\\nkitaaiki.nagano.jp\\nkomagane.nagano.jp\\nkomoro.nagano.jp\\nmatsukawa.nagano.jp\\nmatsumoto.nagano.jp\\nmiasa.nagano.jp\\nminamiaiki.nagano.jp\\nminamimaki.nagano.jp\\nminamiminowa.nagano.jp\\nminowa.nagano.jp\\nmiyada.nagano.jp\\nmiyota.nagano.jp\\nmochizuki.nagano.jp\\nnagano.nagano.jp\\nnagawa.nagano.jp\\nnagiso.nagano.jp\\nnakagawa.nagano.jp\\nnakano.nagano.jp\\nnozawaonsen.nagano.jp\\nobuse.nagano.jp\\nogawa.nagano.jp\\nokaya.nagano.jp\\nomachi.nagano.jp\\nomi.nagano.jp\\nookuwa.nagano.jp\\nooshika.nagano.jp\\notaki.nagano.jp\\notari.nagano.jp\\nsakae.nagano.jp\\nsakaki.nagano.jp\\nsaku.nagano.jp\\nsakuho.nagano.jp\\nshimosuwa.nagano.jp\\nshinanomachi.nagano.jp\\nshiojiri.nagano.jp\\nsuwa.nagano.jp\\nsuzaka.nagano.jp\\ntakagi.nagano.jp\\ntakamori.nagano.jp\\ntakayama.nagano.jp\\ntateshina.nagano.jp\\ntatsuno.nagano.jp\\ntogakushi.nagano.jp\\ntogura.nagano.jp\\ntomi.nagano.jp\\nueda.nagano.jp\\nwada.nagano.jp\\nyamagata.nagano.jp\\nyamanouchi.nagano.jp\\nyasaka.nagano.jp\\nyasuoka.nagano.jp\\nchijiwa.nagasaki.jp\\nfutsu.nagasaki.jp\\ngoto.nagasaki.jp\\nhasami.nagasaki.jp\\nhirado.nagasaki.jp\\niki.nagasaki.jp\\nisahaya.nagasaki.jp\\nkawatana.nagasaki.jp\\nkuchinotsu.nagasaki.jp\\nmatsuura.nagasaki.jp\\nnagasaki.nagasaki.jp\\nobama.nagasaki.jp\\nomura.nagasaki.jp\\noseto.nagasaki.jp\\nsaikai.nagasaki.jp\\nsasebo.nagasaki.jp\\nseihi.nagasaki.jp\\nshimabara.nagasaki.jp\\nshinkamigoto.nagasaki.jp\\ntogitsu.nagasaki.jp\\ntsushima.nagasaki.jp\\nunzen.nagasaki.jp\\nando.nara.jp\\ngose.nara.jp\\nheguri.nara.jp\\nhigashiyoshino.nara.jp\\nikaruga.nara.jp\\nikoma.nara.jp\\nkamikitayama.nara.jp\\nkanmaki.nara.jp\\nkashiba.nara.jp\\nkashihara.nara.jp\\nkatsuragi.nara.jp\\nkawai.nara.jp\\nkawakami.nara.jp\\nkawanishi.nara.jp\\nkoryo.nara.jp\\nkurotaki.nara.jp\\nmitsue.nara.jp\\nmiyake.nara.jp\\nnara.nara.jp\\nnosegawa.nara.jp\\noji.nara.jp\\nouda.nara.jp\\noyodo.nara.jp\\nsakurai.nara.jp\\nsango.nara.jp\\nshimoichi.nara.jp\\nshimokitayama.nara.jp\\nshinjo.nara.jp\\nsoni.nara.jp\\ntakatori.nara.jp\\ntawaramoto.nara.jp\\ntenkawa.nara.jp\\ntenri.nara.jp\\nuda.nara.jp\\nyamatokoriyama.nara.jp\\nyamatotakada.nara.jp\\nyamazoe.nara.jp\\nyoshino.nara.jp\\naga.niigata.jp\\nagano.niigata.jp\\ngosen.niigata.jp\\nitoigawa.niigata.jp\\nizumozaki.niigata.jp\\njoetsu.niigata.jp\\nkamo.niigata.jp\\nkariwa.niigata.jp\\nkashiwazaki.niigata.jp\\nminamiuonuma.niigata.jp\\nmitsuke.niigata.jp\\nmuika.niigata.jp\\nmurakami.niigata.jp\\nmyoko.niigata.jp\\nnagaoka.niigata.jp\\nniigata.niigata.jp\\nojiya.niigata.jp\\nomi.niigata.jp\\nsado.niigata.jp\\nsanjo.niigata.jp\\nseiro.niigata.jp\\nseirou.niigata.jp\\nsekikawa.niigata.jp\\nshibata.niigata.jp\\ntagami.niigata.jp\\ntainai.niigata.jp\\ntochio.niigata.jp\\ntokamachi.niigata.jp\\ntsubame.niigata.jp\\ntsunan.niigata.jp\\nuonuma.niigata.jp\\nyahiko.niigata.jp\\nyoita.niigata.jp\\nyuzawa.niigata.jp\\nbeppu.oita.jp\\nbungoono.oita.jp\\nbungotakada.oita.jp\\nhasama.oita.jp\\nhiji.oita.jp\\nhimeshima.oita.jp\\nhita.oita.jp\\nkamitsue.oita.jp\\nkokonoe.oita.jp\\nkuju.oita.jp\\nkunisaki.oita.jp\\nkusu.oita.jp\\noita.oita.jp\\nsaiki.oita.jp\\ntaketa.oita.jp\\ntsukumi.oita.jp\\nusa.oita.jp\\nusuki.oita.jp\\nyufu.oita.jp\\nakaiwa.okayama.jp\\nasakuchi.okayama.jp\\nbizen.okayama.jp\\nhayashima.okayama.jp\\nibara.okayama.jp\\nkagamino.okayama.jp\\nkasaoka.okayama.jp\\nkibichuo.okayama.jp\\nkumenan.okayama.jp\\nkurashiki.okayama.jp\\nmaniwa.okayama.jp\\nmisaki.okayama.jp\\nnagi.okayama.jp\\nniimi.okayama.jp\\nnishiawakura.okayama.jp\\nokayama.okayama.jp\\nsatosho.okayama.jp\\nsetouchi.okayama.jp\\nshinjo.okayama.jp\\nshoo.okayama.jp\\nsoja.okayama.jp\\ntakahashi.okayama.jp\\ntamano.okayama.jp\\ntsuyama.okayama.jp\\nwake.okayama.jp\\nyakage.okayama.jp\\naguni.okinawa.jp\\nginowan.okinawa.jp\\nginoza.okinawa.jp\\ngushikami.okinawa.jp\\nhaebaru.okinawa.jp\\nhigashi.okinawa.jp\\nhirara.okinawa.jp\\niheya.okinawa.jp\\nishigaki.okinawa.jp\\nishikawa.okinawa.jp\\nitoman.okinawa.jp\\nizena.okinawa.jp\\nkadena.okinawa.jp\\nkin.okinawa.jp\\nkitadaito.okinawa.jp\\nkitanakagusuku.okinawa.jp\\nkumejima.okinawa.jp\\nkunigami.okinawa.jp\\nminamidaito.okinawa.jp\\nmotobu.okinawa.jp\\nnago.okinawa.jp\\nnaha.okinawa.jp\\nnakagusuku.okinawa.jp\\nnakijin.okinawa.jp\\nnanjo.okinawa.jp\\nnishihara.okinawa.jp\\nogimi.okinawa.jp\\nokinawa.okinawa.jp\\nonna.okinawa.jp\\nshimoji.okinawa.jp\\ntaketomi.okinawa.jp\\ntarama.okinawa.jp\\ntokashiki.okinawa.jp\\ntomigusuku.okinawa.jp\\ntonaki.okinawa.jp\\nurasoe.okinawa.jp\\nuruma.okinawa.jp\\nyaese.okinawa.jp\\nyomitan.okinawa.jp\\nyonabaru.okinawa.jp\\nyonaguni.okinawa.jp\\nzamami.okinawa.jp\\nabeno.osaka.jp\\nchihayaakasaka.osaka.jp\\nchuo.osaka.jp\\ndaito.osaka.jp\\nfujiidera.osaka.jp\\nhabikino.osaka.jp\\nhannan.osaka.jp\\nhigashiosaka.osaka.jp\\nhigashisumiyoshi.osaka.jp\\nhigashiyodogawa.osaka.jp\\nhirakata.osaka.jp\\nibaraki.osaka.jp\\nikeda.osaka.jp\\nizumi.osaka.jp\\nizumiotsu.osaka.jp\\nizumisano.osaka.jp\\nkadoma.osaka.jp\\nkaizuka.osaka.jp\\nkanan.osaka.jp\\nkashiwara.osaka.jp\\nkatano.osaka.jp\\nkawachinagano.osaka.jp\\nkishiwada.osaka.jp\\nkita.osaka.jp\\nkumatori.osaka.jp\\nmatsubara.osaka.jp\\nminato.osaka.jp\\nminoh.osaka.jp\\nmisaki.osaka.jp\\nmoriguchi.osaka.jp\\nneyagawa.osaka.jp\\nnishi.osaka.jp\\nnose.osaka.jp\\nosakasayama.osaka.jp\\nsakai.osaka.jp\\nsayama.osaka.jp\\nsennan.osaka.jp\\nsettsu.osaka.jp\\nshijonawate.osaka.jp\\nshimamoto.osaka.jp\\nsuita.osaka.jp\\ntadaoka.osaka.jp\\ntaishi.osaka.jp\\ntajiri.osaka.jp\\ntakaishi.osaka.jp\\ntakatsuki.osaka.jp\\ntondabayashi.osaka.jp\\ntoyonaka.osaka.jp\\ntoyono.osaka.jp\\nyao.osaka.jp\\nariake.saga.jp\\narita.saga.jp\\nfukudomi.saga.jp\\ngenkai.saga.jp\\nhamatama.saga.jp\\nhizen.saga.jp\\nimari.saga.jp\\nkamimine.saga.jp\\nkanzaki.saga.jp\\nkaratsu.saga.jp\\nkashima.saga.jp\\nkitagata.saga.jp\\nkitahata.saga.jp\\nkiyama.saga.jp\\nkouhoku.saga.jp\\nkyuragi.saga.jp\\nnishiarita.saga.jp\\nogi.saga.jp\\nomachi.saga.jp\\nouchi.saga.jp\\nsaga.saga.jp\\nshiroishi.saga.jp\\ntaku.saga.jp\\ntara.saga.jp\\ntosu.saga.jp\\nyoshinogari.saga.jp\\narakawa.saitama.jp\\nasaka.saitama.jp\\nchichibu.saitama.jp\\nfujimi.saitama.jp\\nfujimino.saitama.jp\\nfukaya.saitama.jp\\nhanno.saitama.jp\\nhanyu.saitama.jp\\nhasuda.saitama.jp\\nhatogaya.saitama.jp\\nhatoyama.saitama.jp\\nhidaka.saitama.jp\\nhigashichichibu.saitama.jp\\nhigashimatsuyama.saitama.jp\\nhonjo.saitama.jp\\nina.saitama.jp\\niruma.saitama.jp\\niwatsuki.saitama.jp\\nkamiizumi.saitama.jp\\nkamikawa.saitama.jp\\nkamisato.saitama.jp\\nkasukabe.saitama.jp\\nkawagoe.saitama.jp\\nkawaguchi.saitama.jp\\nkawajima.saitama.jp\\nkazo.saitama.jp\\nkitamoto.saitama.jp\\nkoshigaya.saitama.jp\\nkounosu.saitama.jp\\nkuki.saitama.jp\\nkumagaya.saitama.jp\\nmatsubushi.saitama.jp\\nminano.saitama.jp\\nmisato.saitama.jp\\nmiyashiro.saitama.jp\\nmiyoshi.saitama.jp\\nmoroyama.saitama.jp\\nnagatoro.saitama.jp\\nnamegawa.saitama.jp\\nniiza.saitama.jp\\nogano.saitama.jp\\nogawa.saitama.jp\\nogose.saitama.jp\\nokegawa.saitama.jp\\nomiya.saitama.jp\\notaki.saitama.jp\\nranzan.saitama.jp\\nryokami.saitama.jp\\nsaitama.saitama.jp\\nsakado.saitama.jp\\nsatte.saitama.jp\\nsayama.saitama.jp\\nshiki.saitama.jp\\nshiraoka.saitama.jp\\nsoka.saitama.jp\\nsugito.saitama.jp\\ntoda.saitama.jp\\ntokigawa.saitama.jp\\ntokorozawa.saitama.jp\\ntsurugashima.saitama.jp\\nurawa.saitama.jp\\nwarabi.saitama.jp\\nyashio.saitama.jp\\nyokoze.saitama.jp\\nyono.saitama.jp\\nyorii.saitama.jp\\nyoshida.saitama.jp\\nyoshikawa.saitama.jp\\nyoshimi.saitama.jp\\naisho.shiga.jp\\ngamo.shiga.jp\\nhigashiomi.shiga.jp\\nhikone.shiga.jp\\nkoka.shiga.jp\\nkonan.shiga.jp\\nkosei.shiga.jp\\nkoto.shiga.jp\\nkusatsu.shiga.jp\\nmaibara.shiga.jp\\nmoriyama.shiga.jp\\nnagahama.shiga.jp\\nnishiazai.shiga.jp\\nnotogawa.shiga.jp\\nomihachiman.shiga.jp\\notsu.shiga.jp\\nritto.shiga.jp\\nryuoh.shiga.jp\\ntakashima.shiga.jp\\ntakatsuki.shiga.jp\\ntorahime.shiga.jp\\ntoyosato.shiga.jp\\nyasu.shiga.jp\\nakagi.shimane.jp\\nama.shimane.jp\\ngotsu.shimane.jp\\nhamada.shimane.jp\\nhigashiizumo.shimane.jp\\nhikawa.shimane.jp\\nhikimi.shimane.jp\\nizumo.shimane.jp\\nkakinoki.shimane.jp\\nmasuda.shimane.jp\\nmatsue.shimane.jp\\nmisato.shimane.jp\\nnishinoshima.shimane.jp\\nohda.shimane.jp\\nokinoshima.shimane.jp\\nokuizumo.shimane.jp\\nshimane.shimane.jp\\ntamayu.shimane.jp\\ntsuwano.shimane.jp\\nunnan.shimane.jp\\nyakumo.shimane.jp\\nyasugi.shimane.jp\\nyatsuka.shimane.jp\\narai.shizuoka.jp\\natami.shizuoka.jp\\nfuji.shizuoka.jp\\nfujieda.shizuoka.jp\\nfujikawa.shizuoka.jp\\nfujinomiya.shizuoka.jp\\nfukuroi.shizuoka.jp\\ngotemba.shizuoka.jp\\nhaibara.shizuoka.jp\\nhamamatsu.shizuoka.jp\\nhigashiizu.shizuoka.jp\\nito.shizuoka.jp\\niwata.shizuoka.jp\\nizu.shizuoka.jp\\nizunokuni.shizuoka.jp\\nkakegawa.shizuoka.jp\\nkannami.shizuoka.jp\\nkawanehon.shizuoka.jp\\nkawazu.shizuoka.jp\\nkikugawa.shizuoka.jp\\nkosai.shizuoka.jp\\nmakinohara.shizuoka.jp\\nmatsuzaki.shizuoka.jp\\nminamiizu.shizuoka.jp\\nmishima.shizuoka.jp\\nmorimachi.shizuoka.jp\\nnishiizu.shizuoka.jp\\nnumazu.shizuoka.jp\\nomaezaki.shizuoka.jp\\nshimada.shizuoka.jp\\nshimizu.shizuoka.jp\\nshimoda.shizuoka.jp\\nshizuoka.shizuoka.jp\\nsusono.shizuoka.jp\\nyaizu.shizuoka.jp\\nyoshida.shizuoka.jp\\nashikaga.tochigi.jp\\nbato.tochigi.jp\\nhaga.tochigi.jp\\nichikai.tochigi.jp\\niwafune.tochigi.jp\\nkaminokawa.tochigi.jp\\nkanuma.tochigi.jp\\nkarasuyama.tochigi.jp\\nkuroiso.tochigi.jp\\nmashiko.tochigi.jp\\nmibu.tochigi.jp\\nmoka.tochigi.jp\\nmotegi.tochigi.jp\\nnasu.tochigi.jp\\nnasushiobara.tochigi.jp\\nnikko.tochigi.jp\\nnishikata.tochigi.jp\\nnogi.tochigi.jp\\nohira.tochigi.jp\\nohtawara.tochigi.jp\\noyama.tochigi.jp\\nsakura.tochigi.jp\\nsano.tochigi.jp\\nshimotsuke.tochigi.jp\\nshioya.tochigi.jp\\ntakanezawa.tochigi.jp\\ntochigi.tochigi.jp\\ntsuga.tochigi.jp\\nujiie.tochigi.jp\\nutsunomiya.tochigi.jp\\nyaita.tochigi.jp\\naizumi.tokushima.jp\\nanan.tokushima.jp\\nichiba.tokushima.jp\\nitano.tokushima.jp\\nkainan.tokushima.jp\\nkomatsushima.tokushima.jp\\nmatsushige.tokushima.jp\\nmima.tokushima.jp\\nminami.tokushima.jp\\nmiyoshi.tokushima.jp\\nmugi.tokushima.jp\\nnakagawa.tokushima.jp\\nnaruto.tokushima.jp\\nsanagochi.tokushima.jp\\nshishikui.tokushima.jp\\ntokushima.tokushima.jp\\nwajiki.tokushima.jp\\nadachi.tokyo.jp\\nakiruno.tokyo.jp\\nakishima.tokyo.jp\\naogashima.tokyo.jp\\narakawa.tokyo.jp\\nbunkyo.tokyo.jp\\nchiyoda.tokyo.jp\\nchofu.tokyo.jp\\nchuo.tokyo.jp\\nedogawa.tokyo.jp\\nfuchu.tokyo.jp\\nfussa.tokyo.jp\\nhachijo.tokyo.jp\\nhachioji.tokyo.jp\\nhamura.tokyo.jp\\nhigashikurume.tokyo.jp\\nhigashimurayama.tokyo.jp\\nhigashiyamato.tokyo.jp\\nhino.tokyo.jp\\nhinode.tokyo.jp\\nhinohara.tokyo.jp\\ninagi.tokyo.jp\\nitabashi.tokyo.jp\\nkatsushika.tokyo.jp\\nkita.tokyo.jp\\nkiyose.tokyo.jp\\nkodaira.tokyo.jp\\nkoganei.tokyo.jp\\nkokubunji.tokyo.jp\\nkomae.tokyo.jp\\nkoto.tokyo.jp\\nkouzushima.tokyo.jp\\nkunitachi.tokyo.jp\\nmachida.tokyo.jp\\nmeguro.tokyo.jp\\nminato.tokyo.jp\\nmitaka.tokyo.jp\\nmizuho.tokyo.jp\\nmusashimurayama.tokyo.jp\\nmusashino.tokyo.jp\\nnakano.tokyo.jp\\nnerima.tokyo.jp\\nogasawara.tokyo.jp\\nokutama.tokyo.jp\\nome.tokyo.jp\\noshima.tokyo.jp\\nota.tokyo.jp\\nsetagaya.tokyo.jp\\nshibuya.tokyo.jp\\nshinagawa.tokyo.jp\\nshinjuku.tokyo.jp\\nsuginami.tokyo.jp\\nsumida.tokyo.jp\\ntachikawa.tokyo.jp\\ntaito.tokyo.jp\\ntama.tokyo.jp\\ntoshima.tokyo.jp\\nchizu.tottori.jp\\nhino.tottori.jp\\nkawahara.tottori.jp\\nkoge.tottori.jp\\nkotoura.tottori.jp\\nmisasa.tottori.jp\\nnanbu.tottori.jp\\nnichinan.tottori.jp\\nsakaiminato.tottori.jp\\ntottori.tottori.jp\\nwakasa.tottori.jp\\nyazu.tottori.jp\\nyonago.tottori.jp\\nasahi.toyama.jp\\nfuchu.toyama.jp\\nfukumitsu.toyama.jp\\nfunahashi.toyama.jp\\nhimi.toyama.jp\\nimizu.toyama.jp\\ninami.toyama.jp\\njohana.toyama.jp\\nkamiichi.toyama.jp\\nkurobe.toyama.jp\\nnakaniikawa.toyama.jp\\nnamerikawa.toyama.jp\\nnanto.toyama.jp\\nnyuzen.toyama.jp\\noyabe.toyama.jp\\ntaira.toyama.jp\\ntakaoka.toyama.jp\\ntateyama.toyama.jp\\ntoga.toyama.jp\\ntonami.toyama.jp\\ntoyama.toyama.jp\\nunazuki.toyama.jp\\nuozu.toyama.jp\\nyamada.toyama.jp\\narida.wakayama.jp\\naridagawa.wakayama.jp\\ngobo.wakayama.jp\\nhashimoto.wakayama.jp\\nhidaka.wakayama.jp\\nhirogawa.wakayama.jp\\ninami.wakayama.jp\\niwade.wakayama.jp\\nkainan.wakayama.jp\\nkamitonda.wakayama.jp\\nkatsuragi.wakayama.jp\\nkimino.wakayama.jp\\nkinokawa.wakayama.jp\\nkitayama.wakayama.jp\\nkoya.wakayama.jp\\nkoza.wakayama.jp\\nkozagawa.wakayama.jp\\nkudoyama.wakayama.jp\\nkushimoto.wakayama.jp\\nmihama.wakayama.jp\\nmisato.wakayama.jp\\nnachikatsuura.wakayama.jp\\nshingu.wakayama.jp\\nshirahama.wakayama.jp\\ntaiji.wakayama.jp\\ntanabe.wakayama.jp\\nwakayama.wakayama.jp\\nyuasa.wakayama.jp\\nyura.wakayama.jp\\nasahi.yamagata.jp\\nfunagata.yamagata.jp\\nhigashine.yamagata.jp\\niide.yamagata.jp\\nkahoku.yamagata.jp\\nkaminoyama.yamagata.jp\\nkaneyama.yamagata.jp\\nkawanishi.yamagata.jp\\nmamurogawa.yamagata.jp\\nmikawa.yamagata.jp\\nmurayama.yamagata.jp\\nnagai.yamagata.jp\\nnakayama.yamagata.jp\\nnanyo.yamagata.jp\\nnishikawa.yamagata.jp\\nobanazawa.yamagata.jp\\noe.yamagata.jp\\noguni.yamagata.jp\\nohkura.yamagata.jp\\noishida.yamagata.jp\\nsagae.yamagata.jp\\nsakata.yamagata.jp\\nsakegawa.yamagata.jp\\nshinjo.yamagata.jp\\nshirataka.yamagata.jp\\nshonai.yamagata.jp\\ntakahata.yamagata.jp\\ntendo.yamagata.jp\\ntozawa.yamagata.jp\\ntsuruoka.yamagata.jp\\nyamagata.yamagata.jp\\nyamanobe.yamagata.jp\\nyonezawa.yamagata.jp\\nyuza.yamagata.jp\\nabu.yamaguchi.jp\\nhagi.yamaguchi.jp\\nhikari.yamaguchi.jp\\nhofu.yamaguchi.jp\\niwakuni.yamaguchi.jp\\nkudamatsu.yamaguchi.jp\\nmitou.yamaguchi.jp\\nnagato.yamaguchi.jp\\noshima.yamaguchi.jp\\nshimonoseki.yamaguchi.jp\\nshunan.yamaguchi.jp\\ntabuse.yamaguchi.jp\\ntokuyama.yamaguchi.jp\\ntoyota.yamaguchi.jp\\nube.yamaguchi.jp\\nyuu.yamaguchi.jp\\nchuo.yamanashi.jp\\ndoshi.yamanashi.jp\\nfuefuki.yamanashi.jp\\nfujikawa.yamanashi.jp\\nfujikawaguchiko.yamanashi.jp\\nfujiyoshida.yamanashi.jp\\nhayakawa.yamanashi.jp\\nhokuto.yamanashi.jp\\nichikawamisato.yamanashi.jp\\nkai.yamanashi.jp\\nkofu.yamanashi.jp\\nkoshu.yamanashi.jp\\nkosuge.yamanashi.jp\\nminami-alps.yamanashi.jp\\nminobu.yamanashi.jp\\nnakamichi.yamanashi.jp\\nnanbu.yamanashi.jp\\nnarusawa.yamanashi.jp\\nnirasaki.yamanashi.jp\\nnishikatsura.yamanashi.jp\\noshino.yamanashi.jp\\notsuki.yamanashi.jp\\nshowa.yamanashi.jp\\ntabayama.yamanashi.jp\\ntsuru.yamanashi.jp\\nuenohara.yamanashi.jp\\nyamanakako.yamanashi.jp\\nyamanashi.yamanashi.jp\\n\\n// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains\\nke\\nac.ke\\nco.ke\\ngo.ke\\ninfo.ke\\nme.ke\\nmobi.ke\\nne.ke\\nor.ke\\nsc.ke\\n\\n// kg : http://www.domain.kg/dmn_n.html\\nkg\\norg.kg\\nnet.kg\\ncom.kg\\nedu.kg\\ngov.kg\\nmil.kg\\n\\n// kh : http://www.mptc.gov.kh/dns_registration.htm\\n*.kh\\n\\n// ki : http://www.ki/dns/index.html\\nki\\nedu.ki\\nbiz.ki\\nnet.ki\\norg.ki\\ngov.ki\\ninfo.ki\\ncom.ki\\n\\n// km : https://en.wikipedia.org/wiki/.km\\n// http://www.domaine.km/documents/charte.doc\\nkm\\norg.km\\nnom.km\\ngov.km\\nprd.km\\ntm.km\\nedu.km\\nmil.km\\nass.km\\ncom.km\\n// These are only mentioned as proposed suggestions at domaine.km, but\\n// https://en.wikipedia.org/wiki/.km says they\\'re available for registration:\\ncoop.km\\nasso.km\\npresse.km\\nmedecin.km\\nnotaires.km\\npharmaciens.km\\nveterinaire.km\\ngouv.km\\n\\n// kn : https://en.wikipedia.org/wiki/.kn\\n// http://www.dot.kn/domainRules.html\\nkn\\nnet.kn\\norg.kn\\nedu.kn\\ngov.kn\\n\\n// kp : http://www.kcce.kp/en_index.php\\nkp\\ncom.kp\\nedu.kp\\ngov.kp\\norg.kp\\nrep.kp\\ntra.kp\\n\\n// kr : https://en.wikipedia.org/wiki/.kr\\n// see also: http://domain.nida.or.kr/eng/registration.jsp\\nkr\\nac.kr\\nco.kr\\nes.kr\\ngo.kr\\nhs.kr\\nkg.kr\\nmil.kr\\nms.kr\\nne.kr\\nor.kr\\npe.kr\\nre.kr\\nsc.kr\\n// kr geographical names\\nbusan.kr\\nchungbuk.kr\\nchungnam.kr\\ndaegu.kr\\ndaejeon.kr\\ngangwon.kr\\ngwangju.kr\\ngyeongbuk.kr\\ngyeonggi.kr\\ngyeongnam.kr\\nincheon.kr\\njeju.kr\\njeonbuk.kr\\njeonnam.kr\\nseoul.kr\\nulsan.kr\\n\\n// kw : https://www.nic.kw/policies/\\n// Confirmed by registry <nic.tech@citra.gov.kw>\\nkw\\ncom.kw\\nedu.kw\\nemb.kw\\ngov.kw\\nind.kw\\nnet.kw\\norg.kw\\n\\n// ky : http://www.icta.ky/da_ky_reg_dom.php\\n// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17\\nky\\ncom.ky\\nedu.ky\\nnet.ky\\norg.ky\\n\\n// kz : https://en.wikipedia.org/wiki/.kz\\n// see also: http://www.nic.kz/rules/index.jsp\\nkz\\norg.kz\\nedu.kz\\nnet.kz\\ngov.kz\\nmil.kz\\ncom.kz\\n\\n// la : https://en.wikipedia.org/wiki/.la\\n// Submitted by registry <gavin.brown@nic.la>\\nla\\nint.la\\nnet.la\\ninfo.la\\nedu.la\\ngov.la\\nper.la\\ncom.la\\norg.la\\n\\n// lb : https://en.wikipedia.org/wiki/.lb\\n// Submitted by registry <randy@psg.com>\\nlb\\ncom.lb\\nedu.lb\\ngov.lb\\nnet.lb\\norg.lb\\n\\n// lc : https://en.wikipedia.org/wiki/.lc\\n// see also: http://www.nic.lc/rules.htm\\nlc\\ncom.lc\\nnet.lc\\nco.lc\\norg.lc\\nedu.lc\\ngov.lc\\n\\n// li : https://en.wikipedia.org/wiki/.li\\nli\\n\\n// lk : https://www.nic.lk/index.php/domain-registration/lk-domain-naming-structure\\nlk\\ngov.lk\\nsch.lk\\nnet.lk\\nint.lk\\ncom.lk\\norg.lk\\nedu.lk\\nngo.lk\\nsoc.lk\\nweb.lk\\nltd.lk\\nassn.lk\\ngrp.lk\\nhotel.lk\\nac.lk\\n\\n// lr : http://psg.com/dns/lr/lr.txt\\n// Submitted by registry <randy@psg.com>\\nlr\\ncom.lr\\nedu.lr\\ngov.lr\\norg.lr\\nnet.lr\\n\\n// ls : http://www.nic.ls/\\n// Confirmed by registry <lsadmin@nic.ls>\\nls\\nac.ls\\nbiz.ls\\nco.ls\\nedu.ls\\ngov.ls\\ninfo.ls\\nnet.ls\\norg.ls\\nsc.ls\\n\\n// lt : https://en.wikipedia.org/wiki/.lt\\nlt\\n// gov.lt : http://www.gov.lt/index_en.php\\ngov.lt\\n\\n// lu : http://www.dns.lu/en/\\nlu\\n\\n// lv : http://www.nic.lv/DNS/En/generic.php\\nlv\\ncom.lv\\nedu.lv\\ngov.lv\\norg.lv\\nmil.lv\\nid.lv\\nnet.lv\\nasn.lv\\nconf.lv\\n\\n// ly : http://www.nic.ly/regulations.php\\nly\\ncom.ly\\nnet.ly\\ngov.ly\\nplc.ly\\nedu.ly\\nsch.ly\\nmed.ly\\norg.ly\\nid.ly\\n\\n// ma : https://en.wikipedia.org/wiki/.ma\\n// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf\\nma\\nco.ma\\nnet.ma\\ngov.ma\\norg.ma\\nac.ma\\npress.ma\\n\\n// mc : http://www.nic.mc/\\nmc\\ntm.mc\\nasso.mc\\n\\n// md : https://en.wikipedia.org/wiki/.md\\nmd\\n\\n// me : https://en.wikipedia.org/wiki/.me\\nme\\nco.me\\nnet.me\\norg.me\\nedu.me\\nac.me\\ngov.me\\nits.me\\npriv.me\\n\\n// mg : http://nic.mg/nicmg/?page_id=39\\nmg\\norg.mg\\nnom.mg\\ngov.mg\\nprd.mg\\ntm.mg\\nedu.mg\\nmil.mg\\ncom.mg\\nco.mg\\n\\n// mh : https://en.wikipedia.org/wiki/.mh\\nmh\\n\\n// mil : https://en.wikipedia.org/wiki/.mil\\nmil\\n\\n// mk : https://en.wikipedia.org/wiki/.mk\\n// see also: http://dns.marnet.net.mk/postapka.php\\nmk\\ncom.mk\\norg.mk\\nnet.mk\\nedu.mk\\ngov.mk\\ninf.mk\\nname.mk\\n\\n// ml : http://www.gobin.info/domainname/ml-template.doc\\n// see also: https://en.wikipedia.org/wiki/.ml\\nml\\ncom.ml\\nedu.ml\\ngouv.ml\\ngov.ml\\nnet.ml\\norg.ml\\npresse.ml\\n\\n// mm : https://en.wikipedia.org/wiki/.mm\\n*.mm\\n\\n// mn : https://en.wikipedia.org/wiki/.mn\\nmn\\ngov.mn\\nedu.mn\\norg.mn\\n\\n// mo : http://www.monic.net.mo/\\nmo\\ncom.mo\\nnet.mo\\norg.mo\\nedu.mo\\ngov.mo\\n\\n// mobi : https://en.wikipedia.org/wiki/.mobi\\nmobi\\n\\n// mp : http://www.dot.mp/\\n// Confirmed by registry <dcamacho@saipan.com> 2008-06-17\\nmp\\n\\n// mq : https://en.wikipedia.org/wiki/.mq\\nmq\\n\\n// mr : https://en.wikipedia.org/wiki/.mr\\nmr\\ngov.mr\\n\\n// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf\\nms\\ncom.ms\\nedu.ms\\ngov.ms\\nnet.ms\\norg.ms\\n\\n// mt : https://www.nic.org.mt/go/policy\\n// Submitted by registry <help@nic.org.mt>\\nmt\\ncom.mt\\nedu.mt\\nnet.mt\\norg.mt\\n\\n// mu : https://en.wikipedia.org/wiki/.mu\\nmu\\ncom.mu\\nnet.mu\\norg.mu\\ngov.mu\\nac.mu\\nco.mu\\nor.mu\\n\\n// museum : https://welcome.museum/wp-content/uploads/2018/05/20180525-Registration-Policy-MUSEUM-EN_VF-2.pdf https://welcome.museum/buy-your-dot-museum-2/\\nmuseum\\n\\n// mv : https://en.wikipedia.org/wiki/.mv\\n// \"mv\" included because, contra Wikipedia, google.mv exists.\\nmv\\naero.mv\\nbiz.mv\\ncom.mv\\ncoop.mv\\nedu.mv\\ngov.mv\\ninfo.mv\\nint.mv\\nmil.mv\\nmuseum.mv\\nname.mv\\nnet.mv\\norg.mv\\npro.mv\\n\\n// mw : http://www.registrar.mw/\\nmw\\nac.mw\\nbiz.mw\\nco.mw\\ncom.mw\\ncoop.mw\\nedu.mw\\ngov.mw\\nint.mw\\nmuseum.mw\\nnet.mw\\norg.mw\\n\\n// mx : http://www.nic.mx/\\n// Submitted by registry <farias@nic.mx>\\nmx\\ncom.mx\\norg.mx\\ngob.mx\\nedu.mx\\nnet.mx\\n\\n// my : http://www.mynic.my/\\n// Available strings: https://mynic.my/resources/domains/buying-a-domain/\\nmy\\nbiz.my\\ncom.my\\nedu.my\\ngov.my\\nmil.my\\nname.my\\nnet.my\\norg.my\\n\\n// mz : http://www.uem.mz/\\n// Submitted by registry <antonio@uem.mz>\\nmz\\nac.mz\\nadv.mz\\nco.mz\\nedu.mz\\ngov.mz\\nmil.mz\\nnet.mz\\norg.mz\\n\\n// na : http://www.na-nic.com.na/\\n// http://www.info.na/domain/\\nna\\ninfo.na\\npro.na\\nname.na\\nschool.na\\nor.na\\ndr.na\\nus.na\\nmx.na\\nca.na\\nin.na\\ncc.na\\ntv.na\\nws.na\\nmobi.na\\nco.na\\ncom.na\\norg.na\\n\\n// name : has 2nd-level tlds, but there\\'s no list of them\\nname\\n\\n// nc : http://www.cctld.nc/\\nnc\\nasso.nc\\nnom.nc\\n\\n// ne : https://en.wikipedia.org/wiki/.ne\\nne\\n\\n// net : https://en.wikipedia.org/wiki/.net\\nnet\\n\\n// nf : https://en.wikipedia.org/wiki/.nf\\nnf\\ncom.nf\\nnet.nf\\nper.nf\\nrec.nf\\nweb.nf\\narts.nf\\nfirm.nf\\ninfo.nf\\nother.nf\\nstore.nf\\n\\n// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds\\nng\\ncom.ng\\nedu.ng\\ngov.ng\\ni.ng\\nmil.ng\\nmobi.ng\\nname.ng\\nnet.ng\\norg.ng\\nsch.ng\\n\\n// ni : http://www.nic.ni/\\nni\\nac.ni\\nbiz.ni\\nco.ni\\ncom.ni\\nedu.ni\\ngob.ni\\nin.ni\\ninfo.ni\\nint.ni\\nmil.ni\\nnet.ni\\nnom.ni\\norg.ni\\nweb.ni\\n\\n// nl : https://en.wikipedia.org/wiki/.nl\\n//      https://www.sidn.nl/\\n//      ccTLD for the Netherlands\\nnl\\n\\n// no : https://www.norid.no/en/om-domenenavn/regelverk-for-no/\\n// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/\\n// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/\\n// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/\\n// RSS feed: https://teknisk.norid.no/en/feed/\\nno\\n// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/\\nfhs.no\\nvgs.no\\nfylkesbibl.no\\nfolkebibl.no\\nmuseum.no\\nidrett.no\\npriv.no\\n// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/\\nmil.no\\nstat.no\\ndep.no\\nkommune.no\\nherad.no\\n// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/\\n// counties\\naa.no\\nah.no\\nbu.no\\nfm.no\\nhl.no\\nhm.no\\njan-mayen.no\\nmr.no\\nnl.no\\nnt.no\\nof.no\\nol.no\\noslo.no\\nrl.no\\nsf.no\\nst.no\\nsvalbard.no\\ntm.no\\ntr.no\\nva.no\\nvf.no\\n// primary and lower secondary schools per county\\ngs.aa.no\\ngs.ah.no\\ngs.bu.no\\ngs.fm.no\\ngs.hl.no\\ngs.hm.no\\ngs.jan-mayen.no\\ngs.mr.no\\ngs.nl.no\\ngs.nt.no\\ngs.of.no\\ngs.ol.no\\ngs.oslo.no\\ngs.rl.no\\ngs.sf.no\\ngs.st.no\\ngs.svalbard.no\\ngs.tm.no\\ngs.tr.no\\ngs.va.no\\ngs.vf.no\\n// cities\\nakrehamn.no\\nåkrehamn.no\\nalgard.no\\nålgård.no\\narna.no\\nbrumunddal.no\\nbryne.no\\nbronnoysund.no\\nbrønnøysund.no\\ndrobak.no\\ndrøbak.no\\negersund.no\\nfetsund.no\\nfloro.no\\nflorø.no\\nfredrikstad.no\\nhokksund.no\\nhonefoss.no\\nhønefoss.no\\njessheim.no\\njorpeland.no\\njørpeland.no\\nkirkenes.no\\nkopervik.no\\nkrokstadelva.no\\nlangevag.no\\nlangevåg.no\\nleirvik.no\\nmjondalen.no\\nmjøndalen.no\\nmo-i-rana.no\\nmosjoen.no\\nmosjøen.no\\nnesoddtangen.no\\norkanger.no\\nosoyro.no\\nosøyro.no\\nraholt.no\\nråholt.no\\nsandnessjoen.no\\nsandnessjøen.no\\nskedsmokorset.no\\nslattum.no\\nspjelkavik.no\\nstathelle.no\\nstavern.no\\nstjordalshalsen.no\\nstjørdalshalsen.no\\ntananger.no\\ntranby.no\\nvossevangen.no\\n// communities\\nafjord.no\\nåfjord.no\\nagdenes.no\\nal.no\\nål.no\\nalesund.no\\nålesund.no\\nalstahaug.no\\nalta.no\\náltá.no\\nalaheadju.no\\nálaheadju.no\\nalvdal.no\\namli.no\\nåmli.no\\namot.no\\nåmot.no\\nandebu.no\\nandoy.no\\nandøy.no\\nandasuolo.no\\nardal.no\\nårdal.no\\naremark.no\\narendal.no\\nås.no\\naseral.no\\nåseral.no\\nasker.no\\naskim.no\\naskvoll.no\\naskoy.no\\naskøy.no\\nasnes.no\\nåsnes.no\\naudnedaln.no\\naukra.no\\naure.no\\naurland.no\\naurskog-holand.no\\naurskog-høland.no\\naustevoll.no\\naustrheim.no\\naveroy.no\\naverøy.no\\nbalestrand.no\\nballangen.no\\nbalat.no\\nbálát.no\\nbalsfjord.no\\nbahccavuotna.no\\nbáhccavuotna.no\\nbamble.no\\nbardu.no\\nbeardu.no\\nbeiarn.no\\nbajddar.no\\nbájddar.no\\nbaidar.no\\nbáidár.no\\nberg.no\\nbergen.no\\nberlevag.no\\nberlevåg.no\\nbearalvahki.no\\nbearalváhki.no\\nbindal.no\\nbirkenes.no\\nbjarkoy.no\\nbjarkøy.no\\nbjerkreim.no\\nbjugn.no\\nbodo.no\\nbodø.no\\nbadaddja.no\\nbådåddjå.no\\nbudejju.no\\nbokn.no\\nbremanger.no\\nbronnoy.no\\nbrønnøy.no\\nbygland.no\\nbykle.no\\nbarum.no\\nbærum.no\\nbo.telemark.no\\nbø.telemark.no\\nbo.nordland.no\\nbø.nordland.no\\nbievat.no\\nbievát.no\\nbomlo.no\\nbømlo.no\\nbatsfjord.no\\nbåtsfjord.no\\nbahcavuotna.no\\nbáhcavuotna.no\\ndovre.no\\ndrammen.no\\ndrangedal.no\\ndyroy.no\\ndyrøy.no\\ndonna.no\\ndønna.no\\neid.no\\neidfjord.no\\neidsberg.no\\neidskog.no\\neidsvoll.no\\neigersund.no\\nelverum.no\\nenebakk.no\\nengerdal.no\\netne.no\\netnedal.no\\nevenes.no\\nevenassi.no\\nevenášši.no\\nevje-og-hornnes.no\\nfarsund.no\\nfauske.no\\nfuossko.no\\nfuoisku.no\\nfedje.no\\nfet.no\\nfinnoy.no\\nfinnøy.no\\nfitjar.no\\nfjaler.no\\nfjell.no\\nflakstad.no\\nflatanger.no\\nflekkefjord.no\\nflesberg.no\\nflora.no\\nfla.no\\nflå.no\\nfolldal.no\\nforsand.no\\nfosnes.no\\nfrei.no\\nfrogn.no\\nfroland.no\\nfrosta.no\\nfrana.no\\nfræna.no\\nfroya.no\\nfrøya.no\\nfusa.no\\nfyresdal.no\\nforde.no\\nførde.no\\ngamvik.no\\ngangaviika.no\\ngáŋgaviika.no\\ngaular.no\\ngausdal.no\\ngildeskal.no\\ngildeskål.no\\ngiske.no\\ngjemnes.no\\ngjerdrum.no\\ngjerstad.no\\ngjesdal.no\\ngjovik.no\\ngjøvik.no\\ngloppen.no\\ngol.no\\ngran.no\\ngrane.no\\ngranvin.no\\ngratangen.no\\ngrimstad.no\\ngrong.no\\nkraanghke.no\\nkråanghke.no\\ngrue.no\\ngulen.no\\nhadsel.no\\nhalden.no\\nhalsa.no\\nhamar.no\\nhamaroy.no\\nhabmer.no\\nhábmer.no\\nhapmir.no\\nhápmir.no\\nhammerfest.no\\nhammarfeasta.no\\nhámmárfeasta.no\\nharam.no\\nhareid.no\\nharstad.no\\nhasvik.no\\naknoluokta.no\\nákŋoluokta.no\\nhattfjelldal.no\\naarborte.no\\nhaugesund.no\\nhemne.no\\nhemnes.no\\nhemsedal.no\\nheroy.more-og-romsdal.no\\nherøy.møre-og-romsdal.no\\nheroy.nordland.no\\nherøy.nordland.no\\nhitra.no\\nhjartdal.no\\nhjelmeland.no\\nhobol.no\\nhobøl.no\\nhof.no\\nhol.no\\nhole.no\\nholmestrand.no\\nholtalen.no\\nholtålen.no\\nhornindal.no\\nhorten.no\\nhurdal.no\\nhurum.no\\nhvaler.no\\nhyllestad.no\\nhagebostad.no\\nhægebostad.no\\nhoyanger.no\\nhøyanger.no\\nhoylandet.no\\nhøylandet.no\\nha.no\\nhå.no\\nibestad.no\\ninderoy.no\\ninderøy.no\\niveland.no\\njevnaker.no\\njondal.no\\njolster.no\\njølster.no\\nkarasjok.no\\nkarasjohka.no\\nkárášjohka.no\\nkarlsoy.no\\ngalsa.no\\ngálsá.no\\nkarmoy.no\\nkarmøy.no\\nkautokeino.no\\nguovdageaidnu.no\\nklepp.no\\nklabu.no\\nklæbu.no\\nkongsberg.no\\nkongsvinger.no\\nkragero.no\\nkragerø.no\\nkristiansand.no\\nkristiansund.no\\nkrodsherad.no\\nkrødsherad.no\\nkvalsund.no\\nrahkkeravju.no\\nráhkkerávju.no\\nkvam.no\\nkvinesdal.no\\nkvinnherad.no\\nkviteseid.no\\nkvitsoy.no\\nkvitsøy.no\\nkvafjord.no\\nkvæfjord.no\\ngiehtavuoatna.no\\nkvanangen.no\\nkvænangen.no\\nnavuotna.no\\nnávuotna.no\\nkafjord.no\\nkåfjord.no\\ngaivuotna.no\\ngáivuotna.no\\nlarvik.no\\nlavangen.no\\nlavagis.no\\nloabat.no\\nloabát.no\\nlebesby.no\\ndavvesiida.no\\nleikanger.no\\nleirfjord.no\\nleka.no\\nleksvik.no\\nlenvik.no\\nleangaviika.no\\nleaŋgaviika.no\\nlesja.no\\nlevanger.no\\nlier.no\\nlierne.no\\nlillehammer.no\\nlillesand.no\\nlindesnes.no\\nlindas.no\\nlindås.no\\nlom.no\\nloppa.no\\nlahppi.no\\nláhppi.no\\nlund.no\\nlunner.no\\nluroy.no\\nlurøy.no\\nluster.no\\nlyngdal.no\\nlyngen.no\\nivgu.no\\nlardal.no\\nlerdal.no\\nlærdal.no\\nlodingen.no\\nlødingen.no\\nlorenskog.no\\nlørenskog.no\\nloten.no\\nløten.no\\nmalvik.no\\nmasoy.no\\nmåsøy.no\\nmuosat.no\\nmuosát.no\\nmandal.no\\nmarker.no\\nmarnardal.no\\nmasfjorden.no\\nmeland.no\\nmeldal.no\\nmelhus.no\\nmeloy.no\\nmeløy.no\\nmeraker.no\\nmeråker.no\\nmoareke.no\\nmoåreke.no\\nmidsund.no\\nmidtre-gauldal.no\\nmodalen.no\\nmodum.no\\nmolde.no\\nmoskenes.no\\nmoss.no\\nmosvik.no\\nmalselv.no\\nmålselv.no\\nmalatvuopmi.no\\nmálatvuopmi.no\\nnamdalseid.no\\naejrie.no\\nnamsos.no\\nnamsskogan.no\\nnaamesjevuemie.no\\nnååmesjevuemie.no\\nlaakesvuemie.no\\nnannestad.no\\nnarvik.no\\nnarviika.no\\nnaustdal.no\\nnedre-eiker.no\\nnes.akershus.no\\nnes.buskerud.no\\nnesna.no\\nnesodden.no\\nnesseby.no\\nunjarga.no\\nunjárga.no\\nnesset.no\\nnissedal.no\\nnittedal.no\\nnord-aurdal.no\\nnord-fron.no\\nnord-odal.no\\nnorddal.no\\nnordkapp.no\\ndavvenjarga.no\\ndavvenjárga.no\\nnordre-land.no\\nnordreisa.no\\nraisa.no\\nráisa.no\\nnore-og-uvdal.no\\nnotodden.no\\nnaroy.no\\nnærøy.no\\nnotteroy.no\\nnøtterøy.no\\nodda.no\\noksnes.no\\nøksnes.no\\noppdal.no\\noppegard.no\\noppegård.no\\norkdal.no\\norland.no\\nørland.no\\norskog.no\\nørskog.no\\norsta.no\\nørsta.no\\nos.hedmark.no\\nos.hordaland.no\\nosen.no\\nosteroy.no\\nosterøy.no\\nostre-toten.no\\nøstre-toten.no\\noverhalla.no\\novre-eiker.no\\nøvre-eiker.no\\noyer.no\\nøyer.no\\noygarden.no\\nøygarden.no\\noystre-slidre.no\\nøystre-slidre.no\\nporsanger.no\\nporsangu.no\\nporsáŋgu.no\\nporsgrunn.no\\nradoy.no\\nradøy.no\\nrakkestad.no\\nrana.no\\nruovat.no\\nrandaberg.no\\nrauma.no\\nrendalen.no\\nrennebu.no\\nrennesoy.no\\nrennesøy.no\\nrindal.no\\nringebu.no\\nringerike.no\\nringsaker.no\\nrissa.no\\nrisor.no\\nrisør.no\\nroan.no\\nrollag.no\\nrygge.no\\nralingen.no\\nrælingen.no\\nrodoy.no\\nrødøy.no\\nromskog.no\\nrømskog.no\\nroros.no\\nrøros.no\\nrost.no\\nrøst.no\\nroyken.no\\nrøyken.no\\nroyrvik.no\\nrøyrvik.no\\nrade.no\\nråde.no\\nsalangen.no\\nsiellak.no\\nsaltdal.no\\nsalat.no\\nsálát.no\\nsálat.no\\nsamnanger.no\\nsande.more-og-romsdal.no\\nsande.møre-og-romsdal.no\\nsande.vestfold.no\\nsandefjord.no\\nsandnes.no\\nsandoy.no\\nsandøy.no\\nsarpsborg.no\\nsauda.no\\nsauherad.no\\nsel.no\\nselbu.no\\nselje.no\\nseljord.no\\nsigdal.no\\nsiljan.no\\nsirdal.no\\nskaun.no\\nskedsmo.no\\nski.no\\nskien.no\\nskiptvet.no\\nskjervoy.no\\nskjervøy.no\\nskierva.no\\nskiervá.no\\nskjak.no\\nskjåk.no\\nskodje.no\\nskanland.no\\nskånland.no\\nskanit.no\\nskánit.no\\nsmola.no\\nsmøla.no\\nsnillfjord.no\\nsnasa.no\\nsnåsa.no\\nsnoasa.no\\nsnaase.no\\nsnåase.no\\nsogndal.no\\nsokndal.no\\nsola.no\\nsolund.no\\nsongdalen.no\\nsortland.no\\nspydeberg.no\\nstange.no\\nstavanger.no\\nsteigen.no\\nsteinkjer.no\\nstjordal.no\\nstjørdal.no\\nstokke.no\\nstor-elvdal.no\\nstord.no\\nstordal.no\\nstorfjord.no\\nomasvuotna.no\\nstrand.no\\nstranda.no\\nstryn.no\\nsula.no\\nsuldal.no\\nsund.no\\nsunndal.no\\nsurnadal.no\\nsveio.no\\nsvelvik.no\\nsykkylven.no\\nsogne.no\\nsøgne.no\\nsomna.no\\nsømna.no\\nsondre-land.no\\nsøndre-land.no\\nsor-aurdal.no\\nsør-aurdal.no\\nsor-fron.no\\nsør-fron.no\\nsor-odal.no\\nsør-odal.no\\nsor-varanger.no\\nsør-varanger.no\\nmatta-varjjat.no\\nmátta-várjjat.no\\nsorfold.no\\nsørfold.no\\nsorreisa.no\\nsørreisa.no\\nsorum.no\\nsørum.no\\ntana.no\\ndeatnu.no\\ntime.no\\ntingvoll.no\\ntinn.no\\ntjeldsund.no\\ndielddanuorri.no\\ntjome.no\\ntjøme.no\\ntokke.no\\ntolga.no\\ntorsken.no\\ntranoy.no\\ntranøy.no\\ntromso.no\\ntromsø.no\\ntromsa.no\\nromsa.no\\ntrondheim.no\\ntroandin.no\\ntrysil.no\\ntrana.no\\ntræna.no\\ntrogstad.no\\ntrøgstad.no\\ntvedestrand.no\\ntydal.no\\ntynset.no\\ntysfjord.no\\ndivtasvuodna.no\\ndivttasvuotna.no\\ntysnes.no\\ntysvar.no\\ntysvær.no\\ntonsberg.no\\ntønsberg.no\\nullensaker.no\\nullensvang.no\\nulvik.no\\nutsira.no\\nvadso.no\\nvadsø.no\\ncahcesuolo.no\\nčáhcesuolo.no\\nvaksdal.no\\nvalle.no\\nvang.no\\nvanylven.no\\nvardo.no\\nvardø.no\\nvarggat.no\\nvárggát.no\\nvefsn.no\\nvaapste.no\\nvega.no\\nvegarshei.no\\nvegårshei.no\\nvennesla.no\\nverdal.no\\nverran.no\\nvestby.no\\nvestnes.no\\nvestre-slidre.no\\nvestre-toten.no\\nvestvagoy.no\\nvestvågøy.no\\nvevelstad.no\\nvik.no\\nvikna.no\\nvindafjord.no\\nvolda.no\\nvoss.no\\nvaroy.no\\nværøy.no\\nvagan.no\\nvågan.no\\nvoagat.no\\nvagsoy.no\\nvågsøy.no\\nvaga.no\\nvågå.no\\nvaler.ostfold.no\\nvåler.østfold.no\\nvaler.hedmark.no\\nvåler.hedmark.no\\n\\n// np : http://www.mos.com.np/register.html\\n*.np\\n\\n// nr : http://cenpac.net.nr/dns/index.html\\n// Submitted by registry <technician@cenpac.net.nr>\\nnr\\nbiz.nr\\ninfo.nr\\ngov.nr\\nedu.nr\\norg.nr\\nnet.nr\\ncom.nr\\n\\n// nu : https://en.wikipedia.org/wiki/.nu\\nnu\\n\\n// nz : https://en.wikipedia.org/wiki/.nz\\n// Submitted by registry <jay@nzrs.net.nz>\\nnz\\nac.nz\\nco.nz\\ncri.nz\\ngeek.nz\\ngen.nz\\ngovt.nz\\nhealth.nz\\niwi.nz\\nkiwi.nz\\nmaori.nz\\nmil.nz\\nmāori.nz\\nnet.nz\\norg.nz\\nparliament.nz\\nschool.nz\\n\\n// om : https://en.wikipedia.org/wiki/.om\\nom\\nco.om\\ncom.om\\nedu.om\\ngov.om\\nmed.om\\nmuseum.om\\nnet.om\\norg.om\\npro.om\\n\\n// onion : https://tools.ietf.org/html/rfc7686\\nonion\\n\\n// org : https://en.wikipedia.org/wiki/.org\\norg\\n\\n// pa : http://www.nic.pa/\\n// Some additional second level \"domains\" resolve directly as hostnames, such as\\n// pannet.pa, so we add a rule for \"pa\".\\npa\\nac.pa\\ngob.pa\\ncom.pa\\norg.pa\\nsld.pa\\nedu.pa\\nnet.pa\\ning.pa\\nabo.pa\\nmed.pa\\nnom.pa\\n\\n// pe : https://www.nic.pe/InformeFinalComision.pdf\\npe\\nedu.pe\\ngob.pe\\nnom.pe\\nmil.pe\\norg.pe\\ncom.pe\\nnet.pe\\n\\n// pf : http://www.gobin.info/domainname/formulaire-pf.pdf\\npf\\ncom.pf\\norg.pf\\nedu.pf\\n\\n// pg : https://en.wikipedia.org/wiki/.pg\\n*.pg\\n\\n// ph : http://www.domains.ph/FAQ2.asp\\n// Submitted by registry <jed@email.com.ph>\\nph\\ncom.ph\\nnet.ph\\norg.ph\\ngov.ph\\nedu.ph\\nngo.ph\\nmil.ph\\ni.ph\\n\\n// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK\\npk\\ncom.pk\\nnet.pk\\nedu.pk\\norg.pk\\nfam.pk\\nbiz.pk\\nweb.pk\\ngov.pk\\ngob.pk\\ngok.pk\\ngon.pk\\ngop.pk\\ngos.pk\\ninfo.pk\\n\\n// pl http://www.dns.pl/english/index.html\\n// Submitted by registry\\npl\\ncom.pl\\nnet.pl\\norg.pl\\n// pl functional domains (http://www.dns.pl/english/index.html)\\naid.pl\\nagro.pl\\natm.pl\\nauto.pl\\nbiz.pl\\nedu.pl\\ngmina.pl\\ngsm.pl\\ninfo.pl\\nmail.pl\\nmiasta.pl\\nmedia.pl\\nmil.pl\\nnieruchomosci.pl\\nnom.pl\\npc.pl\\npowiat.pl\\npriv.pl\\nrealestate.pl\\nrel.pl\\nsex.pl\\nshop.pl\\nsklep.pl\\nsos.pl\\nszkola.pl\\ntargi.pl\\ntm.pl\\ntourism.pl\\ntravel.pl\\nturystyka.pl\\n// Government domains\\ngov.pl\\nap.gov.pl\\ngriw.gov.pl\\nic.gov.pl\\nis.gov.pl\\nkmpsp.gov.pl\\nkonsulat.gov.pl\\nkppsp.gov.pl\\nkwp.gov.pl\\nkwpsp.gov.pl\\nmup.gov.pl\\nmw.gov.pl\\noia.gov.pl\\noirm.gov.pl\\noke.gov.pl\\noow.gov.pl\\noschr.gov.pl\\noum.gov.pl\\npa.gov.pl\\npinb.gov.pl\\npiw.gov.pl\\npo.gov.pl\\npr.gov.pl\\npsp.gov.pl\\npsse.gov.pl\\npup.gov.pl\\nrzgw.gov.pl\\nsa.gov.pl\\nsdn.gov.pl\\nsko.gov.pl\\nso.gov.pl\\nsr.gov.pl\\nstarostwo.gov.pl\\nug.gov.pl\\nugim.gov.pl\\num.gov.pl\\numig.gov.pl\\nupow.gov.pl\\nuppo.gov.pl\\nus.gov.pl\\nuw.gov.pl\\nuzs.gov.pl\\nwif.gov.pl\\nwiih.gov.pl\\nwinb.gov.pl\\nwios.gov.pl\\nwitd.gov.pl\\nwiw.gov.pl\\nwkz.gov.pl\\nwsa.gov.pl\\nwskr.gov.pl\\nwsse.gov.pl\\nwuoz.gov.pl\\nwzmiuw.gov.pl\\nzp.gov.pl\\nzpisdn.gov.pl\\n// pl regional domains (http://www.dns.pl/english/index.html)\\naugustow.pl\\nbabia-gora.pl\\nbedzin.pl\\nbeskidy.pl\\nbialowieza.pl\\nbialystok.pl\\nbielawa.pl\\nbieszczady.pl\\nboleslawiec.pl\\nbydgoszcz.pl\\nbytom.pl\\ncieszyn.pl\\nczeladz.pl\\nczest.pl\\ndlugoleka.pl\\nelblag.pl\\nelk.pl\\nglogow.pl\\ngniezno.pl\\ngorlice.pl\\ngrajewo.pl\\nilawa.pl\\njaworzno.pl\\njelenia-gora.pl\\njgora.pl\\nkalisz.pl\\nkazimierz-dolny.pl\\nkarpacz.pl\\nkartuzy.pl\\nkaszuby.pl\\nkatowice.pl\\nkepno.pl\\nketrzyn.pl\\nklodzko.pl\\nkobierzyce.pl\\nkolobrzeg.pl\\nkonin.pl\\nkonskowola.pl\\nkutno.pl\\nlapy.pl\\nlebork.pl\\nlegnica.pl\\nlezajsk.pl\\nlimanowa.pl\\nlomza.pl\\nlowicz.pl\\nlubin.pl\\nlukow.pl\\nmalbork.pl\\nmalopolska.pl\\nmazowsze.pl\\nmazury.pl\\nmielec.pl\\nmielno.pl\\nmragowo.pl\\nnaklo.pl\\nnowaruda.pl\\nnysa.pl\\nolawa.pl\\nolecko.pl\\nolkusz.pl\\nolsztyn.pl\\nopoczno.pl\\nopole.pl\\nostroda.pl\\nostroleka.pl\\nostrowiec.pl\\nostrowwlkp.pl\\npila.pl\\npisz.pl\\npodhale.pl\\npodlasie.pl\\npolkowice.pl\\npomorze.pl\\npomorskie.pl\\nprochowice.pl\\npruszkow.pl\\nprzeworsk.pl\\npulawy.pl\\nradom.pl\\nrawa-maz.pl\\nrybnik.pl\\nrzeszow.pl\\nsanok.pl\\nsejny.pl\\nslask.pl\\nslupsk.pl\\nsosnowiec.pl\\nstalowa-wola.pl\\nskoczow.pl\\nstarachowice.pl\\nstargard.pl\\nsuwalki.pl\\nswidnica.pl\\nswiebodzin.pl\\nswinoujscie.pl\\nszczecin.pl\\nszczytno.pl\\ntarnobrzeg.pl\\ntgory.pl\\nturek.pl\\ntychy.pl\\nustka.pl\\nwalbrzych.pl\\nwarmia.pl\\nwarszawa.pl\\nwaw.pl\\nwegrow.pl\\nwielun.pl\\nwlocl.pl\\nwloclawek.pl\\nwodzislaw.pl\\nwolomin.pl\\nwroclaw.pl\\nzachpomor.pl\\nzagan.pl\\nzarow.pl\\nzgora.pl\\nzgorzelec.pl\\n\\n// pm : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\npm\\n\\n// pn : http://www.government.pn/PnRegistry/policies.htm\\npn\\ngov.pn\\nco.pn\\norg.pn\\nedu.pn\\nnet.pn\\n\\n// post : https://en.wikipedia.org/wiki/.post\\npost\\n\\n// pr : http://www.nic.pr/index.asp?f=1\\npr\\ncom.pr\\nnet.pr\\norg.pr\\ngov.pr\\nedu.pr\\nisla.pr\\npro.pr\\nbiz.pr\\ninfo.pr\\nname.pr\\n// these aren\\'t mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr\\nest.pr\\nprof.pr\\nac.pr\\n\\n// pro : http://registry.pro/get-pro\\npro\\naaa.pro\\naca.pro\\nacct.pro\\navocat.pro\\nbar.pro\\ncpa.pro\\neng.pro\\njur.pro\\nlaw.pro\\nmed.pro\\nrecht.pro\\n\\n// ps : https://en.wikipedia.org/wiki/.ps\\n// http://www.nic.ps/registration/policy.html#reg\\nps\\nedu.ps\\ngov.ps\\nsec.ps\\nplo.ps\\ncom.ps\\norg.ps\\nnet.ps\\n\\n// pt : https://www.dns.pt/en/domain/pt-terms-and-conditions-registration-rules/\\npt\\nnet.pt\\ngov.pt\\norg.pt\\nedu.pt\\nint.pt\\npubl.pt\\ncom.pt\\nnome.pt\\n\\n// pw : https://en.wikipedia.org/wiki/.pw\\npw\\nco.pw\\nne.pw\\nor.pw\\ned.pw\\ngo.pw\\nbelau.pw\\n\\n// py : http://www.nic.py/pautas.html#seccion_9\\n// Submitted by registry\\npy\\ncom.py\\ncoop.py\\nedu.py\\ngov.py\\nmil.py\\nnet.py\\norg.py\\n\\n// qa : http://domains.qa/en/\\nqa\\ncom.qa\\nedu.qa\\ngov.qa\\nmil.qa\\nname.qa\\nnet.qa\\norg.qa\\nsch.qa\\n\\n// re : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\nre\\nasso.re\\ncom.re\\nnom.re\\n\\n// ro : http://www.rotld.ro/\\nro\\narts.ro\\ncom.ro\\nfirm.ro\\ninfo.ro\\nnom.ro\\nnt.ro\\norg.ro\\nrec.ro\\nstore.ro\\ntm.ro\\nwww.ro\\n\\n// rs : https://www.rnids.rs/en/domains/national-domains\\nrs\\nac.rs\\nco.rs\\nedu.rs\\ngov.rs\\nin.rs\\norg.rs\\n\\n// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf\\n// Submitted by George Georgievsky <gug@cctld.ru>\\nru\\n\\n// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf\\nrw\\nac.rw\\nco.rw\\ncoop.rw\\ngov.rw\\nmil.rw\\nnet.rw\\norg.rw\\n\\n// sa : http://www.nic.net.sa/\\nsa\\ncom.sa\\nnet.sa\\norg.sa\\ngov.sa\\nmed.sa\\npub.sa\\nedu.sa\\nsch.sa\\n\\n// sb : http://www.sbnic.net.sb/\\n// Submitted by registry <lee.humphries@telekom.com.sb>\\nsb\\ncom.sb\\nedu.sb\\ngov.sb\\nnet.sb\\norg.sb\\n\\n// sc : http://www.nic.sc/\\nsc\\ncom.sc\\ngov.sc\\nnet.sc\\norg.sc\\nedu.sc\\n\\n// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm\\n// Submitted by registry <admin@isoc.sd>\\nsd\\ncom.sd\\nnet.sd\\norg.sd\\nedu.sd\\nmed.sd\\ntv.sd\\ngov.sd\\ninfo.sd\\n\\n// se : https://en.wikipedia.org/wiki/.se\\n// Submitted by registry <patrik.wallstrom@iis.se>\\nse\\na.se\\nac.se\\nb.se\\nbd.se\\nbrand.se\\nc.se\\nd.se\\ne.se\\nf.se\\nfh.se\\nfhsk.se\\nfhv.se\\ng.se\\nh.se\\ni.se\\nk.se\\nkomforb.se\\nkommunalforbund.se\\nkomvux.se\\nl.se\\nlanbib.se\\nm.se\\nn.se\\nnaturbruksgymn.se\\no.se\\norg.se\\np.se\\nparti.se\\npp.se\\npress.se\\nr.se\\ns.se\\nt.se\\ntm.se\\nu.se\\nw.se\\nx.se\\ny.se\\nz.se\\n\\n// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines\\nsg\\ncom.sg\\nnet.sg\\norg.sg\\ngov.sg\\nedu.sg\\nper.sg\\n\\n// sh : http://nic.sh/rules.htm\\nsh\\ncom.sh\\nnet.sh\\ngov.sh\\norg.sh\\nmil.sh\\n\\n// si : https://en.wikipedia.org/wiki/.si\\nsi\\n\\n// sj : No registrations at this time.\\n// Submitted by registry <jarle@uninett.no>\\nsj\\n\\n// sk : https://en.wikipedia.org/wiki/.sk\\n// list of 2nd level domains ?\\nsk\\n\\n// sl : http://www.nic.sl\\n// Submitted by registry <adam@neoip.com>\\nsl\\ncom.sl\\nnet.sl\\nedu.sl\\ngov.sl\\norg.sl\\n\\n// sm : https://en.wikipedia.org/wiki/.sm\\nsm\\n\\n// sn : https://en.wikipedia.org/wiki/.sn\\nsn\\nart.sn\\ncom.sn\\nedu.sn\\ngouv.sn\\norg.sn\\nperso.sn\\nuniv.sn\\n\\n// so : http://sonic.so/policies/\\nso\\ncom.so\\nedu.so\\ngov.so\\nme.so\\nnet.so\\norg.so\\n\\n// sr : https://en.wikipedia.org/wiki/.sr\\nsr\\n\\n// ss : https://registry.nic.ss/\\n// Submitted by registry <technical@nic.ss>\\nss\\nbiz.ss\\ncom.ss\\nedu.ss\\ngov.ss\\nme.ss\\nnet.ss\\norg.ss\\nsch.ss\\n\\n// st : http://www.nic.st/html/policyrules/\\nst\\nco.st\\ncom.st\\nconsulado.st\\nedu.st\\nembaixada.st\\nmil.st\\nnet.st\\norg.st\\nprincipe.st\\nsaotome.st\\nstore.st\\n\\n// su : https://en.wikipedia.org/wiki/.su\\nsu\\n\\n// sv : http://www.svnet.org.sv/niveldos.pdf\\nsv\\ncom.sv\\nedu.sv\\ngob.sv\\norg.sv\\nred.sv\\n\\n// sx : https://en.wikipedia.org/wiki/.sx\\n// Submitted by registry <jcvignes@openregistry.com>\\nsx\\ngov.sx\\n\\n// sy : https://en.wikipedia.org/wiki/.sy\\n// see also: http://www.gobin.info/domainname/sy.doc\\nsy\\nedu.sy\\ngov.sy\\nnet.sy\\nmil.sy\\ncom.sy\\norg.sy\\n\\n// sz : https://en.wikipedia.org/wiki/.sz\\n// http://www.sispa.org.sz/\\nsz\\nco.sz\\nac.sz\\norg.sz\\n\\n// tc : https://en.wikipedia.org/wiki/.tc\\ntc\\n\\n// td : https://en.wikipedia.org/wiki/.td\\ntd\\n\\n// tel: https://en.wikipedia.org/wiki/.tel\\n// http://www.telnic.org/\\ntel\\n\\n// tf : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\ntf\\n\\n// tg : https://en.wikipedia.org/wiki/.tg\\n// http://www.nic.tg/\\ntg\\n\\n// th : https://en.wikipedia.org/wiki/.th\\n// Submitted by registry <krit@thains.co.th>\\nth\\nac.th\\nco.th\\ngo.th\\nin.th\\nmi.th\\nnet.th\\nor.th\\n\\n// tj : http://www.nic.tj/policy.html\\ntj\\nac.tj\\nbiz.tj\\nco.tj\\ncom.tj\\nedu.tj\\ngo.tj\\ngov.tj\\nint.tj\\nmil.tj\\nname.tj\\nnet.tj\\nnic.tj\\norg.tj\\ntest.tj\\nweb.tj\\n\\n// tk : https://en.wikipedia.org/wiki/.tk\\ntk\\n\\n// tl : https://en.wikipedia.org/wiki/.tl\\ntl\\ngov.tl\\n\\n// tm : http://www.nic.tm/local.html\\ntm\\ncom.tm\\nco.tm\\norg.tm\\nnet.tm\\nnom.tm\\ngov.tm\\nmil.tm\\nedu.tm\\n\\n// tn : http://www.registre.tn/fr/\\n// https://whois.ati.tn/\\ntn\\ncom.tn\\nens.tn\\nfin.tn\\ngov.tn\\nind.tn\\ninfo.tn\\nintl.tn\\nmincom.tn\\nnat.tn\\nnet.tn\\norg.tn\\nperso.tn\\ntourism.tn\\n\\n// to : https://en.wikipedia.org/wiki/.to\\n// Submitted by registry <egullich@colo.to>\\nto\\ncom.to\\ngov.to\\nnet.to\\norg.to\\nedu.to\\nmil.to\\n\\n// tr : https://nic.tr/\\n// https://nic.tr/forms/eng/policies.pdf\\n// https://nic.tr/index.php?USRACTN=PRICELST\\ntr\\nav.tr\\nbbs.tr\\nbel.tr\\nbiz.tr\\ncom.tr\\ndr.tr\\nedu.tr\\ngen.tr\\ngov.tr\\ninfo.tr\\nmil.tr\\nk12.tr\\nkep.tr\\nname.tr\\nnet.tr\\norg.tr\\npol.tr\\ntel.tr\\ntsk.tr\\ntv.tr\\nweb.tr\\n// Used by Northern Cyprus\\nnc.tr\\n// Used by government agencies of Northern Cyprus\\ngov.nc.tr\\n\\n// tt : http://www.nic.tt/\\ntt\\nco.tt\\ncom.tt\\norg.tt\\nnet.tt\\nbiz.tt\\ninfo.tt\\npro.tt\\nint.tt\\ncoop.tt\\njobs.tt\\nmobi.tt\\ntravel.tt\\nmuseum.tt\\naero.tt\\nname.tt\\ngov.tt\\nedu.tt\\n\\n// tv : https://en.wikipedia.org/wiki/.tv\\n// Not listing any 2LDs as reserved since none seem to exist in practice,\\n// Wikipedia notwithstanding.\\ntv\\n\\n// tw : https://en.wikipedia.org/wiki/.tw\\ntw\\nedu.tw\\ngov.tw\\nmil.tw\\ncom.tw\\nnet.tw\\norg.tw\\nidv.tw\\ngame.tw\\nebiz.tw\\nclub.tw\\n網路.tw\\n組織.tw\\n商業.tw\\n\\n// tz : http://www.tznic.or.tz/index.php/domains\\n// Submitted by registry <manager@tznic.or.tz>\\ntz\\nac.tz\\nco.tz\\ngo.tz\\nhotel.tz\\ninfo.tz\\nme.tz\\nmil.tz\\nmobi.tz\\nne.tz\\nor.tz\\nsc.tz\\ntv.tz\\n\\n// ua : https://hostmaster.ua/policy/?ua\\n// Submitted by registry <dk@cctld.ua>\\nua\\n// ua 2LD\\ncom.ua\\nedu.ua\\ngov.ua\\nin.ua\\nnet.ua\\norg.ua\\n// ua geographic names\\n// https://hostmaster.ua/2ld/\\ncherkassy.ua\\ncherkasy.ua\\nchernigov.ua\\nchernihiv.ua\\nchernivtsi.ua\\nchernovtsy.ua\\nck.ua\\ncn.ua\\ncr.ua\\ncrimea.ua\\ncv.ua\\ndn.ua\\ndnepropetrovsk.ua\\ndnipropetrovsk.ua\\ndonetsk.ua\\ndp.ua\\nif.ua\\nivano-frankivsk.ua\\nkh.ua\\nkharkiv.ua\\nkharkov.ua\\nkherson.ua\\nkhmelnitskiy.ua\\nkhmelnytskyi.ua\\nkiev.ua\\nkirovograd.ua\\nkm.ua\\nkr.ua\\nkropyvnytskyi.ua\\nkrym.ua\\nks.ua\\nkv.ua\\nkyiv.ua\\nlg.ua\\nlt.ua\\nlugansk.ua\\nluhansk.ua\\nlutsk.ua\\nlv.ua\\nlviv.ua\\nmk.ua\\nmykolaiv.ua\\nnikolaev.ua\\nod.ua\\nodesa.ua\\nodessa.ua\\npl.ua\\npoltava.ua\\nrivne.ua\\nrovno.ua\\nrv.ua\\nsb.ua\\nsebastopol.ua\\nsevastopol.ua\\nsm.ua\\nsumy.ua\\nte.ua\\nternopil.ua\\nuz.ua\\nuzhgorod.ua\\nuzhhorod.ua\\nvinnica.ua\\nvinnytsia.ua\\nvn.ua\\nvolyn.ua\\nyalta.ua\\nzakarpattia.ua\\nzaporizhzhe.ua\\nzaporizhzhia.ua\\nzhitomir.ua\\nzhytomyr.ua\\nzp.ua\\nzt.ua\\n\\n// ug : https://www.registry.co.ug/\\nug\\nco.ug\\nor.ug\\nac.ug\\nsc.ug\\ngo.ug\\nne.ug\\ncom.ug\\norg.ug\\n\\n// uk : https://en.wikipedia.org/wiki/.uk\\n// Submitted by registry <Michael.Daly@nominet.org.uk>\\nuk\\nac.uk\\nco.uk\\ngov.uk\\nltd.uk\\nme.uk\\nnet.uk\\nnhs.uk\\norg.uk\\nplc.uk\\npolice.uk\\n*.sch.uk\\n\\n// us : https://en.wikipedia.org/wiki/.us\\nus\\ndni.us\\nfed.us\\nisa.us\\nkids.us\\nnsn.us\\n// us geographic names\\nak.us\\nal.us\\nar.us\\nas.us\\naz.us\\nca.us\\nco.us\\nct.us\\ndc.us\\nde.us\\nfl.us\\nga.us\\ngu.us\\nhi.us\\nia.us\\nid.us\\nil.us\\nin.us\\nks.us\\nky.us\\nla.us\\nma.us\\nmd.us\\nme.us\\nmi.us\\nmn.us\\nmo.us\\nms.us\\nmt.us\\nnc.us\\nnd.us\\nne.us\\nnh.us\\nnj.us\\nnm.us\\nnv.us\\nny.us\\noh.us\\nok.us\\nor.us\\npa.us\\npr.us\\nri.us\\nsc.us\\nsd.us\\ntn.us\\ntx.us\\nut.us\\nvi.us\\nvt.us\\nva.us\\nwa.us\\nwi.us\\nwv.us\\nwy.us\\n// The registrar notes several more specific domains available in each state,\\n// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat\\n// haphazard; in some states these domains resolve as addresses, while in others\\n// only subdomains are available, or even nothing at all. We include the\\n// most common ones where it\\'s clear that different sites are different\\n// entities.\\nk12.ak.us\\nk12.al.us\\nk12.ar.us\\nk12.as.us\\nk12.az.us\\nk12.ca.us\\nk12.co.us\\nk12.ct.us\\nk12.dc.us\\nk12.fl.us\\nk12.ga.us\\nk12.gu.us\\n// k12.hi.us  Bug 614565 - Hawaii has a state-wide DOE login\\nk12.ia.us\\nk12.id.us\\nk12.il.us\\nk12.in.us\\nk12.ks.us\\nk12.ky.us\\nk12.la.us\\nk12.ma.us\\nk12.md.us\\nk12.me.us\\nk12.mi.us\\nk12.mn.us\\nk12.mo.us\\nk12.ms.us\\nk12.mt.us\\nk12.nc.us\\n// k12.nd.us  Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov>\\nk12.ne.us\\nk12.nh.us\\nk12.nj.us\\nk12.nm.us\\nk12.nv.us\\nk12.ny.us\\nk12.oh.us\\nk12.ok.us\\nk12.or.us\\nk12.pa.us\\nk12.pr.us\\n// k12.ri.us  Removed at request of Kim Cournoyer <netsupport@staff.ri.net>\\nk12.sc.us\\n// k12.sd.us  Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us>\\nk12.tn.us\\nk12.tx.us\\nk12.ut.us\\nk12.vi.us\\nk12.vt.us\\nk12.va.us\\nk12.wa.us\\nk12.wi.us\\n// k12.wv.us  Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu>\\nk12.wy.us\\ncc.ak.us\\ncc.al.us\\ncc.ar.us\\ncc.as.us\\ncc.az.us\\ncc.ca.us\\ncc.co.us\\ncc.ct.us\\ncc.dc.us\\ncc.de.us\\ncc.fl.us\\ncc.ga.us\\ncc.gu.us\\ncc.hi.us\\ncc.ia.us\\ncc.id.us\\ncc.il.us\\ncc.in.us\\ncc.ks.us\\ncc.ky.us\\ncc.la.us\\ncc.ma.us\\ncc.md.us\\ncc.me.us\\ncc.mi.us\\ncc.mn.us\\ncc.mo.us\\ncc.ms.us\\ncc.mt.us\\ncc.nc.us\\ncc.nd.us\\ncc.ne.us\\ncc.nh.us\\ncc.nj.us\\ncc.nm.us\\ncc.nv.us\\ncc.ny.us\\ncc.oh.us\\ncc.ok.us\\ncc.or.us\\ncc.pa.us\\ncc.pr.us\\ncc.ri.us\\ncc.sc.us\\ncc.sd.us\\ncc.tn.us\\ncc.tx.us\\ncc.ut.us\\ncc.vi.us\\ncc.vt.us\\ncc.va.us\\ncc.wa.us\\ncc.wi.us\\ncc.wv.us\\ncc.wy.us\\nlib.ak.us\\nlib.al.us\\nlib.ar.us\\nlib.as.us\\nlib.az.us\\nlib.ca.us\\nlib.co.us\\nlib.ct.us\\nlib.dc.us\\n// lib.de.us  Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us>\\nlib.fl.us\\nlib.ga.us\\nlib.gu.us\\nlib.hi.us\\nlib.ia.us\\nlib.id.us\\nlib.il.us\\nlib.in.us\\nlib.ks.us\\nlib.ky.us\\nlib.la.us\\nlib.ma.us\\nlib.md.us\\nlib.me.us\\nlib.mi.us\\nlib.mn.us\\nlib.mo.us\\nlib.ms.us\\nlib.mt.us\\nlib.nc.us\\nlib.nd.us\\nlib.ne.us\\nlib.nh.us\\nlib.nj.us\\nlib.nm.us\\nlib.nv.us\\nlib.ny.us\\nlib.oh.us\\nlib.ok.us\\nlib.or.us\\nlib.pa.us\\nlib.pr.us\\nlib.ri.us\\nlib.sc.us\\nlib.sd.us\\nlib.tn.us\\nlib.tx.us\\nlib.ut.us\\nlib.vi.us\\nlib.vt.us\\nlib.va.us\\nlib.wa.us\\nlib.wi.us\\n// lib.wv.us  Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us>\\nlib.wy.us\\n// k12.ma.us contains school districts in Massachusetts. The 4LDs are\\n//  managed independently except for private (PVT), charter (CHTR) and\\n//  parochial (PAROCH) schools.  Those are delegated directly to the\\n//  5LD operators.   <k12-ma-hostmaster _ at _ rsuc.gweep.net>\\npvt.k12.ma.us\\nchtr.k12.ma.us\\nparoch.k12.ma.us\\n// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following\\n//    see also: http://domreg.merit.edu\\n//    see also: whois -h whois.domreg.merit.edu help\\nann-arbor.mi.us\\ncog.mi.us\\ndst.mi.us\\neaton.mi.us\\ngen.mi.us\\nmus.mi.us\\ntec.mi.us\\nwashtenaw.mi.us\\n\\n// uy : http://www.nic.org.uy/\\nuy\\ncom.uy\\nedu.uy\\ngub.uy\\nmil.uy\\nnet.uy\\norg.uy\\n\\n// uz : http://www.reg.uz/\\nuz\\nco.uz\\ncom.uz\\nnet.uz\\norg.uz\\n\\n// va : https://en.wikipedia.org/wiki/.va\\nva\\n\\n// vc : https://en.wikipedia.org/wiki/.vc\\n// Submitted by registry <kshah@ca.afilias.info>\\nvc\\ncom.vc\\nnet.vc\\norg.vc\\ngov.vc\\nmil.vc\\nedu.vc\\n\\n// ve : https://registro.nic.ve/\\n// Submitted by registry nic@nic.ve and nicve@conatel.gob.ve\\nve\\narts.ve\\nbib.ve\\nco.ve\\ncom.ve\\ne12.ve\\nedu.ve\\nfirm.ve\\ngob.ve\\ngov.ve\\ninfo.ve\\nint.ve\\nmil.ve\\nnet.ve\\nnom.ve\\norg.ve\\nrar.ve\\nrec.ve\\nstore.ve\\ntec.ve\\nweb.ve\\n\\n// vg : https://en.wikipedia.org/wiki/.vg\\nvg\\n\\n// vi : http://www.nic.vi/newdomainform.htm\\n// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other\\n// TLDs are \"reserved\", such as edu.vi and gov.vi, but doesn\\'t actually say they\\n// are available for registration (which they do not seem to be).\\nvi\\nco.vi\\ncom.vi\\nk12.vi\\nnet.vi\\norg.vi\\n\\n// vn : https://www.vnnic.vn/en/domain/cctld-vn\\n// https://vnnic.vn/sites/default/files/tailieu/vn.cctld.domains.txt\\nvn\\nac.vn\\nai.vn\\nbiz.vn\\ncom.vn\\nedu.vn\\ngov.vn\\nhealth.vn\\nid.vn\\ninfo.vn\\nint.vn\\nio.vn\\nname.vn\\nnet.vn\\norg.vn\\npro.vn\\n\\n// vn geographical names\\nangiang.vn\\nbacgiang.vn\\nbackan.vn\\nbaclieu.vn\\nbacninh.vn\\nbaria-vungtau.vn\\nbentre.vn\\nbinhdinh.vn\\nbinhduong.vn\\nbinhphuoc.vn\\nbinhthuan.vn\\ncamau.vn\\ncantho.vn\\ncaobang.vn\\ndaklak.vn\\ndaknong.vn\\ndanang.vn\\ndienbien.vn\\ndongnai.vn\\ndongthap.vn\\ngialai.vn\\nhagiang.vn\\nhaiduong.vn\\nhaiphong.vn\\nhanam.vn\\nhanoi.vn\\nhatinh.vn\\nhaugiang.vn\\nhoabinh.vn\\nhungyen.vn\\nkhanhhoa.vn\\nkiengiang.vn\\nkontum.vn\\nlaichau.vn\\nlamdong.vn\\nlangson.vn\\nlaocai.vn\\nlongan.vn\\nnamdinh.vn\\nnghean.vn\\nninhbinh.vn\\nninhthuan.vn\\nphutho.vn\\nphuyen.vn\\nquangbinh.vn\\nquangnam.vn\\nquangngai.vn\\nquangninh.vn\\nquangtri.vn\\nsoctrang.vn\\nsonla.vn\\ntayninh.vn\\nthaibinh.vn\\nthainguyen.vn\\nthanhhoa.vn\\nthanhphohochiminh.vn\\nthuathienhue.vn\\ntiengiang.vn\\ntravinh.vn\\ntuyenquang.vn\\nvinhlong.vn\\nvinhphuc.vn\\nyenbai.vn\\n\\n// vu : https://en.wikipedia.org/wiki/.vu\\n// http://www.vunic.vu/\\nvu\\ncom.vu\\nedu.vu\\nnet.vu\\norg.vu\\n\\n// wf : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\nwf\\n\\n// ws : https://en.wikipedia.org/wiki/.ws\\n// http://samoanic.ws/index.dhtml\\nws\\ncom.ws\\nnet.ws\\norg.ws\\ngov.ws\\nedu.ws\\n\\n// yt : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\nyt\\n\\n// IDN ccTLDs\\n// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then\\n// U-label, and follow this format:\\n// // A-Label (\"<Latin renderings>\", <language name>[, variant info]) : <ISO 3166 ccTLD>\\n// // [sponsoring org]\\n// U-Label\\n\\n// xn--mgbaam7a8h (\"Emerat\", Arabic) : AE\\n// http://nic.ae/english/arabicdomain/rules.jsp\\nامارات\\n\\n// xn--y9a3aq (\"hye\", Armenian) : AM\\n// ISOC AM (operated by .am Registry)\\nհայ\\n\\n// xn--54b7fta0cc (\"Bangla\", Bangla) : BD\\nবাংলা\\n\\n// xn--90ae (\"bg\", Bulgarian) : BG\\nбг\\n\\n// xn--mgbcpq6gpa1a (\"albahrain\", Arabic) : BH\\nالبحرين\\n\\n// xn--90ais (\"bel\", Belarusian/Russian Cyrillic) : BY\\n// Operated by .by registry\\nбел\\n\\n// xn--fiqs8s (\"Zhongguo/China\", Chinese, Simplified) : CN\\n// CNNIC\\n// http://cnnic.cn/html/Dir/2005/10/11/3218.htm\\n中国\\n\\n// xn--fiqz9s (\"Zhongguo/China\", Chinese, Traditional) : CN\\n// CNNIC\\n// http://cnnic.cn/html/Dir/2005/10/11/3218.htm\\n中國\\n\\n// xn--lgbbat1ad8j (\"Algeria/Al Jazair\", Arabic) : DZ\\nالجزائر\\n\\n// xn--wgbh1c (\"Egypt/Masr\", Arabic) : EG\\n// http://www.dotmasr.eg/\\nمصر\\n\\n// xn--e1a4c (\"eu\", Cyrillic) : EU\\n// https://eurid.eu\\nею\\n\\n// xn--qxa6a (\"eu\", Greek) : EU\\n// https://eurid.eu\\nευ\\n\\n// xn--mgbah1a3hjkrd (\"Mauritania\", Arabic) : MR\\nموريتانيا\\n\\n// xn--node (\"ge\", Georgian Mkhedruli) : GE\\nგე\\n\\n// xn--qxam (\"el\", Greek) : GR\\n// Hellenic Ministry of Infrastructure, Transport, and Networks\\nελ\\n\\n// xn--j6w193g (\"Hong Kong\", Chinese) : HK\\n// https://www.hkirc.hk\\n// Submitted by registry <hk.tech@hkirc.hk>\\n// https://www.hkirc.hk/content.jsp?id=30#!/34\\n香港\\n公司.香港\\n教育.香港\\n政府.香港\\n個人.香港\\n網絡.香港\\n組織.香港\\n\\n// xn--2scrj9c (\"Bharat\", Kannada) : IN\\n// India\\nಭಾರತ\\n\\n// xn--3hcrj9c (\"Bharat\", Oriya) : IN\\n// India\\nଭାରତ\\n\\n// xn--45br5cyl (\"Bharatam\", Assamese) : IN\\n// India\\nভাৰত\\n\\n// xn--h2breg3eve (\"Bharatam\", Sanskrit) : IN\\n// India\\nभारतम्\\n\\n// xn--h2brj9c8c (\"Bharot\", Santali) : IN\\n// India\\nभारोत\\n\\n// xn--mgbgu82a (\"Bharat\", Sindhi) : IN\\n// India\\nڀارت\\n\\n// xn--rvc1e0am3e (\"Bharatam\", Malayalam) : IN\\n// India\\nഭാരതം\\n\\n// xn--h2brj9c (\"Bharat\", Devanagari) : IN\\n// India\\nभारत\\n\\n// xn--mgbbh1a (\"Bharat\", Kashmiri) : IN\\n// India\\nبارت\\n\\n// xn--mgbbh1a71e (\"Bharat\", Arabic) : IN\\n// India\\nبھارت\\n\\n// xn--fpcrj9c3d (\"Bharat\", Telugu) : IN\\n// India\\nభారత్\\n\\n// xn--gecrj9c (\"Bharat\", Gujarati) : IN\\n// India\\nભારત\\n\\n// xn--s9brj9c (\"Bharat\", Gurmukhi) : IN\\n// India\\nਭਾਰਤ\\n\\n// xn--45brj9c (\"Bharat\", Bengali) : IN\\n// India\\nভারত\\n\\n// xn--xkc2dl3a5ee0h (\"India\", Tamil) : IN\\n// India\\nஇந்தியா\\n\\n// xn--mgba3a4f16a (\"Iran\", Persian) : IR\\nایران\\n\\n// xn--mgba3a4fra (\"Iran\", Arabic) : IR\\nايران\\n\\n// xn--mgbtx2b (\"Iraq\", Arabic) : IQ\\n// Communications and Media Commission\\nعراق\\n\\n// xn--mgbayh7gpa (\"al-Ordon\", Arabic) : JO\\n// National Information Technology Center (NITC)\\n// Royal Scientific Society, Al-Jubeiha\\nالاردن\\n\\n// xn--3e0b707e (\"Republic of Korea\", Hangul) : KR\\n한국\\n\\n// xn--80ao21a (\"Kaz\", Kazakh) : KZ\\nқаз\\n\\n// xn--q7ce6a (\"Lao\", Lao) : LA\\nລາວ\\n\\n// xn--fzc2c9e2c (\"Lanka\", Sinhalese-Sinhala) : LK\\n// https://nic.lk\\nලංකා\\n\\n// xn--xkc2al3hye2a (\"Ilangai\", Tamil) : LK\\n// https://nic.lk\\nஇலங்கை\\n\\n// xn--mgbc0a9azcg (\"Morocco/al-Maghrib\", Arabic) : MA\\nالمغرب\\n\\n// xn--d1alf (\"mkd\", Macedonian) : MK\\n// MARnet\\nмкд\\n\\n// xn--l1acc (\"mon\", Mongolian) : MN\\nмон\\n\\n// xn--mix891f (\"Macao\", Chinese, Traditional) : MO\\n// MONIC / HNET Asia (Registry Operator for .mo)\\n澳門\\n\\n// xn--mix082f (\"Macao\", Chinese, Simplified) : MO\\n澳门\\n\\n// xn--mgbx4cd0ab (\"Malaysia\", Malay) : MY\\nمليسيا\\n\\n// xn--mgb9awbf (\"Oman\", Arabic) : OM\\nعمان\\n\\n// xn--mgbai9azgqp6j (\"Pakistan\", Urdu/Arabic) : PK\\nپاکستان\\n\\n// xn--mgbai9a5eva00b (\"Pakistan\", Urdu/Arabic, variant) : PK\\nپاكستان\\n\\n// xn--ygbi2ammx (\"Falasteen\", Arabic) : PS\\n// The Palestinian National Internet Naming Authority (PNINA)\\n// http://www.pnina.ps\\nفلسطين\\n\\n// xn--90a3ac (\"srb\", Cyrillic) : RS\\n// https://www.rnids.rs/en/domains/national-domains\\nсрб\\nпр.срб\\nорг.срб\\nобр.срб\\nод.срб\\nупр.срб\\nак.срб\\n\\n// xn--p1ai (\"rf\", Russian-Cyrillic) : RU\\n// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf\\n// Submitted by George Georgievsky <gug@cctld.ru>\\nрф\\n\\n// xn--wgbl6a (\"Qatar\", Arabic) : QA\\n// http://www.ict.gov.qa/\\nقطر\\n\\n// xn--mgberp4a5d4ar (\"AlSaudiah\", Arabic) : SA\\n// http://www.nic.net.sa/\\nالسعودية\\n\\n// xn--mgberp4a5d4a87g (\"AlSaudiah\", Arabic, variant)  : SA\\nالسعودیة\\n\\n// xn--mgbqly7c0a67fbc (\"AlSaudiah\", Arabic, variant) : SA\\nالسعودیۃ\\n\\n// xn--mgbqly7cvafr (\"AlSaudiah\", Arabic, variant) : SA\\nالسعوديه\\n\\n// xn--mgbpl2fh (\"sudan\", Arabic) : SD\\n// Operated by .sd registry\\nسودان\\n\\n// xn--yfro4i67o Singapore (\"Singapore\", Chinese) : SG\\n新加坡\\n\\n// xn--clchc0ea0b2g2a9gcd (\"Singapore\", Tamil) : SG\\nசிங்கப்பூர்\\n\\n// xn--ogbpf8fl (\"Syria\", Arabic) : SY\\nسورية\\n\\n// xn--mgbtf8fl (\"Syria\", Arabic, variant) : SY\\nسوريا\\n\\n// xn--o3cw4h (\"Thai\", Thai) : TH\\n// http://www.thnic.co.th\\nไทย\\nศึกษา.ไทย\\nธุรกิจ.ไทย\\nรัฐบาล.ไทย\\nทหาร.ไทย\\nเน็ต.ไทย\\nองค์กร.ไทย\\n\\n// xn--pgbs0dh (\"Tunisia\", Arabic) : TN\\n// http://nic.tn\\nتونس\\n\\n// xn--kpry57d (\"Taiwan\", Chinese, Traditional) : TW\\n// http://www.twnic.net/english/dn/dn_07a.htm\\n台灣\\n\\n// xn--kprw13d (\"Taiwan\", Chinese, Simplified) : TW\\n// http://www.twnic.net/english/dn/dn_07a.htm\\n台湾\\n\\n// xn--nnx388a (\"Taiwan\", Chinese, variant) : TW\\n臺灣\\n\\n// xn--j1amh (\"ukr\", Cyrillic) : UA\\nукр\\n\\n// xn--mgb2ddes (\"AlYemen\", Arabic) : YE\\nاليمن\\n\\n// xxx : http://icmregistry.com\\nxxx\\n\\n// ye : http://www.y.net.ye/services/domain_name.htm\\nye\\ncom.ye\\nedu.ye\\ngov.ye\\nnet.ye\\nmil.ye\\norg.ye\\n\\n// za : https://www.zadna.org.za/content/page/domain-information/\\nac.za\\nagric.za\\nalt.za\\nco.za\\nedu.za\\ngov.za\\ngrondar.za\\nlaw.za\\nmil.za\\nnet.za\\nngo.za\\nnic.za\\nnis.za\\nnom.za\\norg.za\\nschool.za\\ntm.za\\nweb.za\\n\\n// zm : https://zicta.zm/\\n// Submitted by registry <info@zicta.zm>\\nzm\\nac.zm\\nbiz.zm\\nco.zm\\ncom.zm\\nedu.zm\\ngov.zm\\ninfo.zm\\nmil.zm\\nnet.zm\\norg.zm\\nsch.zm\\n\\n// zw : https://www.potraz.gov.zw/\\n// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25\\nzw\\nac.zw\\nco.zw\\ngov.zw\\nmil.zw\\norg.zw\\n\\n\\n// newGTLDs\\n\\n// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2023-10-20T15:11:50Z\\n// This list is auto-generated, don\\'t edit it manually.\\n// aaa : American Automobile Association, Inc.\\n// https://www.iana.org/domains/root/db/aaa.html\\naaa\\n\\n// aarp : AARP\\n// https://www.iana.org/domains/root/db/aarp.html\\naarp\\n\\n// abb : ABB Ltd\\n// https://www.iana.org/domains/root/db/abb.html\\nabb\\n\\n// abbott : Abbott Laboratories, Inc.\\n// https://www.iana.org/domains/root/db/abbott.html\\nabbott\\n\\n// abbvie : AbbVie Inc.\\n// https://www.iana.org/domains/root/db/abbvie.html\\nabbvie\\n\\n// abc : Disney Enterprises, Inc.\\n// https://www.iana.org/domains/root/db/abc.html\\nabc\\n\\n// able : Able Inc.\\n// https://www.iana.org/domains/root/db/able.html\\nable\\n\\n// abogado : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/abogado.html\\nabogado\\n\\n// abudhabi : Abu Dhabi Systems and Information Centre\\n// https://www.iana.org/domains/root/db/abudhabi.html\\nabudhabi\\n\\n// academy : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/academy.html\\nacademy\\n\\n// accenture : Accenture plc\\n// https://www.iana.org/domains/root/db/accenture.html\\naccenture\\n\\n// accountant : dot Accountant Limited\\n// https://www.iana.org/domains/root/db/accountant.html\\naccountant\\n\\n// accountants : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/accountants.html\\naccountants\\n\\n// aco : ACO Severin Ahlmann GmbH & Co. KG\\n// https://www.iana.org/domains/root/db/aco.html\\naco\\n\\n// actor : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/actor.html\\nactor\\n\\n// ads : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/ads.html\\nads\\n\\n// adult : ICM Registry AD LLC\\n// https://www.iana.org/domains/root/db/adult.html\\nadult\\n\\n// aeg : Aktiebolaget Electrolux\\n// https://www.iana.org/domains/root/db/aeg.html\\naeg\\n\\n// aetna : Aetna Life Insurance Company\\n// https://www.iana.org/domains/root/db/aetna.html\\naetna\\n\\n// afl : Australian Football League\\n// https://www.iana.org/domains/root/db/afl.html\\nafl\\n\\n// africa : ZA Central Registry NPC trading as Registry.Africa\\n// https://www.iana.org/domains/root/db/africa.html\\nafrica\\n\\n// agakhan : Fondation Aga Khan (Aga Khan Foundation)\\n// https://www.iana.org/domains/root/db/agakhan.html\\nagakhan\\n\\n// agency : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/agency.html\\nagency\\n\\n// aig : American International Group, Inc.\\n// https://www.iana.org/domains/root/db/aig.html\\naig\\n\\n// airbus : Airbus S.A.S.\\n// https://www.iana.org/domains/root/db/airbus.html\\nairbus\\n\\n// airforce : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/airforce.html\\nairforce\\n\\n// airtel : Bharti Airtel Limited\\n// https://www.iana.org/domains/root/db/airtel.html\\nairtel\\n\\n// akdn : Fondation Aga Khan (Aga Khan Foundation)\\n// https://www.iana.org/domains/root/db/akdn.html\\nakdn\\n\\n// alibaba : Alibaba Group Holding Limited\\n// https://www.iana.org/domains/root/db/alibaba.html\\nalibaba\\n\\n// alipay : Alibaba Group Holding Limited\\n// https://www.iana.org/domains/root/db/alipay.html\\nalipay\\n\\n// allfinanz : Allfinanz Deutsche Vermögensberatung Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/allfinanz.html\\nallfinanz\\n\\n// allstate : Allstate Fire and Casualty Insurance Company\\n// https://www.iana.org/domains/root/db/allstate.html\\nallstate\\n\\n// ally : Ally Financial Inc.\\n// https://www.iana.org/domains/root/db/ally.html\\nally\\n\\n// alsace : Region Grand Est\\n// https://www.iana.org/domains/root/db/alsace.html\\nalsace\\n\\n// alstom : ALSTOM\\n// https://www.iana.org/domains/root/db/alstom.html\\nalstom\\n\\n// amazon : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/amazon.html\\namazon\\n\\n// americanexpress : American Express Travel Related Services Company, Inc.\\n// https://www.iana.org/domains/root/db/americanexpress.html\\namericanexpress\\n\\n// americanfamily : AmFam, Inc.\\n// https://www.iana.org/domains/root/db/americanfamily.html\\namericanfamily\\n\\n// amex : American Express Travel Related Services Company, Inc.\\n// https://www.iana.org/domains/root/db/amex.html\\namex\\n\\n// amfam : AmFam, Inc.\\n// https://www.iana.org/domains/root/db/amfam.html\\namfam\\n\\n// amica : Amica Mutual Insurance Company\\n// https://www.iana.org/domains/root/db/amica.html\\namica\\n\\n// amsterdam : Gemeente Amsterdam\\n// https://www.iana.org/domains/root/db/amsterdam.html\\namsterdam\\n\\n// analytics : Campus IP LLC\\n// https://www.iana.org/domains/root/db/analytics.html\\nanalytics\\n\\n// android : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/android.html\\nandroid\\n\\n// anquan : Beijing Qihu Keji Co., Ltd.\\n// https://www.iana.org/domains/root/db/anquan.html\\nanquan\\n\\n// anz : Australia and New Zealand Banking Group Limited\\n// https://www.iana.org/domains/root/db/anz.html\\nanz\\n\\n// aol : Oath Inc.\\n// https://www.iana.org/domains/root/db/aol.html\\naol\\n\\n// apartments : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/apartments.html\\napartments\\n\\n// app : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/app.html\\napp\\n\\n// apple : Apple Inc.\\n// https://www.iana.org/domains/root/db/apple.html\\napple\\n\\n// aquarelle : Aquarelle.com\\n// https://www.iana.org/domains/root/db/aquarelle.html\\naquarelle\\n\\n// arab : League of Arab States\\n// https://www.iana.org/domains/root/db/arab.html\\narab\\n\\n// aramco : Aramco Services Company\\n// https://www.iana.org/domains/root/db/aramco.html\\naramco\\n\\n// archi : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/archi.html\\narchi\\n\\n// army : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/army.html\\narmy\\n\\n// art : UK Creative Ideas Limited\\n// https://www.iana.org/domains/root/db/art.html\\nart\\n\\n// arte : Association Relative à la Télévision Européenne G.E.I.E.\\n// https://www.iana.org/domains/root/db/arte.html\\narte\\n\\n// asda : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/asda.html\\nasda\\n\\n// associates : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/associates.html\\nassociates\\n\\n// athleta : The Gap, Inc.\\n// https://www.iana.org/domains/root/db/athleta.html\\nathleta\\n\\n// attorney : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/attorney.html\\nattorney\\n\\n// auction : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/auction.html\\nauction\\n\\n// audi : AUDI Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/audi.html\\naudi\\n\\n// audible : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/audible.html\\naudible\\n\\n// audio : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/audio.html\\naudio\\n\\n// auspost : Australian Postal Corporation\\n// https://www.iana.org/domains/root/db/auspost.html\\nauspost\\n\\n// author : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/author.html\\nauthor\\n\\n// auto : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/auto.html\\nauto\\n\\n// autos : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/autos.html\\nautos\\n\\n// avianca : Avianca Inc.\\n// https://www.iana.org/domains/root/db/avianca.html\\navianca\\n\\n// aws : AWS Registry LLC\\n// https://www.iana.org/domains/root/db/aws.html\\naws\\n\\n// axa : AXA Group Operations SAS\\n// https://www.iana.org/domains/root/db/axa.html\\naxa\\n\\n// azure : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/azure.html\\nazure\\n\\n// baby : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/baby.html\\nbaby\\n\\n// baidu : Baidu, Inc.\\n// https://www.iana.org/domains/root/db/baidu.html\\nbaidu\\n\\n// banamex : Citigroup Inc.\\n// https://www.iana.org/domains/root/db/banamex.html\\nbanamex\\n\\n// bananarepublic : The Gap, Inc.\\n// https://www.iana.org/domains/root/db/bananarepublic.html\\nbananarepublic\\n\\n// band : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/band.html\\nband\\n\\n// bank : fTLD Registry Services LLC\\n// https://www.iana.org/domains/root/db/bank.html\\nbank\\n\\n// bar : Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable\\n// https://www.iana.org/domains/root/db/bar.html\\nbar\\n\\n// barcelona : Municipi de Barcelona\\n// https://www.iana.org/domains/root/db/barcelona.html\\nbarcelona\\n\\n// barclaycard : Barclays Bank PLC\\n// https://www.iana.org/domains/root/db/barclaycard.html\\nbarclaycard\\n\\n// barclays : Barclays Bank PLC\\n// https://www.iana.org/domains/root/db/barclays.html\\nbarclays\\n\\n// barefoot : Gallo Vineyards, Inc.\\n// https://www.iana.org/domains/root/db/barefoot.html\\nbarefoot\\n\\n// bargains : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/bargains.html\\nbargains\\n\\n// baseball : MLB Advanced Media DH, LLC\\n// https://www.iana.org/domains/root/db/baseball.html\\nbaseball\\n\\n// basketball : Fédération Internationale de Basketball (FIBA)\\n// https://www.iana.org/domains/root/db/basketball.html\\nbasketball\\n\\n// bauhaus : Werkhaus GmbH\\n// https://www.iana.org/domains/root/db/bauhaus.html\\nbauhaus\\n\\n// bayern : Bayern Connect GmbH\\n// https://www.iana.org/domains/root/db/bayern.html\\nbayern\\n\\n// bbc : British Broadcasting Corporation\\n// https://www.iana.org/domains/root/db/bbc.html\\nbbc\\n\\n// bbt : BB&T Corporation\\n// https://www.iana.org/domains/root/db/bbt.html\\nbbt\\n\\n// bbva : BANCO BILBAO VIZCAYA ARGENTARIA, S.A.\\n// https://www.iana.org/domains/root/db/bbva.html\\nbbva\\n\\n// bcg : The Boston Consulting Group, Inc.\\n// https://www.iana.org/domains/root/db/bcg.html\\nbcg\\n\\n// bcn : Municipi de Barcelona\\n// https://www.iana.org/domains/root/db/bcn.html\\nbcn\\n\\n// beats : Beats Electronics, LLC\\n// https://www.iana.org/domains/root/db/beats.html\\nbeats\\n\\n// beauty : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/beauty.html\\nbeauty\\n\\n// beer : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/beer.html\\nbeer\\n\\n// bentley : Bentley Motors Limited\\n// https://www.iana.org/domains/root/db/bentley.html\\nbentley\\n\\n// berlin : dotBERLIN GmbH & Co. KG\\n// https://www.iana.org/domains/root/db/berlin.html\\nberlin\\n\\n// best : BestTLD Pty Ltd\\n// https://www.iana.org/domains/root/db/best.html\\nbest\\n\\n// bestbuy : BBY Solutions, Inc.\\n// https://www.iana.org/domains/root/db/bestbuy.html\\nbestbuy\\n\\n// bet : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/bet.html\\nbet\\n\\n// bharti : Bharti Enterprises (Holding) Private Limited\\n// https://www.iana.org/domains/root/db/bharti.html\\nbharti\\n\\n// bible : American Bible Society\\n// https://www.iana.org/domains/root/db/bible.html\\nbible\\n\\n// bid : dot Bid Limited\\n// https://www.iana.org/domains/root/db/bid.html\\nbid\\n\\n// bike : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/bike.html\\nbike\\n\\n// bing : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/bing.html\\nbing\\n\\n// bingo : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/bingo.html\\nbingo\\n\\n// bio : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/bio.html\\nbio\\n\\n// black : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/black.html\\nblack\\n\\n// blackfriday : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/blackfriday.html\\nblackfriday\\n\\n// blockbuster : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/blockbuster.html\\nblockbuster\\n\\n// blog : Knock Knock WHOIS There, LLC\\n// https://www.iana.org/domains/root/db/blog.html\\nblog\\n\\n// bloomberg : Bloomberg IP Holdings LLC\\n// https://www.iana.org/domains/root/db/bloomberg.html\\nbloomberg\\n\\n// blue : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/blue.html\\nblue\\n\\n// bms : Bristol-Myers Squibb Company\\n// https://www.iana.org/domains/root/db/bms.html\\nbms\\n\\n// bmw : Bayerische Motoren Werke Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/bmw.html\\nbmw\\n\\n// bnpparibas : BNP Paribas\\n// https://www.iana.org/domains/root/db/bnpparibas.html\\nbnpparibas\\n\\n// boats : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/boats.html\\nboats\\n\\n// boehringer : Boehringer Ingelheim International GmbH\\n// https://www.iana.org/domains/root/db/boehringer.html\\nboehringer\\n\\n// bofa : Bank of America Corporation\\n// https://www.iana.org/domains/root/db/bofa.html\\nbofa\\n\\n// bom : Núcleo de Informação e Coordenação do Ponto BR - NIC.br\\n// https://www.iana.org/domains/root/db/bom.html\\nbom\\n\\n// bond : ShortDot SA\\n// https://www.iana.org/domains/root/db/bond.html\\nbond\\n\\n// boo : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/boo.html\\nboo\\n\\n// book : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/book.html\\nbook\\n\\n// booking : Booking.com B.V.\\n// https://www.iana.org/domains/root/db/booking.html\\nbooking\\n\\n// bosch : Robert Bosch GMBH\\n// https://www.iana.org/domains/root/db/bosch.html\\nbosch\\n\\n// bostik : Bostik SA\\n// https://www.iana.org/domains/root/db/bostik.html\\nbostik\\n\\n// boston : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/boston.html\\nboston\\n\\n// bot : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/bot.html\\nbot\\n\\n// boutique : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/boutique.html\\nboutique\\n\\n// box : Intercap Registry Inc.\\n// https://www.iana.org/domains/root/db/box.html\\nbox\\n\\n// bradesco : Banco Bradesco S.A.\\n// https://www.iana.org/domains/root/db/bradesco.html\\nbradesco\\n\\n// bridgestone : Bridgestone Corporation\\n// https://www.iana.org/domains/root/db/bridgestone.html\\nbridgestone\\n\\n// broadway : Celebrate Broadway, Inc.\\n// https://www.iana.org/domains/root/db/broadway.html\\nbroadway\\n\\n// broker : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/broker.html\\nbroker\\n\\n// brother : Brother Industries, Ltd.\\n// https://www.iana.org/domains/root/db/brother.html\\nbrother\\n\\n// brussels : DNS.be vzw\\n// https://www.iana.org/domains/root/db/brussels.html\\nbrussels\\n\\n// build : Plan Bee LLC\\n// https://www.iana.org/domains/root/db/build.html\\nbuild\\n\\n// builders : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/builders.html\\nbuilders\\n\\n// business : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/business.html\\nbusiness\\n\\n// buy : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/buy.html\\nbuy\\n\\n// buzz : DOTSTRATEGY CO.\\n// https://www.iana.org/domains/root/db/buzz.html\\nbuzz\\n\\n// bzh : Association www.bzh\\n// https://www.iana.org/domains/root/db/bzh.html\\nbzh\\n\\n// cab : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cab.html\\ncab\\n\\n// cafe : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cafe.html\\ncafe\\n\\n// cal : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/cal.html\\ncal\\n\\n// call : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/call.html\\ncall\\n\\n// calvinklein : PVH gTLD Holdings LLC\\n// https://www.iana.org/domains/root/db/calvinklein.html\\ncalvinklein\\n\\n// cam : Cam Connecting SARL\\n// https://www.iana.org/domains/root/db/cam.html\\ncam\\n\\n// camera : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/camera.html\\ncamera\\n\\n// camp : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/camp.html\\ncamp\\n\\n// canon : Canon Inc.\\n// https://www.iana.org/domains/root/db/canon.html\\ncanon\\n\\n// capetown : ZA Central Registry NPC trading as ZA Central Registry\\n// https://www.iana.org/domains/root/db/capetown.html\\ncapetown\\n\\n// capital : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/capital.html\\ncapital\\n\\n// capitalone : Capital One Financial Corporation\\n// https://www.iana.org/domains/root/db/capitalone.html\\ncapitalone\\n\\n// car : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/car.html\\ncar\\n\\n// caravan : Caravan International, Inc.\\n// https://www.iana.org/domains/root/db/caravan.html\\ncaravan\\n\\n// cards : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cards.html\\ncards\\n\\n// care : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/care.html\\ncare\\n\\n// career : dotCareer LLC\\n// https://www.iana.org/domains/root/db/career.html\\ncareer\\n\\n// careers : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/careers.html\\ncareers\\n\\n// cars : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/cars.html\\ncars\\n\\n// casa : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/casa.html\\ncasa\\n\\n// case : Digity, LLC\\n// https://www.iana.org/domains/root/db/case.html\\ncase\\n\\n// cash : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cash.html\\ncash\\n\\n// casino : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/casino.html\\ncasino\\n\\n// catering : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/catering.html\\ncatering\\n\\n// catholic : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)\\n// https://www.iana.org/domains/root/db/catholic.html\\ncatholic\\n\\n// cba : COMMONWEALTH BANK OF AUSTRALIA\\n// https://www.iana.org/domains/root/db/cba.html\\ncba\\n\\n// cbn : The Christian Broadcasting Network, Inc.\\n// https://www.iana.org/domains/root/db/cbn.html\\ncbn\\n\\n// cbre : CBRE, Inc.\\n// https://www.iana.org/domains/root/db/cbre.html\\ncbre\\n\\n// cbs : CBS Domains Inc.\\n// https://www.iana.org/domains/root/db/cbs.html\\ncbs\\n\\n// center : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/center.html\\ncenter\\n\\n// ceo : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/ceo.html\\nceo\\n\\n// cern : European Organization for Nuclear Research (\"CERN\")\\n// https://www.iana.org/domains/root/db/cern.html\\ncern\\n\\n// cfa : CFA Institute\\n// https://www.iana.org/domains/root/db/cfa.html\\ncfa\\n\\n// cfd : ShortDot SA\\n// https://www.iana.org/domains/root/db/cfd.html\\ncfd\\n\\n// chanel : Chanel International B.V.\\n// https://www.iana.org/domains/root/db/chanel.html\\nchanel\\n\\n// channel : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/channel.html\\nchannel\\n\\n// charity : Public Interest Registry\\n// https://www.iana.org/domains/root/db/charity.html\\ncharity\\n\\n// chase : JPMorgan Chase Bank, National Association\\n// https://www.iana.org/domains/root/db/chase.html\\nchase\\n\\n// chat : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/chat.html\\nchat\\n\\n// cheap : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cheap.html\\ncheap\\n\\n// chintai : CHINTAI Corporation\\n// https://www.iana.org/domains/root/db/chintai.html\\nchintai\\n\\n// christmas : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/christmas.html\\nchristmas\\n\\n// chrome : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/chrome.html\\nchrome\\n\\n// church : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/church.html\\nchurch\\n\\n// cipriani : Hotel Cipriani Srl\\n// https://www.iana.org/domains/root/db/cipriani.html\\ncipriani\\n\\n// circle : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/circle.html\\ncircle\\n\\n// cisco : Cisco Technology, Inc.\\n// https://www.iana.org/domains/root/db/cisco.html\\ncisco\\n\\n// citadel : Citadel Domain LLC\\n// https://www.iana.org/domains/root/db/citadel.html\\ncitadel\\n\\n// citi : Citigroup Inc.\\n// https://www.iana.org/domains/root/db/citi.html\\nciti\\n\\n// citic : CITIC Group Corporation\\n// https://www.iana.org/domains/root/db/citic.html\\ncitic\\n\\n// city : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/city.html\\ncity\\n\\n// claims : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/claims.html\\nclaims\\n\\n// cleaning : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cleaning.html\\ncleaning\\n\\n// click : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/click.html\\nclick\\n\\n// clinic : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/clinic.html\\nclinic\\n\\n// clinique : The Estée Lauder Companies Inc.\\n// https://www.iana.org/domains/root/db/clinique.html\\nclinique\\n\\n// clothing : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/clothing.html\\nclothing\\n\\n// cloud : Aruba PEC S.p.A.\\n// https://www.iana.org/domains/root/db/cloud.html\\ncloud\\n\\n// club : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/club.html\\nclub\\n\\n// clubmed : Club Méditerranée S.A.\\n// https://www.iana.org/domains/root/db/clubmed.html\\nclubmed\\n\\n// coach : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/coach.html\\ncoach\\n\\n// codes : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/codes.html\\ncodes\\n\\n// coffee : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/coffee.html\\ncoffee\\n\\n// college : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/college.html\\ncollege\\n\\n// cologne : dotKoeln GmbH\\n// https://www.iana.org/domains/root/db/cologne.html\\ncologne\\n\\n// comcast : Comcast IP Holdings I, LLC\\n// https://www.iana.org/domains/root/db/comcast.html\\ncomcast\\n\\n// commbank : COMMONWEALTH BANK OF AUSTRALIA\\n// https://www.iana.org/domains/root/db/commbank.html\\ncommbank\\n\\n// community : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/community.html\\ncommunity\\n\\n// company : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/company.html\\ncompany\\n\\n// compare : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/compare.html\\ncompare\\n\\n// computer : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/computer.html\\ncomputer\\n\\n// comsec : VeriSign, Inc.\\n// https://www.iana.org/domains/root/db/comsec.html\\ncomsec\\n\\n// condos : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/condos.html\\ncondos\\n\\n// construction : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/construction.html\\nconstruction\\n\\n// consulting : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/consulting.html\\nconsulting\\n\\n// contact : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/contact.html\\ncontact\\n\\n// contractors : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/contractors.html\\ncontractors\\n\\n// cooking : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/cooking.html\\ncooking\\n\\n// cool : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cool.html\\ncool\\n\\n// corsica : Collectivité de Corse\\n// https://www.iana.org/domains/root/db/corsica.html\\ncorsica\\n\\n// country : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/country.html\\ncountry\\n\\n// coupon : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/coupon.html\\ncoupon\\n\\n// coupons : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/coupons.html\\ncoupons\\n\\n// courses : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/courses.html\\ncourses\\n\\n// cpa : American Institute of Certified Public Accountants\\n// https://www.iana.org/domains/root/db/cpa.html\\ncpa\\n\\n// credit : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/credit.html\\ncredit\\n\\n// creditcard : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/creditcard.html\\ncreditcard\\n\\n// creditunion : DotCooperation LLC\\n// https://www.iana.org/domains/root/db/creditunion.html\\ncreditunion\\n\\n// cricket : dot Cricket Limited\\n// https://www.iana.org/domains/root/db/cricket.html\\ncricket\\n\\n// crown : Crown Equipment Corporation\\n// https://www.iana.org/domains/root/db/crown.html\\ncrown\\n\\n// crs : Federated Co-operatives Limited\\n// https://www.iana.org/domains/root/db/crs.html\\ncrs\\n\\n// cruise : Viking River Cruises (Bermuda) Ltd.\\n// https://www.iana.org/domains/root/db/cruise.html\\ncruise\\n\\n// cruises : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cruises.html\\ncruises\\n\\n// cuisinella : SCHMIDT GROUPE S.A.S.\\n// https://www.iana.org/domains/root/db/cuisinella.html\\ncuisinella\\n\\n// cymru : Nominet UK\\n// https://www.iana.org/domains/root/db/cymru.html\\ncymru\\n\\n// cyou : ShortDot SA\\n// https://www.iana.org/domains/root/db/cyou.html\\ncyou\\n\\n// dabur : Dabur India Limited\\n// https://www.iana.org/domains/root/db/dabur.html\\ndabur\\n\\n// dad : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/dad.html\\ndad\\n\\n// dance : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/dance.html\\ndance\\n\\n// data : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/data.html\\ndata\\n\\n// date : dot Date Limited\\n// https://www.iana.org/domains/root/db/date.html\\ndate\\n\\n// dating : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/dating.html\\ndating\\n\\n// datsun : NISSAN MOTOR CO., LTD.\\n// https://www.iana.org/domains/root/db/datsun.html\\ndatsun\\n\\n// day : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/day.html\\nday\\n\\n// dclk : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/dclk.html\\ndclk\\n\\n// dds : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/dds.html\\ndds\\n\\n// deal : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/deal.html\\ndeal\\n\\n// dealer : Intercap Registry Inc.\\n// https://www.iana.org/domains/root/db/dealer.html\\ndealer\\n\\n// deals : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/deals.html\\ndeals\\n\\n// degree : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/degree.html\\ndegree\\n\\n// delivery : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/delivery.html\\ndelivery\\n\\n// dell : Dell Inc.\\n// https://www.iana.org/domains/root/db/dell.html\\ndell\\n\\n// deloitte : Deloitte Touche Tohmatsu\\n// https://www.iana.org/domains/root/db/deloitte.html\\ndeloitte\\n\\n// delta : Delta Air Lines, Inc.\\n// https://www.iana.org/domains/root/db/delta.html\\ndelta\\n\\n// democrat : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/democrat.html\\ndemocrat\\n\\n// dental : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/dental.html\\ndental\\n\\n// dentist : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/dentist.html\\ndentist\\n\\n// desi : Desi Networks LLC\\n// https://www.iana.org/domains/root/db/desi.html\\ndesi\\n\\n// design : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/design.html\\ndesign\\n\\n// dev : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/dev.html\\ndev\\n\\n// dhl : Deutsche Post AG\\n// https://www.iana.org/domains/root/db/dhl.html\\ndhl\\n\\n// diamonds : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/diamonds.html\\ndiamonds\\n\\n// diet : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/diet.html\\ndiet\\n\\n// digital : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/digital.html\\ndigital\\n\\n// direct : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/direct.html\\ndirect\\n\\n// directory : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/directory.html\\ndirectory\\n\\n// discount : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/discount.html\\ndiscount\\n\\n// discover : Discover Financial Services\\n// https://www.iana.org/domains/root/db/discover.html\\ndiscover\\n\\n// dish : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/dish.html\\ndish\\n\\n// diy : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/diy.html\\ndiy\\n\\n// dnp : Dai Nippon Printing Co., Ltd.\\n// https://www.iana.org/domains/root/db/dnp.html\\ndnp\\n\\n// docs : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/docs.html\\ndocs\\n\\n// doctor : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/doctor.html\\ndoctor\\n\\n// dog : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/dog.html\\ndog\\n\\n// domains : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/domains.html\\ndomains\\n\\n// dot : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/dot.html\\ndot\\n\\n// download : dot Support Limited\\n// https://www.iana.org/domains/root/db/download.html\\ndownload\\n\\n// drive : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/drive.html\\ndrive\\n\\n// dtv : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/dtv.html\\ndtv\\n\\n// dubai : Dubai Smart Government Department\\n// https://www.iana.org/domains/root/db/dubai.html\\ndubai\\n\\n// dunlop : The Goodyear Tire & Rubber Company\\n// https://www.iana.org/domains/root/db/dunlop.html\\ndunlop\\n\\n// dupont : DuPont Specialty Products USA, LLC\\n// https://www.iana.org/domains/root/db/dupont.html\\ndupont\\n\\n// durban : ZA Central Registry NPC trading as ZA Central Registry\\n// https://www.iana.org/domains/root/db/durban.html\\ndurban\\n\\n// dvag : Deutsche Vermögensberatung Aktiengesellschaft DVAG\\n// https://www.iana.org/domains/root/db/dvag.html\\ndvag\\n\\n// dvr : DISH Technologies L.L.C.\\n// https://www.iana.org/domains/root/db/dvr.html\\ndvr\\n\\n// earth : Interlink Systems Innovation Institute K.K.\\n// https://www.iana.org/domains/root/db/earth.html\\nearth\\n\\n// eat : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/eat.html\\neat\\n\\n// eco : Big Room Inc.\\n// https://www.iana.org/domains/root/db/eco.html\\neco\\n\\n// edeka : EDEKA Verband kaufmännischer Genossenschaften e.V.\\n// https://www.iana.org/domains/root/db/edeka.html\\nedeka\\n\\n// education : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/education.html\\neducation\\n\\n// email : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/email.html\\nemail\\n\\n// emerck : Merck KGaA\\n// https://www.iana.org/domains/root/db/emerck.html\\nemerck\\n\\n// energy : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/energy.html\\nenergy\\n\\n// engineer : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/engineer.html\\nengineer\\n\\n// engineering : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/engineering.html\\nengineering\\n\\n// enterprises : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/enterprises.html\\nenterprises\\n\\n// epson : Seiko Epson Corporation\\n// https://www.iana.org/domains/root/db/epson.html\\nepson\\n\\n// equipment : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/equipment.html\\nequipment\\n\\n// ericsson : Telefonaktiebolaget L M Ericsson\\n// https://www.iana.org/domains/root/db/ericsson.html\\nericsson\\n\\n// erni : ERNI Group Holding AG\\n// https://www.iana.org/domains/root/db/erni.html\\nerni\\n\\n// esq : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/esq.html\\nesq\\n\\n// estate : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/estate.html\\nestate\\n\\n// etisalat : Emirates Telecommunications Corporation (trading as Etisalat)\\n// https://www.iana.org/domains/root/db/etisalat.html\\netisalat\\n\\n// eurovision : European Broadcasting Union (EBU)\\n// https://www.iana.org/domains/root/db/eurovision.html\\neurovision\\n\\n// eus : Puntueus Fundazioa\\n// https://www.iana.org/domains/root/db/eus.html\\neus\\n\\n// events : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/events.html\\nevents\\n\\n// exchange : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/exchange.html\\nexchange\\n\\n// expert : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/expert.html\\nexpert\\n\\n// exposed : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/exposed.html\\nexposed\\n\\n// express : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/express.html\\nexpress\\n\\n// extraspace : Extra Space Storage LLC\\n// https://www.iana.org/domains/root/db/extraspace.html\\nextraspace\\n\\n// fage : Fage International S.A.\\n// https://www.iana.org/domains/root/db/fage.html\\nfage\\n\\n// fail : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fail.html\\nfail\\n\\n// fairwinds : FairWinds Partners, LLC\\n// https://www.iana.org/domains/root/db/fairwinds.html\\nfairwinds\\n\\n// faith : dot Faith Limited\\n// https://www.iana.org/domains/root/db/faith.html\\nfaith\\n\\n// family : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/family.html\\nfamily\\n\\n// fan : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/fan.html\\nfan\\n\\n// fans : ZDNS International Limited\\n// https://www.iana.org/domains/root/db/fans.html\\nfans\\n\\n// farm : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/farm.html\\nfarm\\n\\n// farmers : Farmers Insurance Exchange\\n// https://www.iana.org/domains/root/db/farmers.html\\nfarmers\\n\\n// fashion : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/fashion.html\\nfashion\\n\\n// fast : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/fast.html\\nfast\\n\\n// fedex : Federal Express Corporation\\n// https://www.iana.org/domains/root/db/fedex.html\\nfedex\\n\\n// feedback : Top Level Spectrum, Inc.\\n// https://www.iana.org/domains/root/db/feedback.html\\nfeedback\\n\\n// ferrari : Fiat Chrysler Automobiles N.V.\\n// https://www.iana.org/domains/root/db/ferrari.html\\nferrari\\n\\n// ferrero : Ferrero Trading Lux S.A.\\n// https://www.iana.org/domains/root/db/ferrero.html\\nferrero\\n\\n// fidelity : Fidelity Brokerage Services LLC\\n// https://www.iana.org/domains/root/db/fidelity.html\\nfidelity\\n\\n// fido : Rogers Communications Canada Inc.\\n// https://www.iana.org/domains/root/db/fido.html\\nfido\\n\\n// film : Motion Picture Domain Registry Pty Ltd\\n// https://www.iana.org/domains/root/db/film.html\\nfilm\\n\\n// final : Núcleo de Informação e Coordenação do Ponto BR - NIC.br\\n// https://www.iana.org/domains/root/db/final.html\\nfinal\\n\\n// finance : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/finance.html\\nfinance\\n\\n// financial : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/financial.html\\nfinancial\\n\\n// fire : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/fire.html\\nfire\\n\\n// firestone : Bridgestone Licensing Services, Inc\\n// https://www.iana.org/domains/root/db/firestone.html\\nfirestone\\n\\n// firmdale : Firmdale Holdings Limited\\n// https://www.iana.org/domains/root/db/firmdale.html\\nfirmdale\\n\\n// fish : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fish.html\\nfish\\n\\n// fishing : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/fishing.html\\nfishing\\n\\n// fit : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/fit.html\\nfit\\n\\n// fitness : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fitness.html\\nfitness\\n\\n// flickr : Flickr, Inc.\\n// https://www.iana.org/domains/root/db/flickr.html\\nflickr\\n\\n// flights : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/flights.html\\nflights\\n\\n// flir : FLIR Systems, Inc.\\n// https://www.iana.org/domains/root/db/flir.html\\nflir\\n\\n// florist : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/florist.html\\nflorist\\n\\n// flowers : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/flowers.html\\nflowers\\n\\n// fly : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/fly.html\\nfly\\n\\n// foo : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/foo.html\\nfoo\\n\\n// food : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/food.html\\nfood\\n\\n// football : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/football.html\\nfootball\\n\\n// ford : Ford Motor Company\\n// https://www.iana.org/domains/root/db/ford.html\\nford\\n\\n// forex : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/forex.html\\nforex\\n\\n// forsale : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/forsale.html\\nforsale\\n\\n// forum : Fegistry, LLC\\n// https://www.iana.org/domains/root/db/forum.html\\nforum\\n\\n// foundation : Public Interest Registry\\n// https://www.iana.org/domains/root/db/foundation.html\\nfoundation\\n\\n// fox : FOX Registry, LLC\\n// https://www.iana.org/domains/root/db/fox.html\\nfox\\n\\n// free : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/free.html\\nfree\\n\\n// fresenius : Fresenius Immobilien-Verwaltungs-GmbH\\n// https://www.iana.org/domains/root/db/fresenius.html\\nfresenius\\n\\n// frl : FRLregistry B.V.\\n// https://www.iana.org/domains/root/db/frl.html\\nfrl\\n\\n// frogans : OP3FT\\n// https://www.iana.org/domains/root/db/frogans.html\\nfrogans\\n\\n// frontier : Frontier Communications Corporation\\n// https://www.iana.org/domains/root/db/frontier.html\\nfrontier\\n\\n// ftr : Frontier Communications Corporation\\n// https://www.iana.org/domains/root/db/ftr.html\\nftr\\n\\n// fujitsu : Fujitsu Limited\\n// https://www.iana.org/domains/root/db/fujitsu.html\\nfujitsu\\n\\n// fun : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/fun.html\\nfun\\n\\n// fund : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fund.html\\nfund\\n\\n// furniture : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/furniture.html\\nfurniture\\n\\n// futbol : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/futbol.html\\nfutbol\\n\\n// fyi : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fyi.html\\nfyi\\n\\n// gal : Asociación puntoGAL\\n// https://www.iana.org/domains/root/db/gal.html\\ngal\\n\\n// gallery : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gallery.html\\ngallery\\n\\n// gallo : Gallo Vineyards, Inc.\\n// https://www.iana.org/domains/root/db/gallo.html\\ngallo\\n\\n// gallup : Gallup, Inc.\\n// https://www.iana.org/domains/root/db/gallup.html\\ngallup\\n\\n// game : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/game.html\\ngame\\n\\n// games : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/games.html\\ngames\\n\\n// gap : The Gap, Inc.\\n// https://www.iana.org/domains/root/db/gap.html\\ngap\\n\\n// garden : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/garden.html\\ngarden\\n\\n// gay : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/gay.html\\ngay\\n\\n// gbiz : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/gbiz.html\\ngbiz\\n\\n// gdn : Joint Stock Company \"Navigation-information systems\"\\n// https://www.iana.org/domains/root/db/gdn.html\\ngdn\\n\\n// gea : GEA Group Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/gea.html\\ngea\\n\\n// gent : Easyhost BV\\n// https://www.iana.org/domains/root/db/gent.html\\ngent\\n\\n// genting : Resorts World Inc Pte. Ltd.\\n// https://www.iana.org/domains/root/db/genting.html\\ngenting\\n\\n// george : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/george.html\\ngeorge\\n\\n// ggee : GMO Internet, Inc.\\n// https://www.iana.org/domains/root/db/ggee.html\\nggee\\n\\n// gift : DotGift, LLC\\n// https://www.iana.org/domains/root/db/gift.html\\ngift\\n\\n// gifts : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gifts.html\\ngifts\\n\\n// gives : Public Interest Registry\\n// https://www.iana.org/domains/root/db/gives.html\\ngives\\n\\n// giving : Public Interest Registry\\n// https://www.iana.org/domains/root/db/giving.html\\ngiving\\n\\n// glass : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/glass.html\\nglass\\n\\n// gle : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/gle.html\\ngle\\n\\n// global : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/global.html\\nglobal\\n\\n// globo : Globo Comunicação e Participações S.A\\n// https://www.iana.org/domains/root/db/globo.html\\nglobo\\n\\n// gmail : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/gmail.html\\ngmail\\n\\n// gmbh : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gmbh.html\\ngmbh\\n\\n// gmo : GMO Internet, Inc.\\n// https://www.iana.org/domains/root/db/gmo.html\\ngmo\\n\\n// gmx : 1&1 Mail & Media GmbH\\n// https://www.iana.org/domains/root/db/gmx.html\\ngmx\\n\\n// godaddy : Go Daddy East, LLC\\n// https://www.iana.org/domains/root/db/godaddy.html\\ngodaddy\\n\\n// gold : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gold.html\\ngold\\n\\n// goldpoint : YODOBASHI CAMERA CO.,LTD.\\n// https://www.iana.org/domains/root/db/goldpoint.html\\ngoldpoint\\n\\n// golf : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/golf.html\\ngolf\\n\\n// goo : NTT Resonant Inc.\\n// https://www.iana.org/domains/root/db/goo.html\\ngoo\\n\\n// goodyear : The Goodyear Tire & Rubber Company\\n// https://www.iana.org/domains/root/db/goodyear.html\\ngoodyear\\n\\n// goog : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/goog.html\\ngoog\\n\\n// google : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/google.html\\ngoogle\\n\\n// gop : Republican State Leadership Committee, Inc.\\n// https://www.iana.org/domains/root/db/gop.html\\ngop\\n\\n// got : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/got.html\\ngot\\n\\n// grainger : Grainger Registry Services, LLC\\n// https://www.iana.org/domains/root/db/grainger.html\\ngrainger\\n\\n// graphics : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/graphics.html\\ngraphics\\n\\n// gratis : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gratis.html\\ngratis\\n\\n// green : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/green.html\\ngreen\\n\\n// gripe : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gripe.html\\ngripe\\n\\n// grocery : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/grocery.html\\ngrocery\\n\\n// group : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/group.html\\ngroup\\n\\n// guardian : The Guardian Life Insurance Company of America\\n// https://www.iana.org/domains/root/db/guardian.html\\nguardian\\n\\n// gucci : Guccio Gucci S.p.a.\\n// https://www.iana.org/domains/root/db/gucci.html\\ngucci\\n\\n// guge : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/guge.html\\nguge\\n\\n// guide : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/guide.html\\nguide\\n\\n// guitars : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/guitars.html\\nguitars\\n\\n// guru : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/guru.html\\nguru\\n\\n// hair : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/hair.html\\nhair\\n\\n// hamburg : Hamburg Top-Level-Domain GmbH\\n// https://www.iana.org/domains/root/db/hamburg.html\\nhamburg\\n\\n// hangout : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/hangout.html\\nhangout\\n\\n// haus : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/haus.html\\nhaus\\n\\n// hbo : HBO Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/hbo.html\\nhbo\\n\\n// hdfc : HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED\\n// https://www.iana.org/domains/root/db/hdfc.html\\nhdfc\\n\\n// hdfcbank : HDFC Bank Limited\\n// https://www.iana.org/domains/root/db/hdfcbank.html\\nhdfcbank\\n\\n// health : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/health.html\\nhealth\\n\\n// healthcare : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/healthcare.html\\nhealthcare\\n\\n// help : Innovation service Limited\\n// https://www.iana.org/domains/root/db/help.html\\nhelp\\n\\n// helsinki : City of Helsinki\\n// https://www.iana.org/domains/root/db/helsinki.html\\nhelsinki\\n\\n// here : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/here.html\\nhere\\n\\n// hermes : HERMES INTERNATIONAL\\n// https://www.iana.org/domains/root/db/hermes.html\\nhermes\\n\\n// hiphop : Dot Hip Hop, LLC\\n// https://www.iana.org/domains/root/db/hiphop.html\\nhiphop\\n\\n// hisamitsu : Hisamitsu Pharmaceutical Co.,Inc.\\n// https://www.iana.org/domains/root/db/hisamitsu.html\\nhisamitsu\\n\\n// hitachi : Hitachi, Ltd.\\n// https://www.iana.org/domains/root/db/hitachi.html\\nhitachi\\n\\n// hiv : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/hiv.html\\nhiv\\n\\n// hkt : PCCW-HKT DataCom Services Limited\\n// https://www.iana.org/domains/root/db/hkt.html\\nhkt\\n\\n// hockey : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/hockey.html\\nhockey\\n\\n// holdings : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/holdings.html\\nholdings\\n\\n// holiday : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/holiday.html\\nholiday\\n\\n// homedepot : Home Depot Product Authority, LLC\\n// https://www.iana.org/domains/root/db/homedepot.html\\nhomedepot\\n\\n// homegoods : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/homegoods.html\\nhomegoods\\n\\n// homes : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/homes.html\\nhomes\\n\\n// homesense : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/homesense.html\\nhomesense\\n\\n// honda : Honda Motor Co., Ltd.\\n// https://www.iana.org/domains/root/db/honda.html\\nhonda\\n\\n// horse : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/horse.html\\nhorse\\n\\n// hospital : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/hospital.html\\nhospital\\n\\n// host : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/host.html\\nhost\\n\\n// hosting : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/hosting.html\\nhosting\\n\\n// hot : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/hot.html\\nhot\\n\\n// hotels : Booking.com B.V.\\n// https://www.iana.org/domains/root/db/hotels.html\\nhotels\\n\\n// hotmail : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/hotmail.html\\nhotmail\\n\\n// house : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/house.html\\nhouse\\n\\n// how : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/how.html\\nhow\\n\\n// hsbc : HSBC Global Services (UK) Limited\\n// https://www.iana.org/domains/root/db/hsbc.html\\nhsbc\\n\\n// hughes : Hughes Satellite Systems Corporation\\n// https://www.iana.org/domains/root/db/hughes.html\\nhughes\\n\\n// hyatt : Hyatt GTLD, L.L.C.\\n// https://www.iana.org/domains/root/db/hyatt.html\\nhyatt\\n\\n// hyundai : Hyundai Motor Company\\n// https://www.iana.org/domains/root/db/hyundai.html\\nhyundai\\n\\n// ibm : International Business Machines Corporation\\n// https://www.iana.org/domains/root/db/ibm.html\\nibm\\n\\n// icbc : Industrial and Commercial Bank of China Limited\\n// https://www.iana.org/domains/root/db/icbc.html\\nicbc\\n\\n// ice : IntercontinentalExchange, Inc.\\n// https://www.iana.org/domains/root/db/ice.html\\nice\\n\\n// icu : ShortDot SA\\n// https://www.iana.org/domains/root/db/icu.html\\nicu\\n\\n// ieee : IEEE Global LLC\\n// https://www.iana.org/domains/root/db/ieee.html\\nieee\\n\\n// ifm : ifm electronic gmbh\\n// https://www.iana.org/domains/root/db/ifm.html\\nifm\\n\\n// ikano : Ikano S.A.\\n// https://www.iana.org/domains/root/db/ikano.html\\nikano\\n\\n// imamat : Fondation Aga Khan (Aga Khan Foundation)\\n// https://www.iana.org/domains/root/db/imamat.html\\nimamat\\n\\n// imdb : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/imdb.html\\nimdb\\n\\n// immo : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/immo.html\\nimmo\\n\\n// immobilien : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/immobilien.html\\nimmobilien\\n\\n// inc : Intercap Registry Inc.\\n// https://www.iana.org/domains/root/db/inc.html\\ninc\\n\\n// industries : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/industries.html\\nindustries\\n\\n// infiniti : NISSAN MOTOR CO., LTD.\\n// https://www.iana.org/domains/root/db/infiniti.html\\ninfiniti\\n\\n// ing : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/ing.html\\ning\\n\\n// ink : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/ink.html\\nink\\n\\n// institute : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/institute.html\\ninstitute\\n\\n// insurance : fTLD Registry Services LLC\\n// https://www.iana.org/domains/root/db/insurance.html\\ninsurance\\n\\n// insure : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/insure.html\\ninsure\\n\\n// international : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/international.html\\ninternational\\n\\n// intuit : Intuit Administrative Services, Inc.\\n// https://www.iana.org/domains/root/db/intuit.html\\nintuit\\n\\n// investments : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/investments.html\\ninvestments\\n\\n// ipiranga : Ipiranga Produtos de Petroleo S.A.\\n// https://www.iana.org/domains/root/db/ipiranga.html\\nipiranga\\n\\n// irish : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/irish.html\\nirish\\n\\n// ismaili : Fondation Aga Khan (Aga Khan Foundation)\\n// https://www.iana.org/domains/root/db/ismaili.html\\nismaili\\n\\n// ist : Istanbul Metropolitan Municipality\\n// https://www.iana.org/domains/root/db/ist.html\\nist\\n\\n// istanbul : Istanbul Metropolitan Municipality\\n// https://www.iana.org/domains/root/db/istanbul.html\\nistanbul\\n\\n// itau : Itau Unibanco Holding S.A.\\n// https://www.iana.org/domains/root/db/itau.html\\nitau\\n\\n// itv : ITV Services Limited\\n// https://www.iana.org/domains/root/db/itv.html\\nitv\\n\\n// jaguar : Jaguar Land Rover Ltd\\n// https://www.iana.org/domains/root/db/jaguar.html\\njaguar\\n\\n// java : Oracle Corporation\\n// https://www.iana.org/domains/root/db/java.html\\njava\\n\\n// jcb : JCB Co., Ltd.\\n// https://www.iana.org/domains/root/db/jcb.html\\njcb\\n\\n// jeep : FCA US LLC.\\n// https://www.iana.org/domains/root/db/jeep.html\\njeep\\n\\n// jetzt : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/jetzt.html\\njetzt\\n\\n// jewelry : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/jewelry.html\\njewelry\\n\\n// jio : Reliance Industries Limited\\n// https://www.iana.org/domains/root/db/jio.html\\njio\\n\\n// jll : Jones Lang LaSalle Incorporated\\n// https://www.iana.org/domains/root/db/jll.html\\njll\\n\\n// jmp : Matrix IP LLC\\n// https://www.iana.org/domains/root/db/jmp.html\\njmp\\n\\n// jnj : Johnson & Johnson Services, Inc.\\n// https://www.iana.org/domains/root/db/jnj.html\\njnj\\n\\n// joburg : ZA Central Registry NPC trading as ZA Central Registry\\n// https://www.iana.org/domains/root/db/joburg.html\\njoburg\\n\\n// jot : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/jot.html\\njot\\n\\n// joy : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/joy.html\\njoy\\n\\n// jpmorgan : JPMorgan Chase Bank, National Association\\n// https://www.iana.org/domains/root/db/jpmorgan.html\\njpmorgan\\n\\n// jprs : Japan Registry Services Co., Ltd.\\n// https://www.iana.org/domains/root/db/jprs.html\\njprs\\n\\n// juegos : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/juegos.html\\njuegos\\n\\n// juniper : JUNIPER NETWORKS, INC.\\n// https://www.iana.org/domains/root/db/juniper.html\\njuniper\\n\\n// kaufen : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/kaufen.html\\nkaufen\\n\\n// kddi : KDDI CORPORATION\\n// https://www.iana.org/domains/root/db/kddi.html\\nkddi\\n\\n// kerryhotels : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/kerryhotels.html\\nkerryhotels\\n\\n// kerrylogistics : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/kerrylogistics.html\\nkerrylogistics\\n\\n// kerryproperties : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/kerryproperties.html\\nkerryproperties\\n\\n// kfh : Kuwait Finance House\\n// https://www.iana.org/domains/root/db/kfh.html\\nkfh\\n\\n// kia : KIA MOTORS CORPORATION\\n// https://www.iana.org/domains/root/db/kia.html\\nkia\\n\\n// kids : DotKids Foundation Limited\\n// https://www.iana.org/domains/root/db/kids.html\\nkids\\n\\n// kim : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/kim.html\\nkim\\n\\n// kinder : Ferrero Trading Lux S.A.\\n// https://www.iana.org/domains/root/db/kinder.html\\nkinder\\n\\n// kindle : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/kindle.html\\nkindle\\n\\n// kitchen : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/kitchen.html\\nkitchen\\n\\n// kiwi : DOT KIWI LIMITED\\n// https://www.iana.org/domains/root/db/kiwi.html\\nkiwi\\n\\n// koeln : dotKoeln GmbH\\n// https://www.iana.org/domains/root/db/koeln.html\\nkoeln\\n\\n// komatsu : Komatsu Ltd.\\n// https://www.iana.org/domains/root/db/komatsu.html\\nkomatsu\\n\\n// kosher : Kosher Marketing Assets LLC\\n// https://www.iana.org/domains/root/db/kosher.html\\nkosher\\n\\n// kpmg : KPMG International Cooperative (KPMG International Genossenschaft)\\n// https://www.iana.org/domains/root/db/kpmg.html\\nkpmg\\n\\n// kpn : Koninklijke KPN N.V.\\n// https://www.iana.org/domains/root/db/kpn.html\\nkpn\\n\\n// krd : KRG Department of Information Technology\\n// https://www.iana.org/domains/root/db/krd.html\\nkrd\\n\\n// kred : KredTLD Pty Ltd\\n// https://www.iana.org/domains/root/db/kred.html\\nkred\\n\\n// kuokgroup : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/kuokgroup.html\\nkuokgroup\\n\\n// kyoto : Academic Institution: Kyoto Jyoho Gakuen\\n// https://www.iana.org/domains/root/db/kyoto.html\\nkyoto\\n\\n// lacaixa : Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa”\\n// https://www.iana.org/domains/root/db/lacaixa.html\\nlacaixa\\n\\n// lamborghini : Automobili Lamborghini S.p.A.\\n// https://www.iana.org/domains/root/db/lamborghini.html\\nlamborghini\\n\\n// lamer : The Estée Lauder Companies Inc.\\n// https://www.iana.org/domains/root/db/lamer.html\\nlamer\\n\\n// lancaster : LANCASTER\\n// https://www.iana.org/domains/root/db/lancaster.html\\nlancaster\\n\\n// land : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/land.html\\nland\\n\\n// landrover : Jaguar Land Rover Ltd\\n// https://www.iana.org/domains/root/db/landrover.html\\nlandrover\\n\\n// lanxess : LANXESS Corporation\\n// https://www.iana.org/domains/root/db/lanxess.html\\nlanxess\\n\\n// lasalle : Jones Lang LaSalle Incorporated\\n// https://www.iana.org/domains/root/db/lasalle.html\\nlasalle\\n\\n// lat : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/lat.html\\nlat\\n\\n// latino : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/latino.html\\nlatino\\n\\n// latrobe : La Trobe University\\n// https://www.iana.org/domains/root/db/latrobe.html\\nlatrobe\\n\\n// law : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/law.html\\nlaw\\n\\n// lawyer : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/lawyer.html\\nlawyer\\n\\n// lds : IRI Domain Management, LLC\\n// https://www.iana.org/domains/root/db/lds.html\\nlds\\n\\n// lease : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/lease.html\\nlease\\n\\n// leclerc : A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc\\n// https://www.iana.org/domains/root/db/leclerc.html\\nleclerc\\n\\n// lefrak : LeFrak Organization, Inc.\\n// https://www.iana.org/domains/root/db/lefrak.html\\nlefrak\\n\\n// legal : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/legal.html\\nlegal\\n\\n// lego : LEGO Juris A/S\\n// https://www.iana.org/domains/root/db/lego.html\\nlego\\n\\n// lexus : TOYOTA MOTOR CORPORATION\\n// https://www.iana.org/domains/root/db/lexus.html\\nlexus\\n\\n// lgbt : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/lgbt.html\\nlgbt\\n\\n// lidl : Schwarz Domains und Services GmbH & Co. KG\\n// https://www.iana.org/domains/root/db/lidl.html\\nlidl\\n\\n// life : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/life.html\\nlife\\n\\n// lifeinsurance : American Council of Life Insurers\\n// https://www.iana.org/domains/root/db/lifeinsurance.html\\nlifeinsurance\\n\\n// lifestyle : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/lifestyle.html\\nlifestyle\\n\\n// lighting : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/lighting.html\\nlighting\\n\\n// like : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/like.html\\nlike\\n\\n// lilly : Eli Lilly and Company\\n// https://www.iana.org/domains/root/db/lilly.html\\nlilly\\n\\n// limited : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/limited.html\\nlimited\\n\\n// limo : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/limo.html\\nlimo\\n\\n// lincoln : Ford Motor Company\\n// https://www.iana.org/domains/root/db/lincoln.html\\nlincoln\\n\\n// link : Nova Registry Ltd\\n// https://www.iana.org/domains/root/db/link.html\\nlink\\n\\n// lipsy : Lipsy Ltd\\n// https://www.iana.org/domains/root/db/lipsy.html\\nlipsy\\n\\n// live : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/live.html\\nlive\\n\\n// living : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/living.html\\nliving\\n\\n// llc : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/llc.html\\nllc\\n\\n// llp : Intercap Registry Inc.\\n// https://www.iana.org/domains/root/db/llp.html\\nllp\\n\\n// loan : dot Loan Limited\\n// https://www.iana.org/domains/root/db/loan.html\\nloan\\n\\n// loans : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/loans.html\\nloans\\n\\n// locker : Orange Domains LLC\\n// https://www.iana.org/domains/root/db/locker.html\\nlocker\\n\\n// locus : Locus Analytics LLC\\n// https://www.iana.org/domains/root/db/locus.html\\nlocus\\n\\n// lol : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/lol.html\\nlol\\n\\n// london : Dot London Domains Limited\\n// https://www.iana.org/domains/root/db/london.html\\nlondon\\n\\n// lotte : Lotte Holdings Co., Ltd.\\n// https://www.iana.org/domains/root/db/lotte.html\\nlotte\\n\\n// lotto : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/lotto.html\\nlotto\\n\\n// love : Merchant Law Group LLP\\n// https://www.iana.org/domains/root/db/love.html\\nlove\\n\\n// lpl : LPL Holdings, Inc.\\n// https://www.iana.org/domains/root/db/lpl.html\\nlpl\\n\\n// lplfinancial : LPL Holdings, Inc.\\n// https://www.iana.org/domains/root/db/lplfinancial.html\\nlplfinancial\\n\\n// ltd : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/ltd.html\\nltd\\n\\n// ltda : InterNetX, Corp\\n// https://www.iana.org/domains/root/db/ltda.html\\nltda\\n\\n// lundbeck : H. Lundbeck A/S\\n// https://www.iana.org/domains/root/db/lundbeck.html\\nlundbeck\\n\\n// luxe : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/luxe.html\\nluxe\\n\\n// luxury : Luxury Partners, LLC\\n// https://www.iana.org/domains/root/db/luxury.html\\nluxury\\n\\n// madrid : Comunidad de Madrid\\n// https://www.iana.org/domains/root/db/madrid.html\\nmadrid\\n\\n// maif : Mutuelle Assurance Instituteur France (MAIF)\\n// https://www.iana.org/domains/root/db/maif.html\\nmaif\\n\\n// maison : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/maison.html\\nmaison\\n\\n// makeup : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/makeup.html\\nmakeup\\n\\n// man : MAN SE\\n// https://www.iana.org/domains/root/db/man.html\\nman\\n\\n// management : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/management.html\\nmanagement\\n\\n// mango : PUNTO FA S.L.\\n// https://www.iana.org/domains/root/db/mango.html\\nmango\\n\\n// map : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/map.html\\nmap\\n\\n// market : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/market.html\\nmarket\\n\\n// marketing : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/marketing.html\\nmarketing\\n\\n// markets : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/markets.html\\nmarkets\\n\\n// marriott : Marriott Worldwide Corporation\\n// https://www.iana.org/domains/root/db/marriott.html\\nmarriott\\n\\n// marshalls : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/marshalls.html\\nmarshalls\\n\\n// mattel : Mattel Sites, Inc.\\n// https://www.iana.org/domains/root/db/mattel.html\\nmattel\\n\\n// mba : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/mba.html\\nmba\\n\\n// mckinsey : McKinsey Holdings, Inc.\\n// https://www.iana.org/domains/root/db/mckinsey.html\\nmckinsey\\n\\n// med : Medistry LLC\\n// https://www.iana.org/domains/root/db/med.html\\nmed\\n\\n// media : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/media.html\\nmedia\\n\\n// meet : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/meet.html\\nmeet\\n\\n// melbourne : The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation\\n// https://www.iana.org/domains/root/db/melbourne.html\\nmelbourne\\n\\n// meme : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/meme.html\\nmeme\\n\\n// memorial : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/memorial.html\\nmemorial\\n\\n// men : Exclusive Registry Limited\\n// https://www.iana.org/domains/root/db/men.html\\nmen\\n\\n// menu : Dot Menu Registry, LLC\\n// https://www.iana.org/domains/root/db/menu.html\\nmenu\\n\\n// merckmsd : MSD Registry Holdings, Inc.\\n// https://www.iana.org/domains/root/db/merckmsd.html\\nmerckmsd\\n\\n// miami : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/miami.html\\nmiami\\n\\n// microsoft : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/microsoft.html\\nmicrosoft\\n\\n// mini : Bayerische Motoren Werke Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/mini.html\\nmini\\n\\n// mint : Intuit Administrative Services, Inc.\\n// https://www.iana.org/domains/root/db/mint.html\\nmint\\n\\n// mit : Massachusetts Institute of Technology\\n// https://www.iana.org/domains/root/db/mit.html\\nmit\\n\\n// mitsubishi : Mitsubishi Corporation\\n// https://www.iana.org/domains/root/db/mitsubishi.html\\nmitsubishi\\n\\n// mlb : MLB Advanced Media DH, LLC\\n// https://www.iana.org/domains/root/db/mlb.html\\nmlb\\n\\n// mls : The Canadian Real Estate Association\\n// https://www.iana.org/domains/root/db/mls.html\\nmls\\n\\n// mma : MMA IARD\\n// https://www.iana.org/domains/root/db/mma.html\\nmma\\n\\n// mobile : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/mobile.html\\nmobile\\n\\n// moda : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/moda.html\\nmoda\\n\\n// moe : Interlink Systems Innovation Institute K.K.\\n// https://www.iana.org/domains/root/db/moe.html\\nmoe\\n\\n// moi : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/moi.html\\nmoi\\n\\n// mom : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/mom.html\\nmom\\n\\n// monash : Monash University\\n// https://www.iana.org/domains/root/db/monash.html\\nmonash\\n\\n// money : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/money.html\\nmoney\\n\\n// monster : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/monster.html\\nmonster\\n\\n// mormon : IRI Domain Management, LLC\\n// https://www.iana.org/domains/root/db/mormon.html\\nmormon\\n\\n// mortgage : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/mortgage.html\\nmortgage\\n\\n// moscow : Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)\\n// https://www.iana.org/domains/root/db/moscow.html\\nmoscow\\n\\n// moto : Motorola Trademark Holdings, LLC\\n// https://www.iana.org/domains/root/db/moto.html\\nmoto\\n\\n// motorcycles : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/motorcycles.html\\nmotorcycles\\n\\n// mov : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/mov.html\\nmov\\n\\n// movie : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/movie.html\\nmovie\\n\\n// msd : MSD Registry Holdings, Inc.\\n// https://www.iana.org/domains/root/db/msd.html\\nmsd\\n\\n// mtn : MTN Dubai Limited\\n// https://www.iana.org/domains/root/db/mtn.html\\nmtn\\n\\n// mtr : MTR Corporation Limited\\n// https://www.iana.org/domains/root/db/mtr.html\\nmtr\\n\\n// music : DotMusic Limited\\n// https://www.iana.org/domains/root/db/music.html\\nmusic\\n\\n// nab : National Australia Bank Limited\\n// https://www.iana.org/domains/root/db/nab.html\\nnab\\n\\n// nagoya : GMO Registry, Inc.\\n// https://www.iana.org/domains/root/db/nagoya.html\\nnagoya\\n\\n// natura : NATURA COSMÉTICOS S.A.\\n// https://www.iana.org/domains/root/db/natura.html\\nnatura\\n\\n// navy : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/navy.html\\nnavy\\n\\n// nba : NBA REGISTRY, LLC\\n// https://www.iana.org/domains/root/db/nba.html\\nnba\\n\\n// nec : NEC Corporation\\n// https://www.iana.org/domains/root/db/nec.html\\nnec\\n\\n// netbank : COMMONWEALTH BANK OF AUSTRALIA\\n// https://www.iana.org/domains/root/db/netbank.html\\nnetbank\\n\\n// netflix : Netflix, Inc.\\n// https://www.iana.org/domains/root/db/netflix.html\\nnetflix\\n\\n// network : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/network.html\\nnetwork\\n\\n// neustar : NeuStar, Inc.\\n// https://www.iana.org/domains/root/db/neustar.html\\nneustar\\n\\n// new : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/new.html\\nnew\\n\\n// news : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/news.html\\nnews\\n\\n// next : Next plc\\n// https://www.iana.org/domains/root/db/next.html\\nnext\\n\\n// nextdirect : Next plc\\n// https://www.iana.org/domains/root/db/nextdirect.html\\nnextdirect\\n\\n// nexus : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/nexus.html\\nnexus\\n\\n// nfl : NFL Reg Ops LLC\\n// https://www.iana.org/domains/root/db/nfl.html\\nnfl\\n\\n// ngo : Public Interest Registry\\n// https://www.iana.org/domains/root/db/ngo.html\\nngo\\n\\n// nhk : Japan Broadcasting Corporation (NHK)\\n// https://www.iana.org/domains/root/db/nhk.html\\nnhk\\n\\n// nico : DWANGO Co., Ltd.\\n// https://www.iana.org/domains/root/db/nico.html\\nnico\\n\\n// nike : NIKE, Inc.\\n// https://www.iana.org/domains/root/db/nike.html\\nnike\\n\\n// nikon : NIKON CORPORATION\\n// https://www.iana.org/domains/root/db/nikon.html\\nnikon\\n\\n// ninja : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/ninja.html\\nninja\\n\\n// nissan : NISSAN MOTOR CO., LTD.\\n// https://www.iana.org/domains/root/db/nissan.html\\nnissan\\n\\n// nissay : Nippon Life Insurance Company\\n// https://www.iana.org/domains/root/db/nissay.html\\nnissay\\n\\n// nokia : Nokia Corporation\\n// https://www.iana.org/domains/root/db/nokia.html\\nnokia\\n\\n// norton : NortonLifeLock Inc.\\n// https://www.iana.org/domains/root/db/norton.html\\nnorton\\n\\n// now : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/now.html\\nnow\\n\\n// nowruz : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/nowruz.html\\nnowruz\\n\\n// nowtv : Starbucks (HK) Limited\\n// https://www.iana.org/domains/root/db/nowtv.html\\nnowtv\\n\\n// nra : NRA Holdings Company, INC.\\n// https://www.iana.org/domains/root/db/nra.html\\nnra\\n\\n// nrw : Minds + Machines GmbH\\n// https://www.iana.org/domains/root/db/nrw.html\\nnrw\\n\\n// ntt : NIPPON TELEGRAPH AND TELEPHONE CORPORATION\\n// https://www.iana.org/domains/root/db/ntt.html\\nntt\\n\\n// nyc : The City of New York by and through the New York City Department of Information Technology & Telecommunications\\n// https://www.iana.org/domains/root/db/nyc.html\\nnyc\\n\\n// obi : OBI Group Holding SE & Co. KGaA\\n// https://www.iana.org/domains/root/db/obi.html\\nobi\\n\\n// observer : Fegistry, LLC\\n// https://www.iana.org/domains/root/db/observer.html\\nobserver\\n\\n// office : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/office.html\\noffice\\n\\n// okinawa : BRregistry, Inc.\\n// https://www.iana.org/domains/root/db/okinawa.html\\nokinawa\\n\\n// olayan : Competrol (Luxembourg) Sarl\\n// https://www.iana.org/domains/root/db/olayan.html\\nolayan\\n\\n// olayangroup : Competrol (Luxembourg) Sarl\\n// https://www.iana.org/domains/root/db/olayangroup.html\\nolayangroup\\n\\n// oldnavy : The Gap, Inc.\\n// https://www.iana.org/domains/root/db/oldnavy.html\\noldnavy\\n\\n// ollo : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/ollo.html\\nollo\\n\\n// omega : The Swatch Group Ltd\\n// https://www.iana.org/domains/root/db/omega.html\\nomega\\n\\n// one : One.com A/S\\n// https://www.iana.org/domains/root/db/one.html\\none\\n\\n// ong : Public Interest Registry\\n// https://www.iana.org/domains/root/db/ong.html\\nong\\n\\n// onl : iRegistry GmbH\\n// https://www.iana.org/domains/root/db/onl.html\\nonl\\n\\n// online : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/online.html\\nonline\\n\\n// ooo : INFIBEAM AVENUES LIMITED\\n// https://www.iana.org/domains/root/db/ooo.html\\nooo\\n\\n// open : American Express Travel Related Services Company, Inc.\\n// https://www.iana.org/domains/root/db/open.html\\nopen\\n\\n// oracle : Oracle Corporation\\n// https://www.iana.org/domains/root/db/oracle.html\\noracle\\n\\n// orange : Orange Brand Services Limited\\n// https://www.iana.org/domains/root/db/orange.html\\norange\\n\\n// organic : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/organic.html\\norganic\\n\\n// origins : The Estée Lauder Companies Inc.\\n// https://www.iana.org/domains/root/db/origins.html\\norigins\\n\\n// osaka : Osaka Registry Co., Ltd.\\n// https://www.iana.org/domains/root/db/osaka.html\\nosaka\\n\\n// otsuka : Otsuka Holdings Co., Ltd.\\n// https://www.iana.org/domains/root/db/otsuka.html\\notsuka\\n\\n// ott : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/ott.html\\nott\\n\\n// ovh : MédiaBC\\n// https://www.iana.org/domains/root/db/ovh.html\\novh\\n\\n// page : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/page.html\\npage\\n\\n// panasonic : Panasonic Holdings Corporation\\n// https://www.iana.org/domains/root/db/panasonic.html\\npanasonic\\n\\n// paris : City of Paris\\n// https://www.iana.org/domains/root/db/paris.html\\nparis\\n\\n// pars : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/pars.html\\npars\\n\\n// partners : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/partners.html\\npartners\\n\\n// parts : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/parts.html\\nparts\\n\\n// party : Blue Sky Registry Limited\\n// https://www.iana.org/domains/root/db/party.html\\nparty\\n\\n// pay : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/pay.html\\npay\\n\\n// pccw : PCCW Enterprises Limited\\n// https://www.iana.org/domains/root/db/pccw.html\\npccw\\n\\n// pet : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/pet.html\\npet\\n\\n// pfizer : Pfizer Inc.\\n// https://www.iana.org/domains/root/db/pfizer.html\\npfizer\\n\\n// pharmacy : National Association of Boards of Pharmacy\\n// https://www.iana.org/domains/root/db/pharmacy.html\\npharmacy\\n\\n// phd : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/phd.html\\nphd\\n\\n// philips : Koninklijke Philips N.V.\\n// https://www.iana.org/domains/root/db/philips.html\\nphilips\\n\\n// phone : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/phone.html\\nphone\\n\\n// photo : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/photo.html\\nphoto\\n\\n// photography : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/photography.html\\nphotography\\n\\n// photos : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/photos.html\\nphotos\\n\\n// physio : PhysBiz Pty Ltd\\n// https://www.iana.org/domains/root/db/physio.html\\nphysio\\n\\n// pics : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/pics.html\\npics\\n\\n// pictet : Pictet Europe S.A.\\n// https://www.iana.org/domains/root/db/pictet.html\\npictet\\n\\n// pictures : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/pictures.html\\npictures\\n\\n// pid : Top Level Spectrum, Inc.\\n// https://www.iana.org/domains/root/db/pid.html\\npid\\n\\n// pin : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/pin.html\\npin\\n\\n// ping : Ping Registry Provider, Inc.\\n// https://www.iana.org/domains/root/db/ping.html\\nping\\n\\n// pink : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/pink.html\\npink\\n\\n// pioneer : Pioneer Corporation\\n// https://www.iana.org/domains/root/db/pioneer.html\\npioneer\\n\\n// pizza : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/pizza.html\\npizza\\n\\n// place : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/place.html\\nplace\\n\\n// play : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/play.html\\nplay\\n\\n// playstation : Sony Interactive Entertainment Inc.\\n// https://www.iana.org/domains/root/db/playstation.html\\nplaystation\\n\\n// plumbing : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/plumbing.html\\nplumbing\\n\\n// plus : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/plus.html\\nplus\\n\\n// pnc : PNC Domain Co., LLC\\n// https://www.iana.org/domains/root/db/pnc.html\\npnc\\n\\n// pohl : Deutsche Vermögensberatung Aktiengesellschaft DVAG\\n// https://www.iana.org/domains/root/db/pohl.html\\npohl\\n\\n// poker : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/poker.html\\npoker\\n\\n// politie : Politie Nederland\\n// https://www.iana.org/domains/root/db/politie.html\\npolitie\\n\\n// porn : ICM Registry PN LLC\\n// https://www.iana.org/domains/root/db/porn.html\\nporn\\n\\n// pramerica : Prudential Financial, Inc.\\n// https://www.iana.org/domains/root/db/pramerica.html\\npramerica\\n\\n// praxi : Praxi S.p.A.\\n// https://www.iana.org/domains/root/db/praxi.html\\npraxi\\n\\n// press : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/press.html\\npress\\n\\n// prime : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/prime.html\\nprime\\n\\n// prod : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/prod.html\\nprod\\n\\n// productions : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/productions.html\\nproductions\\n\\n// prof : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/prof.html\\nprof\\n\\n// progressive : Progressive Casualty Insurance Company\\n// https://www.iana.org/domains/root/db/progressive.html\\nprogressive\\n\\n// promo : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/promo.html\\npromo\\n\\n// properties : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/properties.html\\nproperties\\n\\n// property : Digital Property Infrastructure Limited\\n// https://www.iana.org/domains/root/db/property.html\\nproperty\\n\\n// protection : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/protection.html\\nprotection\\n\\n// pru : Prudential Financial, Inc.\\n// https://www.iana.org/domains/root/db/pru.html\\npru\\n\\n// prudential : Prudential Financial, Inc.\\n// https://www.iana.org/domains/root/db/prudential.html\\nprudential\\n\\n// pub : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/pub.html\\npub\\n\\n// pwc : PricewaterhouseCoopers LLP\\n// https://www.iana.org/domains/root/db/pwc.html\\npwc\\n\\n// qpon : dotQPON LLC\\n// https://www.iana.org/domains/root/db/qpon.html\\nqpon\\n\\n// quebec : PointQuébec Inc\\n// https://www.iana.org/domains/root/db/quebec.html\\nquebec\\n\\n// quest : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/quest.html\\nquest\\n\\n// racing : Premier Registry Limited\\n// https://www.iana.org/domains/root/db/racing.html\\nracing\\n\\n// radio : European Broadcasting Union (EBU)\\n// https://www.iana.org/domains/root/db/radio.html\\nradio\\n\\n// read : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/read.html\\nread\\n\\n// realestate : dotRealEstate LLC\\n// https://www.iana.org/domains/root/db/realestate.html\\nrealestate\\n\\n// realtor : Real Estate Domains LLC\\n// https://www.iana.org/domains/root/db/realtor.html\\nrealtor\\n\\n// realty : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/realty.html\\nrealty\\n\\n// recipes : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/recipes.html\\nrecipes\\n\\n// red : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/red.html\\nred\\n\\n// redstone : Redstone Haute Couture Co., Ltd.\\n// https://www.iana.org/domains/root/db/redstone.html\\nredstone\\n\\n// redumbrella : Travelers TLD, LLC\\n// https://www.iana.org/domains/root/db/redumbrella.html\\nredumbrella\\n\\n// rehab : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/rehab.html\\nrehab\\n\\n// reise : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/reise.html\\nreise\\n\\n// reisen : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/reisen.html\\nreisen\\n\\n// reit : National Association of Real Estate Investment Trusts, Inc.\\n// https://www.iana.org/domains/root/db/reit.html\\nreit\\n\\n// reliance : Reliance Industries Limited\\n// https://www.iana.org/domains/root/db/reliance.html\\nreliance\\n\\n// ren : ZDNS International Limited\\n// https://www.iana.org/domains/root/db/ren.html\\nren\\n\\n// rent : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/rent.html\\nrent\\n\\n// rentals : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/rentals.html\\nrentals\\n\\n// repair : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/repair.html\\nrepair\\n\\n// report : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/report.html\\nreport\\n\\n// republican : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/republican.html\\nrepublican\\n\\n// rest : Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable\\n// https://www.iana.org/domains/root/db/rest.html\\nrest\\n\\n// restaurant : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/restaurant.html\\nrestaurant\\n\\n// review : dot Review Limited\\n// https://www.iana.org/domains/root/db/review.html\\nreview\\n\\n// reviews : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/reviews.html\\nreviews\\n\\n// rexroth : Robert Bosch GMBH\\n// https://www.iana.org/domains/root/db/rexroth.html\\nrexroth\\n\\n// rich : iRegistry GmbH\\n// https://www.iana.org/domains/root/db/rich.html\\nrich\\n\\n// richardli : Pacific Century Asset Management (HK) Limited\\n// https://www.iana.org/domains/root/db/richardli.html\\nrichardli\\n\\n// ricoh : Ricoh Company, Ltd.\\n// https://www.iana.org/domains/root/db/ricoh.html\\nricoh\\n\\n// ril : Reliance Industries Limited\\n// https://www.iana.org/domains/root/db/ril.html\\nril\\n\\n// rio : Empresa Municipal de Informática SA - IPLANRIO\\n// https://www.iana.org/domains/root/db/rio.html\\nrio\\n\\n// rip : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/rip.html\\nrip\\n\\n// rocher : Ferrero Trading Lux S.A.\\n// https://www.iana.org/domains/root/db/rocher.html\\nrocher\\n\\n// rocks : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/rocks.html\\nrocks\\n\\n// rodeo : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/rodeo.html\\nrodeo\\n\\n// rogers : Rogers Communications Canada Inc.\\n// https://www.iana.org/domains/root/db/rogers.html\\nrogers\\n\\n// room : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/room.html\\nroom\\n\\n// rsvp : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/rsvp.html\\nrsvp\\n\\n// rugby : World Rugby Strategic Developments Limited\\n// https://www.iana.org/domains/root/db/rugby.html\\nrugby\\n\\n// ruhr : dotSaarland GmbH\\n// https://www.iana.org/domains/root/db/ruhr.html\\nruhr\\n\\n// run : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/run.html\\nrun\\n\\n// rwe : RWE AG\\n// https://www.iana.org/domains/root/db/rwe.html\\nrwe\\n\\n// ryukyu : BRregistry, Inc.\\n// https://www.iana.org/domains/root/db/ryukyu.html\\nryukyu\\n\\n// saarland : dotSaarland GmbH\\n// https://www.iana.org/domains/root/db/saarland.html\\nsaarland\\n\\n// safe : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/safe.html\\nsafe\\n\\n// safety : Safety Registry Services, LLC.\\n// https://www.iana.org/domains/root/db/safety.html\\nsafety\\n\\n// sakura : SAKURA Internet Inc.\\n// https://www.iana.org/domains/root/db/sakura.html\\nsakura\\n\\n// sale : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/sale.html\\nsale\\n\\n// salon : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/salon.html\\nsalon\\n\\n// samsclub : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/samsclub.html\\nsamsclub\\n\\n// samsung : SAMSUNG SDS CO., LTD\\n// https://www.iana.org/domains/root/db/samsung.html\\nsamsung\\n\\n// sandvik : Sandvik AB\\n// https://www.iana.org/domains/root/db/sandvik.html\\nsandvik\\n\\n// sandvikcoromant : Sandvik AB\\n// https://www.iana.org/domains/root/db/sandvikcoromant.html\\nsandvikcoromant\\n\\n// sanofi : Sanofi\\n// https://www.iana.org/domains/root/db/sanofi.html\\nsanofi\\n\\n// sap : SAP AG\\n// https://www.iana.org/domains/root/db/sap.html\\nsap\\n\\n// sarl : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/sarl.html\\nsarl\\n\\n// sas : Research IP LLC\\n// https://www.iana.org/domains/root/db/sas.html\\nsas\\n\\n// save : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/save.html\\nsave\\n\\n// saxo : Saxo Bank A/S\\n// https://www.iana.org/domains/root/db/saxo.html\\nsaxo\\n\\n// sbi : STATE BANK OF INDIA\\n// https://www.iana.org/domains/root/db/sbi.html\\nsbi\\n\\n// sbs : ShortDot SA\\n// https://www.iana.org/domains/root/db/sbs.html\\nsbs\\n\\n// sca : SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ)\\n// https://www.iana.org/domains/root/db/sca.html\\nsca\\n\\n// scb : The Siam Commercial Bank Public Company Limited (\"SCB\")\\n// https://www.iana.org/domains/root/db/scb.html\\nscb\\n\\n// schaeffler : Schaeffler Technologies AG & Co. KG\\n// https://www.iana.org/domains/root/db/schaeffler.html\\nschaeffler\\n\\n// schmidt : SCHMIDT GROUPE S.A.S.\\n// https://www.iana.org/domains/root/db/schmidt.html\\nschmidt\\n\\n// scholarships : Scholarships.com, LLC\\n// https://www.iana.org/domains/root/db/scholarships.html\\nscholarships\\n\\n// school : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/school.html\\nschool\\n\\n// schule : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/schule.html\\nschule\\n\\n// schwarz : Schwarz Domains und Services GmbH & Co. KG\\n// https://www.iana.org/domains/root/db/schwarz.html\\nschwarz\\n\\n// science : dot Science Limited\\n// https://www.iana.org/domains/root/db/science.html\\nscience\\n\\n// scot : Dot Scot Registry Limited\\n// https://www.iana.org/domains/root/db/scot.html\\nscot\\n\\n// search : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/search.html\\nsearch\\n\\n// seat : SEAT, S.A. (Sociedad Unipersonal)\\n// https://www.iana.org/domains/root/db/seat.html\\nseat\\n\\n// secure : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/secure.html\\nsecure\\n\\n// security : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/security.html\\nsecurity\\n\\n// seek : Seek Limited\\n// https://www.iana.org/domains/root/db/seek.html\\nseek\\n\\n// select : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/select.html\\nselect\\n\\n// sener : Sener Ingeniería y Sistemas, S.A.\\n// https://www.iana.org/domains/root/db/sener.html\\nsener\\n\\n// services : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/services.html\\nservices\\n\\n// seven : Seven West Media Ltd\\n// https://www.iana.org/domains/root/db/seven.html\\nseven\\n\\n// sew : SEW-EURODRIVE GmbH & Co KG\\n// https://www.iana.org/domains/root/db/sew.html\\nsew\\n\\n// sex : ICM Registry SX LLC\\n// https://www.iana.org/domains/root/db/sex.html\\nsex\\n\\n// sexy : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/sexy.html\\nsexy\\n\\n// sfr : Societe Francaise du Radiotelephone - SFR\\n// https://www.iana.org/domains/root/db/sfr.html\\nsfr\\n\\n// shangrila : Shangri‐La International Hotel Management Limited\\n// https://www.iana.org/domains/root/db/shangrila.html\\nshangrila\\n\\n// sharp : Sharp Corporation\\n// https://www.iana.org/domains/root/db/sharp.html\\nsharp\\n\\n// shaw : Shaw Cablesystems G.P.\\n// https://www.iana.org/domains/root/db/shaw.html\\nshaw\\n\\n// shell : Shell Information Technology International Inc\\n// https://www.iana.org/domains/root/db/shell.html\\nshell\\n\\n// shia : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/shia.html\\nshia\\n\\n// shiksha : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/shiksha.html\\nshiksha\\n\\n// shoes : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/shoes.html\\nshoes\\n\\n// shop : GMO Registry, Inc.\\n// https://www.iana.org/domains/root/db/shop.html\\nshop\\n\\n// shopping : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/shopping.html\\nshopping\\n\\n// shouji : Beijing Qihu Keji Co., Ltd.\\n// https://www.iana.org/domains/root/db/shouji.html\\nshouji\\n\\n// show : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/show.html\\nshow\\n\\n// showtime : CBS Domains Inc.\\n// https://www.iana.org/domains/root/db/showtime.html\\nshowtime\\n\\n// silk : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/silk.html\\nsilk\\n\\n// sina : Sina Corporation\\n// https://www.iana.org/domains/root/db/sina.html\\nsina\\n\\n// singles : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/singles.html\\nsingles\\n\\n// site : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/site.html\\nsite\\n\\n// ski : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/ski.html\\nski\\n\\n// skin : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/skin.html\\nskin\\n\\n// sky : Sky International AG\\n// https://www.iana.org/domains/root/db/sky.html\\nsky\\n\\n// skype : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/skype.html\\nskype\\n\\n// sling : DISH Technologies L.L.C.\\n// https://www.iana.org/domains/root/db/sling.html\\nsling\\n\\n// smart : Smart Communications, Inc. (SMART)\\n// https://www.iana.org/domains/root/db/smart.html\\nsmart\\n\\n// smile : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/smile.html\\nsmile\\n\\n// sncf : Société Nationale SNCF\\n// https://www.iana.org/domains/root/db/sncf.html\\nsncf\\n\\n// soccer : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/soccer.html\\nsoccer\\n\\n// social : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/social.html\\nsocial\\n\\n// softbank : SoftBank Group Corp.\\n// https://www.iana.org/domains/root/db/softbank.html\\nsoftbank\\n\\n// software : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/software.html\\nsoftware\\n\\n// sohu : Sohu.com Limited\\n// https://www.iana.org/domains/root/db/sohu.html\\nsohu\\n\\n// solar : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/solar.html\\nsolar\\n\\n// solutions : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/solutions.html\\nsolutions\\n\\n// song : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/song.html\\nsong\\n\\n// sony : Sony Corporation\\n// https://www.iana.org/domains/root/db/sony.html\\nsony\\n\\n// soy : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/soy.html\\nsoy\\n\\n// spa : Asia Spa and Wellness Promotion Council Limited\\n// https://www.iana.org/domains/root/db/spa.html\\nspa\\n\\n// space : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/space.html\\nspace\\n\\n// sport : SportAccord\\n// https://www.iana.org/domains/root/db/sport.html\\nsport\\n\\n// spot : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/spot.html\\nspot\\n\\n// srl : InterNetX, Corp\\n// https://www.iana.org/domains/root/db/srl.html\\nsrl\\n\\n// stada : STADA Arzneimittel AG\\n// https://www.iana.org/domains/root/db/stada.html\\nstada\\n\\n// staples : Staples, Inc.\\n// https://www.iana.org/domains/root/db/staples.html\\nstaples\\n\\n// star : Star India Private Limited\\n// https://www.iana.org/domains/root/db/star.html\\nstar\\n\\n// statebank : STATE BANK OF INDIA\\n// https://www.iana.org/domains/root/db/statebank.html\\nstatebank\\n\\n// statefarm : State Farm Mutual Automobile Insurance Company\\n// https://www.iana.org/domains/root/db/statefarm.html\\nstatefarm\\n\\n// stc : Saudi Telecom Company\\n// https://www.iana.org/domains/root/db/stc.html\\nstc\\n\\n// stcgroup : Saudi Telecom Company\\n// https://www.iana.org/domains/root/db/stcgroup.html\\nstcgroup\\n\\n// stockholm : Stockholms kommun\\n// https://www.iana.org/domains/root/db/stockholm.html\\nstockholm\\n\\n// storage : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/storage.html\\nstorage\\n\\n// store : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/store.html\\nstore\\n\\n// stream : dot Stream Limited\\n// https://www.iana.org/domains/root/db/stream.html\\nstream\\n\\n// studio : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/studio.html\\nstudio\\n\\n// study : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/study.html\\nstudy\\n\\n// style : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/style.html\\nstyle\\n\\n// sucks : Vox Populi Registry Ltd.\\n// https://www.iana.org/domains/root/db/sucks.html\\nsucks\\n\\n// supplies : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/supplies.html\\nsupplies\\n\\n// supply : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/supply.html\\nsupply\\n\\n// support : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/support.html\\nsupport\\n\\n// surf : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/surf.html\\nsurf\\n\\n// surgery : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/surgery.html\\nsurgery\\n\\n// suzuki : SUZUKI MOTOR CORPORATION\\n// https://www.iana.org/domains/root/db/suzuki.html\\nsuzuki\\n\\n// swatch : The Swatch Group Ltd\\n// https://www.iana.org/domains/root/db/swatch.html\\nswatch\\n\\n// swiss : Swiss Confederation\\n// https://www.iana.org/domains/root/db/swiss.html\\nswiss\\n\\n// sydney : State of New South Wales, Department of Premier and Cabinet\\n// https://www.iana.org/domains/root/db/sydney.html\\nsydney\\n\\n// systems : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/systems.html\\nsystems\\n\\n// tab : Tabcorp Holdings Limited\\n// https://www.iana.org/domains/root/db/tab.html\\ntab\\n\\n// taipei : Taipei City Government\\n// https://www.iana.org/domains/root/db/taipei.html\\ntaipei\\n\\n// talk : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/talk.html\\ntalk\\n\\n// taobao : Alibaba Group Holding Limited\\n// https://www.iana.org/domains/root/db/taobao.html\\ntaobao\\n\\n// target : Target Domain Holdings, LLC\\n// https://www.iana.org/domains/root/db/target.html\\ntarget\\n\\n// tatamotors : Tata Motors Ltd\\n// https://www.iana.org/domains/root/db/tatamotors.html\\ntatamotors\\n\\n// tatar : Limited Liability Company \"Coordination Center of Regional Domain of Tatarstan Republic\"\\n// https://www.iana.org/domains/root/db/tatar.html\\ntatar\\n\\n// tattoo : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/tattoo.html\\ntattoo\\n\\n// tax : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tax.html\\ntax\\n\\n// taxi : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/taxi.html\\ntaxi\\n\\n// tci : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/tci.html\\ntci\\n\\n// tdk : TDK Corporation\\n// https://www.iana.org/domains/root/db/tdk.html\\ntdk\\n\\n// team : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/team.html\\nteam\\n\\n// tech : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/tech.html\\ntech\\n\\n// technology : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/technology.html\\ntechnology\\n\\n// temasek : Temasek Holdings (Private) Limited\\n// https://www.iana.org/domains/root/db/temasek.html\\ntemasek\\n\\n// tennis : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tennis.html\\ntennis\\n\\n// teva : Teva Pharmaceutical Industries Limited\\n// https://www.iana.org/domains/root/db/teva.html\\nteva\\n\\n// thd : Home Depot Product Authority, LLC\\n// https://www.iana.org/domains/root/db/thd.html\\nthd\\n\\n// theater : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/theater.html\\ntheater\\n\\n// theatre : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/theatre.html\\ntheatre\\n\\n// tiaa : Teachers Insurance and Annuity Association of America\\n// https://www.iana.org/domains/root/db/tiaa.html\\ntiaa\\n\\n// tickets : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/tickets.html\\ntickets\\n\\n// tienda : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tienda.html\\ntienda\\n\\n// tips : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tips.html\\ntips\\n\\n// tires : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tires.html\\ntires\\n\\n// tirol : punkt Tirol GmbH\\n// https://www.iana.org/domains/root/db/tirol.html\\ntirol\\n\\n// tjmaxx : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/tjmaxx.html\\ntjmaxx\\n\\n// tjx : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/tjx.html\\ntjx\\n\\n// tkmaxx : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/tkmaxx.html\\ntkmaxx\\n\\n// tmall : Alibaba Group Holding Limited\\n// https://www.iana.org/domains/root/db/tmall.html\\ntmall\\n\\n// today : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/today.html\\ntoday\\n\\n// tokyo : GMO Registry, Inc.\\n// https://www.iana.org/domains/root/db/tokyo.html\\ntokyo\\n\\n// tools : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tools.html\\ntools\\n\\n// top : .TOP Registry\\n// https://www.iana.org/domains/root/db/top.html\\ntop\\n\\n// toray : Toray Industries, Inc.\\n// https://www.iana.org/domains/root/db/toray.html\\ntoray\\n\\n// toshiba : TOSHIBA Corporation\\n// https://www.iana.org/domains/root/db/toshiba.html\\ntoshiba\\n\\n// total : TotalEnergies SE\\n// https://www.iana.org/domains/root/db/total.html\\ntotal\\n\\n// tours : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tours.html\\ntours\\n\\n// town : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/town.html\\ntown\\n\\n// toyota : TOYOTA MOTOR CORPORATION\\n// https://www.iana.org/domains/root/db/toyota.html\\ntoyota\\n\\n// toys : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/toys.html\\ntoys\\n\\n// trade : Elite Registry Limited\\n// https://www.iana.org/domains/root/db/trade.html\\ntrade\\n\\n// trading : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/trading.html\\ntrading\\n\\n// training : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/training.html\\ntraining\\n\\n// travel : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/travel.html\\ntravel\\n\\n// travelers : Travelers TLD, LLC\\n// https://www.iana.org/domains/root/db/travelers.html\\ntravelers\\n\\n// travelersinsurance : Travelers TLD, LLC\\n// https://www.iana.org/domains/root/db/travelersinsurance.html\\ntravelersinsurance\\n\\n// trust : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/trust.html\\ntrust\\n\\n// trv : Travelers TLD, LLC\\n// https://www.iana.org/domains/root/db/trv.html\\ntrv\\n\\n// tube : Latin American Telecom LLC\\n// https://www.iana.org/domains/root/db/tube.html\\ntube\\n\\n// tui : TUI AG\\n// https://www.iana.org/domains/root/db/tui.html\\ntui\\n\\n// tunes : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/tunes.html\\ntunes\\n\\n// tushu : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/tushu.html\\ntushu\\n\\n// tvs : T V SUNDRAM IYENGAR  & SONS LIMITED\\n// https://www.iana.org/domains/root/db/tvs.html\\ntvs\\n\\n// ubank : National Australia Bank Limited\\n// https://www.iana.org/domains/root/db/ubank.html\\nubank\\n\\n// ubs : UBS AG\\n// https://www.iana.org/domains/root/db/ubs.html\\nubs\\n\\n// unicom : China United Network Communications Corporation Limited\\n// https://www.iana.org/domains/root/db/unicom.html\\nunicom\\n\\n// university : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/university.html\\nuniversity\\n\\n// uno : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/uno.html\\nuno\\n\\n// uol : UBN INTERNET LTDA.\\n// https://www.iana.org/domains/root/db/uol.html\\nuol\\n\\n// ups : UPS Market Driver, Inc.\\n// https://www.iana.org/domains/root/db/ups.html\\nups\\n\\n// vacations : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/vacations.html\\nvacations\\n\\n// vana : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/vana.html\\nvana\\n\\n// vanguard : The Vanguard Group, Inc.\\n// https://www.iana.org/domains/root/db/vanguard.html\\nvanguard\\n\\n// vegas : Dot Vegas, Inc.\\n// https://www.iana.org/domains/root/db/vegas.html\\nvegas\\n\\n// ventures : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/ventures.html\\nventures\\n\\n// verisign : VeriSign, Inc.\\n// https://www.iana.org/domains/root/db/verisign.html\\nverisign\\n\\n// versicherung : tldbox GmbH\\n// https://www.iana.org/domains/root/db/versicherung.html\\nversicherung\\n\\n// vet : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/vet.html\\nvet\\n\\n// viajes : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/viajes.html\\nviajes\\n\\n// video : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/video.html\\nvideo\\n\\n// vig : VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe\\n// https://www.iana.org/domains/root/db/vig.html\\nvig\\n\\n// viking : Viking River Cruises (Bermuda) Ltd.\\n// https://www.iana.org/domains/root/db/viking.html\\nviking\\n\\n// villas : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/villas.html\\nvillas\\n\\n// vin : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/vin.html\\nvin\\n\\n// vip : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/vip.html\\nvip\\n\\n// virgin : Virgin Enterprises Limited\\n// https://www.iana.org/domains/root/db/virgin.html\\nvirgin\\n\\n// visa : Visa Worldwide Pte. Limited\\n// https://www.iana.org/domains/root/db/visa.html\\nvisa\\n\\n// vision : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/vision.html\\nvision\\n\\n// viva : Saudi Telecom Company\\n// https://www.iana.org/domains/root/db/viva.html\\nviva\\n\\n// vivo : Telefonica Brasil S.A.\\n// https://www.iana.org/domains/root/db/vivo.html\\nvivo\\n\\n// vlaanderen : DNS.be vzw\\n// https://www.iana.org/domains/root/db/vlaanderen.html\\nvlaanderen\\n\\n// vodka : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/vodka.html\\nvodka\\n\\n// volkswagen : Volkswagen Group of America Inc.\\n// https://www.iana.org/domains/root/db/volkswagen.html\\nvolkswagen\\n\\n// volvo : Volvo Holding Sverige Aktiebolag\\n// https://www.iana.org/domains/root/db/volvo.html\\nvolvo\\n\\n// vote : Monolith Registry LLC\\n// https://www.iana.org/domains/root/db/vote.html\\nvote\\n\\n// voting : Valuetainment Corp.\\n// https://www.iana.org/domains/root/db/voting.html\\nvoting\\n\\n// voto : Monolith Registry LLC\\n// https://www.iana.org/domains/root/db/voto.html\\nvoto\\n\\n// voyage : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/voyage.html\\nvoyage\\n\\n// wales : Nominet UK\\n// https://www.iana.org/domains/root/db/wales.html\\nwales\\n\\n// walmart : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/walmart.html\\nwalmart\\n\\n// walter : Sandvik AB\\n// https://www.iana.org/domains/root/db/walter.html\\nwalter\\n\\n// wang : Zodiac Wang Limited\\n// https://www.iana.org/domains/root/db/wang.html\\nwang\\n\\n// wanggou : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/wanggou.html\\nwanggou\\n\\n// watch : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/watch.html\\nwatch\\n\\n// watches : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/watches.html\\nwatches\\n\\n// weather : International Business Machines Corporation\\n// https://www.iana.org/domains/root/db/weather.html\\nweather\\n\\n// weatherchannel : International Business Machines Corporation\\n// https://www.iana.org/domains/root/db/weatherchannel.html\\nweatherchannel\\n\\n// webcam : dot Webcam Limited\\n// https://www.iana.org/domains/root/db/webcam.html\\nwebcam\\n\\n// weber : Saint-Gobain Weber SA\\n// https://www.iana.org/domains/root/db/weber.html\\nweber\\n\\n// website : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/website.html\\nwebsite\\n\\n// wedding : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/wedding.html\\nwedding\\n\\n// weibo : Sina Corporation\\n// https://www.iana.org/domains/root/db/weibo.html\\nweibo\\n\\n// weir : Weir Group IP Limited\\n// https://www.iana.org/domains/root/db/weir.html\\nweir\\n\\n// whoswho : Who\\'s Who Registry\\n// https://www.iana.org/domains/root/db/whoswho.html\\nwhoswho\\n\\n// wien : punkt.wien GmbH\\n// https://www.iana.org/domains/root/db/wien.html\\nwien\\n\\n// wiki : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/wiki.html\\nwiki\\n\\n// williamhill : William Hill Organization Limited\\n// https://www.iana.org/domains/root/db/williamhill.html\\nwilliamhill\\n\\n// win : First Registry Limited\\n// https://www.iana.org/domains/root/db/win.html\\nwin\\n\\n// windows : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/windows.html\\nwindows\\n\\n// wine : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/wine.html\\nwine\\n\\n// winners : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/winners.html\\nwinners\\n\\n// wme : William Morris Endeavor Entertainment, LLC\\n// https://www.iana.org/domains/root/db/wme.html\\nwme\\n\\n// wolterskluwer : Wolters Kluwer N.V.\\n// https://www.iana.org/domains/root/db/wolterskluwer.html\\nwolterskluwer\\n\\n// woodside : Woodside Petroleum Limited\\n// https://www.iana.org/domains/root/db/woodside.html\\nwoodside\\n\\n// work : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/work.html\\nwork\\n\\n// works : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/works.html\\nworks\\n\\n// world : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/world.html\\nworld\\n\\n// wow : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/wow.html\\nwow\\n\\n// wtc : World Trade Centers Association, Inc.\\n// https://www.iana.org/domains/root/db/wtc.html\\nwtc\\n\\n// wtf : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/wtf.html\\nwtf\\n\\n// xbox : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/xbox.html\\nxbox\\n\\n// xerox : Xerox DNHC LLC\\n// https://www.iana.org/domains/root/db/xerox.html\\nxerox\\n\\n// xfinity : Comcast IP Holdings I, LLC\\n// https://www.iana.org/domains/root/db/xfinity.html\\nxfinity\\n\\n// xihuan : Beijing Qihu Keji Co., Ltd.\\n// https://www.iana.org/domains/root/db/xihuan.html\\nxihuan\\n\\n// xin : Elegant Leader Limited\\n// https://www.iana.org/domains/root/db/xin.html\\nxin\\n\\n// xn--11b4c3d : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--11b4c3d.html\\nकॉम\\n\\n// xn--1ck2e1b : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--1ck2e1b.html\\nセール\\n\\n// xn--1qqw23a : Guangzhou YU Wei Information Technology Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--1qqw23a.html\\n佛山\\n\\n// xn--30rr7y : Excellent First Limited\\n// https://www.iana.org/domains/root/db/xn--30rr7y.html\\n慈善\\n\\n// xn--3bst00m : Eagle Horizon Limited\\n// https://www.iana.org/domains/root/db/xn--3bst00m.html\\n集团\\n\\n// xn--3ds443g : TLD REGISTRY LIMITED OY\\n// https://www.iana.org/domains/root/db/xn--3ds443g.html\\n在线\\n\\n// xn--3pxu8k : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--3pxu8k.html\\n点看\\n\\n// xn--42c2d9a : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--42c2d9a.html\\nคอม\\n\\n// xn--45q11c : Zodiac Gemini Ltd\\n// https://www.iana.org/domains/root/db/xn--45q11c.html\\n八卦\\n\\n// xn--4gbrim : Helium TLDs Ltd\\n// https://www.iana.org/domains/root/db/xn--4gbrim.html\\nموقع\\n\\n// xn--55qw42g : China Organizational Name Administration Center\\n// https://www.iana.org/domains/root/db/xn--55qw42g.html\\n公益\\n\\n// xn--55qx5d : China Internet Network Information Center (CNNIC)\\n// https://www.iana.org/domains/root/db/xn--55qx5d.html\\n公司\\n\\n// xn--5su34j936bgsg : Shangri‐La International Hotel Management Limited\\n// https://www.iana.org/domains/root/db/xn--5su34j936bgsg.html\\n香格里拉\\n\\n// xn--5tzm5g : Global Website TLD Asia Limited\\n// https://www.iana.org/domains/root/db/xn--5tzm5g.html\\n网站\\n\\n// xn--6frz82g : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/xn--6frz82g.html\\n移动\\n\\n// xn--6qq986b3xl : Tycoon Treasure Limited\\n// https://www.iana.org/domains/root/db/xn--6qq986b3xl.html\\n我爱你\\n\\n// xn--80adxhks : Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)\\n// https://www.iana.org/domains/root/db/xn--80adxhks.html\\nмосква\\n\\n// xn--80aqecdr1a : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)\\n// https://www.iana.org/domains/root/db/xn--80aqecdr1a.html\\nкатолик\\n\\n// xn--80asehdb : CORE Association\\n// https://www.iana.org/domains/root/db/xn--80asehdb.html\\nонлайн\\n\\n// xn--80aswg : CORE Association\\n// https://www.iana.org/domains/root/db/xn--80aswg.html\\nсайт\\n\\n// xn--8y0a063a : China United Network Communications Corporation Limited\\n// https://www.iana.org/domains/root/db/xn--8y0a063a.html\\n联通\\n\\n// xn--9dbq2a : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--9dbq2a.html\\nקום\\n\\n// xn--9et52u : RISE VICTORY LIMITED\\n// https://www.iana.org/domains/root/db/xn--9et52u.html\\n时尚\\n\\n// xn--9krt00a : Sina Corporation\\n// https://www.iana.org/domains/root/db/xn--9krt00a.html\\n微博\\n\\n// xn--b4w605ferd : Temasek Holdings (Private) Limited\\n// https://www.iana.org/domains/root/db/xn--b4w605ferd.html\\n淡马锡\\n\\n// xn--bck1b9a5dre4c : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--bck1b9a5dre4c.html\\nファッション\\n\\n// xn--c1avg : Public Interest Registry\\n// https://www.iana.org/domains/root/db/xn--c1avg.html\\nорг\\n\\n// xn--c2br7g : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--c2br7g.html\\nनेट\\n\\n// xn--cck2b3b : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--cck2b3b.html\\nストア\\n\\n// xn--cckwcxetd : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--cckwcxetd.html\\nアマゾン\\n\\n// xn--cg4bki : SAMSUNG SDS CO., LTD\\n// https://www.iana.org/domains/root/db/xn--cg4bki.html\\n삼성\\n\\n// xn--czr694b : Internet DotTrademark Organisation Limited\\n// https://www.iana.org/domains/root/db/xn--czr694b.html\\n商标\\n\\n// xn--czrs0t : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/xn--czrs0t.html\\n商店\\n\\n// xn--czru2d : Zodiac Aquarius Limited\\n// https://www.iana.org/domains/root/db/xn--czru2d.html\\n商城\\n\\n// xn--d1acj3b : The Foundation for Network Initiatives “The Smart Internet”\\n// https://www.iana.org/domains/root/db/xn--d1acj3b.html\\nдети\\n\\n// xn--eckvdtc9d : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--eckvdtc9d.html\\nポイント\\n\\n// xn--efvy88h : Guangzhou YU Wei Information Technology Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--efvy88h.html\\n新闻\\n\\n// xn--fct429k : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--fct429k.html\\n家電\\n\\n// xn--fhbei : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--fhbei.html\\nكوم\\n\\n// xn--fiq228c5hs : TLD REGISTRY LIMITED OY\\n// https://www.iana.org/domains/root/db/xn--fiq228c5hs.html\\n中文网\\n\\n// xn--fiq64b : CITIC Group Corporation\\n// https://www.iana.org/domains/root/db/xn--fiq64b.html\\n中信\\n\\n// xn--fjq720a : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/xn--fjq720a.html\\n娱乐\\n\\n// xn--flw351e : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/xn--flw351e.html\\n谷歌\\n\\n// xn--fzys8d69uvgm : PCCW Enterprises Limited\\n// https://www.iana.org/domains/root/db/xn--fzys8d69uvgm.html\\n電訊盈科\\n\\n// xn--g2xx48c : Nawang Heli(Xiamen) Network Service Co., LTD.\\n// https://www.iana.org/domains/root/db/xn--g2xx48c.html\\n购物\\n\\n// xn--gckr3f0f : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--gckr3f0f.html\\nクラウド\\n\\n// xn--gk3at1e : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--gk3at1e.html\\n通販\\n\\n// xn--hxt814e : Zodiac Taurus Limited\\n// https://www.iana.org/domains/root/db/xn--hxt814e.html\\n网店\\n\\n// xn--i1b6b1a6a2e : Public Interest Registry\\n// https://www.iana.org/domains/root/db/xn--i1b6b1a6a2e.html\\nसंगठन\\n\\n// xn--imr513n : Internet DotTrademark Organisation Limited\\n// https://www.iana.org/domains/root/db/xn--imr513n.html\\n餐厅\\n\\n// xn--io0a7i : China Internet Network Information Center (CNNIC)\\n// https://www.iana.org/domains/root/db/xn--io0a7i.html\\n网络\\n\\n// xn--j1aef : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--j1aef.html\\nком\\n\\n// xn--jlq480n2rg : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--jlq480n2rg.html\\n亚马逊\\n\\n// xn--jvr189m : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--jvr189m.html\\n食品\\n\\n// xn--kcrx77d1x4a : Koninklijke Philips N.V.\\n// https://www.iana.org/domains/root/db/xn--kcrx77d1x4a.html\\n飞利浦\\n\\n// xn--kput3i : Beijing RITT-Net Technology Development Co., Ltd\\n// https://www.iana.org/domains/root/db/xn--kput3i.html\\n手机\\n\\n// xn--mgba3a3ejt : Aramco Services Company\\n// https://www.iana.org/domains/root/db/xn--mgba3a3ejt.html\\nارامكو\\n\\n// xn--mgba7c0bbn0a : Competrol (Luxembourg) Sarl\\n// https://www.iana.org/domains/root/db/xn--mgba7c0bbn0a.html\\nالعليان\\n\\n// xn--mgbaakc7dvf : Emirates Telecommunications Corporation (trading as Etisalat)\\n// https://www.iana.org/domains/root/db/xn--mgbaakc7dvf.html\\nاتصالات\\n\\n// xn--mgbab2bd : CORE Association\\n// https://www.iana.org/domains/root/db/xn--mgbab2bd.html\\nبازار\\n\\n// xn--mgbca7dzdo : Abu Dhabi Systems and Information Centre\\n// https://www.iana.org/domains/root/db/xn--mgbca7dzdo.html\\nابوظبي\\n\\n// xn--mgbi4ecexp : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)\\n// https://www.iana.org/domains/root/db/xn--mgbi4ecexp.html\\nكاثوليك\\n\\n// xn--mgbt3dhd : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/xn--mgbt3dhd.html\\nهمراه\\n\\n// xn--mk1bu44c : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--mk1bu44c.html\\n닷컴\\n\\n// xn--mxtq1m : Net-Chinese Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--mxtq1m.html\\n政府\\n\\n// xn--ngbc5azd : International Domain Registry Pty. Ltd.\\n// https://www.iana.org/domains/root/db/xn--ngbc5azd.html\\nشبكة\\n\\n// xn--ngbe9e0a : Kuwait Finance House\\n// https://www.iana.org/domains/root/db/xn--ngbe9e0a.html\\nبيتك\\n\\n// xn--ngbrx : League of Arab States\\n// https://www.iana.org/domains/root/db/xn--ngbrx.html\\nعرب\\n\\n// xn--nqv7f : Public Interest Registry\\n// https://www.iana.org/domains/root/db/xn--nqv7f.html\\n机构\\n\\n// xn--nqv7fs00ema : Public Interest Registry\\n// https://www.iana.org/domains/root/db/xn--nqv7fs00ema.html\\n组织机构\\n\\n// xn--nyqy26a : Stable Tone Limited\\n// https://www.iana.org/domains/root/db/xn--nyqy26a.html\\n健康\\n\\n// xn--otu796d : Jiang Yu Liang Cai Technology Company Limited\\n// https://www.iana.org/domains/root/db/xn--otu796d.html\\n招聘\\n\\n// xn--p1acf : Rusnames Limited\\n// https://www.iana.org/domains/root/db/xn--p1acf.html\\nрус\\n\\n// xn--pssy2u : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--pssy2u.html\\n大拿\\n\\n// xn--q9jyb4c : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/xn--q9jyb4c.html\\nみんな\\n\\n// xn--qcka1pmc : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/xn--qcka1pmc.html\\nグーグル\\n\\n// xn--rhqv96g : Stable Tone Limited\\n// https://www.iana.org/domains/root/db/xn--rhqv96g.html\\n世界\\n\\n// xn--rovu88b : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--rovu88b.html\\n書籍\\n\\n// xn--ses554g : KNET Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--ses554g.html\\n网址\\n\\n// xn--t60b56a : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--t60b56a.html\\n닷넷\\n\\n// xn--tckwe : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--tckwe.html\\nコム\\n\\n// xn--tiq49xqyj : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)\\n// https://www.iana.org/domains/root/db/xn--tiq49xqyj.html\\n天主教\\n\\n// xn--unup4y : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/xn--unup4y.html\\n游戏\\n\\n// xn--vermgensberater-ctb : Deutsche Vermögensberatung Aktiengesellschaft DVAG\\n// https://www.iana.org/domains/root/db/xn--vermgensberater-ctb.html\\nvermögensberater\\n\\n// xn--vermgensberatung-pwb : Deutsche Vermögensberatung Aktiengesellschaft DVAG\\n// https://www.iana.org/domains/root/db/xn--vermgensberatung-pwb.html\\nvermögensberatung\\n\\n// xn--vhquv : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/xn--vhquv.html\\n企业\\n\\n// xn--vuq861b : Beijing Tele-info Technology Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--vuq861b.html\\n信息\\n\\n// xn--w4r85el8fhu5dnra : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/xn--w4r85el8fhu5dnra.html\\n嘉里大酒店\\n\\n// xn--w4rs40l : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/xn--w4rs40l.html\\n嘉里\\n\\n// xn--xhq521b : Guangzhou YU Wei Information Technology Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--xhq521b.html\\n广东\\n\\n// xn--zfr164b : China Organizational Name Administration Center\\n// https://www.iana.org/domains/root/db/xn--zfr164b.html\\n政务\\n\\n// xyz : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/xyz.html\\nxyz\\n\\n// yachts : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/yachts.html\\nyachts\\n\\n// yahoo : Oath Inc.\\n// https://www.iana.org/domains/root/db/yahoo.html\\nyahoo\\n\\n// yamaxun : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/yamaxun.html\\nyamaxun\\n\\n// yandex : Yandex Europe B.V.\\n// https://www.iana.org/domains/root/db/yandex.html\\nyandex\\n\\n// yodobashi : YODOBASHI CAMERA CO.,LTD.\\n// https://www.iana.org/domains/root/db/yodobashi.html\\nyodobashi\\n\\n// yoga : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/yoga.html\\nyoga\\n\\n// yokohama : GMO Registry, Inc.\\n// https://www.iana.org/domains/root/db/yokohama.html\\nyokohama\\n\\n// you : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/you.html\\nyou\\n\\n// youtube : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/youtube.html\\nyoutube\\n\\n// yun : Beijing Qihu Keji Co., Ltd.\\n// https://www.iana.org/domains/root/db/yun.html\\nyun\\n\\n// zappos : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/zappos.html\\nzappos\\n\\n// zara : Industria de Diseño Textil, S.A. (INDITEX, S.A.)\\n// https://www.iana.org/domains/root/db/zara.html\\nzara\\n\\n// zero : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/zero.html\\nzero\\n\\n// zip : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/zip.html\\nzip\\n\\n// zone : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/zone.html\\nzone\\n\\n// zuerich : Kanton Zürich (Canton of Zurich)\\n// https://www.iana.org/domains/root/db/zuerich.html\\nzuerich\\n\\n\\n// ===END ICANN DOMAINS===\\n// ===BEGIN PRIVATE DOMAINS===\\n// (Note: these are in alphabetical order by company name)\\n\\n// 1GB LLC : https://www.1gb.ua/\\n// Submitted by 1GB LLC <noc@1gb.com.ua>\\ncc.ua\\ninf.ua\\nltd.ua\\n\\n// 611coin : https://611project.org/\\n611.to\\n\\n// Aaron Marais\\' Gitlab pages: https://lab.aaronleem.co.za\\n// Submitted by Aaron Marais <its_me@aaronleem.co.za>\\ngraphox.us\\n\\n// accesso Technology Group, plc. : https://accesso.com/\\n// Submitted by accesso Team <accessoecommerce@accesso.com>\\n*.devcdnaccesso.com\\n\\n// Acorn Labs : https://acorn.io\\n// Submitted by Craig Jellick <domains@acorn.io>\\n*.on-acorn.io\\n\\n// ActiveTrail: https://www.activetrail.biz/\\n// Submitted by Ofer Kalaora <postmaster@activetrail.com>\\nactivetrail.biz\\n\\n// Adobe : https://www.adobe.com/\\n// Submitted by Ian Boston <boston@adobe.com> and Lars Trieloff <trieloff@adobe.com>\\nadobeaemcloud.com\\n*.dev.adobeaemcloud.com\\nhlx.live\\nadobeaemcloud.net\\nhlx.page\\nhlx3.page\\n\\n// Adobe Developer Platform : https://developer.adobe.com\\n// Submitted by Jesse MacFadyen<jessem@adobe.com>\\nadobeio-static.net\\nadobeioruntime.net\\n\\n// Agnat sp. z o.o. : https://domena.pl\\n// Submitted by Przemyslaw Plewa <it-admin@domena.pl>\\nbeep.pl\\n\\n// Airkit : https://www.airkit.com/\\n// Submitted by Grant Cooksey <security@airkit.com>\\nairkitapps.com\\nairkitapps-au.com\\nairkitapps.eu\\n\\n// Aiven: https://aiven.io/\\n// Submitted by Etienne Stalmans <security@aiven.io>\\naivencloud.com\\n\\n// Akamai : https://www.akamai.com/\\n// Submitted by Akamai Team <publicsuffixlist@akamai.com>\\nakadns.net\\nakamai.net\\nakamai-staging.net\\nakamaiedge.net\\nakamaiedge-staging.net\\nakamaihd.net\\nakamaihd-staging.net\\nakamaiorigin.net\\nakamaiorigin-staging.net\\nakamaized.net\\nakamaized-staging.net\\nedgekey.net\\nedgekey-staging.net\\nedgesuite.net\\nedgesuite-staging.net\\n\\n// alboto.ca : http://alboto.ca\\n// Submitted by Anton Avramov <avramov@alboto.ca>\\nbarsy.ca\\n\\n// Alces Software Ltd : http://alces-software.com\\n// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com>\\n*.compute.estate\\n*.alces.network\\n\\n// all-inkl.com : https://all-inkl.com\\n// Submitted by Werner Kaltofen <wk@all-inkl.com>\\nkasserver.com\\n\\n// Altervista: https://www.altervista.org\\n// Submitted by Carlo Cannas <tech_staff@altervista.it>\\naltervista.org\\n\\n// alwaysdata : https://www.alwaysdata.com\\n// Submitted by Cyril <admin@alwaysdata.com>\\nalwaysdata.net\\n\\n// Amaze Software : https://amaze.co\\n// Submitted by Domain Admin <domainadmin@amaze.co>\\nmyamaze.net\\n\\n// Amazon : https://www.amazon.com/\\n// Submitted by AWS Security <psl-maintainers@amazon.com>\\n// Subsections of Amazon/subsidiaries will appear until \"concludes\" tag\\n\\n// Amazon CloudFront\\n// Submitted by Donavan Miller <donavanm@amazon.com>\\n// Reference: 54144616-fd49-4435-8535-19c6a601bdb3\\ncloudfront.net\\n\\n// Amazon EC2\\n// Submitted by Luke Wells <psl-maintainers@amazon.com>\\n// Reference: 4c38fa71-58ac-4768-99e5-689c1767e537\\n*.compute.amazonaws.com\\n*.compute-1.amazonaws.com\\n*.compute.amazonaws.com.cn\\nus-east-1.amazonaws.com\\n\\n// Amazon S3\\n// Submitted by Luke Wells <psl-maintainers@amazon.com>\\n// Reference: d068bd97-f0a9-4838-a6d8-954b622ef4ae\\ns3.cn-north-1.amazonaws.com.cn\\ns3.dualstack.ap-northeast-1.amazonaws.com\\ns3.dualstack.ap-northeast-2.amazonaws.com\\ns3.ap-northeast-2.amazonaws.com\\ns3-website.ap-northeast-2.amazonaws.com\\ns3.dualstack.ap-south-1.amazonaws.com\\ns3.ap-south-1.amazonaws.com\\ns3-website.ap-south-1.amazonaws.com\\ns3.dualstack.ap-southeast-1.amazonaws.com\\ns3.dualstack.ap-southeast-2.amazonaws.com\\ns3.dualstack.ca-central-1.amazonaws.com\\ns3.ca-central-1.amazonaws.com\\ns3-website.ca-central-1.amazonaws.com\\ns3.dualstack.eu-central-1.amazonaws.com\\ns3.eu-central-1.amazonaws.com\\ns3-website.eu-central-1.amazonaws.com\\ns3.dualstack.eu-west-1.amazonaws.com\\ns3.dualstack.eu-west-2.amazonaws.com\\ns3.eu-west-2.amazonaws.com\\ns3-website.eu-west-2.amazonaws.com\\ns3.dualstack.eu-west-3.amazonaws.com\\ns3.eu-west-3.amazonaws.com\\ns3-website.eu-west-3.amazonaws.com\\ns3.amazonaws.com\\ns3-ap-northeast-1.amazonaws.com\\ns3-ap-northeast-2.amazonaws.com\\ns3-ap-south-1.amazonaws.com\\ns3-ap-southeast-1.amazonaws.com\\ns3-ap-southeast-2.amazonaws.com\\ns3-ca-central-1.amazonaws.com\\ns3-eu-central-1.amazonaws.com\\ns3-eu-west-1.amazonaws.com\\ns3-eu-west-2.amazonaws.com\\ns3-eu-west-3.amazonaws.com\\ns3-external-1.amazonaws.com\\ns3-fips-us-gov-west-1.amazonaws.com\\ns3-sa-east-1.amazonaws.com\\ns3-us-east-2.amazonaws.com\\ns3-us-gov-west-1.amazonaws.com\\ns3-us-west-1.amazonaws.com\\ns3-us-west-2.amazonaws.com\\ns3-website-ap-northeast-1.amazonaws.com\\ns3-website-ap-southeast-1.amazonaws.com\\ns3-website-ap-southeast-2.amazonaws.com\\ns3-website-eu-west-1.amazonaws.com\\ns3-website-sa-east-1.amazonaws.com\\ns3-website-us-east-1.amazonaws.com\\ns3-website-us-west-1.amazonaws.com\\ns3-website-us-west-2.amazonaws.com\\ns3.dualstack.sa-east-1.amazonaws.com\\ns3.dualstack.us-east-1.amazonaws.com\\ns3.dualstack.us-east-2.amazonaws.com\\ns3.us-east-2.amazonaws.com\\ns3-website.us-east-2.amazonaws.com\\n\\n// Analytics on AWS\\n// Submitted by AWS Security <psl-maintainers@amazon.com>\\n// Reference: c02c3a80-f8a0-4fd2-b719-48ea8b7c28de\\nanalytics-gateway.ap-northeast-1.amazonaws.com\\nanalytics-gateway.eu-west-1.amazonaws.com\\nanalytics-gateway.us-east-1.amazonaws.com\\nanalytics-gateway.us-east-2.amazonaws.com\\nanalytics-gateway.us-west-2.amazonaws.com\\n\\n// AWS Cloud9\\n// Submitted by: AWS Security <psl-maintainers@amazon.com>\\n// Reference: 05c44955-977c-4b57-938a-f2af92733f9f\\nwebview-assets.aws-cloud9.af-south-1.amazonaws.com\\nvfs.cloud9.af-south-1.amazonaws.com\\nwebview-assets.cloud9.af-south-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-east-1.amazonaws.com\\nvfs.cloud9.ap-east-1.amazonaws.com\\nwebview-assets.cloud9.ap-east-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-northeast-1.amazonaws.com\\nvfs.cloud9.ap-northeast-1.amazonaws.com\\nwebview-assets.cloud9.ap-northeast-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-northeast-2.amazonaws.com\\nvfs.cloud9.ap-northeast-2.amazonaws.com\\nwebview-assets.cloud9.ap-northeast-2.amazonaws.com\\nwebview-assets.aws-cloud9.ap-northeast-3.amazonaws.com\\nvfs.cloud9.ap-northeast-3.amazonaws.com\\nwebview-assets.cloud9.ap-northeast-3.amazonaws.com\\nwebview-assets.aws-cloud9.ap-south-1.amazonaws.com\\nvfs.cloud9.ap-south-1.amazonaws.com\\nwebview-assets.cloud9.ap-south-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-southeast-1.amazonaws.com\\nvfs.cloud9.ap-southeast-1.amazonaws.com\\nwebview-assets.cloud9.ap-southeast-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-southeast-2.amazonaws.com\\nvfs.cloud9.ap-southeast-2.amazonaws.com\\nwebview-assets.cloud9.ap-southeast-2.amazonaws.com\\nwebview-assets.aws-cloud9.ca-central-1.amazonaws.com\\nvfs.cloud9.ca-central-1.amazonaws.com\\nwebview-assets.cloud9.ca-central-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-central-1.amazonaws.com\\nvfs.cloud9.eu-central-1.amazonaws.com\\nwebview-assets.cloud9.eu-central-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-north-1.amazonaws.com\\nvfs.cloud9.eu-north-1.amazonaws.com\\nwebview-assets.cloud9.eu-north-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-south-1.amazonaws.com\\nvfs.cloud9.eu-south-1.amazonaws.com\\nwebview-assets.cloud9.eu-south-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-west-1.amazonaws.com\\nvfs.cloud9.eu-west-1.amazonaws.com\\nwebview-assets.cloud9.eu-west-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-west-2.amazonaws.com\\nvfs.cloud9.eu-west-2.amazonaws.com\\nwebview-assets.cloud9.eu-west-2.amazonaws.com\\nwebview-assets.aws-cloud9.eu-west-3.amazonaws.com\\nvfs.cloud9.eu-west-3.amazonaws.com\\nwebview-assets.cloud9.eu-west-3.amazonaws.com\\nwebview-assets.aws-cloud9.me-south-1.amazonaws.com\\nvfs.cloud9.me-south-1.amazonaws.com\\nwebview-assets.cloud9.me-south-1.amazonaws.com\\nwebview-assets.aws-cloud9.sa-east-1.amazonaws.com\\nvfs.cloud9.sa-east-1.amazonaws.com\\nwebview-assets.cloud9.sa-east-1.amazonaws.com\\nwebview-assets.aws-cloud9.us-east-1.amazonaws.com\\nvfs.cloud9.us-east-1.amazonaws.com\\nwebview-assets.cloud9.us-east-1.amazonaws.com\\nwebview-assets.aws-cloud9.us-east-2.amazonaws.com\\nvfs.cloud9.us-east-2.amazonaws.com\\nwebview-assets.cloud9.us-east-2.amazonaws.com\\nwebview-assets.aws-cloud9.us-west-1.amazonaws.com\\nvfs.cloud9.us-west-1.amazonaws.com\\nwebview-assets.cloud9.us-west-1.amazonaws.com\\nwebview-assets.aws-cloud9.us-west-2.amazonaws.com\\nvfs.cloud9.us-west-2.amazonaws.com\\nwebview-assets.cloud9.us-west-2.amazonaws.com\\n\\n// AWS Elastic Beanstalk\\n// Submitted by Luke Wells <psl-maintainers@amazon.com>\\n// Reference: aa202394-43a0-4857-b245-8db04549137e\\ncn-north-1.eb.amazonaws.com.cn\\ncn-northwest-1.eb.amazonaws.com.cn\\nelasticbeanstalk.com\\nap-northeast-1.elasticbeanstalk.com\\nap-northeast-2.elasticbeanstalk.com\\nap-northeast-3.elasticbeanstalk.com\\nap-south-1.elasticbeanstalk.com\\nap-southeast-1.elasticbeanstalk.com\\nap-southeast-2.elasticbeanstalk.com\\nca-central-1.elasticbeanstalk.com\\neu-central-1.elasticbeanstalk.com\\neu-west-1.elasticbeanstalk.com\\neu-west-2.elasticbeanstalk.com\\neu-west-3.elasticbeanstalk.com\\nsa-east-1.elasticbeanstalk.com\\nus-east-1.elasticbeanstalk.com\\nus-east-2.elasticbeanstalk.com\\nus-gov-west-1.elasticbeanstalk.com\\nus-west-1.elasticbeanstalk.com\\nus-west-2.elasticbeanstalk.com\\n\\n// (AWS) Elastic Load Balancing\\n// Submitted by Luke Wells <psl-maintainers@amazon.com>\\n// Reference: 12a3d528-1bac-4433-a359-a395867ffed2\\n*.elb.amazonaws.com.cn\\n*.elb.amazonaws.com\\n\\n// AWS Global Accelerator\\n// Submitted by Daniel Massaguer <psl-maintainers@amazon.com>\\n// Reference: d916759d-a08b-4241-b536-4db887383a6a\\nawsglobalaccelerator.com\\n\\n// eero\\n// Submitted by Yue Kang <eero-dynamic-dns@amazon.com>\\n// Reference: 264afe70-f62c-4c02-8ab9-b5281ed24461\\neero.online\\neero-stage.online\\n\\n// concludes Amazon\\n\\n// Amune : https://amune.org/\\n// Submitted by Team Amune <cert@amune.org>\\nt3l3p0rt.net\\ntele.amune.org\\n\\n// Apigee : https://apigee.com/\\n// Submitted by Apigee Security Team <security@apigee.com>\\napigee.io\\n\\n// Apphud : https://apphud.com\\n// Submitted by Alexander Selivanov <alex@apphud.com>\\nsiiites.com\\n\\n// Appspace : https://www.appspace.com\\n// Submitted by Appspace Security Team <security@appspace.com>\\nappspacehosted.com\\nappspaceusercontent.com\\n\\n// Appudo UG (haftungsbeschränkt) : https://www.appudo.com\\n// Submitted by Alexander Hochbaum <admin@appudo.com>\\nappudo.net\\n\\n// Aptible : https://www.aptible.com/\\n// Submitted by Thomas Orozco <thomas@aptible.com>\\non-aptible.com\\n\\n// ASEINet : https://www.aseinet.com/\\n// Submitted by Asei SEKIGUCHI <mail@aseinet.com>\\nuser.aseinet.ne.jp\\ngv.vc\\nd.gv.vc\\n\\n// Asociación Amigos de la Informática \"Euskalamiga\" : http://encounter.eus/\\n// Submitted by Hector Martin <marcan@euskalencounter.org>\\nuser.party.eus\\n\\n// Association potager.org : https://potager.org/\\n// Submitted by Lunar <jardiniers@potager.org>\\npimienta.org\\npoivron.org\\npotager.org\\nsweetpepper.org\\n\\n// ASUSTOR Inc. : http://www.asustor.com\\n// Submitted by Vincent Tseng <vincenttseng@asustor.com>\\nmyasustor.com\\n\\n// Atlassian : https://atlassian.com\\n// Submitted by Sam Smyth <devloop@atlassian.com>\\ncdn.prod.atlassian-dev.net\\n\\n// Authentick UG (haftungsbeschränkt) : https://authentick.net\\n// Submitted by Lukas Reschke <lukas@authentick.net>\\ntranslated.page\\n\\n// Autocode : https://autocode.com\\n// Submitted by Jacob Lee <jacob@autocode.com>\\nautocode.dev\\n\\n// AVM : https://avm.de\\n// Submitted by Andreas Weise <a.weise@avm.de>\\nmyfritz.net\\n\\n// AVStack Pte. Ltd. : https://avstack.io\\n// Submitted by Jasper Hugo <jasper@avstack.io>\\nonavstack.net\\n\\n// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com\\n// Submitted by James Kennedy <domains@advisorwebsites.com>\\n*.awdev.ca\\n*.advisor.ws\\n\\n// AZ.pl sp. z.o.o: https://az.pl\\n// Submitted by Krzysztof Wolski <krzysztof.wolski@home.eu>\\necommerce-shop.pl\\n\\n// b-data GmbH : https://www.b-data.io\\n// Submitted by Olivier Benz <olivier.benz@b-data.ch>\\nb-data.io\\n\\n// backplane : https://www.backplane.io\\n// Submitted by Anthony Voutas <anthony@backplane.io>\\nbackplaneapp.io\\n\\n// Balena : https://www.balena.io\\n// Submitted by Petros Angelatos <petrosagg@balena.io>\\nbalena-devices.com\\n\\n// University of Banja Luka : https://unibl.org\\n// Domains for Republic of Srpska administrative entity.\\n// Submitted by Marko Ivanovic <kormang@hotmail.rs>\\nrs.ba\\n\\n// Banzai Cloud\\n// Submitted by Janos Matyas <info@banzaicloud.com>\\n*.banzai.cloud\\napp.banzaicloud.io\\n*.backyards.banzaicloud.io\\n\\n// BASE, Inc. : https://binc.jp\\n// Submitted by Yuya NAGASAWA <public-suffix-list@binc.jp>\\nbase.ec\\nofficial.ec\\nbuyshop.jp\\nfashionstore.jp\\nhandcrafted.jp\\nkawaiishop.jp\\nsupersale.jp\\ntheshop.jp\\nshopselect.net\\nbase.shop\\n\\n// BeagleBoard.org Foundation : https://beagleboard.org\\n// Submitted by Jason Kridner <jkridner@beagleboard.org>\\nbeagleboard.io\\n\\n// Beget Ltd\\n// Submitted by Lev Nekrasov <lnekrasov@beget.com>\\n*.beget.app\\n\\n// BetaInABox\\n// Submitted by Adrian <adrian@betainabox.com>\\nbetainabox.com\\n\\n// BinaryLane : http://www.binarylane.com\\n// Submitted by Nathan O\\'Sullivan <nathan@mammoth.com.au>\\nbnr.la\\n\\n// Bitbucket : http://bitbucket.org\\n// Submitted by Andy Ortlieb <aortlieb@atlassian.com>\\nbitbucket.io\\n\\n// Blackbaud, Inc. : https://www.blackbaud.com\\n// Submitted by Paul Crowder <paul.crowder@blackbaud.com>\\nblackbaudcdn.net\\n\\n// Blatech : http://www.blatech.net\\n// Submitted by Luke Bratch <luke@bratch.co.uk>\\nof.je\\n\\n// Blue Bite, LLC : https://bluebite.com\\n// Submitted by Joshua Weiss <admin.engineering@bluebite.com>\\nbluebite.io\\n\\n// Boomla : https://boomla.com\\n// Submitted by Tibor Halter <thalter@boomla.com>\\nboomla.net\\n\\n// Boutir : https://www.boutir.com\\n// Submitted by Eric Ng Ka Ka <ngkaka@boutir.com>\\nboutir.com\\n\\n// Boxfuse : https://boxfuse.com\\n// Submitted by Axel Fontaine <axel@boxfuse.com>\\nboxfuse.io\\n\\n// bplaced : https://www.bplaced.net/\\n// Submitted by Miroslav Bozic <security@bplaced.net>\\nsquare7.ch\\nbplaced.com\\nbplaced.de\\nsquare7.de\\nbplaced.net\\nsquare7.net\\n\\n// Brendly : https://brendly.rs\\n// Submitted by Dusan Radovanovic <dusan.radovanovic@brendly.rs>\\nshop.brendly.rs\\n\\n// BrowserSafetyMark\\n// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com>\\nbrowsersafetymark.io\\n\\n// Bytemark Hosting : https://www.bytemark.co.uk\\n// Submitted by Paul Cammish <paul.cammish@bytemark.co.uk>\\nuk0.bigv.io\\ndh.bytemark.co.uk\\nvm.bytemark.co.uk\\n\\n// Caf.js Labs LLC : https://www.cafjs.com\\n// Submitted by Antonio Lain <antlai@cafjs.com>\\ncafjs.com\\n\\n// callidomus : https://www.callidomus.com/\\n// Submitted by Marcus Popp <admin@callidomus.com>\\nmycd.eu\\n\\n// Canva Pty Ltd : https://canva.com/\\n// Submitted by Joel Aquilina <publicsuffixlist@canva.com>\\ncanva-apps.cn\\ncanva-apps.com\\n\\n// Carrd : https://carrd.co\\n// Submitted by AJ <aj@carrd.co>\\ndrr.ac\\nuwu.ai\\ncarrd.co\\ncrd.co\\nju.mp\\n\\n// CentralNic : http://www.centralnic.com/names/domains\\n// Submitted by registry <gavin.brown@centralnic.com>\\nae.org\\nbr.com\\ncn.com\\ncom.de\\ncom.se\\nde.com\\neu.com\\ngb.net\\nhu.net\\njp.net\\njpn.com\\nmex.com\\nru.com\\nsa.com\\nse.net\\nuk.com\\nuk.net\\nus.com\\nza.bz\\nza.com\\n\\n// No longer operated by CentralNic, these entries should be adopted and/or removed by current operators\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nar.com\\nhu.com\\nkr.com\\nno.com\\nqc.com\\nuy.com\\n\\n// Africa.com Web Solutions Ltd : https://registry.africa.com\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nafrica.com\\n\\n// iDOT Services Limited : http://www.domain.gr.com\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\ngr.com\\n\\n// Radix FZC : http://domains.in.net\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nin.net\\nweb.in\\n\\n// US REGISTRY LLC : http://us.org\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nus.org\\n\\n// co.com Registry, LLC : https://registry.co.com\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nco.com\\n\\n// Roar Domains LLC : https://roar.basketball/\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\naus.basketball\\nnz.basketball\\n\\n// BRS Media : https://brsmedia.com/\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nradio.am\\nradio.fm\\n\\n// c.la : http://www.c.la/\\nc.la\\n\\n// certmgr.org : https://certmgr.org\\n// Submitted by B. Blechschmidt <hostmaster@certmgr.org>\\ncertmgr.org\\n\\n// Cityhost LLC  : https://cityhost.ua\\n// Submitted by Maksym Rivtin <support@cityhost.net.ua>\\ncx.ua\\n\\n// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/\\n// Submitted by Rishabh Nambiar & Michael Brown <team@discourse.org>\\ndiscourse.group\\ndiscourse.team\\n\\n// Clever Cloud : https://www.clever-cloud.com/\\n// Submitted by Quentin Adam <noc@clever-cloud.com>\\ncleverapps.io\\n\\n// Clerk : https://www.clerk.dev\\n// Submitted by Colin Sidoti <systems@clerk.dev>\\nclerk.app\\nclerkstage.app\\n*.lcl.dev\\n*.lclstage.dev\\n*.stg.dev\\n*.stgstage.dev\\n\\n// ClickRising : https://clickrising.com/\\n// Submitted by Umut Gumeli <infrastructure-publicsuffixlist@clickrising.com>\\nclickrising.net\\n\\n// Cloud66 : https://www.cloud66.com/\\n// Submitted by Khash Sajadi <khash@cloud66.com>\\nc66.me\\ncloud66.ws\\ncloud66.zone\\n\\n// CloudAccess.net : https://www.cloudaccess.net/\\n// Submitted by Pawel Panek <noc@cloudaccess.net>\\njdevcloud.com\\nwpdevcloud.com\\ncloudaccess.host\\nfreesite.host\\ncloudaccess.net\\n\\n// cloudControl : https://www.cloudcontrol.com/\\n// Submitted by Tobias Wilken <tw@cloudcontrol.com>\\ncloudcontrolled.com\\ncloudcontrolapp.com\\n\\n// Cloudera, Inc. : https://www.cloudera.com/\\n// Submitted by Kedarnath Waikar <security@cloudera.com>\\n*.cloudera.site\\n\\n// Cloudflare, Inc. : https://www.cloudflare.com/\\n// Submitted by Cloudflare Team <publicsuffixlist@cloudflare.com>\\ncf-ipfs.com\\ncloudflare-ipfs.com\\ntrycloudflare.com\\npages.dev\\nr2.dev\\nworkers.dev\\n\\n// Clovyr : https://clovyr.io\\n// Submitted by Patrick Nielsen <patrick@clovyr.io>\\nwnext.app\\n\\n// co.ca : http://registry.co.ca/\\nco.ca\\n\\n// Co & Co : https://co-co.nl/\\n// Submitted by Govert Versluis <govert@co-co.nl>\\n*.otap.co\\n\\n// i-registry s.r.o. : http://www.i-registry.cz/\\n// Submitted by Martin Semrad <semrad@i-registry.cz>\\nco.cz\\n\\n// CDN77.com : http://www.cdn77.com\\n// Submitted by Jan Krpes <jan.krpes@cdn77.com>\\nc.cdn77.org\\ncdn77-ssl.net\\nr.cdn77.net\\nrsc.cdn77.org\\nssl.origin.cdn77-secure.org\\n\\n// Cloud DNS Ltd : http://www.cloudns.net\\n// Submitted by Aleksander Hristov <noc@cloudns.net>\\ncloudns.asia\\ncloudns.biz\\ncloudns.club\\ncloudns.cc\\ncloudns.eu\\ncloudns.in\\ncloudns.info\\ncloudns.org\\ncloudns.pro\\ncloudns.pw\\ncloudns.us\\n\\n// CNPY : https://cnpy.gdn\\n// Submitted by Angelo Gladding <angelo@lahacker.net>\\ncnpy.gdn\\n\\n// Codeberg e. V. : https://codeberg.org\\n// Submitted by Moritz Marquardt <git@momar.de>\\ncodeberg.page\\n\\n// CoDNS B.V.\\nco.nl\\nco.no\\n\\n// Combell.com : https://www.combell.com\\n// Submitted by Thomas Wouters <thomas.wouters@combellgroup.com>\\nwebhosting.be\\nhosting-cluster.nl\\n\\n// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/\\n// Submitted by George Georgievsky <gug@cctld.ru>\\nac.ru\\nedu.ru\\ngov.ru\\nint.ru\\nmil.ru\\ntest.ru\\n\\n// COSIMO GmbH : http://www.cosimo.de\\n// Submitted by Rene Marticke <rmarticke@cosimo.de>\\ndyn.cosidns.de\\ndynamisches-dns.de\\ndnsupdater.de\\ninternet-dns.de\\nl-o-g-i-n.de\\ndynamic-dns.info\\nfeste-ip.net\\nknx-server.net\\nstatic-access.net\\n\\n// Craynic, s.r.o. : http://www.craynic.com/\\n// Submitted by Ales Krajnik <ales.krajnik@craynic.com>\\nrealm.cz\\n\\n// Cryptonomic : https://cryptonomic.net/\\n// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net>\\n*.cryptonomic.net\\n\\n// Cupcake : https://cupcake.io/\\n// Submitted by Jonathan Rudenberg <jonathan@cupcake.io>\\ncupcake.is\\n\\n// Curv UG : https://curv-labs.de/\\n// Submitted by Marvin Wiesner <Marvin@curv-labs.de>\\ncurv.dev\\n\\n// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/\\n// Submitted by Gregory Drake <support@dyn.com>\\n// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label\\n*.customer-oci.com\\n*.oci.customer-oci.com\\n*.ocp.customer-oci.com\\n*.ocs.customer-oci.com\\n\\n// cyon GmbH : https://www.cyon.ch/\\n// Submitted by Dominic Luechinger <dol@cyon.ch>\\ncyon.link\\ncyon.site\\n\\n// Danger Science Group: https://dangerscience.com/\\n// Submitted by Skylar MacDonald <skylar@dangerscience.com>\\nfnwk.site\\nfolionetwork.site\\nplatform0.app\\n\\n// Daplie, Inc : https://daplie.com\\n// Submitted by AJ ONeal <aj@daplie.com>\\ndaplie.me\\nlocalhost.daplie.me\\n\\n// Datto, Inc. : https://www.datto.com/\\n// Submitted by Philipp Heckel <ph@datto.com>\\ndattolocal.com\\ndattorelay.com\\ndattoweb.com\\nmydatto.com\\ndattolocal.net\\nmydatto.net\\n\\n// Dansk.net : http://www.dansk.net/\\n// Submitted by Anani Voule <digital@digital.co.dk>\\nbiz.dk\\nco.dk\\nfirm.dk\\nreg.dk\\nstore.dk\\n\\n// dappnode.io : https://dappnode.io/\\n// Submitted by Abel Boldu / DAppNode Team <community@dappnode.io>\\ndyndns.dappnode.io\\n\\n// dapps.earth : https://dapps.earth/\\n// Submitted by Daniil Burdakov <icqkill@gmail.com>\\n*.dapps.earth\\n*.bzz.dapps.earth\\n\\n// Dark, Inc. : https://darklang.com\\n// Submitted by Paul Biggar <ops@darklang.com>\\nbuiltwithdark.com\\n\\n// DataDetect, LLC. : https://datadetect.com\\n// Submitted by Andrew Banchich <abanchich@sceven.com>\\ndemo.datadetect.com\\ninstance.datadetect.com\\n\\n// Datawire, Inc : https://www.datawire.io\\n// Submitted by Richard Li <secalert@datawire.io>\\nedgestack.me\\n\\n// DDNS5 : https://ddns5.com\\n// Submitted by Cameron Elliott <cameron@cameronelliott.com>\\nddns5.com\\n\\n// Debian : https://www.debian.org/\\n// Submitted by Peter Palfrader / Debian Sysadmin Team <dsa-publicsuffixlist@debian.org>\\ndebian.net\\n\\n// Deno Land Inc : https://deno.com/\\n// Submitted by Luca Casonato <hostmaster@deno.com>\\ndeno.dev\\ndeno-staging.dev\\n\\n// deSEC : https://desec.io/\\n// Submitted by Peter Thomassen <peter@desec.io>\\ndedyn.io\\n\\n// Deta: https://www.deta.sh/\\n// Submitted by Aavash Shrestha <aavash@deta.sh>\\ndeta.app\\ndeta.dev\\n\\n// Diher Solutions : https://diher.solutions\\n// Submitted by Didi Hermawan <mail@diher.solutions>\\n*.rss.my.id\\n*.diher.solutions\\n\\n// Discord Inc : https://discord.com\\n// Submitted by Sahn Lam <slam@discordapp.com>\\ndiscordsays.com\\ndiscordsez.com\\n\\n// DNS Africa Ltd https://dns.business\\n// Submitted by Calvin Browne <calvin@dns.business>\\njozi.biz\\n\\n// DNShome : https://www.dnshome.de/\\n// Submitted by Norbert Auler <mail@dnshome.de>\\ndnshome.de\\n\\n// DotArai : https://www.dotarai.com/\\n// Submitted by Atsadawat Netcharadsang <atsadawat@dotarai.co.th>\\nonline.th\\nshop.th\\n\\n// DrayTek Corp. : https://www.draytek.com/\\n// Submitted by Paul Fang <mis@draytek.com>\\ndrayddns.com\\n\\n// DreamCommerce : https://shoper.pl/\\n// Submitted by Konrad Kotarba <konrad.kotarba@dreamcommerce.com>\\nshoparena.pl\\n\\n// DreamHost : http://www.dreamhost.com/\\n// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com>\\ndreamhosters.com\\n\\n// Drobo : http://www.drobo.com/\\n// Submitted by Ricardo Padilha <rpadilha@drobo.com>\\nmydrobo.com\\n\\n// Drud Holdings, LLC. : https://www.drud.com/\\n// Submitted by Kevin Bridges <kevin@drud.com>\\ndrud.io\\ndrud.us\\n\\n// DuckDNS : http://www.duckdns.org/\\n// Submitted by Richard Harper <richard@duckdns.org>\\nduckdns.org\\n\\n// Bip : https://bip.sh\\n// Submitted by Joel Kennedy <joel@bip.sh>\\nbip.sh\\n\\n// bitbridge.net : Submitted by Craig Welch, abeliidev@gmail.com\\nbitbridge.net\\n\\n// dy.fi : http://dy.fi/\\n// Submitted by Heikki Hannikainen <hessu@hes.iki.fi>\\ndy.fi\\ntunk.org\\n\\n// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/\\ndyndns-at-home.com\\ndyndns-at-work.com\\ndyndns-blog.com\\ndyndns-free.com\\ndyndns-home.com\\ndyndns-ip.com\\ndyndns-mail.com\\ndyndns-office.com\\ndyndns-pics.com\\ndyndns-remote.com\\ndyndns-server.com\\ndyndns-web.com\\ndyndns-wiki.com\\ndyndns-work.com\\ndyndns.biz\\ndyndns.info\\ndyndns.org\\ndyndns.tv\\nat-band-camp.net\\nath.cx\\nbarrel-of-knowledge.info\\nbarrell-of-knowledge.info\\nbetter-than.tv\\nblogdns.com\\nblogdns.net\\nblogdns.org\\nblogsite.org\\nboldlygoingnowhere.org\\nbroke-it.net\\nbuyshouses.net\\ncechire.com\\ndnsalias.com\\ndnsalias.net\\ndnsalias.org\\ndnsdojo.com\\ndnsdojo.net\\ndnsdojo.org\\ndoes-it.net\\ndoesntexist.com\\ndoesntexist.org\\ndontexist.com\\ndontexist.net\\ndontexist.org\\ndoomdns.com\\ndoomdns.org\\ndvrdns.org\\ndyn-o-saur.com\\ndynalias.com\\ndynalias.net\\ndynalias.org\\ndynathome.net\\ndyndns.ws\\nendofinternet.net\\nendofinternet.org\\nendoftheinternet.org\\nest-a-la-maison.com\\nest-a-la-masion.com\\nest-le-patron.com\\nest-mon-blogueur.com\\nfor-better.biz\\nfor-more.biz\\nfor-our.info\\nfor-some.biz\\nfor-the.biz\\nforgot.her.name\\nforgot.his.name\\nfrom-ak.com\\nfrom-al.com\\nfrom-ar.com\\nfrom-az.net\\nfrom-ca.com\\nfrom-co.net\\nfrom-ct.com\\nfrom-dc.com\\nfrom-de.com\\nfrom-fl.com\\nfrom-ga.com\\nfrom-hi.com\\nfrom-ia.com\\nfrom-id.com\\nfrom-il.com\\nfrom-in.com\\nfrom-ks.com\\nfrom-ky.com\\nfrom-la.net\\nfrom-ma.com\\nfrom-md.com\\nfrom-me.org\\nfrom-mi.com\\nfrom-mn.com\\nfrom-mo.com\\nfrom-ms.com\\nfrom-mt.com\\nfrom-nc.com\\nfrom-nd.com\\nfrom-ne.com\\nfrom-nh.com\\nfrom-nj.com\\nfrom-nm.com\\nfrom-nv.com\\nfrom-ny.net\\nfrom-oh.com\\nfrom-ok.com\\nfrom-or.com\\nfrom-pa.com\\nfrom-pr.com\\nfrom-ri.com\\nfrom-sc.com\\nfrom-sd.com\\nfrom-tn.com\\nfrom-tx.com\\nfrom-ut.com\\nfrom-va.com\\nfrom-vt.com\\nfrom-wa.com\\nfrom-wi.com\\nfrom-wv.com\\nfrom-wy.com\\nftpaccess.cc\\nfuettertdasnetz.de\\ngame-host.org\\ngame-server.cc\\ngetmyip.com\\ngets-it.net\\ngo.dyndns.org\\ngotdns.com\\ngotdns.org\\ngroks-the.info\\ngroks-this.info\\nham-radio-op.net\\nhere-for-more.info\\nhobby-site.com\\nhobby-site.org\\nhome.dyndns.org\\nhomedns.org\\nhomeftp.net\\nhomeftp.org\\nhomeip.net\\nhomelinux.com\\nhomelinux.net\\nhomelinux.org\\nhomeunix.com\\nhomeunix.net\\nhomeunix.org\\niamallama.com\\nin-the-band.net\\nis-a-anarchist.com\\nis-a-blogger.com\\nis-a-bookkeeper.com\\nis-a-bruinsfan.org\\nis-a-bulls-fan.com\\nis-a-candidate.org\\nis-a-caterer.com\\nis-a-celticsfan.org\\nis-a-chef.com\\nis-a-chef.net\\nis-a-chef.org\\nis-a-conservative.com\\nis-a-cpa.com\\nis-a-cubicle-slave.com\\nis-a-democrat.com\\nis-a-designer.com\\nis-a-doctor.com\\nis-a-financialadvisor.com\\nis-a-geek.com\\nis-a-geek.net\\nis-a-geek.org\\nis-a-green.com\\nis-a-guru.com\\nis-a-hard-worker.com\\nis-a-hunter.com\\nis-a-knight.org\\nis-a-landscaper.com\\nis-a-lawyer.com\\nis-a-liberal.com\\nis-a-libertarian.com\\nis-a-linux-user.org\\nis-a-llama.com\\nis-a-musician.com\\nis-a-nascarfan.com\\nis-a-nurse.com\\nis-a-painter.com\\nis-a-patsfan.org\\nis-a-personaltrainer.com\\nis-a-photographer.com\\nis-a-player.com\\nis-a-republican.com\\nis-a-rockstar.com\\nis-a-socialist.com\\nis-a-soxfan.org\\nis-a-student.com\\nis-a-teacher.com\\nis-a-techie.com\\nis-a-therapist.com\\nis-an-accountant.com\\nis-an-actor.com\\nis-an-actress.com\\nis-an-anarchist.com\\nis-an-artist.com\\nis-an-engineer.com\\nis-an-entertainer.com\\nis-by.us\\nis-certified.com\\nis-found.org\\nis-gone.com\\nis-into-anime.com\\nis-into-cars.com\\nis-into-cartoons.com\\nis-into-games.com\\nis-leet.com\\nis-lost.org\\nis-not-certified.com\\nis-saved.org\\nis-slick.com\\nis-uberleet.com\\nis-very-bad.org\\nis-very-evil.org\\nis-very-good.org\\nis-very-nice.org\\nis-very-sweet.org\\nis-with-theband.com\\nisa-geek.com\\nisa-geek.net\\nisa-geek.org\\nisa-hockeynut.com\\nissmarterthanyou.com\\nisteingeek.de\\nistmein.de\\nkicks-ass.net\\nkicks-ass.org\\nknowsitall.info\\nland-4-sale.us\\nlebtimnetz.de\\nleitungsen.de\\nlikes-pie.com\\nlikescandy.com\\nmerseine.nu\\nmine.nu\\nmisconfused.org\\nmypets.ws\\nmyphotos.cc\\nneat-url.com\\noffice-on-the.net\\non-the-web.tv\\npodzone.net\\npodzone.org\\nreadmyblog.org\\nsaves-the-whales.com\\nscrapper-site.net\\nscrapping.cc\\nselfip.biz\\nselfip.com\\nselfip.info\\nselfip.net\\nselfip.org\\nsells-for-less.com\\nsells-for-u.com\\nsells-it.net\\nsellsyourhome.org\\nservebbs.com\\nservebbs.net\\nservebbs.org\\nserveftp.net\\nserveftp.org\\nservegame.org\\nshacknet.nu\\nsimple-url.com\\nspace-to-rent.com\\nstuff-4-sale.org\\nstuff-4-sale.us\\nteaches-yoga.com\\nthruhere.net\\ntraeumtgerade.de\\nwebhop.biz\\nwebhop.info\\nwebhop.net\\nwebhop.org\\nworse-than.tv\\nwritesthisblog.com\\n\\n// ddnss.de : https://www.ddnss.de/\\n// Submitted by Robert Niedziela <webmaster@ddnss.de>\\nddnss.de\\ndyn.ddnss.de\\ndyndns.ddnss.de\\ndyndns1.de\\ndyn-ip24.de\\nhome-webserver.de\\ndyn.home-webserver.de\\nmyhome-server.de\\nddnss.org\\n\\n// Definima : http://www.definima.com/\\n// Submitted by Maxence Bitterli <maxence@definima.com>\\ndefinima.net\\ndefinima.io\\n\\n// DigitalOcean App Platform : https://www.digitalocean.com/products/app-platform/\\n// Submitted by Braxton Huggins <psl-maintainers@digitalocean.com>\\nondigitalocean.app\\n\\n// DigitalOcean Spaces : https://www.digitalocean.com/products/spaces/\\n// Submitted by Robin H. Johnson <psl-maintainers@digitalocean.com>\\n*.digitaloceanspaces.com\\n\\n// dnstrace.pro : https://dnstrace.pro/\\n// Submitted by Chris Partridge <chris@partridge.tech>\\nbci.dnstrace.pro\\n\\n// Dynu.com : https://www.dynu.com/\\n// Submitted by Sue Ye <sue@dynu.com>\\nddnsfree.com\\nddnsgeek.com\\ngiize.com\\ngleeze.com\\nkozow.com\\nloseyourip.com\\nooguy.com\\ntheworkpc.com\\ncasacam.net\\ndynu.net\\naccesscam.org\\ncamdvr.org\\nfreeddns.org\\nmywire.org\\nwebredirect.org\\nmyddns.rocks\\nblogsite.xyz\\n\\n// dynv6 : https://dynv6.com\\n// Submitted by Dominik Menke <dom@digineo.de>\\ndynv6.net\\n\\n// E4YOU spol. s.r.o. : https://e4you.cz/\\n// Submitted by Vladimir Dudr <info@e4you.cz>\\ne4.cz\\n\\n// Easypanel : https://easypanel.io\\n// Submitted by Andrei Canta <andrei@easypanel.io>\\neasypanel.app\\neasypanel.host\\n\\n// Elementor : Elementor Ltd.\\n// Submitted by Anton Barkan <antonb@elementor.com>\\nelementor.cloud\\nelementor.cool\\n\\n// En root‽ : https://en-root.org\\n// Submitted by Emmanuel Raviart <emmanuel@raviart.com>\\nen-root.fr\\n\\n// Enalean SAS: https://www.enalean.com\\n// Submitted by Thomas Cottier <thomas.cottier@enalean.com>\\nmytuleap.com\\ntuleap-partners.com\\n\\n// Encoretivity AB: https://encore.dev\\n// Submitted by André Eriksson <andre@encore.dev>\\nencr.app\\nencoreapi.com\\n\\n// ECG Robotics, Inc: https://ecgrobotics.org\\n// Submitted by <frc1533@ecgrobotics.org>\\nonred.one\\nstaging.onred.one\\n\\n// encoway GmbH : https://www.encoway.de\\n// Submitted by Marcel Daus <cloudops@encoway.de>\\neu.encoway.cloud\\n\\n// EU.org https://eu.org/\\n// Submitted by Pierre Beyssac <hostmaster@eu.org>\\neu.org\\nal.eu.org\\nasso.eu.org\\nat.eu.org\\nau.eu.org\\nbe.eu.org\\nbg.eu.org\\nca.eu.org\\ncd.eu.org\\nch.eu.org\\ncn.eu.org\\ncy.eu.org\\ncz.eu.org\\nde.eu.org\\ndk.eu.org\\nedu.eu.org\\nee.eu.org\\nes.eu.org\\nfi.eu.org\\nfr.eu.org\\ngr.eu.org\\nhr.eu.org\\nhu.eu.org\\nie.eu.org\\nil.eu.org\\nin.eu.org\\nint.eu.org\\nis.eu.org\\nit.eu.org\\njp.eu.org\\nkr.eu.org\\nlt.eu.org\\nlu.eu.org\\nlv.eu.org\\nmc.eu.org\\nme.eu.org\\nmk.eu.org\\nmt.eu.org\\nmy.eu.org\\nnet.eu.org\\nng.eu.org\\nnl.eu.org\\nno.eu.org\\nnz.eu.org\\nparis.eu.org\\npl.eu.org\\npt.eu.org\\nq-a.eu.org\\nro.eu.org\\nru.eu.org\\nse.eu.org\\nsi.eu.org\\nsk.eu.org\\ntr.eu.org\\nuk.eu.org\\nus.eu.org\\n\\n// Eurobyte : https://eurobyte.ru\\n// Submitted by Evgeniy Subbotin <e.subbotin@eurobyte.ru>\\neurodir.ru\\n\\n// Evennode : http://www.evennode.com/\\n// Submitted by Michal Kralik <support@evennode.com>\\neu-1.evennode.com\\neu-2.evennode.com\\neu-3.evennode.com\\neu-4.evennode.com\\nus-1.evennode.com\\nus-2.evennode.com\\nus-3.evennode.com\\nus-4.evennode.com\\n\\n// eDirect Corp. : https://hosting.url.com.tw/\\n// Submitted by C.S. chang <cschang@corp.url.com.tw>\\ntwmail.cc\\ntwmail.net\\ntwmail.org\\nmymailer.com.tw\\nurl.tw\\n\\n// Fabrica Technologies, Inc. : https://www.fabrica.dev/\\n// Submitted by Eric Jiang <eric@fabrica.dev>\\nonfabrica.com\\n\\n// Facebook, Inc.\\n// Submitted by Peter Ruibal <public-suffix@fb.com>\\napps.fbsbx.com\\n\\n// FAITID : https://faitid.org/\\n// Submitted by Maxim Alzoba <tech.contact@faitid.org>\\n// https://www.flexireg.net/stat_info\\nru.net\\nadygeya.ru\\nbashkiria.ru\\nbir.ru\\ncbg.ru\\ncom.ru\\ndagestan.ru\\ngrozny.ru\\nkalmykia.ru\\nkustanai.ru\\nmarine.ru\\nmordovia.ru\\nmsk.ru\\nmytis.ru\\nnalchik.ru\\nnov.ru\\npyatigorsk.ru\\nspb.ru\\nvladikavkaz.ru\\nvladimir.ru\\nabkhazia.su\\nadygeya.su\\naktyubinsk.su\\narkhangelsk.su\\narmenia.su\\nashgabad.su\\nazerbaijan.su\\nbalashov.su\\nbashkiria.su\\nbryansk.su\\nbukhara.su\\nchimkent.su\\ndagestan.su\\neast-kazakhstan.su\\nexnet.su\\ngeorgia.su\\ngrozny.su\\nivanovo.su\\njambyl.su\\nkalmykia.su\\nkaluga.su\\nkaracol.su\\nkaraganda.su\\nkarelia.su\\nkhakassia.su\\nkrasnodar.su\\nkurgan.su\\nkustanai.su\\nlenug.su\\nmangyshlak.su\\nmordovia.su\\nmsk.su\\nmurmansk.su\\nnalchik.su\\nnavoi.su\\nnorth-kazakhstan.su\\nnov.su\\nobninsk.su\\npenza.su\\npokrovsk.su\\nsochi.su\\nspb.su\\ntashkent.su\\ntermez.su\\ntogliatti.su\\ntroitsk.su\\ntselinograd.su\\ntula.su\\ntuva.su\\nvladikavkaz.su\\nvladimir.su\\nvologda.su\\n\\n// Fancy Bits, LLC : http://getchannels.com\\n// Submitted by Aman Gupta <aman@getchannels.com>\\nchannelsdvr.net\\nu.channelsdvr.net\\n\\n// Fastly Inc. : http://www.fastly.com/\\n// Submitted by Fastly Security <security@fastly.com>\\nedgecompute.app\\nfastly-edge.com\\nfastly-terrarium.com\\nfastlylb.net\\nmap.fastlylb.net\\nfreetls.fastly.net\\nmap.fastly.net\\na.prod.fastly.net\\nglobal.prod.fastly.net\\na.ssl.fastly.net\\nb.ssl.fastly.net\\nglobal.ssl.fastly.net\\n\\n// Fastmail : https://www.fastmail.com/\\n// Submitted by Marc Bradshaw <marc@fastmailteam.com>\\n*.user.fm\\n\\n// FASTVPS EESTI OU : https://fastvps.ru/\\n// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru>\\nfastvps-server.com\\nfastvps.host\\nmyfast.host\\nfastvps.site\\nmyfast.space\\n\\n// Fedora : https://fedoraproject.org/\\n// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org>\\nfedorainfracloud.org\\nfedorapeople.org\\ncloud.fedoraproject.org\\napp.os.fedoraproject.org\\napp.os.stg.fedoraproject.org\\n\\n// FearWorks Media Ltd. : https://fearworksmedia.co.uk\\n// submitted by Keith Fairley <domains@fearworksmedia.co.uk>\\nconn.uk\\ncopro.uk\\nhosp.uk\\n\\n// Fermax : https://fermax.com/\\n// submitted by Koen Van Isterdael <k.vanisterdael@fermax.be>\\nmydobiss.com\\n\\n// FH Muenster : https://www.fh-muenster.de\\n// Submitted by Robin Naundorf <r.naundorf@fh-muenster.de>\\nfh-muenster.io\\n\\n// Filegear Inc. : https://www.filegear.com\\n// Submitted by Jason Zhu <jason@owtware.com>\\nfilegear.me\\nfilegear-au.me\\nfilegear-de.me\\nfilegear-gb.me\\nfilegear-ie.me\\nfilegear-jp.me\\nfilegear-sg.me\\n\\n// Firebase, Inc.\\n// Submitted by Chris Raynor <chris@firebase.com>\\nfirebaseapp.com\\n\\n// Firewebkit : https://www.firewebkit.com\\n// Submitted by Majid Qureshi <mqureshi@amrayn.com>\\nfireweb.app\\n\\n// FLAP : https://www.flap.cloud\\n// Submitted by Louis Chemineau <louis@chmn.me>\\nflap.id\\n\\n// FlashDrive : https://flashdrive.io\\n// Submitted by Eric Chan <support@flashdrive.io>\\nonflashdrive.app\\nfldrv.com\\n\\n// fly.io: https://fly.io\\n// Submitted by Kurt Mackey <kurt@fly.io>\\nfly.dev\\nedgeapp.net\\nshw.io\\n\\n// Flynn : https://flynn.io\\n// Submitted by Jonathan Rudenberg <jonathan@flynn.io>\\nflynnhosting.net\\n\\n// Forgerock : https://www.forgerock.com\\n// Submitted by Roderick Parr <roderick.parr@forgerock.com>\\nforgeblocks.com\\nid.forgerock.io\\n\\n// Framer : https://www.framer.com\\n// Submitted by Koen Rouwhorst <koenrh@framer.com>\\nframer.app\\nframercanvas.com\\nframer.media\\nframer.photos\\nframer.website\\nframer.wiki\\n\\n// Frusky MEDIA&PR : https://www.frusky.de\\n// Submitted by Victor Pupynin <hallo@frusky.de>\\n*.frusky.de\\n\\n// RavPage : https://www.ravpage.co.il\\n// Submitted by Roni Horowitz <roni@responder.co.il>\\nravpage.co.il\\n\\n// Frederik Braun https://frederik-braun.com\\n// Submitted by Frederik Braun <fb@frederik-braun.com>\\n0e.vc\\n\\n// Freebox : http://www.freebox.fr\\n// Submitted by Romain Fliedel <rfliedel@freebox.fr>\\nfreebox-os.com\\nfreeboxos.com\\nfbx-os.fr\\nfbxos.fr\\nfreebox-os.fr\\nfreeboxos.fr\\n\\n// freedesktop.org : https://www.freedesktop.org\\n// Submitted by Daniel Stone <daniel@fooishbar.org>\\nfreedesktop.org\\n\\n// freemyip.com : https://freemyip.com\\n// Submitted by Cadence <contact@freemyip.com>\\nfreemyip.com\\n\\n// FunkFeuer - Verein zur Förderung freier Netze : https://www.funkfeuer.at\\n// Submitted by Daniel A. Maierhofer <vorstand@funkfeuer.at>\\nwien.funkfeuer.at\\n\\n// Futureweb OG : http://www.futureweb.at\\n// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at>\\n*.futurecms.at\\n*.ex.futurecms.at\\n*.in.futurecms.at\\nfuturehosting.at\\nfuturemailing.at\\n*.ex.ortsinfo.at\\n*.kunden.ortsinfo.at\\n*.statics.cloud\\n\\n// GDS : https://www.gov.uk/service-manual/technology/managing-domain-names\\n// Submitted by Stephen Ford <hostmaster@digital.cabinet-office.gov.uk>\\nindependent-commission.uk\\nindependent-inquest.uk\\nindependent-inquiry.uk\\nindependent-panel.uk\\nindependent-review.uk\\npublic-inquiry.uk\\nroyal-commission.uk\\ncampaign.gov.uk\\nservice.gov.uk\\n\\n// CDDO : https://www.gov.uk/guidance/get-an-api-domain-on-govuk\\n// Submitted by Jamie Tanna <jamie.tanna@digital.cabinet-office.gov.uk>\\napi.gov.uk\\n\\n// Gehirn Inc. : https://www.gehirn.co.jp/\\n// Submitted by Kohei YOSHIDA <tech@gehirn.co.jp>\\ngehirn.ne.jp\\nusercontent.jp\\n\\n// Gentlent, Inc. : https://www.gentlent.com\\n// Submitted by Tom Klein <tom@gentlent.com>\\ngentapps.com\\ngentlentapis.com\\nlab.ms\\ncdn-edges.net\\n\\n// Ghost Foundation : https://ghost.org\\n// Submitted by Matt Hanley <security@ghost.org>\\nghost.io\\n\\n// GignoSystemJapan: http://gsj.bz\\n// Submitted by GignoSystemJapan <kakutou-ec@gsj.bz>\\ngsj.bz\\n\\n// GitHub, Inc.\\n// Submitted by Patrick Toomey <security@github.com>\\ngithubusercontent.com\\ngithubpreview.dev\\ngithub.io\\n\\n// GitLab, Inc.\\n// Submitted by Alex Hanselka <alex@gitlab.com>\\ngitlab.io\\n\\n// Gitplac.si - https://gitplac.si\\n// Submitted by Aljaž Starc <me@aljaxus.eu>\\ngitapp.si\\ngitpage.si\\n\\n// Glitch, Inc : https://glitch.com\\n// Submitted by Mads Hartmann <mads@glitch.com>\\nglitch.me\\n\\n// Global NOG Alliance : https://nogalliance.org/\\n// Submitted by Sander Steffann <sander@nogalliance.org>\\nnog.community\\n\\n// Globe Hosting SRL : https://www.globehosting.com/\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nco.ro\\nshop.ro\\n\\n// GMO Pepabo, Inc. : https://pepabo.com/\\n// Submitted by Hosting Div <admin@pepabo.com>\\nlolipop.io\\nangry.jp\\nbabyblue.jp\\nbabymilk.jp\\nbackdrop.jp\\nbambina.jp\\nbitter.jp\\nblush.jp\\nboo.jp\\nboy.jp\\nboyfriend.jp\\nbut.jp\\ncandypop.jp\\ncapoo.jp\\ncatfood.jp\\ncheap.jp\\nchicappa.jp\\nchillout.jp\\nchips.jp\\nchowder.jp\\nchu.jp\\nciao.jp\\ncocotte.jp\\ncoolblog.jp\\ncranky.jp\\ncutegirl.jp\\ndaa.jp\\ndeca.jp\\ndeci.jp\\ndigick.jp\\negoism.jp\\nfakefur.jp\\nfem.jp\\nflier.jp\\nfloppy.jp\\nfool.jp\\nfrenchkiss.jp\\ngirlfriend.jp\\ngirly.jp\\ngloomy.jp\\ngonna.jp\\ngreater.jp\\nhacca.jp\\nheavy.jp\\nher.jp\\nhiho.jp\\nhippy.jp\\nholy.jp\\nhungry.jp\\nicurus.jp\\nitigo.jp\\njellybean.jp\\nkikirara.jp\\nkill.jp\\nkilo.jp\\nkuron.jp\\nlittlestar.jp\\nlolipopmc.jp\\nlolitapunk.jp\\nlomo.jp\\nlovepop.jp\\nlovesick.jp\\nmain.jp\\nmods.jp\\nmond.jp\\nmongolian.jp\\nmoo.jp\\nnamaste.jp\\nnikita.jp\\nnobushi.jp\\nnoor.jp\\noops.jp\\nparallel.jp\\nparasite.jp\\npecori.jp\\npeewee.jp\\npenne.jp\\npepper.jp\\nperma.jp\\npigboat.jp\\npinoko.jp\\npunyu.jp\\npupu.jp\\npussycat.jp\\npya.jp\\nraindrop.jp\\nreadymade.jp\\nsadist.jp\\nschoolbus.jp\\nsecret.jp\\nstaba.jp\\nstripper.jp\\nsub.jp\\nsunnyday.jp\\nthick.jp\\ntonkotsu.jp\\nunder.jp\\nupper.jp\\nvelvet.jp\\nverse.jp\\nversus.jp\\nvivian.jp\\nwatson.jp\\nweblike.jp\\nwhitesnow.jp\\nzombie.jp\\nheteml.net\\n\\n// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/\\n// Submitted by Tom Whitwell <gov-uk-paas-support@digital.cabinet-office.gov.uk>\\ncloudapps.digital\\nlondon.cloudapps.digital\\n\\n// GOV.UK Pay : https://www.payments.service.gov.uk/\\n// Submitted by Richard Baker <richard.baker@digital.cabinet-office.gov.uk>\\npymnt.uk\\n\\n// UKHomeOffice : https://www.gov.uk/government/organisations/home-office\\n// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk>\\nhomeoffice.gov.uk\\n\\n// GlobeHosting, Inc.\\n// Submitted by Zoltan Egresi <egresi@globehosting.com>\\nro.im\\n\\n// GoIP DNS Services : http://www.goip.de\\n// Submitted by Christian Poulter <milchstrasse@goip.de>\\ngoip.de\\n\\n// Google, Inc.\\n// Submitted by Eduardo Vela <evn@google.com>\\nrun.app\\na.run.app\\nweb.app\\n*.0emm.com\\nappspot.com\\n*.r.appspot.com\\ncodespot.com\\ngoogleapis.com\\ngooglecode.com\\npagespeedmobilizer.com\\npublishproxy.com\\nwithgoogle.com\\nwithyoutube.com\\n*.gateway.dev\\ncloud.goog\\ntranslate.goog\\n*.usercontent.goog\\ncloudfunctions.net\\nblogspot.ae\\nblogspot.al\\nblogspot.am\\nblogspot.ba\\nblogspot.be\\nblogspot.bg\\nblogspot.bj\\nblogspot.ca\\nblogspot.cf\\nblogspot.ch\\nblogspot.cl\\nblogspot.co.at\\nblogspot.co.id\\nblogspot.co.il\\nblogspot.co.ke\\nblogspot.co.nz\\nblogspot.co.uk\\nblogspot.co.za\\nblogspot.com\\nblogspot.com.ar\\nblogspot.com.au\\nblogspot.com.br\\nblogspot.com.by\\nblogspot.com.co\\nblogspot.com.cy\\nblogspot.com.ee\\nblogspot.com.eg\\nblogspot.com.es\\nblogspot.com.mt\\nblogspot.com.ng\\nblogspot.com.tr\\nblogspot.com.uy\\nblogspot.cv\\nblogspot.cz\\nblogspot.de\\nblogspot.dk\\nblogspot.fi\\nblogspot.fr\\nblogspot.gr\\nblogspot.hk\\nblogspot.hr\\nblogspot.hu\\nblogspot.ie\\nblogspot.in\\nblogspot.is\\nblogspot.it\\nblogspot.jp\\nblogspot.kr\\nblogspot.li\\nblogspot.lt\\nblogspot.lu\\nblogspot.md\\nblogspot.mk\\nblogspot.mr\\nblogspot.mx\\nblogspot.my\\nblogspot.nl\\nblogspot.no\\nblogspot.pe\\nblogspot.pt\\nblogspot.qa\\nblogspot.re\\nblogspot.ro\\nblogspot.rs\\nblogspot.ru\\nblogspot.se\\nblogspot.sg\\nblogspot.si\\nblogspot.sk\\nblogspot.sn\\nblogspot.td\\nblogspot.tw\\nblogspot.ug\\nblogspot.vn\\n\\n// Goupile : https://goupile.fr\\n// Submitted by Niels Martignene <hello@goupile.fr>\\ngoupile.fr\\n\\n// Government of the Netherlands: https://www.government.nl\\n// Submitted by <domeinnaam@minaz.nl>\\ngov.nl\\n\\n// Group 53, LLC : https://www.group53.com\\n// Submitted by Tyler Todd <noc@nova53.net>\\nawsmppl.com\\n\\n// GünstigBestellen : https://günstigbestellen.de\\n// Submitted by Furkan Akkoc <info@hendelzon.de>\\ngünstigbestellen.de\\ngünstigliefern.de\\n\\n// Hakaran group: http://hakaran.cz\\n// Submitted by Arseniy Sokolov <security@hakaran.cz>\\nfin.ci\\nfree.hr\\ncaa.li\\nua.rs\\nconf.se\\n\\n// Handshake : https://handshake.org\\n// Submitted by Mike Damm <md@md.vc>\\nhs.zone\\nhs.run\\n\\n// Hashbang : https://hashbang.sh\\nhashbang.sh\\n\\n// Hasura : https://hasura.io\\n// Submitted by Shahidh K Muhammed <shahidh@hasura.io>\\nhasura.app\\nhasura-app.io\\n\\n// Heilbronn University of Applied Sciences - Faculty Informatics (GitLab Pages): https://www.hs-heilbronn.de\\n// Submitted by Richard Zowalla <mi-admin@hs-heilbronn.de>\\npages.it.hs-heilbronn.de\\n\\n// Hepforge : https://www.hepforge.org\\n// Submitted by David Grellscheid <admin@hepforge.org>\\nhepforge.org\\n\\n// Heroku : https://www.heroku.com/\\n// Submitted by Tom Maher <tmaher@heroku.com>\\nherokuapp.com\\nherokussl.com\\n\\n// Hibernating Rhinos\\n// Submitted by Oren Eini <oren@ravendb.net>\\nravendb.cloud\\nravendb.community\\nravendb.me\\ndevelopment.run\\nravendb.run\\n\\n// home.pl S.A.: https://home.pl\\n// Submitted by Krzysztof Wolski <krzysztof.wolski@home.eu>\\nhomesklep.pl\\n\\n// Hong Kong Productivity Council: https://www.hkpc.org/\\n// Submitted by SECaaS Team <summchan@hkpc.org>\\nsecaas.hk\\n\\n// Hoplix : https://www.hoplix.com\\n// Submitted by Danilo De Franco<info@hoplix.shop>\\nhoplix.shop\\n\\n\\n// HOSTBIP REGISTRY : https://www.hostbip.com/\\n// Submitted by Atanunu Igbunuroghene <publicsuffixlist@hostbip.com>\\norx.biz\\nbiz.gl\\ncol.ng\\nfirm.ng\\ngen.ng\\nltd.ng\\nngo.ng\\nedu.scot\\nsch.so\\n\\n// HostFly : https://www.ie.ua\\n// Submitted by Bohdan Dub <support@hostfly.com.ua>\\nie.ua\\n\\n// HostyHosting (hostyhosting.com)\\nhostyhosting.io\\n\\n// Häkkinen.fi\\n// Submitted by Eero Häkkinen <Eero+psl@Häkkinen.fi>\\nhäkkinen.fi\\n\\n// Ici la Lune : http://www.icilalune.com/\\n// Submitted by Simon Morvan <simon@icilalune.com>\\n*.moonscale.io\\nmoonscale.net\\n\\n// iki.fi\\n// Submitted by Hannu Aronsson <haa@iki.fi>\\niki.fi\\n\\n// iliad italia: https://www.iliad.it\\n// Submitted by Marios Makassikis <mmakassikis@freebox.fr>\\nibxos.it\\niliadboxos.it\\n\\n// Impertrix Solutions : <https://impertrixcdn.com>\\n// Submitted by Zhixiang Zhao <csuite@impertrix.com>\\nimpertrixcdn.com\\nimpertrix.com\\n\\n// Incsub, LLC: https://incsub.com/\\n// Submitted by Aaron Edwards <sysadmins@incsub.com>\\nsmushcdn.com\\nwphostedmail.com\\nwpmucdn.com\\ntempurl.host\\nwpmudev.host\\n\\n// Individual Network Berlin e.V. : https://www.in-berlin.de/\\n// Submitted by Christian Seitz <chris@in-berlin.de>\\ndyn-berlin.de\\nin-berlin.de\\nin-brb.de\\nin-butter.de\\nin-dsl.de\\nin-dsl.net\\nin-dsl.org\\nin-vpn.de\\nin-vpn.net\\nin-vpn.org\\n\\n// info.at : http://www.info.at/\\nbiz.at\\ninfo.at\\n\\n// info.cx : http://info.cx\\n// Submitted by Jacob Slater <whois@igloo.to>\\ninfo.cx\\n\\n// Interlegis : http://www.interlegis.leg.br\\n// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br>\\nac.leg.br\\nal.leg.br\\nam.leg.br\\nap.leg.br\\nba.leg.br\\nce.leg.br\\ndf.leg.br\\nes.leg.br\\ngo.leg.br\\nma.leg.br\\nmg.leg.br\\nms.leg.br\\nmt.leg.br\\npa.leg.br\\npb.leg.br\\npe.leg.br\\npi.leg.br\\npr.leg.br\\nrj.leg.br\\nrn.leg.br\\nro.leg.br\\nrr.leg.br\\nrs.leg.br\\nsc.leg.br\\nse.leg.br\\nsp.leg.br\\nto.leg.br\\n\\n// intermetrics GmbH : https://pixolino.com/\\n// Submitted by Wolfgang Schwarz <admin@intermetrics.de>\\npixolino.com\\n\\n// Internet-Pro, LLP: https://netangels.ru/\\n// Submitted by Vasiliy Sheredeko <piphon@gmail.com>\\nna4u.ru\\n\\n// iopsys software solutions AB : https://iopsys.eu/\\n// Submitted by Roman Azarenko <roman.azarenko@iopsys.eu>\\niopsys.se\\n\\n// IPiFony Systems, Inc. : https://www.ipifony.com/\\n// Submitted by Matthew Hardeman <mhardeman@ipifony.com>\\nipifony.net\\n\\n// IServ GmbH : https://iserv.de\\n// Submitted by Mario Hoberg <info@iserv.de>\\niservschule.de\\nmein-iserv.de\\nschulplattform.de\\nschulserver.de\\ntest-iserv.de\\niserv.dev\\n\\n// I-O DATA DEVICE, INC. : http://www.iodata.com/\\n// Submitted by Yuji Minagawa <domains-admin@iodata.jp>\\niobb.net\\n\\n// Jelastic, Inc. : https://jelastic.com/\\n// Submitted by Ihor Kolodyuk <ik@jelastic.com>\\nmel.cloudlets.com.au\\ncloud.interhostsolutions.be\\nmycloud.by\\nalp1.ae.flow.ch\\nappengine.flow.ch\\nes-1.axarnet.cloud\\ndiadem.cloud\\nvip.jelastic.cloud\\njele.cloud\\nit1.eur.aruba.jenv-aruba.cloud\\nit1.jenv-aruba.cloud\\nkeliweb.cloud\\ncs.keliweb.cloud\\noxa.cloud\\ntn.oxa.cloud\\nuk.oxa.cloud\\nprimetel.cloud\\nuk.primetel.cloud\\nca.reclaim.cloud\\nuk.reclaim.cloud\\nus.reclaim.cloud\\nch.trendhosting.cloud\\nde.trendhosting.cloud\\njele.club\\namscompute.com\\ndopaas.com\\npaas.hosted-by-previder.com\\nrag-cloud.hosteur.com\\nrag-cloud-ch.hosteur.com\\njcloud.ik-server.com\\njcloud-ver-jpc.ik-server.com\\ndemo.jelastic.com\\nkilatiron.com\\npaas.massivegrid.com\\njed.wafaicloud.com\\nlon.wafaicloud.com\\nryd.wafaicloud.com\\nj.scaleforce.com.cy\\njelastic.dogado.eu\\nfi.cloudplatform.fi\\ndemo.datacenter.fi\\npaas.datacenter.fi\\njele.host\\nmircloud.host\\npaas.beebyte.io\\nsekd1.beebyteapp.io\\njele.io\\ncloud-fr1.unispace.io\\njc.neen.it\\ncloud.jelastic.open.tim.it\\njcloud.kz\\nupaas.kazteleport.kz\\ncloudjiffy.net\\nfra1-de.cloudjiffy.net\\nwest1-us.cloudjiffy.net\\njls-sto1.elastx.net\\njls-sto2.elastx.net\\njls-sto3.elastx.net\\nfaststacks.net\\nfr-1.paas.massivegrid.net\\nlon-1.paas.massivegrid.net\\nlon-2.paas.massivegrid.net\\nny-1.paas.massivegrid.net\\nny-2.paas.massivegrid.net\\nsg-1.paas.massivegrid.net\\njelastic.saveincloud.net\\nnordeste-idc.saveincloud.net\\nj.scaleforce.net\\njelastic.tsukaeru.net\\nsdscloud.pl\\nunicloud.pl\\nmircloud.ru\\njelastic.regruhosting.ru\\nenscaled.sg\\njele.site\\njelastic.team\\norangecloud.tn\\nj.layershift.co.uk\\nphx.enscaled.us\\nmircloud.us\\n\\n// Jino : https://www.jino.ru\\n// Submitted by Sergey Ulyashin <ulyashin@jino.ru>\\nmyjino.ru\\n*.hosting.myjino.ru\\n*.landing.myjino.ru\\n*.spectrum.myjino.ru\\n*.vps.myjino.ru\\n\\n// Jotelulu S.L. : https://jotelulu.com\\n// Submitted by Daniel Fariña <ingenieria@jotelulu.com>\\njotelulu.cloud\\n\\n// Joyent : https://www.joyent.com/\\n// Submitted by Brian Bennett <brian.bennett@joyent.com>\\n*.triton.zone\\n*.cns.joyent.com\\n\\n// JS.ORG : http://dns.js.org\\n// Submitted by Stefan Keim <admin@js.org>\\njs.org\\n\\n// KaasHosting : http://www.kaashosting.nl/\\n// Submitted by Wouter Bakker <hostmaster@kaashosting.nl>\\nkaas.gg\\nkhplay.nl\\n\\n// Kakao : https://www.kakaocorp.com/\\n// Submitted by JaeYoong Lee <cec@kakaocorp.com>\\nktistory.com\\n\\n// Kapsi : https://kapsi.fi\\n// Submitted by Tomi Juntunen <erani@kapsi.fi>\\nkapsi.fi\\n\\n// Keyweb AG : https://www.keyweb.de\\n// Submitted by Martin Dannehl <postmaster@keymachine.de>\\nkeymachine.de\\n\\n// KingHost : https://king.host\\n// Submitted by Felipe Keller Braz <felipebraz@kinghost.com.br>\\nkinghost.net\\nuni5.net\\n\\n// KnightPoint Systems, LLC : http://www.knightpoint.com/\\n// Submitted by Roy Keene <rkeene@knightpoint.com>\\nknightpoint.systems\\n\\n// KoobinEvent, SL: https://www.koobin.com\\n// Submitted by Iván Oliva <ivan.oliva@koobin.com>\\nkoobin.events\\n\\n// KUROKU LTD : https://kuroku.ltd/\\n// Submitted by DisposaBoy <security@oya.to>\\noya.to\\n\\n// Katholieke Universiteit Leuven: https://www.kuleuven.be\\n// Submitted by Abuse KU Leuven <abuse@kuleuven.be>\\nkuleuven.cloud\\nezproxy.kuleuven.be\\n\\n// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf\\nco.krd\\nedu.krd\\n\\n// Krellian Ltd. : https://krellian.com\\n// Submitted by Ben Francis <ben@krellian.com>\\nkrellian.net\\nwebthings.io\\n\\n// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de\\n// Submitted by Lars Laehn <info@lcube.de>\\ngit-repos.de\\nlcube-server.de\\nsvn-repos.de\\n\\n// Leadpages : https://www.leadpages.net\\n// Submitted by Greg Dallavalle <domains@leadpages.net>\\nleadpages.co\\nlpages.co\\nlpusercontent.com\\n\\n// Lelux.fi : https://lelux.fi/\\n// Submitted by Lelux Admin <publisuffix@lelux.site>\\nlelux.site\\n\\n// Lifetime Hosting : https://Lifetime.Hosting/\\n// Submitted by Mike Fillator <support@lifetime.hosting>\\nco.business\\nco.education\\nco.events\\nco.financial\\nco.network\\nco.place\\nco.technology\\n\\n// Lightmaker Property Manager, Inc. : https://app.lmpm.com/\\n// Submitted by Greg Holland <greg.holland@lmpm.com>\\napp.lmpm.com\\n\\n// linkyard ldt: https://www.linkyard.ch/\\n// Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch>\\nlinkyard.cloud\\nlinkyard-cloud.ch\\n\\n// Linode : https://linode.com\\n// Submitted by <security@linode.com>\\nmembers.linode.com\\n*.nodebalancer.linode.com\\n*.linodeobjects.com\\nip.linodeusercontent.com\\n\\n// LiquidNet Ltd : http://www.liquidnetlimited.com/\\n// Submitted by Victor Velchev <admin@liquidnetlimited.com>\\nwe.bs\\n\\n// Localcert : https://localcert.dev\\n// Submitted by Lann Martin <security@localcert.dev>\\n*.user.localcert.dev\\n\\n// localzone.xyz\\n// Submitted by Kenny Niehage <hello@yahe.sh>\\nlocalzone.xyz\\n\\n// Log\\'in Line : https://www.loginline.com/\\n// Submitted by Rémi Mach <remi.mach@loginline.com>\\nloginline.app\\nloginline.dev\\nloginline.io\\nloginline.services\\nloginline.site\\n\\n// Lokalized : https://lokalized.nl\\n// Submitted by Noah Taheij <noah@lokalized.nl>\\nservers.run\\n\\n// Lõhmus Family, The\\n// Submitted by Heiki Lõhmus <hostmaster at lohmus dot me>\\nlohmus.me\\n\\n// LubMAN UMCS Sp. z o.o : https://lubman.pl/\\n// Submitted by Ireneusz Maliszewski <ireneusz.maliszewski@lubman.pl>\\nkrasnik.pl\\nleczna.pl\\nlubartow.pl\\nlublin.pl\\nponiatowa.pl\\nswidnik.pl\\n\\n// Lug.org.uk : https://lug.org.uk\\n// Submitted by Jon Spriggs <admin@lug.org.uk>\\nglug.org.uk\\nlug.org.uk\\nlugs.org.uk\\n\\n// Lukanet Ltd : https://lukanet.com\\n// Submitted by Anton Avramov <register@lukanet.com>\\nbarsy.bg\\nbarsy.co.uk\\nbarsyonline.co.uk\\nbarsycenter.com\\nbarsyonline.com\\nbarsy.club\\nbarsy.de\\nbarsy.eu\\nbarsy.in\\nbarsy.info\\nbarsy.io\\nbarsy.me\\nbarsy.menu\\nbarsy.mobi\\nbarsy.net\\nbarsy.online\\nbarsy.org\\nbarsy.pro\\nbarsy.pub\\nbarsy.ro\\nbarsy.shop\\nbarsy.site\\nbarsy.support\\nbarsy.uk\\n\\n// Magento Commerce\\n// Submitted by Damien Tournoud <dtournoud@magento.cloud>\\n*.magentosite.cloud\\n\\n// May First - People Link : https://mayfirst.org/\\n// Submitted by Jamie McClelland <info@mayfirst.org>\\nmayfirst.info\\nmayfirst.org\\n\\n// Mail.Ru Group : https://hb.cldmail.ru\\n// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru>\\nhb.cldmail.ru\\n\\n// Mail Transfer Platform : https://www.neupeer.com\\n// Submitted by Li Hui <lihui@neupeer.com>\\ncn.vu\\n\\n// Maze Play: https://www.mazeplay.com\\n// Submitted by Adam Humpherys <adam@mws.dev>\\nmazeplay.com\\n\\n// mcpe.me : https://mcpe.me\\n// Submitted by Noa Heyl <hi@noa.dev>\\nmcpe.me\\n\\n// McHost : https://mchost.ru\\n// Submitted by Evgeniy Subbotin <e.subbotin@mchost.ru>\\nmcdir.me\\nmcdir.ru\\nmcpre.ru\\nvps.mcdir.ru\\n\\n// Mediatech : https://mediatech.by\\n// Submitted by Evgeniy Kozhuhovskiy <ugenk@mediatech.by>\\nmediatech.by\\nmediatech.dev\\n\\n// Medicom Health : https://medicomhealth.com\\n// Submitted by Michael Olson <molson@medicomhealth.com>\\nhra.health\\n\\n// Memset hosting : https://www.memset.com\\n// Submitted by Tom Whitwell <domains@memset.com>\\nminiserver.com\\nmemset.net\\n\\n// Messerli Informatik AG : https://www.messerli.ch/\\n// Submitted by Ruben Schmidmeister <psl-maintainers@messerli.ch>\\nmesserli.app\\n\\n// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/\\n// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz>\\n*.cloud.metacentrum.cz\\ncustom.metacentrum.cz\\n\\n// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/\\n// Submitted by Radim Janča <janca@cesnet.cz>\\nflt.cloud.muni.cz\\nusr.cloud.muni.cz\\n\\n// Meteor Development Group : https://www.meteor.com/hosting\\n// Submitted by Pierre Carrier <pierre@meteor.com>\\nmeteorapp.com\\neu.meteorapp.com\\n\\n// Michau Enterprises Limited : http://www.co.pl/\\nco.pl\\n\\n// Microsoft Corporation : http://microsoft.com\\n// Submitted by Public Suffix List Admin <msftpsladmin@microsoft.com>\\n*.azurecontainer.io\\nazurewebsites.net\\nazure-mobile.net\\ncloudapp.net\\nazurestaticapps.net\\n1.azurestaticapps.net\\n2.azurestaticapps.net\\n3.azurestaticapps.net\\ncentralus.azurestaticapps.net\\neastasia.azurestaticapps.net\\neastus2.azurestaticapps.net\\nwesteurope.azurestaticapps.net\\nwestus2.azurestaticapps.net\\n\\n// minion.systems : http://minion.systems\\n// Submitted by Robert Böttinger <r@minion.systems>\\ncsx.cc\\n\\n// Mintere : https://mintere.com/\\n// Submitted by Ben Aubin <security@mintere.com>\\nmintere.site\\n\\n// MobileEducation, LLC : https://joinforte.com\\n// Submitted by Grayson Martin <grayson.martin@mobileeducation.us>\\nforte.id\\n\\n// Mozilla Corporation : https://mozilla.com\\n// Submitted by Ben Francis <bfrancis@mozilla.com>\\nmozilla-iot.org\\n\\n// Mozilla Foundation : https://mozilla.org/\\n// Submitted by glob <glob@mozilla.com>\\nbmoattachments.org\\n\\n// MSK-IX : https://www.msk-ix.ru/\\n// Submitted by Khannanov Roman <r.khannanov@msk-ix.ru>\\nnet.ru\\norg.ru\\npp.ru\\n\\n// Mythic Beasts : https://www.mythic-beasts.com\\n// Submitted by Paul Cammish <kelduum@mythic-beasts.com>\\nhostedpi.com\\ncustomer.mythic-beasts.com\\ncaracal.mythic-beasts.com\\nfentiger.mythic-beasts.com\\nlynx.mythic-beasts.com\\nocelot.mythic-beasts.com\\noncilla.mythic-beasts.com\\nonza.mythic-beasts.com\\nsphinx.mythic-beasts.com\\nvs.mythic-beasts.com\\nx.mythic-beasts.com\\nyali.mythic-beasts.com\\ncust.retrosnub.co.uk\\n\\n// Nabu Casa : https://www.nabucasa.com\\n// Submitted by Paulus Schoutsen <infra@nabucasa.com>\\nui.nabu.casa\\n\\n// Net at Work Gmbh : https://www.netatwork.de\\n// Submitted by Jan Jaeschke <jan.jaeschke@netatwork.de>\\ncloud.nospamproxy.com\\n\\n// Netlify : https://www.netlify.com\\n// Submitted by Jessica Parsons <jessica@netlify.com>\\nnetlify.app\\n\\n// Neustar Inc.\\n// Submitted by Trung Tran <Trung.Tran@neustar.biz>\\n4u.com\\n\\n// ngrok : https://ngrok.com/\\n// Submitted by Alan Shreve <alan@ngrok.com>\\nngrok.app\\nngrok-free.app\\nngrok.dev\\nngrok-free.dev\\nngrok.io\\nap.ngrok.io\\nau.ngrok.io\\neu.ngrok.io\\nin.ngrok.io\\njp.ngrok.io\\nsa.ngrok.io\\nus.ngrok.io\\nngrok.pizza\\n\\n// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/\\n// Submitted by Nicholas Ford <nick@nimbushosting.co.uk>\\nnh-serv.co.uk\\n\\n// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/\\n// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net>\\nnfshost.com\\n\\n// Noop : https://noop.app\\n// Submitted by Nathaniel Schweinberg <noop@rearc.io>\\n*.developer.app\\nnoop.app\\n\\n// Northflank Ltd. : https://northflank.com/\\n// Submitted by Marco Suter <marco@northflank.com>\\n*.northflank.app\\n*.build.run\\n*.code.run\\n*.database.run\\n*.migration.run\\n\\n// Noticeable : https://noticeable.io\\n// Submitted by Laurent Pellegrino <security@noticeable.io>\\nnoticeable.news\\n\\n// Now-DNS : https://now-dns.com\\n// Submitted by Steve Russell <steve@now-dns.com>\\ndnsking.ch\\nmypi.co\\nn4t.co\\n001www.com\\nddnslive.com\\nmyiphost.com\\nforumz.info\\n16-b.it\\n32-b.it\\n64-b.it\\nsoundcast.me\\ntcp4.me\\ndnsup.net\\nhicam.net\\nnow-dns.net\\nownip.net\\nvpndns.net\\ndynserv.org\\nnow-dns.org\\nx443.pw\\nnow-dns.top\\nntdll.top\\nfreeddns.us\\ncrafting.xyz\\nzapto.xyz\\n\\n// nsupdate.info : https://www.nsupdate.info/\\n// Submitted by Thomas Waldmann <info@nsupdate.info>\\nnsupdate.info\\nnerdpol.ovh\\n\\n// No-IP.com : https://noip.com/\\n// Submitted by Deven Reza <publicsuffixlist@noip.com>\\nblogsyte.com\\nbrasilia.me\\ncable-modem.org\\nciscofreak.com\\ncollegefan.org\\ncouchpotatofries.org\\ndamnserver.com\\nddns.me\\nditchyourip.com\\ndnsfor.me\\ndnsiskinky.com\\ndvrcam.info\\ndynns.com\\neating-organic.net\\nfantasyleague.cc\\ngeekgalaxy.com\\ngolffan.us\\nhealth-carereform.com\\nhomesecuritymac.com\\nhomesecuritypc.com\\nhopto.me\\nilovecollege.info\\nloginto.me\\nmlbfan.org\\nmmafan.biz\\nmyactivedirectory.com\\nmydissent.net\\nmyeffect.net\\nmymediapc.net\\nmypsx.net\\nmysecuritycamera.com\\nmysecuritycamera.net\\nmysecuritycamera.org\\nnet-freaks.com\\nnflfan.org\\nnhlfan.net\\nno-ip.ca\\nno-ip.co.uk\\nno-ip.net\\nnoip.us\\nonthewifi.com\\npgafan.net\\npoint2this.com\\npointto.us\\nprivatizehealthinsurance.net\\nquicksytes.com\\nread-books.org\\nsecuritytactics.com\\nserveexchange.com\\nservehumour.com\\nservep2p.com\\nservesarcasm.com\\nstufftoread.com\\nufcfan.org\\nunusualperson.com\\nworkisboring.com\\n3utilities.com\\nbounceme.net\\nddns.net\\nddnsking.com\\ngotdns.ch\\nhopto.org\\nmyftp.biz\\nmyftp.org\\nmyvnc.com\\nno-ip.biz\\nno-ip.info\\nno-ip.org\\nnoip.me\\nredirectme.net\\nservebeer.com\\nserveblog.net\\nservecounterstrike.com\\nserveftp.com\\nservegame.com\\nservehalflife.com\\nservehttp.com\\nserveirc.com\\nserveminecraft.net\\nservemp3.com\\nservepics.com\\nservequake.com\\nsytes.net\\nwebhop.me\\nzapto.org\\n\\n// NodeArt : https://nodeart.io\\n// Submitted by Konstantin Nosov <Nosov@nodeart.io>\\nstage.nodeart.io\\n\\n// Nucleos Inc. : https://nucleos.com\\n// Submitted by Piotr Zduniak <piotr@nucleos.com>\\npcloud.host\\n\\n// NYC.mn : http://www.information.nyc.mn\\n// Submitted by Matthew Brown <mattbrown@nyc.mn>\\nnyc.mn\\n\\n// Observable, Inc. : https://observablehq.com\\n// Submitted by Mike Bostock <dns@observablehq.com>\\nstatic.observableusercontent.com\\n\\n// Octopodal Solutions, LLC. : https://ulterius.io/\\n// Submitted by Andrew Sampson <andrew@ulterius.io>\\ncya.gg\\n\\n// OMG.LOL : <https://omg.lol>\\n// Submitted by Adam Newbold <adam@omg.lol>\\nomg.lol\\n\\n// Omnibond Systems, LLC. : https://www.omnibond.com\\n// Submitted by Cole Estep <cole@omnibond.com>\\ncloudycluster.net\\n\\n// OmniWe Limited: https://omniwe.com\\n// Submitted by Vicary Archangel <vicary@omniwe.com>\\nomniwe.site\\n\\n// One.com: https://www.one.com/\\n// Submitted by Jacob Bunk Nielsen <jbn@one.com>\\n123hjemmeside.dk\\n123hjemmeside.no\\n123homepage.it\\n123kotisivu.fi\\n123minsida.se\\n123miweb.es\\n123paginaweb.pt\\n123sait.ru\\n123siteweb.fr\\n123webseite.at\\n123webseite.de\\n123website.be\\n123website.ch\\n123website.lu\\n123website.nl\\nservice.one\\nsimplesite.com\\nsimplesite.com.br\\nsimplesite.gr\\nsimplesite.pl\\n\\n// One Fold Media : http://www.onefoldmedia.com/\\n// Submitted by Eddie Jones <eddie@onefoldmedia.com>\\nnid.io\\n\\n// Open Social : https://www.getopensocial.com/\\n// Submitted by Alexander Varwijk <security@getopensocial.com>\\nopensocial.site\\n\\n// OpenCraft GmbH : http://opencraft.com/\\n// Submitted by Sven Marnach <sven@opencraft.com>\\nopencraft.hosting\\n\\n// OpenResearch GmbH: https://openresearch.com/\\n// Submitted by Philipp Schmid <ops@openresearch.com>\\norsites.com\\n\\n// Opera Software, A.S.A.\\n// Submitted by Yngve Pettersen <yngve@opera.com>\\noperaunite.com\\n\\n// Orange : https://www.orange.com\\n// Submitted by Alexandre Linte <alexandre.linte@orange.com>\\ntech.orange\\n\\n// Oursky Limited : https://authgear.com/, https://skygear.io/\\n// Submitted by Authgear Team <hello@authgear.com>, Skygear Developer <hello@skygear.io>\\nauthgear-staging.com\\nauthgearapps.com\\nskygearapp.com\\n\\n// OutSystems\\n// Submitted by Duarte Santos <domain-admin@outsystemscloud.com>\\noutsystemscloud.com\\n\\n// OVHcloud: https://ovhcloud.com\\n// Submitted by Vincent Cassé <vincent.casse@ovhcloud.com>\\n*.webpaas.ovh.net\\n*.hosting.ovh.net\\n\\n// OwnProvider GmbH: http://www.ownprovider.com\\n// Submitted by Jan Moennich <jan.moennich@ownprovider.com>\\nownprovider.com\\nown.pm\\n\\n// OwO : https://whats-th.is/\\n// Submitted by Dean Sheather <dean@deansheather.com>\\n*.owo.codes\\n\\n// OX : http://www.ox.rs\\n// Submitted by Adam Grand <webmaster@mail.ox.rs>\\nox.rs\\n\\n// oy.lc\\n// Submitted by Charly Coste <changaco@changaco.oy.lc>\\noy.lc\\n\\n// Pagefog : https://pagefog.com/\\n// Submitted by Derek Myers <derek@pagefog.com>\\npgfog.com\\n\\n// Pagefront : https://www.pagefronthq.com/\\n// Submitted by Jason Kriss <jason@pagefronthq.com>\\npagefrontapp.com\\n\\n// PageXL : https://pagexl.com\\n// Submitted by Yann Guichard <yann@pagexl.com>\\npagexl.com\\n\\n// Paywhirl, Inc : https://paywhirl.com/\\n// Submitted by Daniel Netzer <dan@paywhirl.com>\\n*.paywhirl.com\\n\\n// pcarrier.ca Software Inc: https://pcarrier.ca/\\n// Submitted by Pierre Carrier <pc@rrier.ca>\\nbar0.net\\nbar1.net\\nbar2.net\\nrdv.to\\n\\n// .pl domains (grandfathered)\\nart.pl\\ngliwice.pl\\nkrakow.pl\\npoznan.pl\\nwroc.pl\\nzakopane.pl\\n\\n// Pantheon Systems, Inc. : https://pantheon.io/\\n// Submitted by Gary Dylina <gary@pantheon.io>\\npantheonsite.io\\ngotpantheon.com\\n\\n// Peplink | Pepwave : http://peplink.com/\\n// Submitted by Steve Leung <steveleung@peplink.com>\\nmypep.link\\n\\n// Perspecta : https://perspecta.com/\\n// Submitted by Kenneth Van Alstyne <kvanalstyne@perspecta.com>\\nperspecta.cloud\\n\\n// PE Ulyanov Kirill Sergeevich : https://airy.host\\n// Submitted by Kirill Ulyanov <k.ulyanov@airy.host>\\nlk3.ru\\n\\n// Planet-Work : https://www.planet-work.com/\\n// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com>\\non-web.fr\\n\\n// Platform.sh : https://platform.sh\\n// Submitted by Nikola Kotur <nikola@platform.sh>\\nbc.platform.sh\\nent.platform.sh\\neu.platform.sh\\nus.platform.sh\\n*.platformsh.site\\n*.tst.site\\n\\n// Platter: https://platter.dev\\n// Submitted by Patrick Flor <patrick@platter.dev>\\nplatter-app.com\\nplatter-app.dev\\nplatterp.us\\n\\n// Plesk : https://www.plesk.com/\\n// Submitted by Anton Akhtyamov <program-managers@plesk.com>\\npdns.page\\nplesk.page\\npleskns.com\\n\\n// Port53 : https://port53.io/\\n// Submitted by Maximilian Schieder <maxi@zeug.co>\\ndyn53.io\\n\\n// Porter : https://porter.run/\\n// Submitted by Rudraksh MK <rudi@porter.run>\\nonporter.run\\n\\n// Positive Codes Technology Company : http://co.bn/faq.html\\n// Submitted by Zulfais <pc@co.bn>\\nco.bn\\n\\n// Postman, Inc : https://postman.com\\n// Submitted by Rahul Dhawan <security@postman.com>\\npostman-echo.com\\npstmn.io\\nmock.pstmn.io\\nhttpbin.org\\n\\n//prequalifyme.today : https://prequalifyme.today\\n//Submitted by DeepakTiwari deepak@ivylead.io\\nprequalifyme.today\\n\\n// prgmr.com : https://prgmr.com/\\n// Submitted by Sarah Newman <owner@prgmr.com>\\nxen.prgmr.com\\n\\n// priv.at : http://www.nic.priv.at/\\n// Submitted by registry <lendl@nic.at>\\npriv.at\\n\\n// privacytools.io : https://www.privacytools.io/\\n// Submitted by Jonah Aragon <jonah@privacytools.io>\\nprvcy.page\\n\\n// Protocol Labs : https://protocol.ai/\\n// Submitted by Michael Burns <noc@protocol.ai>\\n*.dweb.link\\n\\n// Protonet GmbH : http://protonet.io\\n// Submitted by Martin Meier <admin@protonet.io>\\nprotonet.io\\n\\n// Publication Presse Communication SARL : https://ppcom.fr\\n// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr>\\nchirurgiens-dentistes-en-france.fr\\nbyen.site\\n\\n// pubtls.org: https://www.pubtls.org\\n// Submitted by Kor Nielsen <kor@pubtls.org>\\npubtls.org\\n\\n// PythonAnywhere LLP: https://www.pythonanywhere.com\\n// Submitted by Giles Thomas <giles@pythonanywhere.com>\\npythonanywhere.com\\neu.pythonanywhere.com\\n\\n// QOTO, Org.\\n// Submitted by Jeffrey Phillips Freeman <jeffrey.freeman@qoto.org>\\nqoto.io\\n\\n// Qualifio : https://qualifio.com/\\n// Submitted by Xavier De Cock <xdecock@gmail.com>\\nqualifioapp.com\\n\\n// Quality Unit: https://qualityunit.com\\n// Submitted by Vasyl Tsalko <vtsalko@qualityunit.com>\\nladesk.com\\n\\n// QuickBackend: https://www.quickbackend.com\\n// Submitted by Dani Biro <dani@pymet.com>\\nqbuser.com\\n\\n// Rad Web Hosting: https://radwebhosting.com\\n// Submitted by Scott Claeys <s.claeys@radwebhosting.com>\\ncloudsite.builders\\n\\n// Redgate Software: https://red-gate.com\\n// Submitted by Andrew Farries <andrew.farries@red-gate.com>\\ninstances.spawn.cc\\n\\n// Redstar Consultants : https://www.redstarconsultants.com/\\n// Submitted by Jons Slemmer <jons@redstarconsultants.com>\\ninstantcloud.cn\\n\\n// Russian Academy of Sciences\\n// Submitted by Tech Support <support@rasnet.ru>\\nras.ru\\n\\n// QA2\\n// Submitted by Daniel Dent (https://www.danieldent.com/)\\nqa2.com\\n\\n// QCX\\n// Submitted by Cassandra Beelen <cassandra@beelen.one>\\nqcx.io\\n*.sys.qcx.io\\n\\n// QNAP System Inc : https://www.qnap.com\\n// Submitted by Nick Chang <nickchang@qnap.com>\\ndev-myqnapcloud.com\\nalpha-myqnapcloud.com\\nmyqnapcloud.com\\n\\n// Quip : https://quip.com\\n// Submitted by Patrick Linehan <plinehan@quip.com>\\n*.quipelements.com\\n\\n// Qutheory LLC : http://qutheory.io\\n// Submitted by Jonas Schwartz <jonas@qutheory.io>\\nvapor.cloud\\nvaporcloud.io\\n\\n// Rackmaze LLC : https://www.rackmaze.com\\n// Submitted by Kirill Pertsev <kika@rackmaze.com>\\nrackmaze.com\\nrackmaze.net\\n\\n// Rakuten Games, Inc : https://dev.viberplay.io\\n// Submitted by Joshua Zhang <public-suffix@rgames.jp>\\ng.vbrplsbx.io\\n\\n// Rancher Labs, Inc : https://rancher.com\\n// Submitted by Vincent Fiduccia <domains@rancher.com>\\n*.on-k3s.io\\n*.on-rancher.cloud\\n*.on-rio.io\\n\\n// Read The Docs, Inc : https://www.readthedocs.org\\n// Submitted by David Fischer <team@readthedocs.org>\\nreadthedocs.io\\n\\n// Red Hat, Inc. OpenShift : https://openshift.redhat.com/\\n// Submitted by Tim Kramer <tkramer@rhcloud.com>\\nrhcloud.com\\n\\n// Render : https://render.com\\n// Submitted by Anurag Goel <dev@render.com>\\napp.render.com\\nonrender.com\\n\\n// Repl.it : https://repl.it\\n// Submitted by Lincoln Bergeson <lincoln@replit.com>\\nfirewalledreplit.co\\nid.firewalledreplit.co\\nrepl.co\\nid.repl.co\\nrepl.run\\n\\n// Resin.io : https://resin.io\\n// Submitted by Tim Perry <tim@resin.io>\\nresindevice.io\\ndevices.resinstaging.io\\n\\n// RethinkDB : https://www.rethinkdb.com/\\n// Submitted by Chris Kastorff <info@rethinkdb.com>\\nhzc.io\\n\\n// Revitalised Limited : http://www.revitalised.co.uk\\n// Submitted by Jack Price <jack@revitalised.co.uk>\\nwellbeingzone.eu\\nwellbeingzone.co.uk\\n\\n// Rico Developments Limited : https://adimo.co\\n// Submitted by Colin Brown <hello@adimo.co>\\nadimo.co.uk\\n\\n// Riseup Networks : https://riseup.net\\n// Submitted by Micah Anderson <micah@riseup.net>\\nitcouldbewor.se\\n\\n// Rochester Institute of Technology : http://www.rit.edu/\\n// Submitted by Jennifer Herting <jchits@rit.edu>\\ngit-pages.rit.edu\\n\\n// Rocky Enterprise Software Foundation : https://resf.org\\n// Submitted by Neil Hanlon <neil@resf.org>\\nrocky.page\\n\\n// Rusnames Limited: http://rusnames.ru/\\n// Submitted by Sergey Zotov <admin@rusnames.ru>\\nбиз.рус\\nком.рус\\nкрым.рус\\nмир.рус\\nмск.рус\\nорг.рус\\nсамара.рус\\nсочи.рус\\nспб.рус\\nя.рус\\n\\n// SAKURA Internet Inc. : https://www.sakura.ad.jp/\\n// Submitted by Internet Service Department <rs-vendor-ml@sakura.ad.jp>\\n180r.com\\ndojin.com\\nsakuratan.com\\nsakuraweb.com\\nx0.com\\n2-d.jp\\nbona.jp\\ncrap.jp\\ndaynight.jp\\neek.jp\\nflop.jp\\nhalfmoon.jp\\njeez.jp\\nmatrix.jp\\nmimoza.jp\\nivory.ne.jp\\nmail-box.ne.jp\\nmints.ne.jp\\nmokuren.ne.jp\\nopal.ne.jp\\nsakura.ne.jp\\nsumomo.ne.jp\\ntopaz.ne.jp\\nnetgamers.jp\\nnyanta.jp\\no0o0.jp\\nrdy.jp\\nrgr.jp\\nrulez.jp\\ns3.isk01.sakurastorage.jp\\ns3.isk02.sakurastorage.jp\\nsaloon.jp\\nsblo.jp\\nskr.jp\\ntank.jp\\nuh-oh.jp\\nundo.jp\\nrs.webaccel.jp\\nuser.webaccel.jp\\nwebsozai.jp\\nxii.jp\\nsquares.net\\njpn.org\\nkirara.st\\nx0.to\\nfrom.tv\\nsakura.tv\\n\\n// Salesforce.com, Inc. https://salesforce.com/\\n// Submitted by Michael Biven <mbiven@salesforce.com>\\n*.builder.code.com\\n*.dev-builder.code.com\\n*.stg-builder.code.com\\n\\n// Sandstorm Development Group, Inc. : https://sandcats.io/\\n// Submitted by Asheesh Laroia <asheesh@sandstorm.io>\\nsandcats.io\\n\\n// SBE network solutions GmbH : https://www.sbe.de/\\n// Submitted by Norman Meilick <nm@sbe.de>\\nlogoip.de\\nlogoip.com\\n\\n// Scaleway : https://www.scaleway.com/\\n// Submitted by Rémy Léone <rleone@scaleway.com>\\nfr-par-1.baremetal.scw.cloud\\nfr-par-2.baremetal.scw.cloud\\nnl-ams-1.baremetal.scw.cloud\\nfnc.fr-par.scw.cloud\\nfunctions.fnc.fr-par.scw.cloud\\nk8s.fr-par.scw.cloud\\nnodes.k8s.fr-par.scw.cloud\\ns3.fr-par.scw.cloud\\ns3-website.fr-par.scw.cloud\\nwhm.fr-par.scw.cloud\\npriv.instances.scw.cloud\\npub.instances.scw.cloud\\nk8s.scw.cloud\\nk8s.nl-ams.scw.cloud\\nnodes.k8s.nl-ams.scw.cloud\\ns3.nl-ams.scw.cloud\\ns3-website.nl-ams.scw.cloud\\nwhm.nl-ams.scw.cloud\\nk8s.pl-waw.scw.cloud\\nnodes.k8s.pl-waw.scw.cloud\\ns3.pl-waw.scw.cloud\\ns3-website.pl-waw.scw.cloud\\nscalebook.scw.cloud\\nsmartlabeling.scw.cloud\\ndedibox.fr\\n\\n// schokokeks.org GbR : https://schokokeks.org/\\n// Submitted by Hanno Böck <hanno@schokokeks.org>\\nschokokeks.net\\n\\n// Scottish Government: https://www.gov.scot\\n// Submitted by Martin Ellis <martin.ellis@gov.scot>\\ngov.scot\\nservice.gov.scot\\n\\n// Scry Security : http://www.scrysec.com\\n// Submitted by Shante Adam <shante@skyhat.io>\\nscrysec.com\\n\\n// Securepoint GmbH : https://www.securepoint.de\\n// Submitted by Erik Anders <erik.anders@securepoint.de>\\nfirewall-gateway.com\\nfirewall-gateway.de\\nmy-gateway.de\\nmy-router.de\\nspdns.de\\nspdns.eu\\nfirewall-gateway.net\\nmy-firewall.org\\nmyfirewall.org\\nspdns.org\\n\\n// Seidat : https://www.seidat.com\\n// Submitted by Artem Kondratev <accounts@seidat.com>\\nseidat.net\\n\\n// Sellfy : https://sellfy.com\\n// Submitted by Yuriy Romadin <contact@sellfy.com>\\nsellfy.store\\n\\n// Senseering GmbH : https://www.senseering.de\\n// Submitted by Felix Mönckemeyer <f.moenckemeyer@senseering.de>\\nsenseering.net\\n\\n// Sendmsg: https://www.sendmsg.co.il\\n// Submitted by Assaf Stern <domains@comstar.co.il>\\nminisite.ms\\n\\n// Service Magnet : https://myservicemagnet.com\\n// Submitted by Dave Sanders <dave@myservicemagnet.com>\\nmagnet.page\\n\\n// Service Online LLC : http://drs.ua/\\n// Submitted by Serhii Bulakh <support@drs.ua>\\nbiz.ua\\nco.ua\\npp.ua\\n\\n// Shift Crypto AG : https://shiftcrypto.ch\\n// Submitted by alex <alex@shiftcrypto.ch>\\nshiftcrypto.dev\\nshiftcrypto.io\\n\\n// ShiftEdit : https://shiftedit.net/\\n// Submitted by Adam Jimenez <adam@shiftcreate.com>\\nshiftedit.io\\n\\n// Shopblocks : http://www.shopblocks.com/\\n// Submitted by Alex Bowers <alex@shopblocks.com>\\nmyshopblocks.com\\n\\n// Shopify : https://www.shopify.com\\n// Submitted by Alex Richter <alex.richter@shopify.com>\\nmyshopify.com\\n\\n// Shopit : https://www.shopitcommerce.com/\\n// Submitted by Craig McMahon <craig@shopitcommerce.com>\\nshopitsite.com\\n\\n// shopware AG : https://shopware.com\\n// Submitted by Jens Küper <cloud@shopware.com>\\nshopware.store\\n\\n// Siemens Mobility GmbH\\n// Submitted by Oliver Graebner <security@mo-siemens.io>\\nmo-siemens.io\\n\\n// SinaAppEngine : http://sae.sina.com.cn/\\n// Submitted by SinaAppEngine <saesupport@sinacloud.com>\\n1kapp.com\\nappchizi.com\\napplinzi.com\\nsinaapp.com\\nvipsinaapp.com\\n\\n// Siteleaf : https://www.siteleaf.com/\\n// Submitted by Skylar Challand <support@siteleaf.com>\\nsiteleaf.net\\n\\n// Skyhat : http://www.skyhat.io\\n// Submitted by Shante Adam <shante@skyhat.io>\\nbounty-full.com\\nalpha.bounty-full.com\\nbeta.bounty-full.com\\n\\n// Smallregistry by Promopixel SARL: https://www.smallregistry.net\\n// Former AFNIC\\'s SLDs \\n// Submitted by Jérôme Lipowicz <support@promopixel.com>\\naeroport.fr\\navocat.fr\\nchambagri.fr\\nchirurgiens-dentistes.fr\\nexperts-comptables.fr\\nmedecin.fr\\nnotaires.fr\\npharmacien.fr\\nport.fr\\nveterinaire.fr\\n\\n// Small Technology Foundation : https://small-tech.org\\n// Submitted by Aral Balkan <aral@small-tech.org>\\nsmall-web.org\\n\\n// Smoove.io : https://www.smoove.io/\\n// Submitted by Dan Kozak <dan@smoove.io>\\nvp4.me\\n\\n// Snowflake Inc : https://www.snowflake.com/\\n// Submitted by Faith Olapade <faith.olapade@snowflake.com>\\nsnowflake.app\\nprivatelink.snowflake.app\\nstreamlit.app\\nstreamlitapp.com\\n\\n// Snowplow Analytics : https://snowplowanalytics.com/\\n// Submitted by Ian Streeter <ian@snowplowanalytics.com>\\ntry-snowplow.com\\n\\n// SourceHut : https://sourcehut.org\\n// Submitted by Drew DeVault <sir@cmpwn.com>\\nsrht.site\\n\\n// Stackhero : https://www.stackhero.io\\n// Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io>\\nstackhero-network.com\\n\\n// Staclar : https://staclar.com\\n// Submitted by Q Misell <q@staclar.com>\\nmusician.io\\n// Submitted by Matthias Merkel <matthias.merkel@staclar.com>\\nnovecore.site\\n\\n// staticland : https://static.land\\n// Submitted by Seth Vincent <sethvincent@gmail.com>\\nstatic.land\\ndev.static.land\\nsites.static.land\\n\\n// Storebase : https://www.storebase.io\\n// Submitted by Tony Schirmer <tony@storebase.io>\\nstorebase.store\\n\\n// Strategic System Consulting (eApps Hosting): https://www.eapps.com/\\n// Submitted by Alex Oancea <aoancea@cloudscale365.com>\\nvps-host.net\\natl.jelastic.vps-host.net\\nnjs.jelastic.vps-host.net\\nric.jelastic.vps-host.net\\n\\n// Sony Interactive Entertainment LLC : https://sie.com/\\n// Submitted by David Coles <david.coles@sony.com>\\nplaystation-cloud.com\\n\\n// SourceLair PC : https://www.sourcelair.com\\n// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com>\\napps.lair.io\\n*.stolos.io\\n\\n// SpaceKit : https://www.spacekit.io/\\n// Submitted by Reza Akhavan <spacekit.io@gmail.com>\\nspacekit.io\\n\\n// SpeedPartner GmbH: https://www.speedpartner.de/\\n// Submitted by Stefan Neufeind <info@speedpartner.de>\\ncustomer.speedpartner.de\\n\\n// Spreadshop (sprd.net AG) : https://www.spreadshop.com/\\n// Submitted by Martin Breest <security@spreadshop.com>\\nmyspreadshop.at\\nmyspreadshop.com.au\\nmyspreadshop.be\\nmyspreadshop.ca\\nmyspreadshop.ch\\nmyspreadshop.com\\nmyspreadshop.de\\nmyspreadshop.dk\\nmyspreadshop.es\\nmyspreadshop.fi\\nmyspreadshop.fr\\nmyspreadshop.ie\\nmyspreadshop.it\\nmyspreadshop.net\\nmyspreadshop.nl\\nmyspreadshop.no\\nmyspreadshop.pl\\nmyspreadshop.se\\nmyspreadshop.co.uk\\n\\n// Standard Library : https://stdlib.com\\n// Submitted by Jacob Lee <jacob@stdlib.com>\\napi.stdlib.com\\n\\n// Storipress : https://storipress.com\\n// Submitted by Benno Liu <benno@storipress.com>\\nstoripress.app\\n\\n// Storj Labs Inc. : https://storj.io/\\n// Submitted by Philip Hutchins <hostmaster@storj.io>\\nstorj.farm\\n\\n// Studenten Net Twente : http://www.snt.utwente.nl/\\n// Submitted by Silke Hofstra <syscom@snt.utwente.nl>\\nutwente.io\\n\\n// Student-Run Computing Facility : https://www.srcf.net/\\n// Submitted by Edwin Balani <sysadmins@srcf.net>\\nsoc.srcf.net\\nuser.srcf.net\\n\\n// Sub 6 Limited: http://www.sub6.com\\n// Submitted by Dan Miller <dm@sub6.com>\\ntemp-dns.com\\n\\n// Supabase : https://supabase.io\\n// Submitted by Inian Parameshwaran <security@supabase.io>\\nsupabase.co\\nsupabase.in\\nsupabase.net\\nsu.paba.se\\n\\n// Symfony, SAS : https://symfony.com/\\n// Submitted by Fabien Potencier <fabien@symfony.com>\\n*.s5y.io\\n*.sensiosite.cloud\\n\\n// Syncloud : https://syncloud.org\\n// Submitted by Boris Rybalkin <syncloud@syncloud.it>\\nsyncloud.it\\n\\n// Synology, Inc. : https://www.synology.com/\\n// Submitted by Rony Weng <ronyweng@synology.com>\\ndscloud.biz\\ndirect.quickconnect.cn\\ndsmynas.com\\nfamilyds.com\\ndiskstation.me\\ndscloud.me\\ni234.me\\nmyds.me\\nsynology.me\\ndscloud.mobi\\ndsmynas.net\\nfamilyds.net\\ndsmynas.org\\nfamilyds.org\\nvpnplus.to\\ndirect.quickconnect.to\\n\\n// Tabit Technologies Ltd. : https://tabit.cloud/\\n// Submitted by Oren Agiv <oren@tabit.cloud>\\ntabitorder.co.il\\nmytabit.co.il\\nmytabit.com\\n\\n// TAIFUN Software AG : http://taifun-software.de\\n// Submitted by Bjoern Henke <dev-server@taifun-software.de>\\ntaifun-dns.de\\n\\n// Tailscale Inc. : https://www.tailscale.com\\n// Submitted by David Anderson <danderson@tailscale.com>\\nbeta.tailscale.net\\nts.net\\n\\n// TASK geographical domains (www.task.gda.pl/uslugi/dns)\\ngda.pl\\ngdansk.pl\\ngdynia.pl\\nmed.pl\\nsopot.pl\\n\\n// team.blue https://team.blue\\n// Submitted by Cedric Dubois <cedric.dubois@team.blue>\\nsite.tb-hosting.com\\n\\n// Teckids e.V. : https://www.teckids.org\\n// Submitted by Dominik George <dominik.george@teckids.org>\\nedugit.io\\ns3.teckids.org\\n\\n// Telebit : https://telebit.cloud\\n// Submitted by AJ ONeal <aj@telebit.cloud>\\ntelebit.app\\ntelebit.io\\n*.telebit.xyz\\n\\n// Thingdust AG : https://thingdust.com/\\n// Submitted by Adrian Imboden <adi@thingdust.com>\\n*.firenet.ch\\n*.svc.firenet.ch\\nreservd.com\\nthingdustdata.com\\ncust.dev.thingdust.io\\ncust.disrec.thingdust.io\\ncust.prod.thingdust.io\\ncust.testing.thingdust.io\\nreservd.dev.thingdust.io\\nreservd.disrec.thingdust.io\\nreservd.testing.thingdust.io\\n\\n// ticket i/O GmbH : https://ticket.io\\n// Submitted by Christian Franke <it@ticket.io>\\ntickets.io\\n\\n// Tlon.io : https://tlon.io\\n// Submitted by Mark Staarink <mark@tlon.io>\\narvo.network\\nazimuth.network\\ntlon.network\\n\\n// Tor Project, Inc. : https://torproject.org\\n// Submitted by Antoine Beaupré <anarcat@torproject.org\\ntorproject.net\\npages.torproject.net\\n\\n// TownNews.com : http://www.townnews.com\\n// Submitted by Dustin Ward <dward@townnews.com>\\nbloxcms.com\\ntownnews-staging.com\\n\\n// TrafficPlex GmbH : https://www.trafficplex.de/\\n// Submitted by Phillipp Röll <phillipp.roell@trafficplex.de>\\n12hp.at\\n2ix.at\\n4lima.at\\nlima-city.at\\n12hp.ch\\n2ix.ch\\n4lima.ch\\nlima-city.ch\\ntrafficplex.cloud\\nde.cool\\n12hp.de\\n2ix.de\\n4lima.de\\nlima-city.de\\n1337.pictures\\nclan.rip\\nlima-city.rocks\\nwebspace.rocks\\nlima.zone\\n\\n// TransIP : https://www.transip.nl\\n// Submitted by Rory Breuk <rbreuk@transip.nl>\\n*.transurl.be\\n*.transurl.eu\\n*.transurl.nl\\n\\n// TransIP: https://www.transip.nl\\n// Submitted by Cedric Dubois <cedric.dubois@team.blue>\\nsite.transip.me\\n\\n// TuxFamily : http://tuxfamily.org\\n// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org>\\ntuxfamily.org\\n\\n// TwoDNS : https://www.twodns.de/\\n// Submitted by TwoDNS-Support <support@two-dns.de>\\ndd-dns.de\\ndiskstation.eu\\ndiskstation.org\\ndray-dns.de\\ndraydns.de\\ndyn-vpn.de\\ndynvpn.de\\nmein-vigor.de\\nmy-vigor.de\\nmy-wan.de\\nsyno-ds.de\\nsynology-diskstation.de\\nsynology-ds.de\\n\\n// Typedream : https://typedream.com\\n// Submitted by Putri Karunia <putri@typedream.com>\\ntypedream.app\\n\\n// Typeform : https://www.typeform.com\\n// Submitted by Sergi Ferriz <sergi.ferriz@typeform.com>\\npro.typeform.com\\n\\n// Uberspace : https://uberspace.de\\n// Submitted by Moritz Werner <mwerner@jonaspasche.com>\\nuber.space\\n*.uberspace.de\\n\\n// UDR Limited : http://www.udr.hk.com\\n// Submitted by registry <hostmaster@udr.hk.com>\\nhk.com\\nhk.org\\nltd.hk\\ninc.hk\\n\\n// UK Intis Telecom LTD : https://it.com\\n// Submitted by ITComdomains <to@it.com>\\nit.com\\n\\n// UNIVERSAL DOMAIN REGISTRY : https://www.udr.org.yt/\\n// see also: whois -h whois.udr.org.yt help\\n// Submitted by Atanunu Igbunuroghene <publicsuffixlist@udr.org.yt>\\nname.pm\\nsch.tf\\nbiz.wf\\nsch.wf\\norg.yt\\n\\n// United Gameserver GmbH : https://united-gameserver.de\\n// Submitted by Stefan Schwarz <sysadm@united-gameserver.de>\\nvirtualuser.de\\nvirtual-user.de\\n\\n// Upli : https://upli.io\\n// Submitted by Lenny Bakkalian <lenny.bakkalian@gmail.com>\\nupli.io\\n\\n// urown.net : https://urown.net\\n// Submitted by Hostmaster <hostmaster@urown.net>\\nurown.cloud\\ndnsupdate.info\\n\\n// .US\\n// Submitted by Ed Moore <Ed.Moore@lib.de.us>\\nlib.de.us\\n\\n// VeryPositive SIA : http://very.lv\\n// Submitted by Danko Aleksejevs <danko@very.lv>\\n2038.io\\n\\n// Vercel, Inc : https://vercel.com/\\n// Submitted by Connor Davis <security@vercel.com>\\nvercel.app\\nvercel.dev\\nnow.sh\\n\\n// Viprinet Europe GmbH : http://www.viprinet.com\\n// Submitted by Simon Kissel <hostmaster@viprinet.com>\\nrouter.management\\n\\n// Virtual-Info : https://www.virtual-info.info/\\n// Submitted by Adnan RIHAN <hostmaster@v-info.info>\\nv-info.info\\n\\n// Voorloper.com: https://voorloper.com\\n// Submitted by Nathan van Bakel <info@voorloper.com>\\nvoorloper.cloud\\n\\n// Voxel.sh DNS : https://voxel.sh/dns/\\n// Submitted by Mia Rehlinger <dns@voxel.sh>\\nneko.am\\nnyaa.am\\nbe.ax\\ncat.ax\\nes.ax\\neu.ax\\ngg.ax\\nmc.ax\\nus.ax\\nxy.ax\\nnl.ci\\nxx.gl\\napp.gp\\nblog.gt\\nde.gt\\nto.gt\\nbe.gy\\ncc.hn\\nblog.kg\\nio.kg\\njp.kg\\ntv.kg\\nuk.kg\\nus.kg\\nde.ls\\nat.md\\nde.md\\njp.md\\nto.md\\nindie.porn\\nvxl.sh\\nch.tc\\nme.tc\\nwe.tc\\nnyan.to\\nat.vg\\nblog.vu\\ndev.vu\\nme.vu\\n\\n// V.UA Domain Administrator : https://domain.v.ua/\\n// Submitted by Serhii Rostilo <sergey@rostilo.kiev.ua>\\nv.ua\\n\\n// Vultr Objects : https://www.vultr.com/products/object-storage/\\n// Submitted by Niels Maumenee <storage@vultr.com>\\n*.vultrobjects.com\\n\\n// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com\\n// Submitted by Masayuki Note <masa@blade.wafflecell.com>\\nwafflecell.com\\n\\n// WebHare bv: https://www.webhare.com/\\n// Submitted by Arnold Hendriks <info@webhare.com>\\n*.webhare.dev\\n\\n// WebHotelier Technologies Ltd: https://www.webhotelier.net/\\n// Submitted by Apostolos Tsakpinis <apostolos.tsakpinis@gmail.com>\\nreserve-online.net\\nreserve-online.com\\nbookonline.app\\nhotelwithflight.com\\n\\n// WeDeploy by Liferay, Inc. : https://www.wedeploy.com\\n// Submitted by Henrique Vicente <security@wedeploy.com>\\nwedeploy.io\\nwedeploy.me\\nwedeploy.sh\\n\\n// Western Digital Technologies, Inc : https://www.wdc.com\\n// Submitted by Jung Jin <jungseok.jin@wdc.com>\\nremotewd.com\\n\\n// WIARD Enterprises : https://wiardweb.com\\n// Submitted by Kidd Hustle <kiddhustle@wiardweb.com>\\npages.wiardweb.com\\n\\n// Wikimedia Labs : https://wikitech.wikimedia.org\\n// Submitted by Arturo Borrero Gonzalez <aborrero@wikimedia.org>\\nwmflabs.org\\ntoolforge.org\\nwmcloud.org\\n\\n// WISP : https://wisp.gg\\n// Submitted by Stepan Fedotov <stepan@wisp.gg>\\npanel.gg\\ndaemon.panel.gg\\n\\n// Wizard Zines : https://wizardzines.com\\n// Submitted by Julia Evans <julia@wizardzines.com>\\nmesswithdns.com\\n\\n// WoltLab GmbH : https://www.woltlab.com\\n// Submitted by Tim Düsterhus <security@woltlab.cloud>\\nwoltlab-demo.com\\nmyforum.community\\ncommunity-pro.de\\ndiskussionsbereich.de\\ncommunity-pro.net\\nmeinforum.net\\n\\n// Woods Valldata : https://www.woodsvalldata.co.uk/\\n// Submitted by Chris Whittle <chris.whittle@woodsvalldata.co.uk>\\naffinitylottery.org.uk\\nraffleentry.org.uk\\nweeklylottery.org.uk\\n\\n// WP Engine : https://wpengine.com/\\n// Submitted by Michael Smith <michael.smith@wpengine.com>\\n// Submitted by Brandon DuRette <brandon.durette@wpengine.com>\\nwpenginepowered.com\\njs.wpenginepowered.com\\n\\n// Wix.com, Inc. : https://www.wix.com\\n// Submitted by Shahar Talmi <shahar@wix.com>\\nwixsite.com\\neditorx.io\\nwixstudio.io\\nwix.run\\n\\n// XenonCloud GbR: https://xenoncloud.net\\n// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net>\\nhalf.host\\n\\n// XnBay Technology : http://www.xnbay.com/\\n// Submitted by XnBay Developer <developer.xncloud@gmail.com>\\nxnbay.com\\nu2.xnbay.com\\nu2-local.xnbay.com\\n\\n// XS4ALL Internet bv : https://www.xs4all.nl/\\n// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net>\\ncistron.nl\\ndemon.nl\\nxs4all.space\\n\\n// Yandex.Cloud LLC: https://cloud.yandex.com\\n// Submitted by Alexander Lodin <security+psl@yandex-team.ru>\\nyandexcloud.net\\nstorage.yandexcloud.net\\nwebsite.yandexcloud.net\\n\\n// YesCourse Pty Ltd : https://yescourse.com\\n// Submitted by Atul Bhouraskar <atul@yescourse.com>\\nofficial.academy\\n\\n// Yola : https://www.yola.com/\\n// Submitted by Stefano Rivera <stefano@yola.com>\\nyolasite.com\\n\\n// Yombo : https://yombo.net\\n// Submitted by Mitch Schwenk <mitch@yombo.net>\\nybo.faith\\nyombo.me\\nhomelink.one\\nybo.party\\nybo.review\\nybo.science\\nybo.trade\\n\\n// Yunohost : https://yunohost.org\\n// Submitted by Valentin Grimaud <security@yunohost.org>\\nynh.fr\\nnohost.me\\nnoho.st\\n\\n// ZaNiC : http://www.za.net/\\n// Submitted by registry <hostmaster@nic.za.net>\\nza.net\\nza.org\\n\\n// Zine EOOD : https://zine.bg/\\n// Submitted by Martin Angelov <martin@zine.bg>\\nbss.design\\n\\n// Zitcom A/S : https://www.zitcom.dk\\n// Submitted by Emil Stahl <esp@zitcom.dk>\\nbasicserver.io\\nvirtualserver.io\\nenterprisecloud.nu\\n\\n// ===END PRIVATE DOMAINS===\\n'.split(\"\\n\").filter(n=>!n.startsWith(\"//\")&&n.trim().length>0).sort((n,e)=>e.length-n.length);async function Zn(n,e,t){let a=await $n(t.filenameTemplate,t,n,e)||\"\";a=a.trim(),t.replaceEmojisInFilename&&Jn.forEach(n=>a=Xn(a,n,\" _\"+Kn[n]+\"_ \"));const{filenameReplacementCharacter:o,filenameReplacedCharacters:i,filenameReplacementCharacters:r}=t;if(a=On(a,i,o,r),t.backgroundSave||(a=a.replace(/\\//g,o)),!t.keepFilename&&(\"bytes\"==t.filenameMaxLengthUnit&&Mn(a)>t.filenameMaxLength||a.length>t.filenameMaxLength)){const n=a.match(/(\\.[^.]{3,4})$/),e=n&&n[0]&&n[0].length>1?n[0]:\"\";a=\"bytes\"==t.filenameMaxLengthUnit?await te(a,t.filenameMaxLength-e.length):a.substring(0,t.filenameMaxLength-e.length),a=a+\"…\"+e}return a||(a=\"Unnamed page\"),a.startsWith(\".\")&&(a=\"Unnamed page\"+a),a.trim()}async function $n(n=\"\",e,t,a,o={}){const{dontReplaceSlash:i}=o;o.currentDate=new Date;const r=new Un(e.saveUrl||e.url),s=ne(r.href),l=Array.from(new Wn(r.search)),c=e.bookmarkFolders&&e.bookmarkFolders.join(\"/\")||\"\",m=void 0===i||i,h=Yn.find(n=>r.hostname.endsWith(\".\"+n)&&n),p=h?r.hostname.substring(0,r.hostname.length-h.length-1):r.hostname,u=p.lastIndexOf(\".\");let g=p.substring(0,-1==u?0:u);const w=p.substring(g.length?g.length+1:0),b=w+\".\"+h;g.startsWith(\"www.\")?g=g.substring(4):\"www\"==g&&(g=\"\");const f={\"navigator-language\":{getter:()=>Gn.language},\"page-title\":{getter:()=>e.title},\"page-heading\":{getter:()=>e.info.heading},\"page-language\":{getter:()=>e.info.lang},\"page-description\":{getter:()=>e.info.description},\"page-author\":{getter:()=>e.info.author},\"page-creator\":{getter:()=>e.info.creator},\"page-publisher\":{getter:()=>e.info.publisher},\"url-hash\":{getter:()=>r.hash.substring(1)},\"url-host\":{getter:()=>r.host.replace(/\\/$/,\"\")},\"url-hostname\":{getter:()=>r.hostname.replace(/\\/$/,\"\")},\"url-hostname-suffix\":{getter:()=>h},\"url-hostname-domain\":{getter:()=>w},\"url-hostname-root\":{getter:()=>b},\"url-hostname-subdomains\":{getter:()=>g},\"url-href\":{getter:()=>s,dontReplaceSlash:m},\"url-href-digest-sha-1\":{getter:s?async()=>Bn(\"SHA-1\",s):\"\"},\"url-href-flat\":{getter:()=>ne(r.href),dontReplaceSlash:!1},\"url-referrer\":{getter:()=>ne(e.referrer),dontReplaceSlash:m},\"url-referrer-flat\":{getter:()=>ne(e.referrer),dontReplaceSlash:!1},\"url-password\":{getter:()=>r.password},\"url-pathname\":{getter:()=>ne(r.pathname).replace(/^\\//,\"\").replace(/\\/$/,\"\"),dontReplaceSlash:m},\"url-pathname-flat\":{getter:()=>ne(r.pathname),dontReplaceSlash:!1},\"url-port\":{getter:()=>r.port},\"url-protocol\":{getter:()=>r.protocol},\"url-search\":{getter:()=>r.search.substring(1)},\"url-username\":{getter:()=>r.username},\"url-original\":{getter:()=>e.originalUrl},\"tab-id\":{getter:()=>String(e.tabId)},\"tab-index\":{getter:()=>String(e.tabIndex)},\"url-last-segment\":{getter:()=>ne(ee(r,e.filenameReplacementCharacter))},\"url-filename\":{getter:()=>{const n=r.pathname,e=n.split(\"/\");if(n.endsWith(\"/\"))return\"\";return ne(e[e.length-1])},dontReplaceSlash:m},\"bookmark-pathname\":{getter:()=>c,dontReplaceSlash:m},\"bookmark-pathname-flat\":{getter:()=>c,dontReplaceSlash:!1},\"profile-name\":{getter:()=>e.profileName},\"filename-extension\":{getter:()=>function(n){return n.compressContent?n.selfExtractingArchive?n.extractDataFromPage?\"u.zip.html\":\"zip.html\":\"zip\":\"html\"}(e)},\"save-action\":{getter:()=>e.selected?\"selection\":\"page\"},\"options-json\":{getter:()=>JSON.stringify(ae(e))},\"options-text\":{getter:()=>function(n){const e=[];for(const t in n){const a=n[t];\"function\"!=typeof a&&null!=a&&\"\"!==a&&e.push(t+\": \"+JSON.stringify(a))}return e.join(\"\\n\")}(ae(e))}};t&&(f[\"digest-sha-256\"]={getter:async()=>Bn(\"SHA-256\",t)},f[\"digest-sha-384\"]={getter:async()=>Bn(\"SHA-384\",t)},f[\"digest-sha-512\"]={getter:async()=>Bn(\"SHA-512\",t)}),e.saveDate&&v(e.saveDate),e.visitDate&&v(e.visitDate,\"visit-\");const k={\"if-empty\":(...n)=>{const e=n.pop(),t=n.find(n=>n);return t||e},\"if-not-empty\":(...n)=>{const e=n.pop(),t=n.find(n=>n);return t?e:t},\"if-equals\":(n,e,t,a)=>n==e?t:a,\"if-not-equals\":(n,e,t,a)=>n!=e?t:a,\"if-contains\":(n,e,t,a)=>e&&n.includes(e)?t:a,\"if-not-contains\":(n,e,t,a)=>e&&!n.includes(e)?t:a,substring:(n,e,t)=>n.substring(e,t),lowercase:n=>n.toLowerCase(),uppercase:n=>n.toUpperCase(),capitalize:n=>n.charAt(0).toUpperCase()+n.slice(1),replace:(n,e,t)=>e&&t?Xn(n,e,t):n,trim:n=>n.trim(),\"trim-left\":n=>n.trimLeft(),\"trim-right\":n=>n.trimRight(),\"pad-left\":(n,e,t)=>e>0?n.padStart(e,t):n,\"pad-right\":(n,e,t)=>e>0?n.padEnd(e,t):n,repeat:(n,e)=>e>0?n.repeat(e):\"\",\"index-of\":(n,e,t)=>n.indexOf(e,t),\"last-index-of\":(n,e,t)=>n.lastIndexOf(e,t),length:n=>n.length,\"url-search-name\":(n=0)=>l[n]&&l[n][0],\"url-search-value\":(n=0)=>l[n]&&l[n][1],\"url-search-named-value\":n=>{const e=l.find(e=>e[0]==n);return e&&e[1]},\"url-search\":n=>{const e=l.find(e=>e[0]==n);return e&&e[1]},\"url-segment\":(n=0)=>{const t=ne(r.pathname).split(\"/\");return t.pop(),t.push(ee(r,e.filenameReplacementCharacter)),t[n]},\"url-hostname-subdomain\":(n=0)=>{const e=g.split(\".\");return e[e.length-n-1]},stringify:n=>{try{return JSON.stringify(n)}catch(e){return n}},\"encode-base64\":n=>function(n){const e=Array.from(n,n=>String.fromCodePoint(n)).join(\"\");return btoa(e)}((new TextEncoder).encode(n)),\"decode-base64\":n=>{try{const e=function(n){const e=atob(n);return Uint8Array.from(e,n=>n.codePointAt(0))}(n);return new TextDecoder(\"utf-8\").decode(e)}catch(e){return n}},\"encode-uri\":n=>{try{return encodeURI(n)}catch(e){return n}},\"decode-uri\":n=>{try{return decodeURI(n)}catch(e){return n}},\"encode-uri-component\":n=>{try{return encodeURIComponent(n)}catch(e){return n}},\"decode-uri-component\":n=>{try{return decodeURIComponent(n)}catch(e){return n}},\"date-locale\":n=>o.currentDate.toLocaleDateString(n),\"time-locale\":n=>o.currentDate.toLocaleTimeString(n),\"datetime-locale\":n=>o.currentDate.toLocaleString(n),\"datetime-custom\":(n,e,t,a,i,r,s,l,c,m,d,h,p,u,g)=>{const w=o.currentDate,b={};return f(b,\"year\",e),f(b,\"month\",t),f(b,\"day\",a),f(b,\"weekday\",i),f(b,\"hour\",r),f(b,\"minute\",s),f(b,\"second\",l),f(b,\"hour12\",c),b.hour12=\"true\"==c,f(b,\"timeZone\",m),f(b,\"fractionalSecondDigits\",d),f(b,\"timeZoneName\",h),f(b,\"dayPeriod\",p),f(b,\"era\",u),f(b,\"localeMatcher\",g),new Hn.DateTimeFormat(n,b).format(w);function f(n,e,t){\" \"==t?n[e]=void 0:t&&(n[e]=t)}},\"option-value\":n=>{const t=ae(e)[n];return null==t?\"\":JSON.stringify(t)}};k[\"date-locale\"].dontReplaceSlash=!0,k[\"time-locale\"].dontReplaceSlash=!0,k[\"datetime-locale\"].dontReplaceSlash=!0,k[\"datetime-custom\"].dontReplaceSlash=!0,a&&(k[\"page-element-text\"]=n=>{const e=a.querySelector(n);return e&&e.textContent},k[\"page-element-attribute\"]=(n,e)=>{const t=a.querySelector(n);return t&&t.getAttribute(e)}),n=Xn(n,\"\\\\%\",\"\\\\\\\\%\"),n=Xn(n,\"\\\\{\",\"\\\\\\\\{\"),n=Xn(n,\"\\\\|\",\"\\\\\\\\|\"),n=Xn(n,\"\\\\>\",\"\\\\\\\\>\");let y=await d(n,{async callFunction(n,[t,a],o){const i=k[n];if(!i)return\"\";if(t=t.replace(/\\\\\\\\(.)/g,\"$1\"),a||(a=[]),a=a.map(n=>n.replace(/\\\\\\\\(.)/g,\"$1\")).filter(n=>null!=n&&null!=n).map(n=>\"\"==n?void 0:n),!(null!=t&&null!=t&&\"\"!=t||a.length>0))return\"\";try{const n=void 0===i.dontReplaceSlash||i.dontReplaceSlash;return await Qn(()=>i(t,...a),n,e.filenameReplacementCharacter,o)}catch(n){return\"\"}},getVariableValue(n,t){const a=f[n];return a?Qn(a.getter,a.dontReplaceSlash,e.filenameReplacementCharacter,t):\"\"}});return y=Xn(y,\"\\\\\\\\%\",\"%\"),y=Xn(y,\"\\\\\\\\{\",\"{\"),y=Xn(y,\"\\\\\\\\|\",\"|\"),y=Xn(y,\"\\\\\\\\>\",\">\"),y;function v(n,e=\"\"){f[e+\"datetime-iso\"]={getter:()=>n.toISOString()},f[e+\"date-iso\"]={getter:()=>n.toISOString().split(\"T\")[0]},f[e+\"time-iso\"]={getter:()=>n.toISOString().split(\"T\")[1].split(\"Z\")[0]},f[e+\"date-locale\"]={getter:()=>n.toLocaleDateString()},f[e+\"time-locale\"]={getter:()=>n.toLocaleTimeString()},f[e+\"day-locale\"]={getter:()=>String(n.getDate()).padStart(2,\"0\")},f[e+\"month-locale\"]={getter:()=>String(n.getMonth()+1).padStart(2,\"0\")},f[e+\"year-locale\"]={getter:()=>String(n.getFullYear())},f[e+\"datetime-locale\"]={getter:()=>n.toLocaleString()},f[e+\"datetime-utc\"]={getter:()=>n.toUTCString()},f[e+\"day-utc\"]={getter:()=>String(n.getUTCDate()).padStart(2,\"0\")},f[e+\"month-utc\"]={getter:()=>String(n.getUTCMonth()+1).padStart(2,\"0\")},f[e+\"year-utc\"]={getter:()=>String(n.getUTCFullYear())},f[e+\"hours-locale\"]={getter:()=>String(n.getHours()).padStart(2,\"0\")},f[e+\"minutes-locale\"]={getter:()=>String(n.getMinutes()).padStart(2,\"0\")},f[e+\"seconds-locale\"]={getter:()=>String(n.getSeconds()).padStart(2,\"0\")},f[e+\"hours-utc\"]={getter:()=>String(n.getUTCHours()).padStart(2,\"0\")},f[e+\"minutes-utc\"]={getter:()=>String(n.getUTCMinutes()).padStart(2,\"0\")},f[e+\"seconds-utc\"]={getter:()=>String(n.getUTCSeconds()).padStart(2,\"0\")},f[e+\"time-ms\"]={getter:()=>String(n.getTime())}}}function Xn(n,e,t){if(\"function\"==typeof n.replaceAll)return n.replaceAll(e,t);{const a=new RegExp(e.replace(Vn,\"\\\\$1\"),\"g\");return n.replace(a,t)}}async function Qn(n,e,t,a){const{maxLength:o,maxCharLength:i}=function(n){if(n){const{unit:e,length:t}=n;let a,o;return\"char\"==e?o=t:a=t,{maxLength:a,maxCharLength:o}}return{}}(a);let r=await n()||\"\";return e||(r=r.replace(/\\/+/g,t)),o?r=await te(r,o):i&&(r=r.substring(0,i)),r}function ne(n){try{return decodeURI(n)}catch(e){return n}}function ee(n,e){let t=n.pathname.match(/\\/([^/]+)$/),a=t&&t[0];return a||(t=n.href.match(/([^/]+)\\/?$/),a=t&&t[0]),a||(t=a.match(/(.*)\\.[^.]+$/),a=t&&t[0]),a||(a=n.hostname.replace(/\\/+/g,e).replace(/\\/$/,\"\")),t=a.match(/(.*)\\.[^.]+$/),t&&t[1]&&(a=t[1]),a=a.replace(/\\/$/,\"\").replace(/^\\//,\"\"),a}function te(n,e){const t=new Fn([n]),a=new qn;return a.readAsText(t.slice(0,e)),new Promise((t,o)=>{a.addEventListener(\"load\",()=>{n.startsWith(a.result)?t(a.result):te(n,e-1).then(t).catch(o)},!1),a.addEventListener(\"error\",o,!1)})}function ae(n){const e=Object.assign({},n);return delete e.content,delete e.usedFonts,delete e.extensionScriptFiles,delete e.taskId,delete e.updatedResources,delete e.visitDate,delete e.keepFilename,delete e.insertCanonicalLink,delete e.frames,delete e.win,delete e.doc,delete e.url,delete e.resourceReferrer,delete e.baseURI,delete e.rootDocument,delete e.fontTests,delete e.canvases,delete e.fonts,delete e.worklets,delete e.stylesheets,delete e.images,delete e.posters,delete e.videos,delete e.shadowRoots,delete e.referrer,delete e.adoptedStyleSheets,delete e.tabId,delete e.tabIndex,delete e.saveDate,delete e.saveUrl,delete e.title,delete e.info,e}const{Array:oe,Object:ie,String:re,Number:se,BigInt:le,Math:ce,Date:me,Map:de,Set:he,Response:pe,URL:ue,Error:ge,Uint8Array:we,Uint16Array:be,Uint32Array:fe,DataView:ke,Blob:ye,Promise:ve,TextEncoder:je,TextDecoder:Se,crypto:xe,btoa:Ce,TransformStream:ze,ReadableStream:Le,WritableStream:Ae,CompressionStream:Te,DecompressionStream:Ie,navigator:Re,Worker:Ee}=globalThis,De=4294967295,Me=65535,Be=67324752,Ne=134695760,Pe=Ne,Oe=33639248,_e=101010256,Fe=101075792,qe=117853008,Ue=22,He=39169,We=21589,Ge=6534,Ve=2048,Ke=\"/\",Je=new me(2107,11,31),Ye=new me(1980,0,1),Ze=void 0,$e=\"undefined\",Xe=\"function\";class Qe{constructor(n){return class extends ze{constructor(e,t){const a=new n(t);super({transform(n,e){e.enqueue(a.append(n))},flush(n){const e=a.flush();e&&n.enqueue(e)}})}}}}let nt=2;try{typeof Re!=$e&&Re.hardwareConcurrency&&(nt=Re.hardwareConcurrency)}catch(n){}const et={chunkSize:524288,maxWorkers:nt,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,workerScripts:Ze,CompressionStreamNative:typeof Te!=$e&&Te,DecompressionStreamNative:typeof Ie!=$e&&Ie},tt=ie.assign({},et);function at(){return tt}function ot(n){return ce.max(n.chunkSize,64)}function it(n){const{baseURL:e,chunkSize:t,maxWorkers:a,terminateWorkerTimeout:o,useCompressionStream:i,useWebWorkers:r,Deflate:s,Inflate:l,CompressionStream:c,DecompressionStream:m,workerScripts:d}=n;if(rt(\"baseURL\",e),rt(\"chunkSize\",t),rt(\"maxWorkers\",a),rt(\"terminateWorkerTimeout\",o),rt(\"useCompressionStream\",i),rt(\"useWebWorkers\",r),s&&(tt.CompressionStream=new Qe(s)),l&&(tt.DecompressionStream=new Qe(l)),rt(\"CompressionStream\",c),rt(\"DecompressionStream\",m),d!==Ze){const{deflate:n,inflate:e}=d;if((n||e)&&(tt.workerScripts||(tt.workerScripts={})),n){if(!oe.isArray(n))throw new ge(\"workerScripts.deflate must be an array\");tt.workerScripts.deflate=n}if(e){if(!oe.isArray(e))throw new ge(\"workerScripts.inflate must be an array\");tt.workerScripts.inflate=e}}}function rt(n,e){e!==Ze&&(tt[n]=e)}function st(n,e,t){return class{constructor(a){const o=this;var i,r;i=a,r=\"level\",(typeof ie.hasOwn===Xe?ie.hasOwn(i,r):i.hasOwnProperty(r))&&a.level===Ze&&delete a.level,o.codec=new n(ie.assign({},e,a)),t(o.codec,n=>{if(o.pendingData){const e=o.pendingData;o.pendingData=new we(e.length+n.length);const{pendingData:t}=o;t.set(e,0),t.set(n,e.length)}else o.pendingData=new we(n)})}append(n){return this.codec.push(n),a(this)}flush(){return this.codec.push(new we,!0),a(this)}};function a(n){if(n.pendingData){const e=n.pendingData;return n.pendingData=null,e}return new we}}const lt=[];for(let n=0;n<256;n++){let e=n;for(let n=0;n<8;n++)1&e?e=e>>>1^3988292384:e>>>=1;lt[n]=e}class ct{constructor(n){this.crc=n||-1}append(n){let e=0|this.crc;for(let t=0,a=0|n.length;t<a;t++)e=e>>>8^lt[255&(e^n[t])];this.crc=e}get(){return~this.crc}}class mt extends ze{constructor(){let n;const e=new ct;super({transform(n,t){e.append(n),t.enqueue(n)},flush(){const t=new we(4);new ke(t.buffer).setUint32(0,e.get()),n.value=t}}),n=this}}function dt(n){if(typeof je==$e){n=unescape(encodeURIComponent(n));const e=new we(n.length);for(let t=0;t<e.length;t++)e[t]=n.charCodeAt(t);return e}return(new je).encode(n)}const ht={concat(n,e){if(0===n.length||0===e.length)return n.concat(e);const t=n[n.length-1],a=ht.getPartial(t);return 32===a?n.concat(e):ht._shiftRight(e,a,0|t,n.slice(0,n.length-1))},bitLength(n){const e=n.length;if(0===e)return 0;const t=n[e-1];return 32*(e-1)+ht.getPartial(t)},clamp(n,e){if(32*n.length<e)return n;const t=(n=n.slice(0,ce.ceil(e/32))).length;return e&=31,t>0&&e&&(n[t-1]=ht.partial(e,n[t-1]&2147483648>>e-1,1)),n},partial:(n,e,t)=>32===n?e:(t?0|e:e<<32-n)+1099511627776*n,getPartial:n=>ce.round(n/1099511627776)||32,_shiftRight(n,e,t,a){for(void 0===a&&(a=[]);e>=32;e-=32)a.push(t),t=0;if(0===e)return a.concat(n);for(let o=0;o<n.length;o++)a.push(t|n[o]>>>e),t=n[o]<<32-e;const o=n.length?n[n.length-1]:0,i=ht.getPartial(o);return a.push(ht.partial(e+i&31,e+i>32?t:a.pop(),1)),a}},pt={bytes:{fromBits(n){const e=ht.bitLength(n)/8,t=new we(e);let a;for(let o=0;o<e;o++)3&o||(a=n[o/4]),t[o]=a>>>24,a<<=8;return t},toBits(n){const e=[];let t,a=0;for(t=0;t<n.length;t++)a=a<<8|n[t],3&~t||(e.push(a),a=0);return 3&t&&e.push(ht.partial(8*(3&t),a)),e}}},ut={sha1:class{constructor(n){const e=this;e.blockSize=512,e._init=[1732584193,4023233417,2562383102,271733878,3285377520],e._key=[1518500249,1859775393,2400959708,3395469782],n?(e._h=n._h.slice(0),e._buffer=n._buffer.slice(0),e._length=n._length):e.reset()}reset(){const n=this;return n._h=n._init.slice(0),n._buffer=[],n._length=0,n}update(n){const e=this;\"string\"==typeof n&&(n=pt.utf8String.toBits(n));const t=e._buffer=ht.concat(e._buffer,n),a=e._length,o=e._length=a+ht.bitLength(n);if(o>9007199254740991)throw new ge(\"Cannot hash more than 2^53 - 1 bits\");const i=new fe(t);let r=0;for(let n=e.blockSize+a-(e.blockSize+a&e.blockSize-1);n<=o;n+=e.blockSize)e._block(i.subarray(16*r,16*(r+1))),r+=1;return t.splice(0,16*r),e}finalize(){const n=this;let e=n._buffer;const t=n._h;e=ht.concat(e,[ht.partial(1,1)]);for(let n=e.length+2;15&n;n++)e.push(0);for(e.push(ce.floor(n._length/4294967296)),e.push(0|n._length);e.length;)n._block(e.splice(0,16));return n.reset(),t}_f(n,e,t,a){return n<=19?e&t|~e&a:n<=39?e^t^a:n<=59?e&t|e&a|t&a:n<=79?e^t^a:void 0}_S(n,e){return e<<n|e>>>32-n}_block(n){const e=this,t=e._h,a=oe(80);for(let e=0;e<16;e++)a[e]=n[e];let o=t[0],i=t[1],r=t[2],s=t[3],l=t[4];for(let n=0;n<=79;n++){n>=16&&(a[n]=e._S(1,a[n-3]^a[n-8]^a[n-14]^a[n-16]));const t=e._S(5,o)+e._f(n,i,r,s)+l+a[n]+e._key[ce.floor(n/20)]|0;l=s,s=r,r=e._S(30,i),i=o,o=t}t[0]=t[0]+o|0,t[1]=t[1]+i|0,t[2]=t[2]+r|0,t[3]=t[3]+s|0,t[4]=t[4]+l|0}}},gt={aes:class{constructor(n){const e=this;e._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],e._tables[0][0][0]||e._precompute();const t=e._tables[0][4],a=e._tables[1],o=n.length;let i,r,s,l=1;if(4!==o&&6!==o&&8!==o)throw new ge(\"invalid aes key size\");for(e._key=[r=n.slice(0),s=[]],i=o;i<4*o+28;i++){let n=r[i-1];(i%o===0||8===o&&i%o===4)&&(n=t[n>>>24]<<24^t[n>>16&255]<<16^t[n>>8&255]<<8^t[255&n],i%o===0&&(n=n<<8^n>>>24^l<<24,l=l<<1^283*(l>>7))),r[i]=r[i-o]^n}for(let n=0;i;n++,i--){const e=r[3&n?i:i-4];s[n]=i<=4||n<4?e:a[0][t[e>>>24]]^a[1][t[e>>16&255]]^a[2][t[e>>8&255]]^a[3][t[255&e]]}}encrypt(n){return this._crypt(n,0)}decrypt(n){return this._crypt(n,1)}_precompute(){const n=this._tables[0],e=this._tables[1],t=n[4],a=e[4],o=[],i=[];let r,s,l,c;for(let n=0;n<256;n++)i[(o[n]=n<<1^283*(n>>7))^n]=n;for(let m=r=0;!t[m];m^=s||1,r=i[r]||1){let i=r^r<<1^r<<2^r<<3^r<<4;i=i>>8^255&i^99,t[m]=i,a[i]=m,c=o[l=o[s=o[m]]];let d=16843009*c^65537*l^257*s^16843008*m,h=257*o[i]^16843008*i;for(let t=0;t<4;t++)n[t][m]=h=h<<24^h>>>8,e[t][i]=d=d<<24^d>>>8}for(let t=0;t<5;t++)n[t]=n[t].slice(0),e[t]=e[t].slice(0)}_crypt(n,e){if(4!==n.length)throw new ge(\"invalid aes block size\");const t=this._key[e],a=t.length/4-2,o=[0,0,0,0],i=this._tables[e],r=i[0],s=i[1],l=i[2],c=i[3],m=i[4];let d,h,p,u=n[0]^t[0],g=n[e?3:1]^t[1],w=n[2]^t[2],b=n[e?1:3]^t[3],f=4;for(let n=0;n<a;n++)d=r[u>>>24]^s[g>>16&255]^l[w>>8&255]^c[255&b]^t[f],h=r[g>>>24]^s[w>>16&255]^l[b>>8&255]^c[255&u]^t[f+1],p=r[w>>>24]^s[b>>16&255]^l[u>>8&255]^c[255&g]^t[f+2],b=r[b>>>24]^s[u>>16&255]^l[g>>8&255]^c[255&w]^t[f+3],f+=4,u=d,g=h,w=p;for(let n=0;n<4;n++)o[e?3&-n:n]=m[u>>>24]<<24^m[g>>16&255]<<16^m[w>>8&255]<<8^m[255&b]^t[f++],d=u,u=g,g=w,w=b,b=d;return o}}},wt={getRandomValues(n){const e=new fe(n.buffer),t=n=>{let e=987654321;const t=4294967295;return function(){e=36969*(65535&e)+(e>>16)&t;return(((e<<16)+(n=18e3*(65535&n)+(n>>16)&t)&t)/4294967296+.5)*(ce.random()>.5?1:-1)}};for(let a,o=0;o<n.length;o+=4){const n=t(4294967296*(a||ce.random()));a=987654071*n(),e[o/4]=4294967296*n()|0}return n}},bt={ctrGladman:class{constructor(n,e){this._prf=n,this._initIv=e,this._iv=e}reset(){this._iv=this._initIv}update(n){return this.calculate(this._prf,n,this._iv)}incWord(n){if(255&~(n>>24))n+=1<<24;else{let e=n>>16&255,t=n>>8&255,a=255&n;255===e?(e=0,255===t?(t=0,255===a?a=0:++a):++t):++e,n=0,n+=e<<16,n+=t<<8,n+=a}return n}incCounter(n){0===(n[0]=this.incWord(n[0]))&&(n[1]=this.incWord(n[1]))}calculate(n,e,t){let a;if(!(a=e.length))return[];const o=ht.bitLength(e);for(let o=0;o<a;o+=4){this.incCounter(t);const a=n.encrypt(t);e[o]^=a[0],e[o+1]^=a[1],e[o+2]^=a[2],e[o+3]^=a[3]}return ht.clamp(e,o)}}},ft={importKey:n=>new ft.hmacSha1(pt.bytes.toBits(n)),pbkdf2(n,e,t,a){if(t=t||1e4,a<0||t<0)throw new ge(\"invalid params to pbkdf2\");const o=1+(a>>5)<<2;let i,r,s,l,c;const m=new ArrayBuffer(o),d=new ke(m);let h=0;const p=ht;for(e=pt.bytes.toBits(e),c=1;h<(o||1);c++){for(i=r=n.encrypt(p.concat(e,[c])),s=1;s<t;s++)for(r=n.encrypt(r),l=0;l<r.length;l++)i[l]^=r[l];for(s=0;h<(o||1)&&s<i.length;s++)d.setInt32(h,i[s]),h+=4}return m.slice(0,a/8)},hmacSha1:class{constructor(n){const e=this,t=e._hash=ut.sha1,a=[[],[]];e._baseHash=[new t,new t];const o=e._baseHash[0].blockSize/32;n.length>o&&(n=(new t).update(n).finalize());for(let e=0;e<o;e++)a[0][e]=909522486^n[e],a[1][e]=1549556828^n[e];e._baseHash[0].update(a[0]),e._baseHash[1].update(a[1]),e._resultHash=new t(e._baseHash[0])}reset(){const n=this;n._resultHash=new n._hash(n._baseHash[0]),n._updated=!1}update(n){this._updated=!0,this._resultHash.update(n)}digest(){const n=this,e=n._resultHash.finalize(),t=new n._hash(n._baseHash[1]).update(e).finalize();return n.reset(),t}encrypt(n){if(this._updated)throw new ge(\"encrypt on already updated hmac called!\");return this.update(n),this.digest(n)}}},kt=typeof xe!=$e&&typeof xe.getRandomValues==Xe,yt=\"Invalid password\",vt=\"Invalid signature\",jt=\"zipjs-abort-check-password\";function St(n){return kt?xe.getRandomValues(n):wt.getRandomValues(n)}const xt=16,Ct={name:\"PBKDF2\"},zt=ie.assign({hash:{name:\"HMAC\"}},Ct),Lt=ie.assign({iterations:1e3,hash:{name:\"SHA-1\"}},Ct),At=[\"deriveBits\"],Tt=[8,12,16],It=[16,24,32],Rt=10,Et=[0,0,0,0],Dt=typeof xe!=$e,Mt=Dt&&xe.subtle,Bt=Dt&&typeof Mt!=$e,Nt=pt.bytes,Pt=gt.aes,Ot=bt.ctrGladman,_t=ft.hmacSha1;let Ft=Dt&&Bt&&typeof Mt.importKey==Xe,qt=Dt&&Bt&&typeof Mt.deriveBits==Xe;class Ut extends ze{constructor({password:n,rawPassword:e,signed:t,encryptionStrength:a,checkPasswordOnly:o}){super({start(){ie.assign(this,{ready:new ve(n=>this.resolveReady=n),password:Vt(n,e),signed:t,strength:a-1,pending:new we})},async transform(n,e){const t=this,{password:a,strength:i,resolveReady:r,ready:s}=t;a?(await async function(n,e,t,a){const o=await Gt(n,e,t,Jt(a,0,Tt[e])),i=Jt(a,Tt[e]);if(o[0]!=i[0]||o[1]!=i[1])throw new ge(yt)}(t,i,a,Jt(n,0,Tt[i]+2)),n=Jt(n,Tt[i]+2),o?e.error(new ge(jt)):r()):await s;const l=new we(n.length-Rt-(n.length-Rt)%xt);e.enqueue(Wt(t,n,l,0,Rt,!0))},async flush(n){const{signed:e,ctr:t,hmac:a,pending:o,ready:i}=this;if(a&&t){await i;const r=Jt(o,0,o.length-Rt),s=Jt(o,o.length-Rt);let l=new we;if(r.length){const n=Zt(Nt,r);a.update(n);const e=t.update(n);l=Yt(Nt,e)}if(e){const n=Jt(Yt(Nt,a.digest()),0,Rt);for(let e=0;e<Rt;e++)if(n[e]!=s[e])throw new ge(vt)}n.enqueue(l)}}})}}class Ht extends ze{constructor({password:n,rawPassword:e,encryptionStrength:t}){let a;super({start(){ie.assign(this,{ready:new ve(n=>this.resolveReady=n),password:Vt(n,e),strength:t-1,pending:new we})},async transform(n,e){const t=this,{password:a,strength:o,resolveReady:i,ready:r}=t;let s=new we;a?(s=await async function(n,e,t){const a=St(new we(Tt[e])),o=await Gt(n,e,t,a);return Kt(a,o)}(t,o,a),i()):await r;const l=new we(s.length+n.length-n.length%xt);l.set(s,0),e.enqueue(Wt(t,n,l,s.length,0))},async flush(n){const{ctr:e,hmac:t,pending:o,ready:i}=this;if(t&&e){await i;let r=new we;if(o.length){const n=e.update(Zt(Nt,o));t.update(n),r=Yt(Nt,n)}a.signature=Yt(Nt,t.digest()).slice(0,Rt),n.enqueue(Kt(r,a.signature))}}}),a=this}}function Wt(n,e,t,a,o,i){const{ctr:r,hmac:s,pending:l}=n,c=e.length-o;let m;for(l.length&&(e=Kt(l,e),t=function(n,e){if(e&&e>n.length){const t=n;(n=new we(e)).set(t,0)}return n}(t,c-c%xt)),m=0;m<=c-xt;m+=xt){const n=Zt(Nt,Jt(e,m,m+xt));i&&s.update(n);const o=r.update(n);i||s.update(o),t.set(Yt(Nt,o),m+a)}return n.pending=Jt(e,m),t}async function Gt(n,e,t,a){n.password=null;const o=await async function(n,e,t,a,o){if(!Ft)return ft.importKey(e);try{return await Mt.importKey(n,e,t,a,o)}catch(n){return Ft=!1,ft.importKey(e)}}(\"raw\",t,zt,!1,At),i=await async function(n,e,t){if(!qt)return ft.pbkdf2(e,n.salt,Lt.iterations,t);try{return await Mt.deriveBits(n,e,t)}catch(a){return qt=!1,ft.pbkdf2(e,n.salt,Lt.iterations,t)}}(ie.assign({salt:a},Lt),o,8*(2*It[e]+2)),r=new we(i),s=Zt(Nt,Jt(r,0,It[e])),l=Zt(Nt,Jt(r,It[e],2*It[e])),c=Jt(r,2*It[e]);return ie.assign(n,{keys:{key:s,authentication:l,passwordVerification:c},ctr:new Ot(new Pt(s),oe.from(Et)),hmac:new _t(l)}),c}function Vt(n,e){return e===Ze?dt(n):e}function Kt(n,e){let t=n;return n.length+e.length&&(t=new we(n.length+e.length),t.set(n,0),t.set(e,n.length)),t}function Jt(n,e,t){return n.subarray(e,t)}function Yt(n,e){return n.fromBits(e)}function Zt(n,e){return n.toBits(e)}const $t=12;class Xt extends ze{constructor({password:n,passwordVerification:e,checkPasswordOnly:t}){super({start(){ie.assign(this,{password:n,passwordVerification:e}),ta(this,n)},transform(n,e){const a=this;if(a.password){const e=na(a,n.subarray(0,$t));if(a.password=null,e[11]!=a.passwordVerification)throw new ge(yt);n=n.subarray($t)}t?e.error(new ge(jt)):e.enqueue(na(a,n))}})}}class Qt extends ze{constructor({password:n,passwordVerification:e}){super({start(){ie.assign(this,{password:n,passwordVerification:e}),ta(this,n)},transform(n,e){const t=this;let a,o;if(t.password){t.password=null;const e=St(new we($t));e[11]=t.passwordVerification,a=new we(n.length+e.length),a.set(ea(t,e),0),o=$t}else a=new we(n.length),o=0;a.set(ea(t,n),o),e.enqueue(a)}})}}function na(n,e){const t=new we(e.length);for(let a=0;a<e.length;a++)t[a]=oa(n)^e[a],aa(n,t[a]);return t}function ea(n,e){const t=new we(e.length);for(let a=0;a<e.length;a++)t[a]=oa(n)^e[a],aa(n,e[a]);return t}function ta(n,e){const t=[305419896,591751049,878082192];ie.assign(n,{keys:t,crcKey0:new ct(t[0]),crcKey2:new ct(t[2])});for(let t=0;t<e.length;t++)aa(n,e.charCodeAt(t))}function aa(n,e){let[t,a,o]=n.keys;n.crcKey0.append([e]),t=~n.crcKey0.get(),a=ra(ce.imul(ra(a+ia(t)),134775813)+1),n.crcKey2.append([a>>>24]),o=~n.crcKey2.get(),n.keys=[t,a,o]}function oa(n){const e=2|n.keys[2];return ia(ce.imul(e,1^e)>>>8)}function ia(n){return 255&n}function ra(n){return 4294967295&n}const sa=\"deflate-raw\";class la extends ze{constructor(n,{chunkSize:e,CompressionStream:t,CompressionStreamNative:a}){super({});const{compressed:o,encrypted:i,useCompressionStream:r,zipCrypto:s,signed:l,level:c}=n,m=this;let d,h,p=ma(super.readable);i&&!s||!l||(d=new mt,p=pa(p,d)),o&&(p=ha(p,r,{level:c,chunkSize:e},a,t)),i&&(s?p=pa(p,new Qt(n)):(h=new Ht(n),p=pa(p,h))),da(m,p,()=>{let n;i&&!s&&(n=h.signature),i&&!s||!l||(n=new ke(d.value.buffer).getUint32(0)),m.signature=n})}}class ca extends ze{constructor(n,{chunkSize:e,DecompressionStream:t,DecompressionStreamNative:a}){super({});const{zipCrypto:o,encrypted:i,signed:r,signature:s,compressed:l,useCompressionStream:c}=n;let m,d,h=ma(super.readable);i&&(o?h=pa(h,new Xt(n)):(d=new Ut(n),h=pa(h,d))),l&&(h=ha(h,c,{chunkSize:e},a,t)),i&&!o||!r||(m=new mt,h=pa(h,m)),da(this,h,()=>{if((!i||o)&&r){const n=new ke(m.value.buffer);if(s!=n.getUint32(0,!1))throw new ge(vt)}})}}function ma(n){return pa(n,new ze({transform(n,e){n&&n.length&&e.enqueue(n)}}))}function da(n,e,t){e=pa(e,new ze({flush:t})),ie.defineProperty(n,\"readable\",{get:()=>e})}function ha(n,e,t,a,o){try{n=pa(n,new(e&&a?a:o)(sa,t))}catch(a){if(!e)return n;try{n=pa(n,new o(sa,t))}catch(e){return n}}return n}function pa(n,e){return n.pipeThrough(e)}const ua=\"message\",ga=\"start\",wa=\"pull\",ba=\"data\",fa=\"close\",ka=\"deflate\",ya=\"inflate\";class va extends ze{constructor(n,e){super({});const t=this,{codecType:a}=n;let o;a.startsWith(ka)?o=la:a.startsWith(ya)&&(o=ca);let i=0,r=0;const s=new o(n,e),l=super.readable,c=new ze({transform(n,e){n&&n.length&&(r+=n.length,e.enqueue(n))},flush(){ie.assign(t,{inputSize:r})}}),m=new ze({transform(n,e){n&&n.length&&(i+=n.length,e.enqueue(n))},flush(){const{signature:n}=s;ie.assign(t,{signature:n,outputSize:i,inputSize:r})}});ie.defineProperty(t,\"readable\",{get:()=>l.pipeThrough(c).pipeThrough(s).pipeThrough(m)})}}class ja extends ze{constructor(n){let e;super({transform:function t(a,o){if(e){const n=new we(e.length+a.length);n.set(e),n.set(a,e.length),a=n,e=null}a.length>n?(o.enqueue(a.slice(0,n)),t(a.slice(n),o)):e=a},flush(n){e&&e.length&&n.enqueue(e)}})}}let Sa=typeof Ee!=$e;class xa{constructor(n,{readable:e,writable:t},{options:a,config:o,streamOptions:i,useWebWorkers:r,transferStreams:s,scripts:l},c){const{signal:m}=i;return ie.assign(n,{busy:!0,readable:e.pipeThrough(new ja(o.chunkSize)).pipeThrough(new Ca(e,i),{signal:m}),writable:t,options:ie.assign({},a),scripts:l,transferStreams:s,terminate:()=>new ve(e=>{const{worker:t,busy:a}=n;t?(a?n.resolveTerminated=e:(t.terminate(),e()),n.interface=null):e()}),onTaskFinished(){const{resolveTerminated:e}=n;e&&(n.resolveTerminated=null,n.terminated=!0,n.worker.terminate(),e()),n.busy=!1,c(n)}}),(r&&Sa?Aa:La)(n,o)}}class Ca extends ze{constructor(n,{onstart:e,onprogress:t,size:a,onend:o}){let i=0;super({async start(){e&&await za(e,a)},async transform(n,e){i+=n.length,t&&await za(t,i,a),e.enqueue(n)},async flush(){n.size=i,o&&await za(o,i)}})}}async function za(n,...e){try{await n(...e)}catch(n){}}function La(n,e){return{run:()=>async function({options:n,readable:e,writable:t,onTaskFinished:a},o){try{const a=new va(n,o);await e.pipeThrough(a).pipeTo(t,{preventClose:!0,preventAbort:!0});const{signature:i,inputSize:r,outputSize:s}=a;return{signature:i,inputSize:r,outputSize:s}}finally{a()}}(n,e)}}function Aa(n,e){const{baseURL:t,chunkSize:a}=e;if(!n.interface){let o;try{o=function(n,e,t){const a={type:\"module\"};let o,i;typeof n==Xe&&(n=n());try{o=new ue(n,e)}catch(e){o=n}if(Ta)try{i=new Ee(o)}catch(n){Ta=!1,i=new Ee(o,a)}else i=new Ee(o,a);return i.addEventListener(ua,n=>async function({data:n},e){const{type:t,value:a,messageId:o,result:i,error:r}=n,{reader:s,writer:l,resolveResult:c,rejectResult:m,onTaskFinished:d}=e;try{if(r){const{message:n,stack:e,code:t,name:a}=r,o=new ge(n);ie.assign(o,{stack:e,code:t,name:a}),h(o)}else{if(t==wa){const{value:n,done:t}=await s.read();Ra({type:ba,value:n,done:t,messageId:o},e)}t==ba&&(await l.ready,await l.write(new we(a)),Ra({type:\"ack\",messageId:o},e)),t==fa&&h(null,i)}}catch(r){Ra({type:fa,messageId:o},e),h(r)}function h(n,e){n?m(n):c(e),l&&l.releaseLock(),d()}}(n,t)),i}(n.scripts[0],t,n)}catch(t){return Sa=!1,La(n,e)}ie.assign(n,{worker:o,interface:{run:()=>async function(n,e){let t,a;const o=new ve((n,e)=>{t=n,a=e});ie.assign(n,{reader:null,writer:null,resolveResult:t,rejectResult:a,result:o});const{readable:i,options:r,scripts:s}=n,{writable:l,closed:c}=function(n){let e;const t=new ve(n=>e=n),a=new Ae({async write(e){const t=n.getWriter();await t.ready,await t.write(e),t.releaseLock()},close(){e()},abort:e=>n.getWriter().abort(e)});return{writable:a,closed:t}}(n.writable),m=Ra({type:ga,scripts:s.slice(1),options:r,config:e,readable:i,writable:l},n);m||ie.assign(n,{reader:i.getReader(),writer:l.getWriter()});const d=await o;m||await l.getWriter().close();return await c,d}(n,{chunkSize:a})}})}return n.interface}let Ta=!0,Ia=!0;function Ra(n,{worker:e,writer:t,onTaskFinished:a,transferStreams:o}){try{let{value:t,readable:a,writable:i}=n;const r=[];if(t&&(t.byteLength<t.buffer.byteLength?n.value=t.buffer.slice(0,t.byteLength):n.value=t.buffer,r.push(n.value)),o&&Ia?(a&&r.push(a),i&&r.push(i)):n.readable=n.writable=null,r.length)try{return e.postMessage(n,r),!0}catch(t){Ia=!1,n.readable=n.writable=null,e.postMessage(n)}else e.postMessage(n)}catch(n){throw t&&t.releaseLock(),a(),n}}let Ea=[];const Da=[];let Ma=0;async function Ba(n,e){const{options:t,config:a}=e,{transferStreams:o,useWebWorkers:i,useCompressionStream:r,codecType:s,compressed:l,signed:c,encrypted:m}=t,{workerScripts:d,maxWorkers:h}=a;e.transferStreams=o||o===Ze;const p=!(l||c||m||e.transferStreams);return e.useWebWorkers=!p&&(i||i===Ze&&a.useWebWorkers),e.scripts=e.useWebWorkers&&d?d[s]:[],t.useCompressionStream=r||r===Ze&&a.useCompressionStream,(await async function(){const t=Ea.find(n=>!n.busy);if(t)return Na(t),new xa(t,n,e,u);if(Ea.length<h){const t={indexWorker:Ma};return Ma++,Ea.push(t),new xa(t,n,e,u)}return new ve(t=>Da.push({resolve:t,stream:n,workerOptions:e}))}()).run();function u(n){if(Da.length){const[{resolve:e,stream:t,workerOptions:a}]=Da.splice(0,1);e(new xa(n,t,a,u))}else n.worker?(Na(n),function(n,e){const{config:t}=e,{terminateWorkerTimeout:a}=t;se.isFinite(a)&&a>=0&&(n.terminated?n.terminated=!1:n.terminateTimeout=setTimeout(async()=>{Ea=Ea.filter(e=>e!=n);try{await n.terminate()}catch(n){}},a))}(n,e)):Ea=Ea.filter(e=>e!=n)}}function Na(n){const{terminateTimeout:e}=n;e&&(clearTimeout(e),n.terminateTimeout=null)}const Pa=\"HTTP error \",Oa=\"HTTP Range not supported\",_a=\"Writer iterator completed too soon\",Fa=\"Range\",qa=\"GET\",Ua=\"bytes\",Ha=65536,Wa=\"writable\";class Ga{constructor(){this.size=0}init(){this.initialized=!0}}class Va extends Ga{get readable(){const n=this,{chunkSize:e=Ha}=n,t=new Le({start(){this.chunkOffset=0},async pull(a){const{offset:o=0,size:i,diskNumberStart:r}=t,{chunkOffset:s}=this;a.enqueue(await wo(n,o+s,ce.min(e,i-s),r)),s+e>i?a.close():this.chunkOffset+=e}});return t}}class Ka extends Ga{constructor(){super();const n=this,e=new Ae({write:e=>n.writeUint8Array(e)});ie.defineProperty(n,Wa,{get:()=>e})}writeUint8Array(){}}class Ja extends Va{constructor(n){super(),ie.assign(this,{blob:n,size:n.size})}async readUint8Array(n,e){const t=this,a=n+e,o=n||a<t.size?t.blob.slice(n,a):t.blob;let i=await o.arrayBuffer();return i.byteLength>e&&(i=i.slice(n,a)),new we(i)}}class Ya extends Ga{constructor(n){super();const e=new ze,t=[];n&&t.push([\"Content-Type\",n]),ie.defineProperty(this,Wa,{get:()=>e.writable}),this.blob=new pe(e.readable,{headers:t}).blob()}getData(){return this.blob}}class Za extends Va{constructor(n,e){super(),Xa(this,n,e)}async init(){await Qa(this,so,ao),super.init()}readUint8Array(n,e){return no(this,n,e,so,ao)}}class $a extends Va{constructor(n,e){super(),Xa(this,n,e)}async init(){await Qa(this,lo,oo),super.init()}readUint8Array(n,e){return no(this,n,e,lo,oo)}}function Xa(n,e,t){const{preventHeadRequest:a,useRangeHeader:o,forceRangeRequests:i,combineSizeEocd:r}=t;delete(t=ie.assign({},t)).preventHeadRequest,delete t.useRangeHeader,delete t.forceRangeRequests,delete t.combineSizeEocd,delete t.useXHR,ie.assign(n,{url:e,options:t,preventHeadRequest:a,useRangeHeader:o,forceRangeRequests:i,combineSizeEocd:r})}async function Qa(n,e,t){const{url:a,preventHeadRequest:o,useRangeHeader:i,forceRangeRequests:r,combineSizeEocd:s}=n;if(function(n){const{baseURL:e}=at(),{protocol:t}=new ue(n,e);return\"http:\"==t||\"https:\"==t}(a)&&(i||r)&&(void 0===o||o)){const a=await e(qa,n,eo(n,s?-22:void 0));if(!r&&a.headers.get(\"Accept-Ranges\")!=Ua)throw new ge(Oa);{let o;s&&(n.eocdCache=new we(await a.arrayBuffer()));const i=a.headers.get(\"Content-Range\");if(i){const n=i.trim().split(/\\s*\\/\\s*/);if(n.length){const e=n[1];e&&\"*\"!=e&&(o=se(e))}}o===Ze?await ro(n,e,t):n.size=o}}else await ro(n,e,t)}async function no(n,e,t,a,o){const{useRangeHeader:i,forceRangeRequests:r,eocdCache:s,size:l,options:c}=n;if(i||r){if(s&&e==l-Ue&&t==Ue)return s;const o=await a(qa,n,eo(n,e,t));if(206!=o.status)throw new ge(Oa);return new we(await o.arrayBuffer())}{const{data:a}=n;return a||await o(n,c),new we(n.data.subarray(e,e+t))}}function eo(n,e=0,t=1){return ie.assign({},to(n),{[Fa]:Ua+\"=\"+(e<0?e:e+\"-\"+(e+t-1))})}function to({options:n}){const{headers:e}=n;if(e)return Symbol.iterator in e?ie.fromEntries(e):e}async function ao(n){await io(n,so)}async function oo(n){await io(n,lo)}async function io(n,e){const t=await e(qa,n,to(n));n.data=new we(await t.arrayBuffer()),n.size||(n.size=n.data.length)}async function ro(n,e,t){if(n.preventHeadRequest)await t(n,n.options);else{const a=(await e(\"HEAD\",n,to(n))).headers.get(\"Content-Length\");a?n.size=se(a):await t(n,n.options)}}async function so(n,{options:e,url:t},a){const o=await fetch(t,ie.assign({},e,{method:n,headers:a}));if(o.status<400)return o;throw 416==o.status?new ge(Oa):new ge(Pa+(o.statusText||o.status))}function lo(n,{url:e},t){return new ve((a,o)=>{const i=new XMLHttpRequest;if(i.addEventListener(\"load\",()=>{if(i.status<400){const n=[];i.getAllResponseHeaders().trim().split(/[\\r\\n]+/).forEach(e=>{const t=e.trim().split(/\\s*:\\s*/);t[0]=t[0].trim().replace(/^[a-z]|-[a-z]/g,n=>n.toUpperCase()),n.push(t)}),a({status:i.status,arrayBuffer:()=>i.response,headers:new de(n)})}else o(416==i.status?new ge(Oa):new ge(Pa+(i.statusText||i.status)))},!1),i.addEventListener(\"error\",n=>o(n.detail?n.detail.error:new ge(\"Network error\")),!1),i.open(n,e),t)for(const n of ie.entries(t))i.setRequestHeader(n[0],n[1]);i.responseType=\"arraybuffer\",i.send()})}class co extends Va{constructor(n,e={}){super(),ie.assign(this,{url:n,reader:e.useXHR?new $a(n,e):new Za(n,e)})}set size(n){}get size(){return this.reader.size}async init(){await this.reader.init(),super.init()}readUint8Array(n,e){return this.reader.readUint8Array(n,e)}}class mo extends Va{constructor(n){super(),this.readers=n}async init(){const n=this,{readers:e}=n;n.lastDiskNumber=0,n.lastDiskOffset=0,await ve.all(e.map(async(t,a)=>{await t.init(),a!=e.length-1&&(n.lastDiskOffset+=t.size),n.size+=t.size})),super.init()}async readUint8Array(n,e,t=0){const a=this,{readers:o}=this;let i,r=t;-1==r&&(r=o.length-1);let s=n;for(;s>=o[r].size;)s-=o[r].size,r++;const l=o[r],c=l.size;if(s+e<=c)i=await wo(l,s,e);else{const o=c-s;i=new we(e),i.set(await wo(l,s,o)),i.set(await a.readUint8Array(n+o,e-o,t),o)}return a.lastDiskNumber=ce.max(r,a.lastDiskNumber),i}}class ho extends Ga{constructor(n,e=4294967295){super();const t=this;let a,o,i;ie.assign(t,{diskNumber:0,diskOffset:0,size:0,maxSize:e,availableSize:e});const r=new Ae({async write(e){const{availableSize:r}=t;if(i)e.length>=r?(await s(e.slice(0,r)),await l(),t.diskOffset+=a.size,t.diskNumber++,i=null,await this.write(e.slice(r))):await s(e);else{const{value:r,done:s}=await n.next();if(s&&!r)throw new ge(_a);a=r,a.size=0,a.maxSize&&(t.maxSize=a.maxSize),t.availableSize=t.maxSize,await po(a),o=r.writable,i=o.getWriter(),await this.write(e)}},async close(){await i.ready,await l()}});async function s(n){const e=n.length;e&&(await i.ready,await i.write(n),a.size+=e,t.size+=e,t.availableSize-=e)}async function l(){o.size=a.size,await i.close()}ie.defineProperty(t,Wa,{get:()=>r})}}async function po(n,e){if(!n.init||n.initialized)return ve.resolve();await n.init(e)}function uo(n){return oe.isArray(n)&&(n=new mo(n)),n instanceof Le&&(n={readable:n}),n}function go(n){n.writable===Ze&&typeof n.next==Xe&&(n=new ho(n)),n instanceof Ae&&(n={writable:n});const{writable:e}=n;return e.size===Ze&&(e.size=0),n instanceof ho||ie.assign(n,{diskNumber:0,diskOffset:0,availableSize:1/0,maxSize:1/0}),n}function wo(n,e,t,a){return n.readUint8Array(e,t,a)}const bo=mo,fo=ho,ko=\"\\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \".split(\"\"),yo=256==ko.length;function vo(n,e){return e&&\"cp437\"==e.trim().toLowerCase()?function(n){if(yo){let e=\"\";for(let t=0;t<n.length;t++)e+=ko[n[t]];return e}return(new Se).decode(n)}(n):new Se(e).decode(n)}const jo=\"filename\",So=\"rawFilename\",xo=\"comment\",Co=\"rawComment\",zo=\"uncompressedSize\",Lo=\"compressedSize\",Ao=\"offset\",To=\"diskNumberStart\",Io=\"lastModDate\",Ro=\"rawLastModDate\",Eo=\"lastAccessDate\",Do=\"rawLastAccessDate\",Mo=\"creationDate\",Bo=\"rawCreationDate\",No=\"internalFileAttribute\",Po=\"externalFileAttribute\",Oo=\"msDosCompatible\",_o=\"zip64\",Fo=[jo,So,Lo,zo,Io,Ro,xo,Co,Eo,Mo,Ao,To,To,No,Po,Oo,_o,\"directory\",\"bitFlag\",\"encrypted\",\"signature\",\"filenameUTF8\",\"commentUTF8\",\"compressionMethod\",\"version\",\"versionMadeBy\",\"extraField\",\"rawExtraField\",\"extraFieldZip64\",\"extraFieldUnicodePath\",\"extraFieldUnicodeComment\",\"extraFieldAES\",\"extraFieldNTFS\",\"extraFieldExtendedTimestamp\"];class qo{constructor(n){Fo.forEach(e=>this[e]=n[e])}}const Uo=\"File format is not recognized\",Ho=\"End of central directory not found\",Wo=\"End of Zip64 central directory locator not found\",Go=\"Central directory header not found\",Vo=\"Local file header not found\",Ko=\"Zip64 extra field not found\",Jo=\"File contains encrypted entry\",Yo=\"Encryption method not supported\",Zo=\"Compression method not supported\",$o=\"Split zip file\",Xo=\"utf-8\",Qo=\"cp437\",ni=[[zo,De],[Lo,De],[Ao,De],[To,Me]],ei={[Me]:{getValue:hi,bytes:4},[De]:{getValue:pi,bytes:8}};class ti{constructor(n,e={}){ie.assign(this,{reader:uo(n),options:e,config:at()})}async*getEntriesGenerator(n={}){const e=this;let{reader:t}=e;const{config:a}=e;if(await po(t),t.size!==Ze&&t.readUint8Array||(t=new Ja(await new pe(t.readable).blob()),await po(t)),t.size<Ue)throw new ge(Uo);t.chunkSize=ot(a);const o=await async function(n,e,t,a,o){const i=new we(4);!function(n,e,t){n.setUint32(e,t,!0)}(ui(i),0,e);const r=a+o;return await s(a)||await s(ce.min(r,t));async function s(e){const o=t-e,r=await wo(n,o,e);for(let n=r.length-a;n>=0;n--)if(r[n]==i[0]&&r[n+1]==i[1]&&r[n+2]==i[2]&&r[n+3]==i[3])return{offset:o+n,buffer:r.slice(n,n+a).buffer}}}(t,_e,t.size,Ue,1048560);if(!o){throw hi(ui(await wo(t,0,4)))==Ne?new ge($o):new ge(Ho)}const i=ui(o);let r=hi(i,12),s=hi(i,16);const l=o.offset,c=di(i,20),m=l+Ue+c;let d=di(i,4);const h=t.lastDiskNumber||0;let p=di(i,6),u=di(i,8),g=0,w=0;if(s==De||r==De||u==Me||p==Me){const n=ui(await wo(t,o.offset-20,20));if(hi(n,0)==qe){s=pi(n,8);let e=await wo(t,s,56,-1),a=ui(e);const i=o.offset-20-56;if(hi(a,0)!=Fe&&s!=i){const n=s;s=i,g=s-n,e=await wo(t,s,56,-1),a=ui(e)}if(hi(a,0)!=Fe)throw new ge(Wo);d==Me&&(d=hi(a,16)),p==Me&&(p=hi(a,20)),u==Me&&(u=pi(a,32)),r==De&&(r=pi(a,40)),s-=r}}if(s>=t.size&&(g=t.size-s-r-Ue,s=t.size-r-Ue),h!=d)throw new ge($o);if(s<0)throw new ge(Uo);let b=0,f=await wo(t,s,r,p),k=ui(f);if(r){const n=o.offset-r;if(hi(k,b)!=Oe&&s!=n){const e=s;s=n,g+=s-e,f=await wo(t,s,r,p),k=ui(f)}}const y=o.offset-s-(t.lastDiskOffset||0);if(r!=y&&y>=0&&(r=y,f=await wo(t,s,r,p),k=ui(f)),s<0||s>=t.size)throw new ge(Uo);const v=si(e,n,\"filenameEncoding\"),j=si(e,n,\"commentEncoding\");for(let o=0;o<u;o++){const i=new ai(t,a,e.options);if(hi(k,b)!=Oe)throw new ge(Go);oi(i,k,b+6);const r=Boolean(i.bitFlag.languageEncodingFlag),s=b+46,l=s+i.filenameLength,c=l+i.extraFieldLength,m=di(k,b+4),d=!(0&m),h=f.subarray(s,l),p=di(k,b+32),y=c+p,S=f.subarray(c,y),x=r,C=r,z=d&&!(16&~mi(k,b+38)),L=hi(k,b+42)+g;ie.assign(i,{versionMadeBy:m,msDosCompatible:d,compressedSize:0,uncompressedSize:0,commentLength:p,directory:z,offset:L,diskNumberStart:di(k,b+34),internalFileAttribute:di(k,b+36),externalFileAttribute:hi(k,b+38),rawFilename:h,filenameUTF8:x,commentUTF8:C,rawExtraField:f.subarray(l,c)});const A=si(e,n,\"decodeText\")||vo,T=x?Xo:v||Qo,I=C?Xo:j||Qo;let R=A(h,T);R===Ze&&(R=vo(h,T));let E=A(S,I);E===Ze&&(E=vo(S,I)),ie.assign(i,{rawComment:S,filename:R,comment:E,directory:z||R.endsWith(Ke)}),w=ce.max(L,w),await ii(i,i,k,b+6);const D=new qo(i);D.getData=(n,e)=>i.getData(n,D,e),b=y;const{onprogress:M}=n;if(M)try{await M(o+1,u,new qo(i))}catch(n){}yield D}const S=si(e,n,\"extractPrependedData\"),x=si(e,n,\"extractAppendedData\");return S&&(e.prependedData=w>0?await wo(t,0,w):new we),e.comment=c?await wo(t,l+Ue,c):new we,x&&(e.appendedData=m<t.size?await wo(t,m,t.size-m):new we),!0}async getEntries(n={}){const e=[];for await(const t of this.getEntriesGenerator(n))e.push(t);return e}async close(){}}class ai{constructor(n,e,t){ie.assign(this,{reader:n,config:e,options:t})}async getData(n,e,t={}){const a=this,{reader:o,offset:i,diskNumberStart:r,extraFieldAES:s,compressionMethod:l,config:c,bitFlag:m,signature:d,rawLastModDate:h,uncompressedSize:p,compressedSize:u}=a,g=e.localDirectory={},w=ui(await wo(o,i,30,r));let b=si(a,t,\"password\"),f=si(a,t,\"rawPassword\");if(b=b&&b.length&&b,f=f&&f.length&&f,s&&99!=s.originalCompressionMethod)throw new ge(Zo);if(0!=l&&8!=l)throw new ge(Zo);if(hi(w,0)!=Be)throw new ge(Vo);oi(g,w,4),g.rawExtraField=g.extraFieldLength?await wo(o,i+30+g.filenameLength,g.extraFieldLength,r):new we,await ii(a,g,w,4,!0),ie.assign(e,{lastAccessDate:g.lastAccessDate,creationDate:g.creationDate});const k=a.encrypted&&g.encrypted,y=k&&!s;if(k){if(!y&&s.strength===Ze)throw new ge(Yo);if(!b&&!f)throw new ge(Jo)}const v=i+30+g.filenameLength+g.extraFieldLength,j=u,S=o.readable;ie.assign(S,{diskNumberStart:r,offset:v,size:j});const x=si(a,t,\"signal\"),C=si(a,t,\"checkPasswordOnly\");C&&(n=new Ae),n=go(n),await po(n,p);const{writable:z}=n,{onstart:L,onprogress:A,onend:T}=t,I={options:{codecType:ya,password:b,rawPassword:f,zipCrypto:y,encryptionStrength:s&&s.strength,signed:si(a,t,\"checkSignature\"),passwordVerification:y&&(m.dataDescriptor?h>>>8&255:d>>>24&255),signature:d,compressed:0!=l,encrypted:k,useWebWorkers:si(a,t,\"useWebWorkers\"),useCompressionStream:si(a,t,\"useCompressionStream\"),transferStreams:si(a,t,\"transferStreams\"),checkPasswordOnly:C},config:c,streamOptions:{signal:x,size:j,onstart:L,onprogress:A,onend:T}};let R=0;try{({outputSize:R}=await Ba({readable:S,writable:z},I))}catch(n){if(!C||n.message!=jt)throw n}finally{const n=si(a,t,\"preventClose\");z.size+=R,n||z.locked||await z.getWriter().close()}return C?Ze:n.getData?n.getData():z}}function oi(n,e,t){const a=n.rawBitFlag=di(e,t+2),o=!(1&~a),i=hi(e,t+6);ie.assign(n,{encrypted:o,version:di(e,t),bitFlag:{level:(6&a)>>1,dataDescriptor:!(8&~a),languageEncodingFlag:(a&Ve)==Ve},rawLastModDate:i,lastModDate:li(i),filenameLength:di(e,t+22),extraFieldLength:di(e,t+24)})}async function ii(n,e,t,a,o){const{rawExtraField:i}=e,r=e.extraField=new de,s=ui(new we(i));let l=0;try{for(;l<i.length;){const n=di(s,l),e=di(s,l+2);r.set(n,{type:n,data:i.slice(l+4,l+4+e)}),l+=4+e}}catch(n){}const c=di(t,a+4);ie.assign(e,{signature:hi(t,a+10),uncompressedSize:hi(t,a+18),compressedSize:hi(t,a+14)});const m=r.get(1);m&&(!function(n,e){e.zip64=!0;const t=ui(n.data),a=ni.filter(([n,t])=>e[n]==t);for(let o=0,i=0;o<a.length;o++){const[r,s]=a[o];if(e[r]==s){const a=ei[s];e[r]=n[r]=a.getValue(t,i),i+=a.bytes}else if(n[r])throw new ge(Ko)}}(m,e),e.extraFieldZip64=m);const d=r.get(28789);d&&(await ri(d,jo,So,e,n),e.extraFieldUnicodePath=d);const h=r.get(25461);h&&(await ri(h,xo,Co,e,n),e.extraFieldUnicodeComment=h);const p=r.get(39169);p?(!function(n,e,t){const a=ui(n.data),o=mi(a,4);ie.assign(n,{vendorVersion:mi(a,0),vendorId:mi(a,2),strength:o,originalCompressionMethod:t,compressionMethod:di(a,5)}),e.compressionMethod=n.compressionMethod}(p,e,c),e.extraFieldAES=p):e.compressionMethod=c;const u=r.get(10);u&&(!function(n,e){const t=ui(n.data);let a,o=4;try{for(;o<n.data.length&&!a;){const e=di(t,o),i=di(t,o+2);1==e&&(a=n.data.slice(o+4,o+4+i)),o+=4+i}}catch(n){}try{if(a&&24==a.length){const t=ui(a),o=t.getBigUint64(0,!0),i=t.getBigUint64(8,!0),r=t.getBigUint64(16,!0);ie.assign(n,{rawLastModDate:o,rawLastAccessDate:i,rawCreationDate:r});const s=ci(o),l=ci(i),c={lastModDate:s,lastAccessDate:l,creationDate:ci(r)};ie.assign(n,c),ie.assign(e,c)}}catch(n){}}(u,e),e.extraFieldNTFS=u);const g=r.get(We);g&&(!function(n,e,t){const a=ui(n.data),o=mi(a,0),i=[],r=[];t?(1&~o||(i.push(Io),r.push(Ro)),2&~o||(i.push(Eo),r.push(Do)),4&~o||(i.push(Mo),r.push(Bo))):n.data.length>=5&&(i.push(Io),r.push(Ro));let s=1;i.forEach((t,o)=>{if(n.data.length>=s+4){const i=hi(a,s);e[t]=n[t]=new me(1e3*i);const l=r[o];n[l]=i}s+=4})}(g,e,o),e.extraFieldExtendedTimestamp=g);const w=r.get(6534);w&&(e.extraFieldUSDZ=w)}async function ri(n,e,t,a,o){const i=ui(n.data),r=new ct;r.append(o[t]);const s=ui(new we(4));s.setUint32(0,r.get(),!0);const l=hi(i,1);ie.assign(n,{version:mi(i,0),[e]:vo(n.data.subarray(5)),valid:!o.bitFlag.languageEncodingFlag&&l==hi(s,0)}),n.valid&&(a[e]=n[e],a[e+\"UTF8\"]=!0)}function si(n,e,t){return e[t]===Ze?n.options[t]:e[t]}function li(n){const e=(4294901760&n)>>16,t=65535&n;try{return new me(1980+((65024&e)>>9),((480&e)>>5)-1,31&e,(63488&t)>>11,(2016&t)>>5,2*(31&t),0)}catch(n){}}function ci(n){return new me(se(n/le(1e4)-le(116444736e5)))}function mi(n,e){return n.getUint8(e)}function di(n,e){return n.getUint16(e,!0)}function hi(n,e){return n.getUint32(e,!0)}function pi(n,e){return se(n.getBigUint64(e,!0))}function ui(n){return new ke(n.buffer)}const gi=\"File already exists\",wi=\"Zip file comment exceeds 64KB\",bi=\"File entry comment exceeds 64KB\",fi=\"File entry name exceeds 64KB\",ki=\"Version exceeds 65535\",yi=\"The strength must equal 1, 2, or 3\",vi=\"Extra field type exceeds 65535\",ji=\"Extra field data exceeds 64KB\",Si=\"Zip64 is not supported (make sure 'keepOrder' is set to 'true')\",xi=new we([7,0,2,0,65,69,3,0,0]);let Ci=0;const zi=[];class Li{constructor(n,e={}){const t=(n=go(n)).availableSize!==Ze&&n.availableSize>0&&n.availableSize!==1/0&&n.maxSize!==Ze&&n.maxSize>0&&n.maxSize!==1/0;ie.assign(this,{writer:n,addSplitZipSignature:t,options:e,config:at(),files:new de,filenames:new he,offset:n.writable.size,pendingEntriesSize:0,pendingAddFileCalls:new he,bufferedWrites:0})}async add(n=\"\",e,t={}){const a=this,{pendingAddFileCalls:o,config:i}=a;let r;Ci<i.maxWorkers?Ci++:await new ve(n=>zi.push(n));try{if(n=n.trim(),a.filenames.has(n))throw new ge(gi);return a.filenames.add(n),r=async function(n,e,t,a){e=e.trim(),a.directory&&!e.endsWith(Ke)?e+=Ke:a.directory=e.endsWith(Ke);const o=Ii(n,a,\"encodeText\",dt);let i=o(e);i===Ze&&(i=dt(e));if(Pi(i)>Me)throw new ge(fi);const r=a.comment||\"\";let s=o(r);s===Ze&&(s=dt(r));if(Pi(s)>Me)throw new ge(bi);const l=Ii(n,a,\"version\",20);if(l>Me)throw new ge(ki);const c=Ii(n,a,\"versionMadeBy\",20);if(c>Me)throw new ge(ki);const m=Ii(n,a,Io,new me),d=Ii(n,a,Eo),h=Ii(n,a,Mo),p=Ii(n,a,Oo,!0),u=Ii(n,a,No,0),g=Ii(n,a,Po,0),w=Ii(n,a,\"password\"),b=Ii(n,a,\"rawPassword\"),f=Ii(n,a,\"encryptionStrength\",3),k=Ii(n,a,\"zipCrypto\"),y=Ii(n,a,\"extendedTimestamp\",!0),v=Ii(n,a,\"keepOrder\",!0),j=Ii(n,a,\"level\"),S=Ii(n,a,\"useWebWorkers\"),x=Ii(n,a,\"bufferedWrite\"),C=Ii(n,a,\"dataDescriptorSignature\",!1),z=Ii(n,a,\"signal\"),L=Ii(n,a,\"useCompressionStream\");let A=Ii(n,a,\"dataDescriptor\",!0),T=Ii(n,a,_o);if(w!==Ze&&f!==Ze&&(f<1||f>3))throw new ge(yi);let I=new we;const{extraField:R}=a;if(R){let n=0,e=0;R.forEach(e=>n+=4+Pi(e)),I=new we(n),R.forEach((n,t)=>{if(t>Me)throw new ge(vi);if(Pi(n)>Me)throw new ge(ji);Bi(I,new be([t]),e),Bi(I,new be([Pi(n)]),e+2),Bi(I,n,e+4),e+=4+Pi(n)})}let E=0,D=0,M=0;const B=!0===T;t&&(t=uo(t),await po(t),t.size===Ze?(A=!0,(T||T===Ze)&&(T=!0,M=E=4294967296)):(M=t.size,E=function(n){return n+5*(ce.floor(n/16383)+1)}(M)));const{diskOffset:N,diskNumber:P,maxSize:O}=n.writer,_=B||M>De,F=B||E>De,q=B||n.offset+n.pendingEntriesSize-N>De,U=Ii(n,a,\"supportZip64SplitFile\",!0),H=U&&B||P+ce.ceil(n.pendingEntriesSize/O)>Me;if(q||_||F||H){if(!1===T||!v)throw new ge(Si);T=!0}T=T||!1,a=ie.assign({},a,{rawFilename:i,rawComment:s,version:l,versionMadeBy:c,lastModDate:m,lastAccessDate:d,creationDate:h,rawExtraField:I,zip64:T,zip64UncompressedSize:_,zip64CompressedSize:F,zip64Offset:q,zip64DiskNumberStart:H,password:w,rawPassword:b,level:L||n.config.CompressionStream!==Ze||n.config.CompressionStreamNative!==Ze?j:0,useWebWorkers:S,encryptionStrength:f,extendedTimestamp:y,zipCrypto:k,bufferedWrite:x,keepOrder:v,dataDescriptor:A,dataDescriptorSignature:C,signal:z,msDosCompatible:p,internalFileAttribute:u,externalFileAttribute:g,useCompressionStream:L});const W=function(n){const{rawFilename:e,lastModDate:t,lastAccessDate:a,creationDate:o,rawPassword:i,password:r,level:s,zip64:l,zipCrypto:c,dataDescriptor:m,directory:d,rawExtraField:h,encryptionStrength:p,extendedTimestamp:u}=n,g=0!==s&&!d,w=Boolean(r&&Pi(r)||i&&Pi(i));let b,f,k,y,v=n.version;if(w&&!c){b=new we(Pi(xi)+2);const n=Ni(b);Ei(n,0,He),Bi(b,xi,2),Ri(n,8,p)}else b=new we;if(u){k=new we(9+(a?4:0)+(o?4:0));const n=Ni(k);Ei(n,0,We),Ei(n,2,Pi(k)-4),y=1+(a?2:0)+(o?4:0),Ri(n,4,y);let e=5;Di(n,e,ce.floor(t.getTime()/1e3)),e+=4,a&&(Di(n,e,ce.floor(a.getTime()/1e3)),e+=4),o&&Di(n,e,ce.floor(o.getTime()/1e3));try{f=new we(36);const n=Ni(f),e=Ti(t);Ei(n,0,10),Ei(n,2,32),Ei(n,8,1),Ei(n,10,24),Mi(n,12,e),Mi(n,20,Ti(a)||e),Mi(n,28,Ti(o)||e)}catch(n){f=new we}}else f=k=new we;let j=Ve;m&&(j|=8);let S=0;g&&(S=8);l&&(v=v>45?v:45);w&&(j|=1,c||(v=v>51?v:51,S=99,g&&(b[9]=8)));const x=new we(26),C=Ni(x);Ei(C,0,v),Ei(C,2,j),Ei(C,4,S);const z=new fe(1),L=Ni(z);let A;A=t<Ye?Ye:t>Je?Je:t;Ei(L,0,(A.getHours()<<6|A.getMinutes())<<5|A.getSeconds()/2),Ei(L,2,(A.getFullYear()-1980<<4|A.getMonth()+1)<<5|A.getDate());const T=z[0];Di(C,6,T),Ei(C,22,Pi(e));const I=Pi(b,k,f,h);Ei(C,24,I);const R=new we(30+Pi(e)+I);return Di(Ni(R),0,Be),Bi(R,x,4),Bi(R,e,30),Bi(R,b,30+Pi(e)),Bi(R,k,30+Pi(e,b)),Bi(R,f,30+Pi(e,b,k)),Bi(R,h,30+Pi(e,b,k,f)),{localHeaderArray:R,headerArray:x,headerView:C,lastModDate:t,rawLastModDate:T,encrypted:w,compressed:g,version:v,compressionMethod:S,extraFieldExtendedTimestampFlag:y,rawExtraFieldExtendedTimestamp:k,rawExtraFieldNTFS:f,rawExtraFieldAES:b,extraFieldLength:I}}(a),G=function(n){const{zip64:e,dataDescriptor:t,dataDescriptorSignature:a}=n;let o,i=new we,r=0;t&&(i=new we(e?a?24:20:a?16:12),o=Ni(i),a&&(r=4,Di(o,0,Pe)));return{dataDescriptorArray:i,dataDescriptorView:o,dataDescriptorOffset:r}}(a),V=Pi(W.localHeaderArray,G.dataDescriptorArray);D=V+E,n.options.usdz&&(D+=D+64);let K;n.pendingEntriesSize+=D;try{K=await async function(n,e,t,a,o){const{files:i,writer:r}=n,{keepOrder:s,dataDescriptor:l,signal:c}=o,{headerInfo:m}=a,{usdz:d}=n.options,h=oe.from(i.values()).pop();let p,u,g,w,b,f,k,y={};i.set(e,y);try{let m;s&&(m=h&&h.lock,v()),!(o.bufferedWrite||n.writerLocked||n.bufferedWrites&&s)&&l||d?(f=r,await j()):(f=new ze,k=new pe(f.readable).blob(),f.writable.size=0,p=!0,n.bufferedWrites++,await po(r)),await po(f);const{writable:u}=r;let{diskOffset:g}=r;if(n.addSplitZipSignature){delete n.addSplitZipSignature;const e=new we(4);Di(Ni(e),0,Ne),await Ai(u,e),n.offset+=4}d&&function(n,e){const{headerInfo:t}=n;let{localHeaderArray:a,extraFieldLength:o}=t,i=Ni(a),r=64-(e+Pi(a))%64;r<4&&(r+=64);const s=new we(r),l=Ni(s);Ei(l,0,Ge),Ei(l,2,r-2);const c=a;t.localHeaderArray=a=new we(Pi(c)+r),Bi(a,c),Bi(a,s,Pi(c)),i=Ni(a),Ei(i,28,o+r),n.metadataSize+=r}(a,n.offset-g),p||(await m,await S(u));const{diskNumber:x}=r;if(b=!0,y.diskNumberStart=x,y=await async function(n,e,{diskNumberStart:t,lock:a},o,i,r){const{headerInfo:s,dataDescriptorInfo:l,metadataSize:c}=o,{localHeaderArray:m,headerArray:d,lastModDate:h,rawLastModDate:p,encrypted:u,compressed:g,version:w,compressionMethod:b,rawExtraFieldExtendedTimestamp:f,extraFieldExtendedTimestampFlag:k,rawExtraFieldNTFS:y,rawExtraFieldAES:v}=s,{dataDescriptorArray:j}=l,{rawFilename:S,lastAccessDate:x,creationDate:C,password:z,rawPassword:L,level:A,zip64:T,zip64UncompressedSize:I,zip64CompressedSize:R,zip64Offset:E,zip64DiskNumberStart:D,zipCrypto:M,dataDescriptor:B,directory:N,versionMadeBy:P,rawComment:O,rawExtraField:_,useWebWorkers:F,onstart:q,onprogress:U,onend:H,signal:W,encryptionStrength:G,extendedTimestamp:V,msDosCompatible:K,internalFileAttribute:J,externalFileAttribute:Y,useCompressionStream:Z}=r,$={lock:a,versionMadeBy:P,zip64:T,directory:Boolean(N),filenameUTF8:!0,rawFilename:S,commentUTF8:!0,rawComment:O,rawExtraFieldExtendedTimestamp:f,rawExtraFieldNTFS:y,rawExtraFieldAES:v,rawExtraField:_,extendedTimestamp:V,msDosCompatible:K,internalFileAttribute:J,externalFileAttribute:Y,diskNumberStart:t};let X,Q=0,nn=0;const{writable:en}=e;if(n){n.chunkSize=ot(i),await Ai(en,m);const e=n.readable,t=e.size=n.size,a={options:{codecType:ka,level:A,rawPassword:L,password:z,encryptionStrength:G,zipCrypto:u&&M,passwordVerification:u&&M&&p>>8&255,signed:!0,compressed:g,encrypted:u,useWebWorkers:F,useCompressionStream:Z,transferStreams:!1},config:i,streamOptions:{signal:W,size:t,onstart:q,onprogress:U,onend:H}},o=await Ba({readable:e,writable:en},a);nn=o.inputSize,Q=o.outputSize,X=o.signature,en.size+=nn}else await Ai(en,m);let tn;if(T){let n=4;I&&(n+=8),R&&(n+=8),E&&(n+=8),D&&(n+=4),tn=new we(n)}else tn=new we;(function(n,e){const{signature:t,rawExtraFieldZip64:a,compressedSize:o,uncompressedSize:i,headerInfo:r,dataDescriptorInfo:s}=n,{headerView:l,encrypted:c}=r,{dataDescriptorView:m,dataDescriptorOffset:d}=s,{zip64:h,zip64UncompressedSize:p,zip64CompressedSize:u,zipCrypto:g,dataDescriptor:w}=e;c&&!g||t===Ze||(Di(l,10,t),w&&Di(m,d,t));if(h){const n=Ni(a);Ei(n,0,1),Ei(n,2,Pi(a)-4);let e=4;p&&(Di(l,18,De),Mi(n,e,le(i)),e+=8),u&&(Di(l,14,De),Mi(n,e,le(o))),w&&(Mi(m,d+4,le(o)),Mi(m,d+12,le(i)))}else Di(l,14,o),Di(l,18,i),w&&(Di(m,d+4,o),Di(m,d+8,i))})({signature:X,rawExtraFieldZip64:tn,compressedSize:Q,uncompressedSize:nn,headerInfo:s,dataDescriptorInfo:l},r),B&&await Ai(en,j);return ie.assign($,{uncompressedSize:nn,compressedSize:Q,lastModDate:h,rawLastModDate:p,creationDate:C,lastAccessDate:x,encrypted:u,size:c+Q,compressionMethod:b,version:w,headerArray:d,signature:X,rawExtraFieldZip64:tn,extraFieldExtendedTimestampFlag:k,zip64UncompressedSize:I,zip64CompressedSize:R,zip64Offset:E,zip64DiskNumberStart:D}),$}(t,f,y,a,n.config,o),b=!1,i.set(e,y),y.filename=e,p){await f.writable.getWriter().close();let n=await k;await m,await j(),w=!0,l||(n=await async function(n,e,t,{zipCrypto:a}){let o;o=await e.slice(0,26).arrayBuffer(),26!=o.byteLength&&(o=o.slice(0,26));const i=new ke(o);n.encrypted&&!a||Di(i,14,n.signature);n.zip64?(Di(i,18,De),Di(i,22,De)):(Di(i,18,n.compressedSize),Di(i,22,n.uncompressedSize));return await Ai(t,new we(o)),e.slice(o.byteLength)}(y,n,u,o)),await S(u),y.diskNumberStart=r.diskNumber,g=r.diskOffset,await n.stream().pipeTo(u,{preventClose:!0,preventAbort:!0,signal:c}),u.size+=n.size,w=!1}if(y.offset=n.offset-g,y.zip64)!function(n,e){const{rawExtraFieldZip64:t,offset:a,diskNumberStart:o}=n,{zip64UncompressedSize:i,zip64CompressedSize:r,zip64Offset:s,zip64DiskNumberStart:l}=e,c=Ni(t);let m=4;i&&(m+=8);r&&(m+=8);s&&(Mi(c,m,le(a)),m+=8);l&&Di(c,m,o)}(y,o);else if(y.offset>De)throw new ge(Si);return n.offset+=y.size,y}catch(t){if(p&&w||!p&&b){if(n.hasCorruptedEntries=!0,t)try{t.corruptedEntry=!0}catch(n){}p?n.offset+=f.writable.size:n.offset=f.writable.size}throw i.delete(e),t}finally{p&&n.bufferedWrites--,g&&g(),u&&u()}function v(){y.lock=new ve(n=>g=n)}async function j(){n.writerLocked=!0;const{lockWriter:e}=n;n.lockWriter=new ve(e=>u=()=>{n.writerLocked=!1,e()}),await e}async function S(n){Pi(m.localHeaderArray)>r.availableSize&&(r.availableSize=0,await Ai(n,new we))}}(n,e,t,{headerInfo:W,dataDescriptorInfo:G,metadataSize:V},a)}finally{n.pendingEntriesSize-=D}return ie.assign(K,{name:e,comment:r,extraField:R}),new qo(K)}(a,n,e,t),o.add(r),await r}catch(e){throw a.filenames.delete(n),e}finally{o.delete(r);const n=zi.shift();n?n():Ci--}}async close(n=new we,e={}){const{pendingAddFileCalls:t,writer:a}=this,{writable:o}=a;for(;t.size;)await ve.allSettled(oe.from(t));await async function(n,e,t){const{files:a,writer:o}=n,{diskOffset:i,writable:r}=o;let{diskNumber:s}=o,l=0,c=0,m=n.offset-i,d=a.size;for(const[,n]of a){const{rawFilename:e,rawExtraFieldZip64:t,rawExtraFieldAES:a,rawComment:o,rawExtraFieldNTFS:i,rawExtraField:r,extendedTimestamp:s,extraFieldExtendedTimestampFlag:l,lastModDate:m}=n;let d;if(s){d=new we(9);const n=Ni(d);Ei(n,0,We),Ei(n,2,5),Ri(n,4,l),Di(n,5,ce.floor(m.getTime()/1e3))}else d=new we;n.rawExtraFieldCDExtendedTimestamp=d,c+=46+Pi(e,o,t,a,i,d,r)}const h=new we(c),p=Ni(h);await po(o);let u=0;for(const[n,e]of oe.from(a.values()).entries()){const{offset:i,rawFilename:s,rawExtraFieldZip64:c,rawExtraFieldAES:m,rawExtraFieldCDExtendedTimestamp:d,rawExtraFieldNTFS:g,rawExtraField:w,rawComment:b,versionMadeBy:f,headerArray:k,directory:y,zip64:v,zip64UncompressedSize:j,zip64CompressedSize:S,zip64DiskNumberStart:x,zip64Offset:C,msDosCompatible:z,internalFileAttribute:L,externalFileAttribute:A,diskNumberStart:T,uncompressedSize:I,compressedSize:R}=e,E=Pi(c,m,d,g,w);Di(p,l,Oe),Ei(p,l+4,f);const D=Ni(k);j||Di(D,18,I),S||Di(D,14,R),Bi(h,k,l+6),Ei(p,l+30,E),Ei(p,l+32,Pi(b)),Ei(p,l+34,v&&x?Me:T),Ei(p,l+36,L),A?Di(p,l+38,A):y&&z&&Ri(p,l+38,16),Di(p,l+42,v&&C?De:i),Bi(h,s,l+46),Bi(h,c,l+46+Pi(s)),Bi(h,m,l+46+Pi(s,c)),Bi(h,d,l+46+Pi(s,c,m)),Bi(h,g,l+46+Pi(s,c,m,d)),Bi(h,w,l+46+Pi(s,c,m,d,g)),Bi(h,b,l+46+Pi(s)+E);const M=46+Pi(s,b)+E;if(l-u>o.availableSize&&(o.availableSize=0,await Ai(r,h.slice(u,l)),u=l),l+=M,t.onprogress)try{await t.onprogress(n+1,a.size,new qo(e))}catch(n){}}await Ai(r,u?h.slice(u):h);let g=o.diskNumber;const{availableSize:w}=o;w<Ue&&g++;let b=Ii(n,t,\"zip64\");if(m>De||c>De||d>Me||g>Me){if(!1===b)throw new ge(Si);b=!0}const f=new we(b?98:Ue),k=Ni(f);if(l=0,b){Di(k,0,Fe),Mi(k,4,le(44)),Ei(k,12,45),Ei(k,14,45),Di(k,16,g),Di(k,20,s),Mi(k,24,le(d)),Mi(k,32,le(d)),Mi(k,40,le(c)),Mi(k,48,le(m)),Di(k,56,qe),Mi(k,64,le(m)+le(c)),Di(k,72,g+1);Ii(n,t,\"supportZip64SplitFile\",!0)&&(g=Me,s=Me),d=Me,m=De,c=De,l+=76}Di(k,l,_e),Ei(k,l+4,g),Ei(k,l+6,s),Ei(k,l+8,d),Ei(k,l+10,d),Di(k,l+12,c),Di(k,l+16,m);const y=Pi(e);if(y){if(!(y<=Me))throw new ge(wi);Ei(k,l+20,y)}await Ai(r,f),y&&await Ai(r,e)}(this,n,e);return Ii(this,e,\"preventClose\")||await o.getWriter().close(),a.getData?a.getData():o}}async function Ai(n,e){const t=n.getWriter();try{await t.ready,n.size+=Pi(e),await t.write(e)}finally{t.releaseLock()}}function Ti(n){if(n)return(le(n.getTime())+le(116444736e5))*le(1e4)}function Ii(n,e,t,a){const o=e[t]===Ze?n.options[t]:e[t];return o===Ze?a:o}function Ri(n,e,t){n.setUint8(e,t)}function Ei(n,e,t){n.setUint16(e,t,!0)}function Di(n,e,t){n.setUint32(e,t,!0)}function Mi(n,e,t){n.setBigUint64(e,t,!0)}function Bi(n,e,t){n.set(e,t)}function Ni(n){return new ke(n.buffer)}function Pi(...n){let e=0;return n.forEach(n=>n&&(e+=n.length)),e}let Oi;try{Oi=\"undefined\"==typeof document&&\"undefined\"==typeof location?require(\"url\").pathToFileURL(__filename).href:\"undefined\"==typeof document?location.href:e&&\"SCRIPT\"===e.tagName.toUpperCase()&&e.src||new URL(\"single-file-extension-editor-helper.js\",document.baseURI).href}catch(n){}it({baseURL:Oi}),function(n){const e=()=>ue.createObjectURL(new ye(['const{Array:e,Object:t,Number:n,Math:s,Error:r,Uint8Array:a,Uint16Array:i,Uint32Array:o,Int32Array:l,Map:c,DataView:h,Promise:f,TextEncoder:u,crypto:p,postMessage:d,TransformStream:g,ReadableStream:w,WritableStream:y,CompressionStream:v,DecompressionStream:b}=self,m=void 0,_=\"undefined\",S=\"function\";class k{constructor(e){return class extends g{constructor(t,n){const s=new e(n);super({transform(e,t){t.enqueue(s.append(e))},flush(e){const t=s.flush();t&&e.enqueue(t)}})}}}}const z=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;z[e]=t}class D{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,s=0|e.length;s>n;n++)t=t>>>8^z[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class C extends g{constructor(){let e;const t=new D;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new a(4);new h(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const x={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],s=x.getPartial(n);return 32===s?e.concat(t):x._shiftRight(t,s,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+x.getPartial(n)},clamp(e,t){if(32*e.length<t)return e;const n=(e=e.slice(0,s.ceil(t/32))).length;return t&=31,n>0&&t&&(e[n-1]=x.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>s.round(e/1099511627776)||32,_shiftRight(e,t,n,s){for(void 0===s&&(s=[]);t>=32;t-=32)s.push(n),n=0;if(0===t)return s.concat(e);for(let r=0;r<e.length;r++)s.push(n|e[r]>>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=x.getPartial(r);return s.push(x.partial(t+a&31,t+a>32?n:s.pop(),1)),s}},I={bytes:{fromBits(e){const t=x.bitLength(e)/8,n=new a(t);let s;for(let r=0;t>r;r++)3&r||(s=e[r/4]),n[r]=s>>>24,s<<=8;return n},toBits(e){const t=[];let n,s=0;for(n=0;n<e.length;n++)s=s<<8|e[n],3&~n||(t.push(s),s=0);return 3&n&&t.push(x.partial(8*(3&n),s)),t}}},T=class{constructor(e){const t=this;t.blockSize=512,t._init=[1732584193,4023233417,2562383102,271733878,3285377520],t._key=[1518500249,1859775393,2400959708,3395469782],e?(t._h=e._h.slice(0),t._buffer=e._buffer.slice(0),t._length=e._length):t.reset()}reset(){const e=this;return e._h=e._init.slice(0),e._buffer=[],e._length=0,e}update(e){const t=this;\"string\"==typeof e&&(e=I.utf8String.toBits(e));const n=t._buffer=x.concat(t._buffer,e),s=t._length,a=t._length=s+x.bitLength(e);if(a>9007199254740991)throw new r(\"Cannot hash more than 2^53 - 1 bits\");const i=new o(n);let l=0;for(let e=t.blockSize+s-(t.blockSize+s&t.blockSize-1);a>=e;e+=t.blockSize)t._block(i.subarray(16*l,16*(l+1))),l+=1;return n.splice(0,16*l),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=x.concat(t,[x.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(s.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,s){return e>19?e>39?e>59?e>79?void 0:t^n^s:t&n|t&s|n&s:t^n^s:t&n|~t&s}_S(e,t){return t<<e|t>>>32-e}_block(t){const n=this,r=n._h,a=e(80);for(let e=0;16>e;e++)a[e]=t[e];let i=r[0],o=r[1],l=r[2],c=r[3],h=r[4];for(let e=0;79>=e;e++){16>e||(a[e]=n._S(1,a[e-3]^a[e-8]^a[e-14]^a[e-16]));const t=n._S(5,i)+n._f(e,o,l,c)+h+a[e]+n._key[s.floor(e/20)]|0;h=c,c=l,l=n._S(30,o),o=i,i=t}r[0]=r[0]+i|0,r[1]=r[1]+o|0,r[2]=r[2]+l|0,r[3]=r[3]+c|0,r[4]=r[4]+h|0}},A={getRandomValues(e){const t=new o(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(s.random()>.5?1:-1))};for(let r,a=0;a<e.length;a+=4){const e=n(4294967296*(r||s.random()));r=987654071*e(),t[a/4]=4294967296*e()|0}return e}},q={importKey:e=>new q.hmacSha1(I.bytes.toBits(e)),pbkdf2(e,t,n,s){if(n=n||1e4,0>s||0>n)throw new r(\"invalid params to pbkdf2\");const a=1+(s>>5)<<2;let i,o,l,c,f;const u=new ArrayBuffer(a),p=new h(u);let d=0;const g=x;for(t=I.bytes.toBits(t),f=1;(a||1)>d;f++){for(i=o=e.encrypt(g.concat(t,[f])),l=1;n>l;l++)for(o=e.encrypt(o),c=0;c<o.length;c++)i[c]^=o[c];for(l=0;(a||1)>d&&l<i.length;l++)p.setInt32(d,i[l]),d+=4}return u.slice(0,s/8)},hmacSha1:class{constructor(e){const t=this,n=t._hash=T,s=[[],[]];t._baseHash=[new n,new n];const r=t._baseHash[0].blockSize/32;e.length>r&&(e=(new n).update(e).finalize());for(let t=0;r>t;t++)s[0][t]=909522486^e[t],s[1][t]=1549556828^e[t];t._baseHash[0].update(s[0]),t._baseHash[1].update(s[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new r(\"encrypt on already updated hmac called!\");return this.update(e),this.digest(e)}}},R=typeof p!=_&&typeof p.getRandomValues==S,H=\"Invalid password\",P=\"Invalid signature\",B=\"zipjs-abort-check-password\";function K(e){return R?p.getRandomValues(e):A.getRandomValues(e)}const V=16,E={name:\"PBKDF2\"},U=t.assign({hash:{name:\"HMAC\"}},E),W=t.assign({iterations:1e3,hash:{name:\"SHA-1\"}},E),M=[\"deriveBits\"],N=[8,12,16],O=[16,24,32],F=10,L=[0,0,0,0],j=typeof p!=_,G=j&&p.subtle,X=j&&typeof G!=_,J=I.bytes,Q=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],s=t._tables[1],a=e.length;let i,o,l,c=1;if(4!==a&&6!==a&&8!==a)throw new r(\"invalid aes key size\");for(t._key=[o=e.slice(0),l=[]],i=a;4*a+28>i;i++){let e=o[i-1];(i%a==0||8===a&&i%a==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],i%a==0&&(e=e<<8^e>>>24^c<<24,c=c<<1^283*(c>>7))),o[i]=o[i-a]^e}for(let e=0;i;e++,i--){const t=o[3&e?i:i-4];l[e]=4>=i||4>e?t:s[0][n[t>>>24]]^s[1][n[t>>16&255]]^s[2][n[t>>8&255]]^s[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],s=t[4],r=[],a=[];let i,o,l,c;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let h=i=0;!n[h];h^=o||1,i=a[i]||1){let a=i^i<<1^i<<2^i<<3^i<<4;a=a>>8^255&a^99,n[h]=a,s[a]=h,c=r[l=r[o=r[h]]];let f=16843009*c^65537*l^257*o^16843008*h,u=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][h]=u=u<<24^u>>>8,t[n][a]=f=f<<24^f>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new r(\"invalid aes block size\");const n=this._key[t],s=n.length/4-2,a=[0,0,0,0],i=this._tables[t],o=i[0],l=i[1],c=i[2],h=i[3],f=i[4];let u,p,d,g=e[0]^n[0],w=e[t?3:1]^n[1],y=e[2]^n[2],v=e[t?1:3]^n[3],b=4;for(let e=0;s>e;e++)u=o[g>>>24]^l[w>>16&255]^c[y>>8&255]^h[255&v]^n[b],p=o[w>>>24]^l[y>>16&255]^c[v>>8&255]^h[255&g]^n[b+1],d=o[y>>>24]^l[v>>16&255]^c[g>>8&255]^h[255&w]^n[b+2],v=o[v>>>24]^l[g>>16&255]^c[w>>8&255]^h[255&y]^n[b+3],b+=4,g=u,w=p,y=d;for(let e=0;4>e;e++)a[t?3&-e:e]=f[g>>>24]<<24^f[w>>16&255]<<16^f[y>>8&255]<<8^f[255&v]^n[b++],u=g,g=w,w=y,y=v,v=u;return a}},Y=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,s=255&e;255===t?(t=0,255===n?(n=0,255===s?s=0:++s):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=s}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let s;if(!(s=t.length))return[];const r=x.bitLength(t);for(let r=0;s>r;r+=4){this.incCounter(n);const s=e.encrypt(n);t[r]^=s[0],t[r+1]^=s[1],t[r+2]^=s[2],t[r+3]^=s[3]}return x.clamp(t,r)}},Z=q.hmacSha1;let $=j&&X&&typeof G.importKey==S,ee=j&&X&&typeof G.deriveBits==S;class te extends g{constructor({password:e,rawPassword:n,signed:s,encryptionStrength:i,checkPasswordOnly:o}){super({start(){t.assign(this,{ready:new f((e=>this.resolveReady=e)),password:ae(e,n),signed:s,strength:i-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:i,resolveReady:l,ready:c}=n;s?(await(async(e,t,n,s)=>{const a=await re(e,t,n,oe(s,0,N[t])),i=oe(s,N[t]);if(a[0]!=i[0]||a[1]!=i[1])throw new r(H)})(n,i,s,oe(e,0,N[i]+2)),e=oe(e,N[i]+2),o?t.error(new r(B)):l()):await c;const h=new a(e.length-F-(e.length-F)%V);t.enqueue(se(n,e,h,0,F,!0))},async flush(e){const{signed:t,ctr:n,hmac:s,pending:i,ready:o}=this;if(s&&n){await o;const l=oe(i,0,i.length-F),c=oe(i,i.length-F);let h=new a;if(l.length){const e=ce(J,l);s.update(e);const t=n.update(e);h=le(J,t)}if(t){const e=oe(le(J,s.digest()),0,F);for(let t=0;F>t;t++)if(e[t]!=c[t])throw new r(P)}e.enqueue(h)}}})}}class ne extends g{constructor({password:e,rawPassword:n,encryptionStrength:s}){let r;super({start(){t.assign(this,{ready:new f((e=>this.resolveReady=e)),password:ae(e,n),strength:s-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:i,ready:o}=n;let l=new a;s?(l=await(async(e,t,n)=>{const s=K(new a(N[t]));return ie(s,await re(e,t,n,s))})(n,r,s),i()):await o;const c=new a(l.length+e.length-e.length%V);c.set(l,0),t.enqueue(se(n,e,c,l.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:i}=this;if(n&&t){await i;let o=new a;if(s.length){const e=t.update(ce(J,s));n.update(e),o=le(J,e)}r.signature=le(J,n.digest()).slice(0,F),e.enqueue(ie(o,r.signature))}}}),r=this}}function se(e,t,n,s,r,i){const{ctr:o,hmac:l,pending:c}=e,h=t.length-r;let f;for(c.length&&(t=ie(c,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new a(t)).set(n,0)}return e})(n,h-h%V)),f=0;h-V>=f;f+=V){const e=ce(J,oe(t,f,f+V));i&&l.update(e);const r=o.update(e);i||l.update(r),n.set(le(J,r),f+s)}return e.pending=oe(t,f),n}async function re(n,s,r,i){n.password=null;const o=await(async(e,t,n,s,r)=>{if(!$)return q.importKey(t);try{return await G.importKey(\"raw\",t,n,!1,r)}catch(e){return $=!1,q.importKey(t)}})(0,r,U,0,M),l=await(async(e,t,n)=>{if(!ee)return q.pbkdf2(t,e.salt,W.iterations,n);try{return await G.deriveBits(e,t,n)}catch(s){return ee=!1,q.pbkdf2(t,e.salt,W.iterations,n)}})(t.assign({salt:i},W),o,8*(2*O[s]+2)),c=new a(l),h=ce(J,oe(c,0,O[s])),f=ce(J,oe(c,O[s],2*O[s])),u=oe(c,2*O[s]);return t.assign(n,{keys:{key:h,authentication:f,passwordVerification:u},ctr:new Y(new Q(h),e.from(L)),hmac:new Z(f)}),u}function ae(e,t){return t===m?(e=>{if(typeof u==_){const t=new a((e=unescape(encodeURIComponent(e))).length);for(let n=0;n<t.length;n++)t[n]=e.charCodeAt(n);return t}return(new u).encode(e)})(e):t}function ie(e,t){let n=e;return e.length+t.length&&(n=new a(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function oe(e,t,n){return e.subarray(t,n)}function le(e,t){return e.fromBits(t)}function ce(e,t){return e.toBits(t)}class he extends g{constructor({password:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;if(n.password){const t=ue(n,e.subarray(0,12));if(n.password=null,t[11]!=n.passwordVerification)throw new r(H);e=e.subarray(12)}s?t.error(new r(B)):t.enqueue(ue(n,e))}})}}class fe extends g{constructor({password:e,passwordVerification:n}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;let s,r;if(n.password){n.password=null;const t=K(new a(12));t[11]=n.passwordVerification,s=new a(e.length+t.length),s.set(pe(n,t),0),r=12}else s=new a(e.length),r=0;s.set(pe(n,e),r),t.enqueue(s)}})}}function ue(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,n[s]);return n}function pe(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,t[s]);return n}function de(e,n){const s=[305419896,591751049,878082192];t.assign(e,{keys:s,crcKey0:new D(s[0]),crcKey2:new D(s[2])});for(let t=0;t<n.length;t++)ge(e,n.charCodeAt(t))}function ge(e,t){let[n,r,a]=e.keys;e.crcKey0.append([t]),n=~e.crcKey0.get(),r=ve(s.imul(ve(r+ye(n)),134775813)+1),e.crcKey2.append([r>>>24]),a=~e.crcKey2.get(),e.keys=[n,r,a]}function we(e){const t=2|e.keys[2];return ye(s.imul(t,1^t)>>>8)}function ye(e){return 255&e}function ve(e){return 4294967295&e}const be=\"deflate-raw\";class me extends g{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:s}){super({});const{compressed:r,encrypted:a,useCompressionStream:i,zipCrypto:o,signed:l,level:c}=e,f=this;let u,p,d=Se(super.readable);a&&!o||!l||(u=new C,d=De(d,u)),r&&(d=ze(d,i,{level:c,chunkSize:t},s,n)),a&&(o?d=De(d,new fe(e)):(p=new ne(e),d=De(d,p))),ke(f,d,(()=>{let e;a&&!o&&(e=p.signature),a&&!o||!l||(e=new h(u.value.buffer).getUint32(0)),f.signature=e}))}}class _e extends g{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:s}){super({});const{zipCrypto:a,encrypted:i,signed:o,signature:l,compressed:c,useCompressionStream:f}=e;let u,p,d=Se(super.readable);i&&(a?d=De(d,new he(e)):(p=new te(e),d=De(d,p))),c&&(d=ze(d,f,{chunkSize:t},s,n)),i&&!a||!o||(u=new C,d=De(d,u)),ke(this,d,(()=>{if((!i||a)&&o){const e=new h(u.value.buffer);if(l!=e.getUint32(0,!1))throw new r(P)}}))}}function Se(e){return De(e,new g({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function ke(e,n,s){n=De(n,new g({flush:s})),t.defineProperty(e,\"readable\",{get:()=>n})}function ze(e,t,n,s,r){try{e=De(e,new(t&&s?s:r)(be,n))}catch(s){if(!t)return e;try{e=De(e,new r(be,n))}catch(t){return e}}return e}function De(e,t){return e.pipeThrough(t)}const Ce=\"data\",xe=\"close\";class Ie extends g{constructor(e,n){super({});const s=this,{codecType:r}=e;let a;r.startsWith(\"deflate\")?a=me:r.startsWith(\"inflate\")&&(a=_e);let i=0,o=0;const l=new a(e,n),c=super.readable,h=new g({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){t.assign(s,{inputSize:o})}}),f=new g({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){const{signature:e}=l;t.assign(s,{signature:e,outputSize:i,inputSize:o})}});t.defineProperty(s,\"readable\",{get:()=>c.pipeThrough(h).pipeThrough(l).pipeThrough(f)})}}class Te extends g{constructor(e){let t;super({transform:function n(s,r){if(t){const e=new a(t.length+s.length);e.set(t),e.set(s,t.length),s=e,t=null}s.length>e?(r.enqueue(s.slice(0,e)),n(s.slice(e),r)):t=s},flush(e){t&&t.length&&e.enqueue(t)}})}}const Ae=new c,qe=new c;let Re,He=0,Pe=!0;async function Be(e){try{const{options:t,scripts:s,config:r}=e;if(s&&s.length)try{Pe?importScripts.apply(m,s):await Ke(s)}catch(e){Pe=!1,await Ke(s)}self.initCodec&&self.initCodec(),r.CompressionStreamNative=self.CompressionStream,r.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(r.CompressionStream=new k(self.Deflate)),self.Inflate&&(r.DecompressionStream=new k(self.Inflate));const a={highWaterMark:1},i=e.readable||new w({async pull(e){const t=new f((e=>Ae.set(He,e)));Ve({type:\"pull\",messageId:He}),He=(He+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await t;e.enqueue(s),r&&e.close()}},a),o=e.writable||new y({async write(e){let t;const s=new f((e=>t=e));qe.set(He,t),Ve({type:Ce,value:e,messageId:He}),He=(He+1)%n.MAX_SAFE_INTEGER,await s}},a),l=new Ie(t,r);Re=new AbortController;const{signal:c}=Re;await i.pipeThrough(l).pipeThrough(new Te(r.chunkSize)).pipeTo(o,{signal:c,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{signature:h,inputSize:u,outputSize:p}=l;Ve({type:xe,result:{signature:h,inputSize:u,outputSize:p}})}catch(e){Ee(e)}}async function Ke(e){for(const t of e)await import(t)}function Ve(e){let{value:t}=e;if(t)if(t.length)try{t=new a(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Ee(e=new r(\"Unknown error\")){const{message:t,stack:n,code:s,name:a}=e;d({error:{message:t,stack:n,code:s,name:a}})}addEventListener(\"message\",(({data:e})=>{const{type:t,messageId:n,value:s,done:r}=e;try{if(\"start\"==t&&Be(e),t==Ce){const e=Ae.get(n);Ae.delete(n),e({value:new a(s),done:r})}if(\"ack\"==t){const e=qe.get(n);qe.delete(n),e()}t==xe&&Re.abort()}catch(e){Ee(e)}}));var Ue=a,We=i,Me=l,Ne=new Ue([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Oe=new Ue([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Fe=new Ue([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Le=(e,t)=>{for(var n=new We(31),s=0;31>s;++s)n[s]=t+=1<<e[s-1];var r=new Me(n[30]);for(s=1;30>s;++s)for(var a=n[s];a<n[s+1];++a)r[a]=a-n[s]<<5|s;return{b:n,r:r}},je=Le(Ne,2),Ge=je.b,Xe=je.r;Ge[28]=258,Xe[258]=28;for(var Je=Le(Oe,0),Qe=Je.b,Ye=Je.r,Ze=new We(32768),$e=0;32768>$e;++$e){var et=(43690&$e)>>1|(21845&$e)<<1;et=(61680&(et=(52428&et)>>2|(13107&et)<<2))>>4|(3855&et)<<4,Ze[$e]=((65280&et)>>8|(255&et)<<8)>>1}var tt=(e,t,n)=>{for(var s=e.length,r=0,a=new We(t);s>r;++r)e[r]&&++a[e[r]-1];var i,o=new We(t);for(r=1;t>r;++r)o[r]=o[r-1]+a[r-1]<<1;if(n){i=new We(1<<t);var l=15-t;for(r=0;s>r;++r)if(e[r])for(var c=r<<4|e[r],h=t-e[r],f=o[e[r]-1]++<<h,u=f|(1<<h)-1;u>=f;++f)i[Ze[f]>>l]=c}else for(i=new We(s),r=0;s>r;++r)e[r]&&(i[r]=Ze[o[e[r]-1]++]>>15-e[r]);return i},nt=new Ue(288);for($e=0;144>$e;++$e)nt[$e]=8;for($e=144;256>$e;++$e)nt[$e]=9;for($e=256;280>$e;++$e)nt[$e]=7;for($e=280;288>$e;++$e)nt[$e]=8;var st=new Ue(32);for($e=0;32>$e;++$e)st[$e]=5;var rt=tt(nt,9,0),at=tt(nt,9,1),it=tt(st,5,0),ot=tt(st,5,1),lt=e=>{for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},ct=(e,t,n)=>{var s=t/8|0;return(e[s]|e[s+1]<<8)>>(7&t)&n},ht=(e,t)=>{var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},ft=e=>(e+7)/8|0,ut=(e,t,n)=>((null==t||0>t)&&(t=0),(null==n||n>e.length)&&(n=e.length),new Ue(e.subarray(t,n))),pt=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],dt=(e,t,n)=>{var s=new r(t||pt[e]);if(s.code=e,r.captureStackTrace&&r.captureStackTrace(s,dt),!n)throw s;return s},gt=(e,t,n)=>{n<<=7&t;var s=t/8|0;e[s]|=n,e[s+1]|=n>>8},wt=(e,t,n)=>{n<<=7&t;var s=t/8|0;e[s]|=n,e[s+1]|=n>>8,e[s+2]|=n>>16},yt=(e,t)=>{for(var n=[],s=0;s<e.length;++s)e[s]&&n.push({s:s,f:e[s]});var r=n.length,a=n.slice();if(!r)return{t:zt,l:0};if(1==r){var i=new Ue(n[0].s+1);return i[n[0].s]=1,{t:i,l:1}}n.sort(((e,t)=>e.f-t.f)),n.push({s:-1,f:25001});var o=n[0],l=n[1],c=0,h=1,f=2;for(n[0]={s:-1,f:o.f+l.f,l:o,r:l};h!=r-1;)o=n[n[c].f<n[f].f?c++:f++],l=n[c!=h&&n[c].f<n[f].f?c++:f++],n[h++]={s:-1,f:o.f+l.f,l:o,r:l};var u=a[0].s;for(s=1;r>s;++s)a[s].s>u&&(u=a[s].s);var p=new We(u+1),d=vt(n[h-1],p,0);if(d>t){s=0;var g=0,w=d-t,y=1<<w;for(a.sort(((e,t)=>p[t.s]-p[e.s]||e.f-t.f));r>s;++s){var v=a[s].s;if(p[v]<=t)break;g+=y-(1<<d-p[v]),p[v]=t}for(g>>=w;g>0;){var b=a[s].s;p[b]<t?g-=1<<t-p[b]++-1:++s}for(;s>=0&&g;--s){var m=a[s].s;p[m]==t&&(--p[m],++g)}d=t}return{t:new Ue(p),l:d}},vt=(e,t,n)=>-1==e.s?s.max(vt(e.l,t,n+1),vt(e.r,t,n+1)):t[e.s]=n,bt=e=>{for(var t=e.length;t&&!e[--t];);for(var n=new We(++t),s=0,r=e[0],a=1,i=e=>{n[s++]=e},o=1;t>=o;++o)if(e[o]==r&&o!=t)++a;else{if(!r&&a>2){for(;a>138;a-=138)i(32754);a>2&&(i(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(i(r),--a;a>6;a-=6)i(8304);a>2&&(i(a-3<<5|8208),a=0)}for(;a--;)i(r);a=1,r=e[o]}return{c:n.subarray(0,s),n:t}},mt=(e,t)=>{for(var n=0,s=0;s<t.length;++s)n+=e[s]*t[s];return n},_t=(e,t,n)=>{var s=n.length,r=ft(t+2);e[r]=255&s,e[r+1]=s>>8,e[r+2]=255^e[r],e[r+3]=255^e[r+1];for(var a=0;s>a;++a)e[r+a+4]=n[a];return 8*(r+4+s)},St=(e,t,n,s,r,a,i,o,l,c,h)=>{gt(t,h++,n),++r[256];for(var f=yt(r,15),u=f.t,p=f.l,d=yt(a,15),g=d.t,w=d.l,y=bt(u),v=y.c,b=y.n,m=bt(g),_=m.c,S=m.n,k=new We(19),z=0;z<v.length;++z)++k[31&v[z]];for(z=0;z<_.length;++z)++k[31&_[z]];for(var D=yt(k,7),C=D.t,x=D.l,I=19;I>4&&!C[Fe[I-1]];--I);var T,A,q,R,H=c+5<<3,P=mt(r,nt)+mt(a,st)+i,B=mt(r,u)+mt(a,g)+i+14+3*I+mt(k,C)+2*k[16]+3*k[17]+7*k[18];if(l>=0&&P>=H&&B>=H)return _t(t,h,e.subarray(l,l+c));if(gt(t,h,1+(P>B)),h+=2,P>B){T=tt(u,p,0),A=u,q=tt(g,w,0),R=g;var K=tt(C,x,0);for(gt(t,h,b-257),gt(t,h+5,S-1),gt(t,h+10,I-4),h+=14,z=0;I>z;++z)gt(t,h+3*z,C[Fe[z]]);h+=3*I;for(var V=[v,_],E=0;2>E;++E){var U=V[E];for(z=0;z<U.length;++z){var W=31&U[z];gt(t,h,K[W]),h+=C[W],W>15&&(gt(t,h,U[z]>>5&127),h+=U[z]>>12)}}}else T=rt,A=nt,q=it,R=st;for(z=0;o>z;++z){var M=s[z];if(M>255){wt(t,h,T[257+(W=M>>18&31)]),h+=A[W+257],W>7&&(gt(t,h,M>>23&31),h+=Ne[W]);var N=31&M;wt(t,h,q[N]),h+=R[N],N>3&&(wt(t,h,M>>5&8191),h+=Oe[N])}else wt(t,h,T[M]),h+=A[M]}return wt(t,h,T[256]),h+A[256]},kt=new Me([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),zt=new Ue(0),Dt=function(){function e(e,t){if(\"function\"==typeof e&&(t=e,e={}),this.ondata=t,this.o=e||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new Ue(98304),this.o.dictionary){var n=this.o.dictionary.subarray(-32768);this.b.set(n,32768-n.length),this.s.i=32768-n.length}}return e.prototype.p=function(e,t){this.ondata(((e,t,n,r,a)=>{if(!a&&(a={l:1},t.dictionary)){var i=t.dictionary.subarray(-32768),o=new Ue(i.length+e.length);o.set(i),o.set(e,i.length),e=o,a.w=i.length}return((e,t,n,r,a,i)=>{var o=i.z||e.length,l=new Ue(0+o+5*(1+s.ceil(o/7e3))+0),c=l.subarray(0,l.length-0),h=i.l,f=7&(i.r||0);if(t){f&&(c[0]=i.r>>3);for(var u=kt[t-1],p=u>>13,d=8191&u,g=(1<<n)-1,w=i.p||new We(32768),y=i.h||new We(g+1),v=s.ceil(n/3),b=2*v,m=t=>(e[t]^e[t+1]<<v^e[t+2]<<b)&g,_=new Me(25e3),S=new We(288),k=new We(32),z=0,D=0,C=i.i||0,x=0,I=i.w||0,T=0;o>C+2;++C){var A=m(C),q=32767&C,R=y[A];if(w[q]=R,y[A]=q,C>=I){var H=o-C;if((z>7e3||x>24576)&&(H>423||!h)){f=St(e,c,0,_,S,k,D,x,T,C-T,f),x=z=D=0,T=C;for(var P=0;286>P;++P)S[P]=0;for(P=0;30>P;++P)k[P]=0}var B=2,K=0,V=d,E=q-R&32767;if(H>2&&A==m(C-E))for(var U=s.min(p,H)-1,W=s.min(32767,C),M=s.min(258,H);W>=E&&--V&&q!=R;){if(e[C+B]==e[C+B-E]){for(var N=0;M>N&&e[C+N]==e[C+N-E];++N);if(N>B){if(B=N,K=E,N>U)break;var O=s.min(E,N-2),F=0;for(P=0;O>P;++P){var L=C-E+P&32767,j=L-w[L]&32767;j>F&&(F=j,R=L)}}}E+=(q=R)-(R=w[q])&32767}if(K){_[x++]=268435456|Xe[B]<<18|Ye[K];var G=31&Xe[B],X=31&Ye[K];D+=Ne[G]+Oe[X],++S[257+G],++k[X],I=C+B,++z}else _[x++]=e[C],++S[e[C]]}}for(C=s.max(C,I);o>C;++C)_[x++]=e[C],++S[e[C]];f=St(e,c,h,_,S,k,D,x,T,C-T,f),h||(i.r=7&f|c[f/8|0]<<3,f-=7,i.h=y,i.p=w,i.i=C,i.w=I)}else{for(C=i.w||0;o+h>C;C+=65535){var J=C+65535;o>J||(c[f/8|0]=h,J=o),f=_t(c,f+1,e.subarray(C,J))}i.i=o}return ut(l,0,0+ft(f)+0)})(e,null==t.level?6:t.level,null==t.mem?a.l?s.ceil(1.5*s.max(8,s.min(13,s.log(e.length)))):20:12+t.mem,0,0,a)})(e,this.o,0,0,this.s),t)},e.prototype.push=function(e,t){this.ondata||dt(5),this.s.l&&dt(4);var n=e.length+this.s.z;if(n>this.b.length){if(n>2*this.b.length-32768){var s=new Ue(-32768&n);s.set(this.b.subarray(0,this.s.z)),this.b=s}var r=this.b.length-this.s.z;this.b.set(e.subarray(0,r),this.s.z),this.s.z=this.b.length,this.p(this.b,!1),this.b.set(this.b.subarray(-32768)),this.b.set(e.subarray(r),32768),this.s.z=e.length-r+32768,this.s.i=32766,this.s.w=32768}else this.b.set(e,this.s.z),this.s.z+=e.length;this.s.l=1&t,(this.s.z>this.s.w+8191||t)&&(this.p(this.b,t||!1),this.s.w=this.s.i,this.s.i-=2)},e.prototype.flush=function(){this.ondata||dt(5),this.s.l&&dt(4),this.p(this.b,!1),this.s.w=this.s.i,this.s.i-=2},e}(),Ct=function(){function e(e,t){\"function\"==typeof e&&(t=e,e={}),this.ondata=t;var n=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:n?n.length:0},this.o=new Ue(32768),this.p=new Ue(0),n&&this.o.set(n)}return e.prototype.e=function(e){if(this.ondata||dt(5),this.d&&dt(4),this.p.length){if(e.length){var t=new Ue(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,n=((e,t,n)=>{var r=e.length;if(!r||t.f&&!t.l)return n||new Ue(0);var a=!n,i=a||2!=t.i,o=t.i;a&&(n=new Ue(3*r));var l=e=>{var t=n.length;if(e>t){var r=new Ue(s.max(2*t,e));r.set(n),n=r}},c=t.f||0,h=t.p||0,f=t.b||0,u=t.l,p=t.d,d=t.m,g=t.n,w=8*r;do{if(!u){c=ct(e,h,1);var y=ct(e,h+1,3);if(h+=3,!y){var v=e[(T=ft(h)+4)-4]|e[T-3]<<8,b=T+v;if(b>r){o&&dt(0);break}i&&l(f+v),n.set(e.subarray(T,b),f),t.b=f+=v,t.p=h=8*b,t.f=c;continue}if(1==y)u=at,p=ot,d=9,g=5;else if(2==y){var m=ct(e,h,31)+257,_=ct(e,h+10,15)+4,S=m+ct(e,h+5,31)+1;h+=14;for(var k=new Ue(S),z=new Ue(19),D=0;_>D;++D)z[Fe[D]]=ct(e,h+3*D,7);h+=3*_;var C=lt(z),x=(1<<C)-1,I=tt(z,C,1);for(D=0;S>D;){var T,A=I[ct(e,h,x)];if(h+=15&A,16>(T=A>>4))k[D++]=T;else{var q=0,R=0;for(16==T?(R=3+ct(e,h,3),h+=2,q=k[D-1]):17==T?(R=3+ct(e,h,7),h+=3):18==T&&(R=11+ct(e,h,127),h+=7);R--;)k[D++]=q}}var H=k.subarray(0,m),P=k.subarray(m);d=lt(H),g=lt(P),u=tt(H,d,1),p=tt(P,g,1)}else dt(1);if(h>w){o&&dt(0);break}}i&&l(f+131072);for(var B=(1<<d)-1,K=(1<<g)-1,V=h;;V=h){var E=(q=u[ht(e,h)&B])>>4;if((h+=15&q)>w){o&&dt(0);break}if(q||dt(2),256>E)n[f++]=E;else{if(256==E){V=h,u=null;break}var U=E-254;if(E>264){var W=Ne[D=E-257];U=ct(e,h,(1<<W)-1)+Ge[D],h+=W}var M=p[ht(e,h)&K],N=M>>4;if(M||dt(3),h+=15&M,P=Qe[N],N>3&&(W=Oe[N],P+=ht(e,h)&(1<<W)-1,h+=W),h>w){o&&dt(0);break}i&&l(f+131072);var O=f+U;if(P>f){var F=0-P,L=s.min(P,O);for(0>F+f&&dt(3);L>f;++f)n[f]=(void 0)[F+f]}for(;O>f;++f)n[f]=n[f-P]}}t.l=u,t.p=V,t.b=f,t.f=c,u&&(c=1,t.m=d,t.d=p,t.n=g)}while(!c);return f!=n.length&&a?ut(n,0,f):n.subarray(0,f)})(this.p,this.s,this.o);this.ondata(ut(n,t,this.s.b),this.d),this.o=ut(n,this.s.b-32768),this.s.b=this.o.length,this.p=ut(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),xt=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{xt.decode(zt,{stream:!0})}catch(e){}function It(e,n,s){return class{constructor(r){const i=this;var o,l;o=r,l=\"level\",(typeof t.hasOwn===S?t.hasOwn(o,l):o.hasOwnProperty(l))&&r.level===m&&delete r.level,i.codec=new e(t.assign({},n,r)),s(i.codec,(e=>{if(i.pendingData){const t=i.pendingData;i.pendingData=new a(t.length+e.length);const{pendingData:n}=i;n.set(t,0),n.set(e,t.length)}else i.pendingData=new a(e)}))}append(e){return this.codec.push(e),r(this)}flush(){return this.codec.push(new a,!0),r(this)}};function r(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new a}}const{Deflate:Tt,Inflate:At}=((e,t={},n)=>({Deflate:It(e.Deflate,t.deflate,n),Inflate:It(e.Inflate,t.inflate,n)}))({Deflate:Dt,Inflate:Ct},m,((e,t)=>e.ondata=t));self.initCodec=()=>{self.Deflate=Tt,self.Inflate=At};\\n'],{type:\"text/javascript\"}));n({workerScripts:{inflate:[e],deflate:[e]}})}(it);var _i=Object.freeze({__proto__:null,BlobReader:Ja,BlobWriter:Ya,Data64URIReader:class extends Va{constructor(n){super();let e=n.length;for(;\"=\"==n.charAt(e-1);)e--;const t=n.indexOf(\",\")+1;ie.assign(this,{dataURI:n,dataStart:t,size:ce.floor(.75*(e-t))})}readUint8Array(n,e){const{dataStart:t,dataURI:a}=this,o=new we(e),i=4*ce.floor(n/3),r=atob(a.substring(i+t,4*ce.ceil((n+e)/3)+t)),s=n-3*ce.floor(i/4);for(let n=s;n<s+e;n++)o[n-s]=r.charCodeAt(n);return o}},Data64URIWriter:class extends Ka{constructor(n){super(),ie.assign(this,{data:\"data:\"+(n||\"\")+\";base64,\",pending:[]})}writeUint8Array(n){const e=this;let t=0,a=e.pending;const o=e.pending.length;for(e.pending=\"\",t=0;t<3*ce.floor((o+n.length)/3)-o;t++)a+=re.fromCharCode(n[t]);for(;t<n.length;t++)e.pending+=re.fromCharCode(n[t]);a.length>2?e.data+=Ce(a):e.pending=a}getData(){return this.data+Ce(this.pending)}},ERR_BAD_FORMAT:Uo,ERR_CENTRAL_DIRECTORY_NOT_FOUND:Go,ERR_DUPLICATED_NAME:gi,ERR_ENCRYPTED:Jo,ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND:Wo,ERR_EOCDR_NOT_FOUND:Ho,ERR_EXTRAFIELD_ZIP64_NOT_FOUND:Ko,ERR_HTTP_RANGE:Oa,ERR_INVALID_COMMENT:wi,ERR_INVALID_ENCRYPTION_STRENGTH:yi,ERR_INVALID_ENTRY_COMMENT:bi,ERR_INVALID_ENTRY_NAME:fi,ERR_INVALID_EXTRAFIELD_DATA:ji,ERR_INVALID_EXTRAFIELD_TYPE:vi,ERR_INVALID_PASSWORD:yt,ERR_INVALID_SIGNATURE:vt,ERR_INVALID_VERSION:ki,ERR_ITERATOR_COMPLETED_TOO_SOON:_a,ERR_LOCAL_FILE_HEADER_NOT_FOUND:Vo,ERR_SPLIT_ZIP_FILE:$o,ERR_UNSUPPORTED_COMPRESSION:Zo,ERR_UNSUPPORTED_ENCRYPTION:Yo,ERR_UNSUPPORTED_FORMAT:Si,HttpRangeReader:class extends co{constructor(n,e={}){e.useRangeHeader=!0,super(n,e)}},HttpReader:co,Reader:Va,SplitDataReader:mo,SplitDataWriter:ho,SplitZipReader:bo,SplitZipWriter:fo,TextReader:class extends Ja{constructor(n){super(new ye([n],{type:\"text/plain\"}))}},TextWriter:class extends Ya{constructor(n){super(n),ie.assign(this,{encoding:n,utf8:!n||\"utf-8\"==n.toLowerCase()})}async getData(){const{encoding:n,utf8:e}=this,t=await super.getData();if(t.text&&e)return t.text();{const e=new FileReader;return new ve((a,o)=>{ie.assign(e,{onload:({target:n})=>a(n.result),onerror:()=>o(e.error)}),e.readAsText(t,n)})}}},Uint8ArrayReader:class extends Va{constructor(n){super(),ie.assign(this,{array:n,size:n.length})}readUint8Array(n,e){return this.array.slice(n,n+e)}},Uint8ArrayWriter:class extends Ka{init(n=0){ie.assign(this,{offset:0,array:new we(n)}),super.init()}writeUint8Array(n){const e=this;if(e.offset+n.length>e.array.length){const t=e.array;e.array=new we(t.length+n.length),e.array.set(t)}e.array.set(n,e.offset),e.offset+=n.length}getData(){return this.array}},Writer:Ka,ZipReader:ti,ZipReaderStream:class{constructor(n={}){const{readable:e,writable:t}=new ze,a=new ti(e,n).getEntriesGenerator();this.readable=new Le({async pull(n){const{done:e,value:t}=await a.next();if(e)return n.close();const o={...t,readable:function(){const{readable:n,writable:e}=new ze;if(t.getData)return t.getData(e),n}()};delete o.getData,n.enqueue(o)}}),this.writable=t}},ZipWriter:Li,ZipWriterStream:class{constructor(n={}){const{readable:e,writable:t}=new ze;this.readable=e,this.zipWriter=new Li(t,n)}transform(n){const{readable:e,writable:t}=new ze({flush:()=>{this.zipWriter.close()}});return this.zipWriter.add(n,e),{readable:this.readable,writable:t}}writable(n){const{readable:e,writable:t}=new ze;return this.zipWriter.add(n,e),t}close(n=void 0,e={}){return this.zipWriter.close(n,e)}},configure:it,getMimeType:function(){return\"application/octet-stream\"},initReader:uo,initShimAsyncCodec:function(n,e={},t){return{Deflate:st(n.Deflate,e.deflate,t),Inflate:st(n.Inflate,e.inflate,t)}},initStream:po,initWriter:go,readUint8Array:wo,terminateWorkers:async function(){await ve.allSettled(Ea.map(n=>(Na(n),n.terminate())))}}),Fi=Object.create,qi=Object.defineProperty,Ui=Object.getOwnPropertyDescriptor,Hi=Object.getOwnPropertyNames,Wi=Object.getPrototypeOf,Gi=Object.prototype.hasOwnProperty,Vi=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),Ki=(n,e)=>{for(var t in e)qi(n,t,{get:e[t],enumerable:!0})},Ji=Vi(n=>{var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");n.encode=function(n){if(0<=n&&n<e.length)return e[n];throw new TypeError(\"Must be between 0 and 63: \"+n)},n.decode=function(n){return 65<=n&&n<=90?n-65:97<=n&&n<=122?n-97+26:48<=n&&n<=57?n-48+52:43==n?62:47==n?63:-1}}),Yi=Vi(n=>{var e=Ji();n.encode=function(n){var t,a=\"\",o=function(n){return n<0?1+(-n<<1):0+(n<<1)}(n);do{t=31&o,(o>>>=5)>0&&(t|=32),a+=e.encode(t)}while(o>0);return a},n.decode=function(n,t,a){var o,i,r=n.length,s=0,l=0;do{if(t>=r)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(-1===(i=e.decode(n.charCodeAt(t++))))throw new Error(\"Invalid base64 digit: \"+n.charAt(t-1));o=!!(32&i),s+=(i&=31)<<l,l+=5}while(o);a.value=function(n){var e=n>>1;return 1&~n?e:-e}(s),a.rest=t}}),Zi=Vi(n=>{n.getArg=function(n,e,t){if(e in n)return n[e];if(3===arguments.length)return t;throw new Error('\"'+e+'\" is a required argument.')};var e=/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/,t=/^data:.+\\,.+$/;function a(n){var t=n.match(e);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function o(n){var e=\"\";return n.scheme&&(e+=n.scheme+\":\"),e+=\"//\",n.auth&&(e+=n.auth+\"@\"),n.host&&(e+=n.host),n.port&&(e+=\":\"+n.port),n.path&&(e+=n.path),e}n.urlParse=a,n.urlGenerate=o;var i=function(n){var e=[];return function(t){for(var a=0;a<e.length;a++)if(e[a].input===t){var o=e[0];return e[0]=e[a],e[a]=o,e[0].result}var i=n(t);return e.unshift({input:t,result:i}),e.length>32&&e.pop(),i}}(function(e){var t=e,i=a(e);if(i){if(!i.path)return e;t=i.path}for(var r=n.isAbsolute(t),s=[],l=0,c=0;;){if(l=c,-1===(c=t.indexOf(\"/\",l))){s.push(t.slice(l));break}for(s.push(t.slice(l,c));c<t.length&&\"/\"===t[c];)c++}var m,d=0;for(c=s.length-1;c>=0;c--)\".\"===(m=s[c])?s.splice(c,1):\"..\"===m?d++:d>0&&(\"\"===m?(s.splice(c+1,d),d=0):(s.splice(c,2),d--));return\"\"===(t=s.join(\"/\"))&&(t=r?\"/\":\".\"),i?(i.path=t,o(i)):t});function r(n,e){\"\"===n&&(n=\".\"),\"\"===e&&(e=\".\");var r=a(e),s=a(n);if(s&&(n=s.path||\"/\"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||e.match(t))return e;if(s&&!s.host&&!s.path)return s.host=e,o(s);var l=\"/\"===e.charAt(0)?e:i(n.replace(/\\/+$/,\"\")+\"/\"+e);return s?(s.path=l,o(s)):l}n.normalize=i,n.join=r,n.isAbsolute=function(n){return\"/\"===n.charAt(0)||e.test(n)},n.relative=function(n,e){\"\"===n&&(n=\".\"),n=n.replace(/\\/$/,\"\");for(var t=0;0!==e.indexOf(n+\"/\");){var a=n.lastIndexOf(\"/\");if(a<0||(n=n.slice(0,a)).match(/^([^\\/]+:\\/)?\\/*$/))return e;++t}return Array(t+1).join(\"../\")+e.substr(n.length+1)};var s=!(\"__proto__\"in Object.create(null));function l(n){return n}function c(n){if(!n)return!1;var e=n.length;if(e<9||95!==n.charCodeAt(e-1)||95!==n.charCodeAt(e-2)||111!==n.charCodeAt(e-3)||116!==n.charCodeAt(e-4)||111!==n.charCodeAt(e-5)||114!==n.charCodeAt(e-6)||112!==n.charCodeAt(e-7)||95!==n.charCodeAt(e-8)||95!==n.charCodeAt(e-9))return!1;for(var t=e-10;t>=0;t--)if(36!==n.charCodeAt(t))return!1;return!0}function m(n,e){return n===e?0:null===n?1:null===e?-1:n>e?1:-1}n.toSetString=s?l:function(n){return c(n)?\"$\"+n:n},n.fromSetString=s?l:function(n){return c(n)?n.slice(1):n},n.compareByOriginalPositions=function(n,e,t){var a=m(n.source,e.source);return 0!==a||0!==(a=n.originalLine-e.originalLine)||(0!==(a=n.originalColumn-e.originalColumn)||t)||0!==(a=n.generatedColumn-e.generatedColumn)||0!==(a=n.generatedLine-e.generatedLine)?a:m(n.name,e.name)},n.compareByOriginalPositionsNoSource=function(n,e,t){var a;return 0!==(a=n.originalLine-e.originalLine)||(0!==(a=n.originalColumn-e.originalColumn)||t)||0!==(a=n.generatedColumn-e.generatedColumn)||0!==(a=n.generatedLine-e.generatedLine)?a:m(n.name,e.name)},n.compareByGeneratedPositionsDeflated=function(n,e,t){var a=n.generatedLine-e.generatedLine;return 0!==a||(0!==(a=n.generatedColumn-e.generatedColumn)||t)||0!==(a=m(n.source,e.source))||0!==(a=n.originalLine-e.originalLine)||0!==(a=n.originalColumn-e.originalColumn)?a:m(n.name,e.name)},n.compareByGeneratedPositionsDeflatedNoLine=function(n,e,t){var a=n.generatedColumn-e.generatedColumn;return 0!==a||t||0!==(a=m(n.source,e.source))||0!==(a=n.originalLine-e.originalLine)||0!==(a=n.originalColumn-e.originalColumn)?a:m(n.name,e.name)},n.compareByGeneratedPositionsInflated=function(n,e){var t=n.generatedLine-e.generatedLine;return 0!==t||0!==(t=n.generatedColumn-e.generatedColumn)||0!==(t=m(n.source,e.source))||0!==(t=n.originalLine-e.originalLine)||0!==(t=n.originalColumn-e.originalColumn)?t:m(n.name,e.name)},n.parseSourceMapInput=function(n){return JSON.parse(n.replace(/^\\)]}'[^\\n]*\\n/,\"\"))},n.computeSourceURL=function(n,e,t){if(e=e||\"\",n&&(\"/\"!==n[n.length-1]&&\"/\"!==e[0]&&(n+=\"/\"),e=n+e),t){var s=a(t);if(!s)throw new Error(\"sourceMapURL could not be parsed\");if(s.path){var l=s.path.lastIndexOf(\"/\");l>=0&&(s.path=s.path.substring(0,l+1))}e=r(o(s),e)}return i(e)}}),$i=Vi(n=>{var e=Zi(),t=Object.prototype.hasOwnProperty,a=typeof Map<\"u\";function o(){this._array=[],this._set=a?new Map:Object.create(null)}o.fromArray=function(n,e){for(var t=new o,a=0,i=n.length;a<i;a++)t.add(n[a],e);return t},o.prototype.size=function(){return a?this._set.size:Object.getOwnPropertyNames(this._set).length},o.prototype.add=function(n,o){var i=a?n:e.toSetString(n),r=a?this.has(n):t.call(this._set,i),s=this._array.length;(!r||o)&&this._array.push(n),r||(a?this._set.set(n,s):this._set[i]=s)},o.prototype.has=function(n){if(a)return this._set.has(n);var o=e.toSetString(n);return t.call(this._set,o)},o.prototype.indexOf=function(n){if(a){var o=this._set.get(n);if(o>=0)return o}else{var i=e.toSetString(n);if(t.call(this._set,i))return this._set[i]}throw new Error('\"'+n+'\" is not in the set.')},o.prototype.at=function(n){if(n>=0&&n<this._array.length)return this._array[n];throw new Error(\"No element indexed by \"+n)},o.prototype.toArray=function(){return this._array.slice()},n.ArraySet=o}),Xi=Vi(n=>{var e=Zi();function t(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}t.prototype.unsortedForEach=function(n,e){this._array.forEach(n,e)},t.prototype.add=function(n){!function(n,t){var a=n.generatedLine,o=t.generatedLine,i=n.generatedColumn,r=t.generatedColumn;return o>a||o==a&&r>=i||e.compareByGeneratedPositionsInflated(n,t)<=0}(this._last,n)?(this._sorted=!1,this._array.push(n)):(this._last=n,this._array.push(n))},t.prototype.toArray=function(){return this._sorted||(this._array.sort(e.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=t}),Qi=Vi(n=>{var e=Yi(),t=Zi(),a=$i().ArraySet,o=Xi().MappingList;function i(n){n||(n={}),this._file=t.getArg(n,\"file\",null),this._sourceRoot=t.getArg(n,\"sourceRoot\",null),this._skipValidation=t.getArg(n,\"skipValidation\",!1),this._sources=new a,this._names=new a,this._mappings=new o,this._sourcesContents=null}i.prototype._version=3,i.fromSourceMap=function(n){var e=n.sourceRoot,a=new i({file:n.file,sourceRoot:e});return n.eachMapping(function(n){var o={generated:{line:n.generatedLine,column:n.generatedColumn}};null!=n.source&&(o.source=n.source,null!=e&&(o.source=t.relative(e,o.source)),o.original={line:n.originalLine,column:n.originalColumn},null!=n.name&&(o.name=n.name)),a.addMapping(o)}),n.sources.forEach(function(o){var i=o;null!==e&&(i=t.relative(e,o)),a._sources.has(i)||a._sources.add(i);var r=n.sourceContentFor(o);null!=r&&a.setSourceContent(o,r)}),a},i.prototype.addMapping=function(n){var e=t.getArg(n,\"generated\"),a=t.getArg(n,\"original\",null),o=t.getArg(n,\"source\",null),i=t.getArg(n,\"name\",null);this._skipValidation||this._validateMapping(e,a,o,i),null!=o&&(o=String(o),this._sources.has(o)||this._sources.add(o)),null!=i&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:e.line,generatedColumn:e.column,originalLine:null!=a&&a.line,originalColumn:null!=a&&a.column,source:o,name:i})},i.prototype.setSourceContent=function(n,e){var a=n;null!=this._sourceRoot&&(a=t.relative(this._sourceRoot,a)),null!=e?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[t.toSetString(a)]=e):this._sourcesContents&&(delete this._sourcesContents[t.toSetString(a)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},i.prototype.applySourceMap=function(n,e,o){var i=e;if(null==e){if(null==n.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\\'s \"file\" property. Both were omitted.');i=n.file}var r=this._sourceRoot;null!=r&&(i=t.relative(r,i));var s=new a,l=new a;this._mappings.unsortedForEach(function(e){if(e.source===i&&null!=e.originalLine){var a=n.originalPositionFor({line:e.originalLine,column:e.originalColumn});null!=a.source&&(e.source=a.source,null!=o&&(e.source=t.join(o,e.source)),null!=r&&(e.source=t.relative(r,e.source)),e.originalLine=a.line,e.originalColumn=a.column,null!=a.name&&(e.name=a.name))}var c=e.source;null!=c&&!s.has(c)&&s.add(c);var m=e.name;null!=m&&!l.has(m)&&l.add(m)},this),this._sources=s,this._names=l,n.sources.forEach(function(e){var a=n.sourceContentFor(e);null!=a&&(null!=o&&(e=t.join(o,e)),null!=r&&(e=t.relative(r,e)),this.setSourceContent(e,a))},this)},i.prototype._validateMapping=function(n,e,t,a){if(e&&\"number\"!=typeof e.line&&\"number\"!=typeof e.column)throw new Error(\"original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.\");if(!(n&&\"line\"in n&&\"column\"in n&&n.line>0&&n.column>=0)||e||t||a){if(n&&\"line\"in n&&\"column\"in n&&e&&\"line\"in e&&\"column\"in e&&n.line>0&&n.column>=0&&e.line>0&&e.column>=0&&t)return;throw new Error(\"Invalid mapping: \"+JSON.stringify({generated:n,source:t,original:e,name:a}))}},i.prototype._serializeMappings=function(){for(var n,a,o,i,r=0,s=1,l=0,c=0,m=0,d=0,h=\"\",p=this._mappings.toArray(),u=0,g=p.length;u<g;u++){if(n=\"\",(a=p[u]).generatedLine!==s)for(r=0;a.generatedLine!==s;)n+=\";\",s++;else if(u>0){if(!t.compareByGeneratedPositionsInflated(a,p[u-1]))continue;n+=\",\"}n+=e.encode(a.generatedColumn-r),r=a.generatedColumn,null!=a.source&&(i=this._sources.indexOf(a.source),n+=e.encode(i-d),d=i,n+=e.encode(a.originalLine-1-c),c=a.originalLine-1,n+=e.encode(a.originalColumn-l),l=a.originalColumn,null!=a.name&&(o=this._names.indexOf(a.name),n+=e.encode(o-m),m=o)),h+=n}return h},i.prototype._generateSourcesContent=function(n,e){return n.map(function(n){if(!this._sourcesContents)return null;null!=e&&(n=t.relative(e,n));var a=t.toSetString(n);return Object.prototype.hasOwnProperty.call(this._sourcesContents,a)?this._sourcesContents[a]:null},this)},i.prototype.toJSON=function(){var n={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(n.file=this._file),null!=this._sourceRoot&&(n.sourceRoot=this._sourceRoot),this._sourcesContents&&(n.sourcesContent=this._generateSourcesContent(n.sources,n.sourceRoot)),n},i.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=i});Ki({},{AtKeyword:()=>ar,BadString:()=>rr,BadUrl:()=>lr,CDC:()=>gr,CDO:()=>ur,Colon:()=>wr,Comma:()=>fr,Comment:()=>Cr,Delim:()=>cr,Dimension:()=>hr,EOF:()=>nr,Function:()=>tr,Hash:()=>or,Ident:()=>er,LeftCurlyBracket:()=>Sr,LeftParenthesis:()=>vr,LeftSquareBracket:()=>kr,Number:()=>mr,Percentage:()=>dr,RightCurlyBracket:()=>xr,RightParenthesis:()=>jr,RightSquareBracket:()=>yr,Semicolon:()=>br,String:()=>ir,Url:()=>sr,WhiteSpace:()=>pr});var nr=0,er=1,tr=2,ar=3,or=4,ir=5,rr=6,sr=7,lr=8,cr=9,mr=10,dr=11,hr=12,pr=13,ur=14,gr=15,wr=16,br=17,fr=18,kr=19,yr=20,vr=21,jr=22,Sr=23,xr=24,Cr=25;function zr(n){return n>=48&&n<=57}function Lr(n){return zr(n)||n>=65&&n<=70||n>=97&&n<=102}function Ar(n){return n>=65&&n<=90}function Tr(n){return function(n){return Ar(n)||function(n){return n>=97&&n<=122}(n)}(n)||function(n){return n>=128}(n)||95===n}function Ir(n){return Tr(n)||zr(n)||45===n}function Rr(n){return n>=0&&n<=8||11===n||n>=14&&n<=31||127===n}function Er(n){return 10===n||13===n||12===n}function Dr(n){return Er(n)||32===n||9===n}function Mr(n,e){return!(92!==n||Er(e)||0===e)}function Br(n,e,t){return 45===n?Tr(e)||45===e||Mr(e,t):!!Tr(n)||92===n&&Mr(n,e)}function Nr(n,e,t){return 43===n||45===n?zr(e)?2:46===e&&zr(t)?3:0:46===n?zr(e)?2:0:zr(n)?1:0}function Pr(n){return 65279===n||65534===n?1:0}var Or=new Array(128),_r=130;for(let n=0;n<Or.length;n++)Or[n]=(Dr(n)?_r:zr(n)&&131)||Tr(n)&&132||Rr(n)&&133||n||128;function Fr(n){return n<128?Or[n]:132}function qr(n,e){return e<n.length?n.charCodeAt(e):0}function Ur(n,e,t){return 13===t&&10===qr(n,e+1)?2:1}function Hr(n,e,t){let a=n.charCodeAt(e);return Ar(a)&&(a|=32),a===t}function Wr(n,e,t,a){if(t-e!==a.length||e<0||t>n.length)return!1;for(let o=e;o<t;o++){let t=a.charCodeAt(o-e),i=n.charCodeAt(o);if(Ar(i)&&(i|=32),i!==t)return!1}return!0}function Gr(n,e){for(;e<n.length&&Dr(n.charCodeAt(e));e++);return e}function Vr(n,e){for(;e<n.length&&zr(n.charCodeAt(e));e++);return e}function Kr(n,e){if(Lr(qr(n,(e+=2)-1))){for(let t=Math.min(n.length,e+5);e<t&&Lr(qr(n,e));e++);let t=qr(n,e);Dr(t)&&(e+=Ur(n,e,t))}return e}function Jr(n,e){for(;e<n.length;e++){let t=n.charCodeAt(e);if(!Ir(t)){if(Mr(t,qr(n,e+1))){e=Kr(n,e)-1;continue}break}}return e}function Yr(n,e){let t=n.charCodeAt(e);if((43===t||45===t)&&(t=n.charCodeAt(e+=1)),zr(t)&&(e=Vr(n,e+1),t=n.charCodeAt(e)),46===t&&zr(n.charCodeAt(e+1))&&(e=Vr(n,e+=2)),Hr(n,e,101)){let a=0;t=n.charCodeAt(e+1),(45===t||43===t)&&(a=1,t=n.charCodeAt(e+2)),zr(t)&&(e=Vr(n,e+1+a+1))}return e}function Zr(n,e){for(;e<n.length;e++){let t=n.charCodeAt(e);if(41===t){e++;break}Mr(t,qr(n,e+1))&&(e=Kr(n,e))}return e}function $r(n){if(1===n.length&&!Lr(n.charCodeAt(0)))return n[0];let e=parseInt(n,16);return(0===e||e>=55296&&e<=57343||e>1114111)&&(e=65533),String.fromCodePoint(e)}var Xr=[\"EOF-token\",\"ident-token\",\"function-token\",\"at-keyword-token\",\"hash-token\",\"string-token\",\"bad-string-token\",\"url-token\",\"bad-url-token\",\"delim-token\",\"number-token\",\"percentage-token\",\"dimension-token\",\"whitespace-token\",\"CDO-token\",\"CDC-token\",\"colon-token\",\"semicolon-token\",\"comma-token\",\"[-token\",\"]-token\",\"(-token\",\")-token\",\"{-token\",\"}-token\",\"comment-token\"];function Qr(n=null,e){return null===n||n.length<e?new Uint32Array(Math.max(e+1024,16384)):n}function ns(n){let e=n.source,t=e.length,a=e.length>0?Pr(e.charCodeAt(0)):0,o=Qr(n.lines,t),i=Qr(n.columns,t),r=n.startLine,s=n.startColumn;for(let n=a;n<t;n++){let a=e.charCodeAt(n);o[n]=r,i[n]=s++,(10===a||13===a||12===a)&&(13===a&&n+1<t&&10===e.charCodeAt(n+1)&&(n++,o[n]=r,i[n]=s),r++,s=1)}o[t]=r,i[t]=s,n.lines=o,n.columns=i,n.computed=!0}var es=class{constructor(n,e,t,a){this.setSource(n,e,t,a),this.lines=null,this.columns=null}setSource(n=\"\",e=0,t=1,a=1){this.source=n,this.startOffset=e,this.startLine=t,this.startColumn=a,this.computed=!1}getLocation(n,e){return this.computed||ns(this),{source:e,offset:this.startOffset+n,line:this.lines[n],column:this.columns[n]}}getLocationRange(n,e,t){return this.computed||ns(this),{source:t,start:{offset:this.startOffset+n,line:this.lines[n],column:this.columns[n]},end:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}}}},ts=16777215,as=24,os=new Uint8Array(32);os[2]=22,os[21]=22,os[19]=20,os[23]=24;var is=new Uint8Array(32);function rs(n,e,t){return n<e?e:n>t?t:n}is[2]=1,is[21]=1,is[19]=1,is[23]=1,is[22]=2,is[20]=2,is[24]=2;var ss=class{constructor(n,e){this.setSource(n,e)}reset(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset}setSource(n=\"\",e=()=>{}){let t=(n=String(n||\"\")).length,a=Qr(this.offsetAndType,n.length+1),o=Qr(this.balance,n.length+1),i=0,r=-1,s=0,l=n.length;this.offsetAndType=null,this.balance=null,o.fill(0),e(n,(n,e,t)=>{let c=i++;if(a[c]=n<<as|t,-1===r&&(r=e),o[c]=l,n===s){let n=o[l];o[l]=c,l=n,s=os[a[n]>>as]}else this.isBlockOpenerTokenType(n)&&(l=c,s=os[n])}),a[i]=0|t,o[i]=i;for(let n=0;n<i;n++){let e=o[n];if(e<=n){let t=o[e];t!==n&&(o[n]=t)}else e>i&&(o[n]=i)}this.source=n,this.firstCharOffset=-1===r?0:r,this.tokenCount=i,this.offsetAndType=a,this.balance=o,this.reset(),this.next()}lookupType(n){return(n+=this.tokenIndex)<this.tokenCount?this.offsetAndType[n]>>as:0}lookupTypeNonSC(n){for(let e=this.tokenIndex;e<this.tokenCount;e++){let t=this.offsetAndType[e]>>as;if(13!==t&&25!==t&&0===n--)return t}return 0}lookupOffset(n){return(n+=this.tokenIndex)<this.tokenCount?this.offsetAndType[n-1]&ts:this.source.length}lookupOffsetNonSC(n){for(let e=this.tokenIndex;e<this.tokenCount;e++){let t=this.offsetAndType[e]>>as;if(13!==t&&25!==t&&0===n--)return e-this.tokenIndex}return 0}lookupValue(n,e){return(n+=this.tokenIndex)<this.tokenCount&&Wr(this.source,this.offsetAndType[n-1]&ts,this.offsetAndType[n]&ts,e)}getTokenStart(n){return n===this.tokenIndex?this.tokenStart:n>0?n<this.tokenCount?this.offsetAndType[n-1]&ts:this.offsetAndType[this.tokenCount]&ts:this.firstCharOffset}getTokenEnd(n){return n===this.tokenIndex?this.tokenEnd:this.offsetAndType[rs(n,0,this.tokenCount)]&ts}getTokenType(n){return n===this.tokenIndex?this.tokenType:this.offsetAndType[rs(n,0,this.tokenCount)]>>as}substrToCursor(n){return this.source.substring(n,this.tokenStart)}isBlockOpenerTokenType(n){return 1===is[n]}isBlockCloserTokenType(n){return 2===is[n]}getBlockTokenPairIndex(n){let e=this.getTokenType(n);if(1===is[e]){let t=this.balance[n],a=this.getTokenType(t);return os[e]===a?t:-1}if(2===is[e]){let t=this.balance[n],a=this.getTokenType(t);return os[a]===e?t:-1}return-1}isBalanceEdge(n){return this.balance[this.tokenIndex]<n}isDelim(n,e){return e?9===this.lookupType(e)&&this.source.charCodeAt(this.lookupOffset(e))===n:9===this.tokenType&&this.source.charCodeAt(this.tokenStart)===n}skip(n){let e=this.tokenIndex+n;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.offsetAndType[e-1]&ts,e=this.offsetAndType[e],this.tokenType=e>>as,this.tokenEnd=e&ts):(this.tokenIndex=this.tokenCount,this.next())}next(){let n=this.tokenIndex+1;n<this.tokenCount?(this.tokenIndex=n,this.tokenStart=this.tokenEnd,n=this.offsetAndType[n],this.tokenType=n>>as,this.tokenEnd=n&ts):(this.eof=!0,this.tokenIndex=this.tokenCount,this.tokenType=0,this.tokenStart=this.tokenEnd=this.source.length)}skipSC(){for(;13===this.tokenType||25===this.tokenType;)this.next()}skipUntilBalanced(n,e){let t=n,a=0,o=0;n:for(;t<this.tokenCount&&(a=this.balance[t],!(a<n));t++)switch(o=t>0?this.offsetAndType[t-1]&ts:this.firstCharOffset,e(this.source.charCodeAt(o))){case 1:break n;case 2:t++;break n;default:this.isBlockOpenerTokenType(this.offsetAndType[t]>>as)&&(t=a)}this.skip(t-this.tokenIndex)}forEachToken(n){for(let e=0,t=this.firstCharOffset;e<this.tokenCount;e++){let a=t,o=this.offsetAndType[e],i=o&ts;t=i,n(o>>as,a,i,e)}}dump(){let n=new Array(this.tokenCount);return this.forEachToken((e,t,a,o)=>{n[o]={idx:o,type:Xr[e],chunk:this.source.substring(t,a),balance:this.balance[o]}}),n}};function ls(n,e){function t(e){return e<s?n.charCodeAt(e):0}function a(){return c=Yr(n,c),Br(t(c),t(c+1),t(c+2))?(r=12,void(c=Jr(n,c))):37===t(c)?(r=11,void c++):void(r=10)}function o(){let e=c;return c=Jr(n,c),Wr(n,e,c,\"url\")&&40===t(c)?(c=Gr(n,c+1),34===t(c)||39===t(c)?(r=2,void(c=e+4)):void function(){for(r=7,c=Gr(n,c);c<n.length;c++){let e=n.charCodeAt(c);switch(Fr(e)){case 41:return void c++;case _r:return c=Gr(n,c),41===t(c)||c>=n.length?void(c<n.length&&c++):(c=Zr(n,c),void(r=8));case 34:case 39:case 40:case 133:return c=Zr(n,c),void(r=8);case 92:if(Mr(e,t(c+1))){c=Kr(n,c)-1;break}return c=Zr(n,c),void(r=8)}}}()):40===t(c)?(r=2,void c++):void(r=1)}function i(e){for(e||(e=t(c++)),r=5;c<n.length;c++){let a=n.charCodeAt(c);switch(Fr(a)){case e:return void c++;case _r:if(Er(a))return c+=Ur(n,c,a),void(r=6);break;case 92:if(c===n.length-1)break;let o=t(c+1);Er(o)?c+=Ur(n,c+1,o):Mr(a,o)&&(c=Kr(n,c)-1)}}}let r,s=(n=String(n||\"\")).length,l=Pr(t(0)),c=l;for(;c<s;){let s=n.charCodeAt(c);switch(Fr(s)){case _r:r=13,c=Gr(n,c+1);break;case 34:i();break;case 35:Ir(t(c+1))||Mr(t(c+1),t(c+2))?(r=4,c=Jr(n,c+1)):(r=9,c++);break;case 39:i();break;case 40:r=21,c++;break;case 41:r=22,c++;break;case 43:Nr(s,t(c+1),t(c+2))?a():(r=9,c++);break;case 44:r=18,c++;break;case 45:Nr(s,t(c+1),t(c+2))?a():45===t(c+1)&&62===t(c+2)?(r=15,c+=3):Br(s,t(c+1),t(c+2))?o():(r=9,c++);break;case 46:Nr(s,t(c+1),t(c+2))?a():(r=9,c++);break;case 47:42===t(c+1)?(r=25,c=n.indexOf(\"*/\",c+2),c=-1===c?n.length:c+2):(r=9,c++);break;case 58:r=16,c++;break;case 59:r=17,c++;break;case 60:33===t(c+1)&&45===t(c+2)&&45===t(c+3)?(r=14,c+=4):(r=9,c++);break;case 64:Br(t(c+1),t(c+2),t(c+3))?(r=3,c=Jr(n,c+1)):(r=9,c++);break;case 91:r=19,c++;break;case 92:Mr(s,t(c+1))?o():(r=9,c++);break;case 93:r=20,c++;break;case 123:r=23,c++;break;case 125:r=24,c++;break;case 131:a();break;case 132:o();break;default:r=9,c++}e(r,l,l=c)}}var cs=null,ms=class n{static createItem(n){return{prev:null,next:null,data:n}}constructor(){this.head=null,this.tail=null,this.cursor=null}createItem(e){return n.createItem(e)}allocateCursor(n,e){let t;return null!==cs?(t=cs,cs=cs.cursor,t.prev=n,t.next=e,t.cursor=this.cursor):t={prev:n,next:e,cursor:this.cursor},this.cursor=t,t}releaseCursor(){let{cursor:n}=this;this.cursor=n.cursor,n.prev=null,n.next=null,n.cursor=cs,cs=n}updateCursors(n,e,t,a){let{cursor:o}=this;for(;null!==o;)o.prev===n&&(o.prev=e),o.next===t&&(o.next=a),o=o.cursor}*[Symbol.iterator](){for(let n=this.head;null!==n;n=n.next)yield n.data}get size(){let n=0;for(let e=this.head;null!==e;e=e.next)n++;return n}get isEmpty(){return null===this.head}get first(){return this.head&&this.head.data}get last(){return this.tail&&this.tail.data}fromArray(e){let t=null;this.head=null;for(let a of e){let e=n.createItem(a);null!==t?t.next=e:this.head=e,e.prev=t,t=e}return this.tail=t,this}toArray(){return[...this]}toJSON(){return[...this]}forEach(n,e=this){let t=this.allocateCursor(null,this.head);for(;null!==t.next;){let a=t.next;t.next=a.next,n.call(e,a.data,a,this)}this.releaseCursor()}forEachRight(n,e=this){let t=this.allocateCursor(this.tail,null);for(;null!==t.prev;){let a=t.prev;t.prev=a.prev,n.call(e,a.data,a,this)}this.releaseCursor()}reduce(n,e,t=this){let a,o=this.allocateCursor(null,this.head),i=e;for(;null!==o.next;)a=o.next,o.next=a.next,i=n.call(t,i,a.data,a,this);return this.releaseCursor(),i}reduceRight(n,e,t=this){let a,o=this.allocateCursor(this.tail,null),i=e;for(;null!==o.prev;)a=o.prev,o.prev=a.prev,i=n.call(t,i,a.data,a,this);return this.releaseCursor(),i}some(n,e=this){for(let t=this.head;null!==t;t=t.next)if(n.call(e,t.data,t,this))return!0;return!1}map(e,t=this){let a=new n;for(let n=this.head;null!==n;n=n.next)a.appendData(e.call(t,n.data,n,this));return a}filter(e,t=this){let a=new n;for(let n=this.head;null!==n;n=n.next)e.call(t,n.data,n,this)&&a.appendData(n.data);return a}nextUntil(n,e,t=this){if(null===n)return;let a=this.allocateCursor(null,n);for(;null!==a.next;){let n=a.next;if(a.next=n.next,e.call(t,n.data,n,this))break}this.releaseCursor()}prevUntil(n,e,t=this){if(null===n)return;let a=this.allocateCursor(n,null);for(;null!==a.prev;){let n=a.prev;if(a.prev=n.prev,e.call(t,n.data,n,this))break}this.releaseCursor()}clear(){this.head=null,this.tail=null}copy(){let e=new n;for(let n of this)e.appendData(n);return e}prepend(n){return this.updateCursors(null,n,this.head,n),null!==this.head?(this.head.prev=n,n.next=this.head):this.tail=n,this.head=n,this}prependData(e){return this.prepend(n.createItem(e))}append(n){return this.insert(n)}appendData(e){return this.insert(n.createItem(e))}insert(n,e=null){if(null!==e)if(this.updateCursors(e.prev,n,e,n),null===e.prev){if(this.head!==e)throw new Error(\"before doesn't belong to list\");this.head=n,e.prev=n,n.next=e,this.updateCursors(null,n)}else e.prev.next=n,n.prev=e.prev,e.prev=n,n.next=e;else this.updateCursors(this.tail,n,null,n),null!==this.tail?(this.tail.next=n,n.prev=this.tail):this.head=n,this.tail=n;return this}insertData(e,t){return this.insert(n.createItem(e),t)}remove(n){if(this.updateCursors(n,n.prev,n,n.next),null!==n.prev)n.prev.next=n.next;else{if(this.head!==n)throw new Error(\"item doesn't belong to list\");this.head=n.next}if(null!==n.next)n.next.prev=n.prev;else{if(this.tail!==n)throw new Error(\"item doesn't belong to list\");this.tail=n.prev}return n.prev=null,n.next=null,n}push(e){this.insert(n.createItem(e))}pop(){return null!==this.tail?this.remove(this.tail):null}unshift(e){this.prepend(n.createItem(e))}shift(){return null!==this.head?this.remove(this.head):null}prependList(n){return this.insertList(n,this.head)}appendList(n){return this.insertList(n)}insertList(n,e){return null===n.head||(null!=e?(this.updateCursors(e.prev,n.tail,e,n.head),null!==e.prev?(e.prev.next=n.head,n.head.prev=e.prev):this.head=n.head,e.prev=n.tail,n.tail.next=e):(this.updateCursors(this.tail,n.tail,null,n.head),null!==this.tail?(this.tail.next=n.head,n.head.prev=this.tail):this.head=n.head,this.tail=n.tail),n.head=null,n.tail=null),this}replace(n,e){\"head\"in e?this.insertList(e,n):this.insert(e,n),this.remove(n)}};function ds(n,e){let t=Object.create(SyntaxError.prototype),a=new Error;return Object.assign(t,{name:n,message:e,get stack(){return(a.stack||\"\").replace(/^(.+\\n){1,3}/,`${n}: ${e}\\n`)}})}var hs=\"    \";function ps({source:n,line:e,column:t,baseLine:a,baseColumn:o},i){function r(n,e){return s.slice(n,e).map((e,t)=>String(n+t+1).padStart(m)+\" |\"+e).join(\"\\n\")}let s=(\"\\n\".repeat(Math.max(a-1,0))+\" \".repeat(Math.max(o-1,0))+n).split(/\\r\\n?|\\n|\\f/),l=Math.max(1,e-i)-1,c=Math.min(e+i,s.length+1),m=Math.max(4,String(c).length)+1,d=0;(t+=3*(s[e-1].substr(0,t-1).match(/\\t/g)||[]).length)>100&&(d=t-60+3,t=58);for(let n=l;n<=c;n++)n>=0&&n<s.length&&(s[n]=s[n].replace(/\\t/g,hs),s[n]=(d>0&&s[n].length>d?\"…\":\"\")+s[n].substr(d,98)+(s[n].length>d+100-1?\"…\":\"\"));return[r(l,e),new Array(t+m+2).join(\"-\")+\"^\",r(e,c)].filter(Boolean).join(\"\\n\").replace(/^(\\s+\\d+\\s+\\|\\n)+/,\"\").replace(/\\n(\\s+\\d+\\s+\\|)+$/,\"\")}function us(n,e,t,a,o,i=1,r=1){return Object.assign(ds(\"SyntaxError\",n),{source:e,offset:t,line:a,column:o,sourceFragment:n=>ps({source:e,line:a,column:o,baseLine:i,baseColumn:r},isNaN(n)?0:n),get formattedMessage(){return`Parse error: ${n}\\n`+ps({source:e,line:a,column:o,baseLine:i,baseColumn:r},2)}})}function gs(n){let e=this.createList(),t=!1,a={recognizer:n};for(;!this.eof;){switch(this.tokenType){case 25:this.next();continue;case 13:t=!0,this.next();continue}let o=n.getNode.call(this,a);if(void 0===o)break;t&&(n.onWhiteSpace&&n.onWhiteSpace.call(this,o,e,a),t=!1),e.push(o)}return t&&n.onWhiteSpace&&n.onWhiteSpace.call(this,null,e,a),e}var ws=()=>{};function bs(n){return function(){return this[n]()}}function fs(n){let e=Object.create(null);for(let t of Object.keys(n)){let a=n[t],o=a.parse||a;o&&(e[t]=o)}return e}function ks(n){let e=\"\",t=\"<unknown>\",a=!1,o=ws,i=!1,r=new es,s=Object.assign(new ss,function(n){let e={context:Object.create(null),features:Object.assign(Object.create(null),n.features),scope:Object.assign(Object.create(null),n.scope),atrule:fs(n.atrule),pseudo:fs(n.pseudo),node:fs(n.node)};for(let[t,a]of Object.entries(n.parseContext))switch(typeof a){case\"function\":e.context[t]=a;break;case\"string\":e.context[t]=bs(a)}return{config:e,...e,...e.node}}(n||{}),{parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:gs,consumeUntilBalanceEnd:()=>0,consumeUntilLeftCurlyBracket:n=>123===n?1:0,consumeUntilLeftCurlyBracketOrSemicolon:n=>123===n||59===n?1:0,consumeUntilExclamationMarkOrSemicolon:n=>33===n||59===n?1:0,consumeUntilSemicolonIncluded:n=>59===n?2:0,createList:()=>new ms,createSingleNodeList:n=>(new ms).appendData(n),getFirstListNode:n=>n&&n.first,getLastListNode:n=>n&&n.last,parseWithFallback(n,e){let t=this.tokenIndex;try{return n.call(this)}catch(n){if(i)throw n;this.skip(t-this.tokenIndex);let a=e.call(this);return i=!0,o(n,a),i=!1,a}},lookupNonWSType(n){let e;do{if(e=this.lookupType(n++),13!==e&&25!==e)return e}while(0!==e);return 0},charCodeAt:n=>n>=0&&n<e.length?e.charCodeAt(n):0,substring:(n,t)=>e.substring(n,t),substrToCursor(n){return this.source.substring(n,this.tokenStart)},cmpChar:(n,t)=>Hr(e,n,t),cmpStr:(n,t,a)=>Wr(e,n,t,a),consume(n){let e=this.tokenStart;return this.eat(n),this.substrToCursor(e)},consumeFunctionName(){let n=e.substring(this.tokenStart,this.tokenEnd-1);return this.eat(2),n},consumeNumber(n){let t=e.substring(this.tokenStart,Yr(e,this.tokenStart));return this.eat(n),t},eat(n){if(this.tokenType!==n){let e=Xr[n].slice(0,-6).replace(/-/g,\" \").replace(/^./,n=>n.toUpperCase()),t=`${/[[\\](){}]/.test(e)?`\"${e}\"`:e} is expected`,a=this.tokenStart;switch(n){case 1:2===this.tokenType||7===this.tokenType?(a=this.tokenEnd-1,t=\"Identifier is expected but function found\"):t=\"Identifier is expected\";break;case 4:this.isDelim(35)&&(this.next(),a++,t=\"Name is expected\");break;case 11:10===this.tokenType&&(a=this.tokenEnd,t=\"Percent sign is expected\")}this.error(t,a)}this.next()},eatIdent(n){(1!==this.tokenType||!1===this.lookupValue(0,n))&&this.error(`Identifier \"${n}\" is expected`),this.next()},eatDelim(n){this.isDelim(n)||this.error(`Delim \"${String.fromCharCode(n)}\" is expected`),this.next()},getLocation:(n,e)=>a?r.getLocationRange(n,e,t):null,getLocationFromList(n){if(a){let e=this.getFirstListNode(n),a=this.getLastListNode(n);return r.getLocationRange(null!==e?e.loc.start.offset-r.startOffset:this.tokenStart,null!==a?a.loc.end.offset-r.startOffset:this.tokenStart,t)}return null},error(n,t){let a=typeof t<\"u\"&&t<e.length?r.getLocation(t):this.eof?r.getLocation(function(n,e){for(;e>=0&&Dr(n.charCodeAt(e));e--);return e+1}(e,e.length-1)):r.getLocation(this.tokenStart);throw new us(n||\"Unexpected input\",e,a.offset,a.line,a.column,r.startLine,r.startColumn)}});return Object.assign(function(n,l){e=n,l=l||{},s.setSource(e,ls),r.setSource(e,l.offset,l.line,l.column),t=l.filename||\"<unknown>\",a=!!l.positions,o=\"function\"==typeof l.onParseError?l.onParseError:ws,i=!1,s.parseAtrulePrelude=!(\"parseAtrulePrelude\"in l)||!!l.parseAtrulePrelude,s.parseRulePrelude=!(\"parseRulePrelude\"in l)||!!l.parseRulePrelude,s.parseValue=!(\"parseValue\"in l)||!!l.parseValue,s.parseCustomProperty=\"parseCustomProperty\"in l&&!!l.parseCustomProperty;let{context:c=\"default\",onComment:m,onToken:d}=l;if(!(c in s.context))throw new Error(\"Unknown context `\"+c+\"`\");Array.isArray(d)?s.forEachToken((n,e,t)=>{d.push({type:n,start:e,end:t})}):\"function\"==typeof d&&s.forEachToken(d.bind({filename:t,source:e,tokenCount:s.tokenCount,getTokenType:n=>s.getTokenType(n),getTokenTypeName:n=>Xr[s.getTokenType(n)],getTokenStart:n=>s.getTokenStart(n),getTokenEnd:n=>s.getTokenEnd(n),getTokenValue:n=>s.source.substring(s.getTokenStart(n),s.getTokenEnd(n)),substring:(n,e)=>s.source.substring(n,e),balance:s.balance.subarray(0,s.tokenCount+1),isBlockOpenerTokenType:s.isBlockOpenerTokenType,isBlockCloserTokenType:s.isBlockCloserTokenType,getBlockTokenPairIndex:n=>s.getBlockTokenPairIndex(n),getLocation:n=>r.getLocation(n,t),getRangeLocation:(n,e)=>r.getLocationRange(n,e,t)})),\"function\"==typeof m&&s.forEachToken((n,t,a)=>{if(25===n){let n=s.getLocation(t,a),o=Wr(e,a-2,a,\"*/\")?e.slice(t+2,a-2):e.slice(t+2,a);m(o,n)}});let h=s.context[c].call(s,l);return s.eof||s.error(),h},{SyntaxError:us,config:s.config})}var ys=((n,e,t)=>(t=null!=n?Fi(Wi(n)):{},((n,e,t,a)=>{if(e&&\"object\"==typeof e||\"function\"==typeof e)for(let o of Hi(e))!Gi.call(n,o)&&o!==t&&qi(n,o,{get:()=>e[o],enumerable:!(a=Ui(e,o))||a.enumerable});return n})(qi(t,\"default\",{value:n,enumerable:!0}),n)))(Qi()),vs=new Set([\"Atrule\",\"Selector\",\"Declaration\"]);var js={};Ki(js,{safe:()=>As,spec:()=>Ls});var Ss=(n,e)=>{if(9===n&&(n=e),\"string\"==typeof n){let e=n.charCodeAt(0);return e>127?32768:e<<8}return n},xs=[[1,1],[1,2],[1,7],[1,8],[1,\"-\"],[1,10],[1,11],[1,12],[1,15],[1,21],[3,1],[3,2],[3,7],[3,8],[3,\"-\"],[3,10],[3,11],[3,12],[3,15],[4,1],[4,2],[4,7],[4,8],[4,\"-\"],[4,10],[4,11],[4,12],[4,15],[12,1],[12,2],[12,7],[12,8],[12,\"-\"],[12,10],[12,11],[12,12],[12,15],[\"#\",1],[\"#\",2],[\"#\",7],[\"#\",8],[\"#\",\"-\"],[\"#\",10],[\"#\",11],[\"#\",12],[\"#\",15],[\"-\",1],[\"-\",2],[\"-\",7],[\"-\",8],[\"-\",\"-\"],[\"-\",10],[\"-\",11],[\"-\",12],[\"-\",15],[10,1],[10,2],[10,7],[10,8],[10,10],[10,11],[10,12],[10,\"%\"],[10,15],[\"@\",1],[\"@\",2],[\"@\",7],[\"@\",8],[\"@\",\"-\"],[\"@\",15],[\".\",10],[\".\",11],[\".\",12],[\"+\",10],[\"+\",11],[\"+\",12],[\"/\",\"*\"]],Cs=xs.concat([[1,4],[12,4],[4,4],[3,21],[3,5],[3,16],[11,11],[11,12],[11,2],[11,\"-\"],[22,1],[22,2],[22,11],[22,12],[22,4],[22,\"-\"]]);function zs(n){let e=new Set(n.map(([n,e])=>Ss(n)<<16|Ss(e)));return function(n,t,a){let o=Ss(t,a),i=a.charCodeAt(0);return(45===i&&1!==t&&2!==t&&15!==t||43===i?e.has(n<<16|i<<8):e.has(n<<16|o))&&this.emit(\" \",13,!0),o}}var Ls=zs(xs),As=zs(Cs);function Ts(n,e){if(\"function\"==typeof e){let t=null;return void n.children.forEach(n=>{null!==t&&e.call(this,t),this.node(n),t=n})}n.children.forEach(this.node,this)}function Is(n){ls(n,(e,t,a)=>{this.token(e,n.slice(t,a))})}function Rs(n){let e=new Map;for(let[t,a]of Object.entries(n.node))\"function\"==typeof(a.generate||a)&&e.set(t,a.generate||a);return function(n,t){let a=\"\",o=0,i={node(n){if(!e.has(n.type))throw new Error(\"Unknown node type: \"+n.type);e.get(n.type).call(r,n)},tokenBefore:As,token(n,e){o=this.tokenBefore(o,n,e),this.emit(e,n,!1),9===n&&92===e.charCodeAt(0)&&this.emit(\"\\n\",13,!0)},emit(n){a+=n},result:()=>a};t&&(\"function\"==typeof t.decorator&&(i=t.decorator(i)),t.sourceMap&&(i=function(n){let e=new ys.SourceMapGenerator,t={line:1,column:0},a={line:0,column:0},o={line:1,column:0},i={generated:o},r=1,s=0,l=!1,c=n.node;n.node=function(n){if(n.loc&&n.loc.start&&vs.has(n.type)){let c=n.loc.start.line,m=n.loc.start.column-1;(a.line!==c||a.column!==m)&&(a.line=c,a.column=m,t.line=r,t.column=s,l&&(l=!1,(t.line!==o.line||t.column!==o.column)&&e.addMapping(i)),l=!0,e.addMapping({source:n.loc.source,original:a,generated:t}))}c.call(this,n),l&&vs.has(n.type)&&(o.line=r,o.column=s)};let m=n.emit;n.emit=function(n,e,t){for(let e=0;e<n.length;e++)10===n.charCodeAt(e)?(r++,s=0):s++;m(n,e,t)};let d=n.result;return n.result=function(){return l&&e.addMapping(i),{css:d(),map:e}},n}(i)),t.mode in js&&(i.tokenBefore=js[t.mode]));let r={node:n=>i.node(n),children:Ts,token:(n,e)=>i.token(n,e),tokenize:Is};return i.node(n),i.result()}}var{hasOwnProperty:Es}=Object.prototype,Ds=function(){};function Ms(n){return\"function\"==typeof n?n:Ds}function Bs(n,e){return function(t,a,o){t.type===e&&n.call(this,t,a,o)}}function Ns(n,e){let t=e.structure,a=[];for(let n in t){if(!1===Es.call(t,n))continue;let e=t[n],o={name:n,type:!1,nullable:!1};Array.isArray(e)||(e=[e]);for(let n of e)null===n?o.nullable=!0:\"string\"==typeof n?o.type=\"node\":Array.isArray(n)&&(o.type=\"list\");o.type&&a.push(o)}return a.length?{context:e.walkContext,fields:a}:null}function Ps(n,e){let t=n.fields.slice(),a=n.context,o=\"string\"==typeof a;return e&&t.reverse(),function(n,i,r,s){let l;o&&(l=i[a],i[a]=n);for(let a of t){let t=n[a.name];if(!a.nullable||t)if(\"list\"===a.type){if(e?t.reduceRight(s,!1):t.reduce(s,!1))return!0}else if(r(t))return!0}o&&(i[a]=l)}}function Os({StyleSheet:n,Atrule:e,Rule:t,Block:a,DeclarationList:o}){return{Atrule:{StyleSheet:n,Atrule:e,Rule:t,Block:a},Rule:{StyleSheet:n,Atrule:e,Rule:t,Block:a},Declaration:{StyleSheet:n,Atrule:e,Rule:t,Block:a,DeclarationList:o}}}function _s(n){let e=function(n){let e={};for(let t in n.node)if(Es.call(n.node,t)){let a=n.node[t];if(!a.structure)throw new Error(\"Missed `structure` field in `\"+t+\"` node type definition\");e[t]=Ns(0,a)}return e}(n),t={},a={},o=Symbol(\"break-walk\"),i=Symbol(\"skip-node\");for(let n in e)Es.call(e,n)&&null!==e[n]&&(t[n]=Ps(e[n],!1),a[n]=Ps(e[n],!0));let r=Os(t),s=Os(a),l=function(n,l){function c(n,e,t){let a=m.call(u,n,e,t);return a===o||a!==i&&!!(h.hasOwnProperty(n.type)&&h[n.type](n,u,c,p)||d.call(u,n,e,t)===o)}let m=Ds,d=Ds,h=t,p=(n,e,t,a)=>n||c(e,t,a),u={break:o,skip:i,root:n,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if(\"function\"==typeof l)m=l;else if(l&&(m=Ms(l.enter),d=Ms(l.leave),l.reverse&&(h=a),l.visit)){if(r.hasOwnProperty(l.visit))h=l.reverse?s[l.visit]:r[l.visit];else if(!e.hasOwnProperty(l.visit))throw new Error(\"Bad value `\"+l.visit+\"` for `visit` option (should be: \"+Object.keys(e).sort().join(\", \")+\")\");m=Bs(m,l.visit),d=Bs(d,l.visit)}if(m===Ds&&d===Ds)throw new Error(\"Neither `enter` nor `leave` walker handler is set or both aren't a function\");c(n)};return l.break=o,l.skip=i,l.find=function(n,e){let t=null;return l(n,function(n,a,i){if(e.call(this,n,a,i))return t=n,o}),t},l.findLast=function(n,e){let t=null;return l(n,{reverse:!0,enter(n,a,i){if(e.call(this,n,a,i))return t=n,o}}),t},l.findAll=function(n,e){let t=[];return l(n,function(n,a,o){e.call(this,n,a,o)&&t.push(n)}),t},l}function Fs(n){return n}function qs(n,e,t,a){let o;switch(n.type){case\"Group\":o=function(n,e,t,a){let o=\" \"===n.combinator||a?n.combinator:\" \"+n.combinator+\" \",i=n.terms.map(n=>qs(n,e,t,a)).join(o);return n.explicit||t?(a||\",\"===i[0]?\"[\":\"[ \")+i+(a?\"]\":\" ]\"):i}(n,e,t,a)+(n.disallowEmpty?\"!\":\"\");break;case\"Multiplier\":return qs(n.term,e,t,a)+e(function(n){let{min:e,max:t,comma:a}=n;return 0===e&&0===t?a?\"#?\":\"*\":0===e&&1===t?\"?\":1===e&&0===t?a?\"#\":\"+\":1===e&&1===t?\"\":(a?\"#\":\"\")+(e===t?\"{\"+e+\"}\":\"{\"+e+\",\"+(0!==t?t:\"\")+\"}\")}(n),n);case\"Boolean\":o=\"<boolean-expr[\"+qs(n.term,e,t,a)+\"]>\";break;case\"Type\":o=\"<\"+n.name+(n.opts?e(function(n){if(\"Range\"===n.type)return\" [\"+(null===n.min?\"-∞\":n.min)+\",\"+(null===n.max?\"∞\":n.max)+\"]\";throw new Error(\"Unknown node type `\"+n.type+\"`\")}(n.opts),n.opts):\"\")+\">\";break;case\"Property\":o=\"<'\"+n.name+\"'>\";break;case\"Keyword\":o=n.name;break;case\"AtKeyword\":o=\"@\"+n.name;break;case\"Function\":o=n.name+\"(\";break;case\"String\":case\"Token\":o=n.value;break;case\"Comma\":o=\",\";break;default:throw new Error(\"Unknown node type `\"+n.type+\"`\")}return e(o,n)}function Us(n,e){let t=Fs,a=!1,o=!1;return\"function\"==typeof e?t=e:e&&(a=!!e.forceBraces,o=!!e.compact,\"function\"==typeof e.decorate&&(t=e.decorate)),qs(n,t,a,o)}var Hs={offset:0,line:1,column:1};function Ws(n,e){let t=n&&n.loc&&n.loc[e];return t?\"line\"in t?Gs(t):t:null}function Gs({offset:n,line:e,column:t},a){let o={offset:n,line:e,column:t};if(a){let n=a.split(/\\n|\\r\\n?|\\f/);o.offset+=a.length,o.line+=n.length-1,o.column=1===n.length?o.column+a.length:n.pop().length+1}return o}var Vs=function(n,e){let t=ds(\"SyntaxReferenceError\",n+(e?\" `\"+e+\"`\":\"\"));return t.reference=e,t},Ks=function(n,e,t,a){let o=ds(\"SyntaxMatchError\",n),{css:i,mismatchOffset:r,mismatchLength:s,start:l,end:c}=function(n,e){let t,a,o=n.tokens,i=n.longestMatch,r=i<o.length&&o[i].node||null,s=r!==e?r:null,l=0,c=0,m=0,d=\"\";for(let n=0;n<o.length;n++){let e=o[n].value;n===i&&(c=e.length,l=d.length),null!==s&&o[n].node===s&&(n<=i?m++:m=0),d+=e}return i===o.length||m>1?(t=Ws(s||e,\"end\")||Gs(Hs,d),a=Gs(t)):(t=Ws(s,\"start\")||Gs(Ws(e,\"start\")||Hs,d.slice(0,l)),a=Ws(s,\"end\")||Gs(t,d.substr(l,c))),{css:d,mismatchOffset:l,mismatchLength:c,start:t,end:a}}(a,t);return o.rawMessage=n,o.syntax=e?Us(e):\"<generic>\",o.css=i,o.mismatchOffset=r,o.mismatchLength=s,o.message=n+\"\\n  syntax: \"+o.syntax+\"\\n   value: \"+(i||\"<empty string>\")+\"\\n  --------\"+new Array(o.mismatchOffset+1).join(\"-\")+\"^\",Object.assign(o,l),o.loc={source:t&&t.loc&&t.loc.source||\"<unknown>\",start:l,end:c},o},Js=new Map,Ys=new Map,Zs=function(n){if(Js.has(n))return Js.get(n);let e=n.toLowerCase(),t=Js.get(e);if(void 0===t){let n=Xs(e,0),a=n?\"\":Qs(e,0);t=Object.freeze({basename:e.substr(a.length),name:e,prefix:a,vendor:a,custom:n})}return Js.set(n,t),t},$s=function(n){if(Ys.has(n))return Ys.get(n);let e=n,t=n[0];\"/\"===t?t=\"/\"===n[1]?\"//\":\"/\":\"_\"!==t&&\"*\"!==t&&\"$\"!==t&&\"#\"!==t&&\"+\"!==t&&\"&\"!==t&&(t=\"\");let a=Xs(e,t.length);if(!a&&(e=e.toLowerCase(),Ys.has(e))){let t=Ys.get(e);return Ys.set(n,t),t}let o=a?\"\":Qs(e,t.length),i=e.substr(0,t.length+o.length),r=Object.freeze({basename:e.substr(i.length),name:e.substr(t.length),hack:t,vendor:o,prefix:i,custom:a});return Ys.set(n,r),r};function Xs(n,e){return e=e||0,n.length-e>=2&&45===n.charCodeAt(e)&&45===n.charCodeAt(e+1)}function Qs(n,e){if(e=e||0,n.length-e>=3&&45===n.charCodeAt(e)&&45!==n.charCodeAt(e+1)){let t=n.indexOf(\"-\",e+2);if(-1!==t)return n.substring(e,t+1)}return\"\"}var nl=[\"initial\",\"inherit\",\"unset\",\"revert\",\"revert-layer\"],el=45,tl=!0;function al(n,e){return null!==n&&9===n.type&&n.value.charCodeAt(0)===e}function ol(n,e,t){for(;null!==n&&(13===n.type||25===n.type);)n=t(++e);return e}function il(n,e,t,a){if(!n)return 0;let o=n.value.charCodeAt(e);if(43===o||o===el){if(t)return 0;e++}for(;e<n.value.length;e++)if(!zr(n.value.charCodeAt(e)))return 0;return a+1}function rl(n,e,t){let a=!1,o=ol(n,e,t);if(null===(n=t(o)))return e;if(10!==n.type){if(!al(n,43)&&!al(n,el))return e;if(a=!0,o=ol(t(++o),o,t),null===(n=t(o))||10!==n.type)return 0}if(!a){let e=n.value.charCodeAt(0);if(43!==e&&e!==el)return 0}return il(n,a?0:1,a,o)}function sl(n,e){return null!==n&&9===n.type&&n.value.charCodeAt(0)===e}function ll(n,e,t){let a=0;for(let o=e;o<n.value.length;o++){let i=n.value.charCodeAt(o);if(45===i&&t&&0!==a)return ll(n,e+a+1,!1),6;if(!Lr(i)||++a>6)return 0}return a}function cl(n,e,t){if(!n)return 0;for(;sl(t(e),63);){if(++n>6)return 0;e++}return e}var ml=[\"calc(\",\"-moz-calc(\",\"-webkit-calc(\"],dl=new Map([[2,22],[21,22],[19,20],[23,24]]);function hl(n,e){return e<n.length?n.charCodeAt(e):0}function pl(n,e){return Wr(n,0,n.length,e)}function ul(n,e){for(let t=0;t<e.length;t++)if(pl(n,e[t]))return!0;return!1}function gl(n,e){return e===n.length-2&&(92===hl(n,e)&&zr(hl(n,e+1)))}function wl(n,e,t){if(n&&\"Range\"===n.type){let a=Number(void 0!==t&&t!==e.length?e.substr(0,t):e);if(isNaN(a)||null!==n.min&&a<n.min&&\"string\"!=typeof n.min||null!==n.max&&a>n.max&&\"string\"!=typeof n.max)return!0}return!1}function bl(n){return function(e,t,a){return null===e?0:2===e.type&&ul(e.value,ml)?function(n,e){let t=0,a=[],o=0;n:do{switch(n.type){case 24:case 22:case 20:if(n.type!==t)break n;if(t=a.pop(),0===a.length){o++;break n}break;case 2:case 21:case 19:case 23:a.push(t),t=dl.get(n.type)}o++}while(n=e(o));return o}(e,t):n(e,t,a)}}function fl(n){return function(e){return null===e||e.type!==n?0:1}}function kl(n){return null===n||1!==n.type||45!==hl(n.value,0)||45!==hl(n.value,1)?0:1}function yl(n){return n&&(n=new Set(n)),function(e,t,a){if(null===e||12!==e.type)return 0;let o=Yr(e.value,0);if(null!==n){let t=e.value.indexOf(\"\\\\\",o),a=-1!==t&&gl(e.value,t)?e.value.substring(o,t):e.value.substr(o);if(!1===n.has(a.toLowerCase()))return 0}return wl(a,e.value,o)?0:1}}function vl(n){return\"function\"!=typeof n&&(n=function(){return 0}),function(e,t,a){return null!==e&&10===e.type&&0===Number(e.value)?1:n(e,t,a)}}var jl={\"ident-token\":fl(1),\"function-token\":fl(2),\"at-keyword-token\":fl(3),\"hash-token\":fl(4),\"string-token\":fl(5),\"bad-string-token\":fl(6),\"url-token\":fl(7),\"bad-url-token\":fl(8),\"delim-token\":fl(9),\"number-token\":fl(10),\"percentage-token\":fl(11),\"dimension-token\":fl(12),\"whitespace-token\":fl(13),\"CDO-token\":fl(14),\"CDC-token\":fl(15),\"colon-token\":fl(16),\"semicolon-token\":fl(17),\"comma-token\":fl(18),\"[-token\":fl(19),\"]-token\":fl(20),\"(-token\":fl(21),\")-token\":fl(22),\"{-token\":fl(23),\"}-token\":fl(24)},Sl={string:fl(5),ident:fl(1),percentage:bl(function(n,e,t){return null===n||11!==n.type||wl(t,n.value,n.value.length-1)?0:1}),zero:vl(),number:bl(function(n,e,t){if(null===n)return 0;let a=Yr(n.value,0);return a!==n.value.length&&!gl(n.value,a)||wl(t,n.value,a)?0:1}),integer:bl(function(n,e,t){if(null===n||10!==n.type)return 0;let a=43===hl(n.value,0)||45===hl(n.value,0)?1:0;for(;a<n.value.length;a++)if(!zr(hl(n.value,a)))return 0;return wl(t,n.value,a)?0:1}),\"custom-ident\":function(n){if(null===n||1!==n.type)return 0;let e=n.value.toLowerCase();return ul(e,nl)||pl(e,\"default\")?0:1},\"dashed-ident\":kl,\"custom-property-name\":function(n){return kl(n)&&\"--\"!==n.value?1:0},\"hex-color\":function(n){if(null===n||4!==n.type)return 0;let e=n.value.length;if(4!==e&&5!==e&&7!==e&&9!==e)return 0;for(let t=1;t<e;t++)if(!Lr(hl(n.value,t)))return 0;return 1},\"id-selector\":function(n){return null!==n&&4===n.type&&Br(hl(n.value,1),hl(n.value,2),hl(n.value,3))?1:0},\"an-plus-b\":function(n,e){let t=0;if(!n)return 0;if(10===n.type)return il(n,0,false,t);if(1===n.type&&n.value.charCodeAt(0)===el){if(!Hr(n.value,1,110))return 0;switch(n.value.length){case 2:return rl(e(++t),t,e);case 3:return n.value.charCodeAt(2)!==el?0:(t=ol(e(++t),t,e),il(n=e(t),0,tl,t));default:return n.value.charCodeAt(2)!==el?0:il(n,3,tl,t)}}else if(1===n.type||al(n,43)&&1===e(t+1).type){if(1!==n.type&&(n=e(++t)),null===n||!Hr(n.value,0,110))return 0;switch(n.value.length){case 1:return rl(e(++t),t,e);case 2:return n.value.charCodeAt(1)!==el?0:(t=ol(e(++t),t,e),il(n=e(t),0,tl,t));default:return n.value.charCodeAt(1)!==el?0:il(n,2,tl,t)}}else if(12===n.type){let a=n.value.charCodeAt(0),o=43===a||a===el?1:0,i=o;for(;i<n.value.length&&zr(n.value.charCodeAt(i));i++);return i!==o&&Hr(n.value,i,110)?i+1===n.value.length?rl(e(++t),t,e):n.value.charCodeAt(i+1)!==el?0:i+2===n.value.length?(t=ol(e(++t),t,e),il(n=e(t),0,tl,t)):il(n,i+2,tl,t):0}return 0},urange:function(n,e){let t=0;if(null===n||1!==n.type||!Hr(n.value,0,117)||null===(n=e(++t)))return 0;if(sl(n,43))return null===(n=e(++t))?0:1===n.type?cl(ll(n,0,!0),++t,e):sl(n,63)?cl(1,++t,e):0;if(10===n.type){let a=ll(n,1,!0);return 0===a?0:null===(n=e(++t))?t:12===n.type||10===n.type?function(n,e){return n.value.charCodeAt(0)===e}(n,45)&&ll(n,1,!1)?t+1:0:cl(a,t,e)}return 12===n.type?cl(ll(n,1,!0),++t,e):0},\"declaration-value\":function(n,e){if(!n)return 0;let t=0,a=[],o=0;n:do{switch(n.type){case 6:case 8:break n;case 24:case 22:case 20:if(n.type!==t)break n;t=a.pop();break;case 17:if(0===t)break n;break;case 9:if(0===t&&\"!\"===n.value)break n;break;case 2:case 21:case 19:case 23:a.push(t),t=dl.get(n.type)}o++}while(n=e(o));return o},\"any-value\":function(n,e){if(!n)return 0;let t=0,a=[],o=0;n:do{switch(n.type){case 6:case 8:break n;case 24:case 22:case 20:if(n.type!==t)break n;t=a.pop();break;case 2:case 21:case 19:case 23:a.push(t),t=dl.get(n.type)}o++}while(n=e(o));return o}};function xl(n){let{angle:e,decibel:t,frequency:a,flex:o,length:i,resolution:r,semitones:s,time:l}=n||{};return{dimension:bl(yl(null)),angle:bl(yl(e)),decibel:bl(yl(t)),frequency:bl(yl(a)),flex:bl(yl(o)),length:bl(vl(yl(i))),resolution:bl(yl(r)),semitones:bl(yl(s)),time:bl(yl(l))}}var Cl={};Ki(Cl,{angle:()=>Ll,decibel:()=>El,flex:()=>Rl,frequency:()=>Tl,length:()=>zl,resolution:()=>Il,semitones:()=>Dl,time:()=>Al});var zl=[\"cm\",\"mm\",\"q\",\"in\",\"pt\",\"pc\",\"px\",\"em\",\"rem\",\"ex\",\"rex\",\"cap\",\"rcap\",\"ch\",\"rch\",\"ic\",\"ric\",\"lh\",\"rlh\",\"vw\",\"svw\",\"lvw\",\"dvw\",\"vh\",\"svh\",\"lvh\",\"dvh\",\"vi\",\"svi\",\"lvi\",\"dvi\",\"vb\",\"svb\",\"lvb\",\"dvb\",\"vmin\",\"svmin\",\"lvmin\",\"dvmin\",\"vmax\",\"svmax\",\"lvmax\",\"dvmax\",\"cqw\",\"cqh\",\"cqi\",\"cqb\",\"cqmin\",\"cqmax\"],Ll=[\"deg\",\"grad\",\"rad\",\"turn\"],Al=[\"s\",\"ms\"],Tl=[\"hz\",\"khz\"],Il=[\"dpi\",\"dpcm\",\"dppx\",\"x\"],Rl=[\"fr\"],El=[\"db\"],Dl=[\"st\"];function Ml(n,e,t){return Object.assign(ds(\"SyntaxError\",n),{input:e,offset:t,rawMessage:n,message:n+\"\\n  \"+e+\"\\n--\"+new Array((t||e.length)+1).join(\"-\")+\"^\"})}Ki({},{SyntaxError:()=>Ml,generate:()=>Us,parse:()=>wc,walk:()=>kc});var Bl=new Uint8Array(128).map((n,e)=>/[a-zA-Z0-9\\-]/.test(String.fromCharCode(e))?1:0),Nl=class{constructor(n){this.str=n,this.pos=0}charCodeAt(n){return n<this.str.length?this.str.charCodeAt(n):0}charCode(){return this.charCodeAt(this.pos)}isNameCharCode(n=this.charCode()){return n<128&&1===Bl[n]}nextCharCode(){return this.charCodeAt(this.pos+1)}nextNonWsCode(n){return this.charCodeAt(this.findWsEnd(n))}skipWs(){this.pos=this.findWsEnd(this.pos)}findWsEnd(n){for(;n<this.str.length;n++){let e=this.str.charCodeAt(n);if(13!==e&&10!==e&&12!==e&&32!==e&&9!==e)break}return n}substringToPos(n){return this.str.substring(this.pos,this.pos=n)}eat(n){this.charCode()!==n&&this.error(\"Expect `\"+String.fromCharCode(n)+\"`\"),this.pos++}peek(){return this.pos<this.str.length?this.str.charAt(this.pos++):\"\"}error(n){throw new Ml(n,this.str,this.pos)}scanSpaces(){return this.substringToPos(this.findWsEnd(this.pos))}scanWord(){let n=this.pos;for(;n<this.str.length;n++){let e=this.str.charCodeAt(n);if(e>=128||0===Bl[e])break}return this.pos===n&&this.error(\"Expect a keyword\"),this.substringToPos(n)}scanNumber(){let n=this.pos;for(;n<this.str.length;n++){let e=this.str.charCodeAt(n);if(e<48||e>57)break}return this.pos===n&&this.error(\"Expect a number\"),this.substringToPos(n)}scanString(){let n=this.str.indexOf(\"'\",this.pos+1);return-1===n&&(this.pos=this.str.length,this.error(\"Expect an apostrophe\")),this.substringToPos(n+1)}},Pl=9,Ol=10,_l=12,Fl=13,ql=32,Ul=33,Hl=35,Wl=38,Gl=39,Vl=40,Kl=41,Jl=42,Yl=43,Zl=44,$l=45,Xl=60,Ql=62,nc=63,ec=64,tc=91,ac=93,oc=123,ic=124,rc=125,sc=8734,lc={\" \":1,\"&&\":2,\"||\":3,\"|\":4};function cc(n){let e=null,t=null;return n.eat(oc),n.skipWs(),e=n.scanNumber(n),n.skipWs(),n.charCode()===Zl?(n.pos++,n.skipWs(),n.charCode()!==rc&&(t=n.scanNumber(n),n.skipWs())):t=e,n.eat(rc),{min:Number(e),max:t?Number(t):0}}function mc(n,e){let t=function(n){let e=null,t=!1;switch(n.charCode()){case Jl:n.pos++,e={min:0,max:0};break;case Yl:n.pos++,e={min:1,max:0};break;case nc:n.pos++,e={min:0,max:1};break;case Hl:n.pos++,t=!0,n.charCode()===oc?e=cc(n):n.charCode()===nc?(n.pos++,e={min:0,max:0}):e={min:1,max:0};break;case oc:e=cc(n);break;default:return null}return{type:\"Multiplier\",comma:t,min:e.min,max:e.max,term:null}}(n);return null!==t?(t.term=e,n.charCode()===Hl&&n.charCodeAt(n.pos-1)===Yl?mc(n,t):t):e}function dc(n){let e=n.peek();return\"\"===e?null:mc(n,{type:\"Token\",value:e})}function hc(n){let e,t=null;if(n.eat(Xl),e=n.scanWord(),\"boolean-expr\"===e){n.eat(tc);let e=uc(n,ac);return n.eat(ac),n.eat(Ql),mc(n,{type:\"Boolean\",term:1===e.terms.length?e.terms[0]:e})}return n.charCode()===Vl&&n.nextCharCode()===Kl&&(n.pos+=2,e+=\"()\"),n.charCodeAt(n.findWsEnd(n.pos))===tc&&(n.skipWs(),t=function(n){let e=null,t=null,a=1;return n.eat(tc),n.charCode()===$l&&(n.peek(),a=-1),-1==a&&n.charCode()===sc?n.peek():(e=a*Number(n.scanNumber(n)),n.isNameCharCode()&&(e+=n.scanWord())),n.skipWs(),n.eat(Zl),n.skipWs(),n.charCode()===sc?n.peek():(a=1,n.charCode()===$l&&(n.peek(),a=-1),t=a*Number(n.scanNumber(n)),n.isNameCharCode()&&(t+=n.scanWord())),n.eat(ac),{type:\"Range\",min:e,max:t}}(n)),n.eat(Ql),mc(n,{type:\"Type\",name:e,opts:t})}function pc(n,e){function t(n,e){return{type:\"Group\",terms:n,combinator:e,disallowEmpty:!1,explicit:!1}}let a;for(e=Object.keys(e).sort((n,e)=>lc[n]-lc[e]);e.length>0;){a=e.shift();let o=0,i=0;for(;o<n.length;o++){let e=n[o];\"Combinator\"===e.type&&(e.value===a?(-1===i&&(i=o-1),n.splice(o,1),o--):(-1!==i&&o-i>1&&(n.splice(i,o-i,t(n.slice(i,o),a)),o=i+1),i=-1))}-1!==i&&e.length&&n.splice(i,o-i,t(n.slice(i,o),a))}return a}function uc(n,e){let t,a=Object.create(null),o=[],i=null,r=n.pos;for(;n.charCode()!==e&&(t=gc(n,e));)\"Spaces\"!==t.type&&(\"Combinator\"===t.type?((null===i||\"Combinator\"===i.type)&&(n.pos=r,n.error(\"Unexpected combinator\")),a[t.value]=!0):null!==i&&\"Combinator\"!==i.type&&(a[\" \"]=!0,o.push({type:\"Combinator\",value:\" \"})),o.push(t),i=t,r=n.pos);return null!==i&&\"Combinator\"===i.type&&(n.pos-=r,n.error(\"Unexpected combinator\")),{type:\"Group\",terms:o,combinator:pc(o,a)||\" \",disallowEmpty:!1,explicit:!1}}function gc(n,e){let t=n.charCode();switch(t){case ac:break;case tc:return mc(n,function(n,e){let t;return n.eat(tc),t=uc(n,e),n.eat(ac),t.explicit=!0,n.charCode()===Ul&&(n.pos++,t.disallowEmpty=!0),t}(n,e));case Xl:return n.nextCharCode()===Gl?function(n){let e;return n.eat(Xl),n.eat(Gl),e=n.scanWord(),n.eat(Gl),n.eat(Ql),mc(n,{type:\"Property\",name:e})}(n):hc(n);case ic:return{type:\"Combinator\",value:n.substringToPos(n.pos+(n.nextCharCode()===ic?2:1))};case Wl:return n.pos++,n.eat(Wl),{type:\"Combinator\",value:\"&&\"};case Zl:return n.pos++,{type:\"Comma\"};case Gl:return mc(n,{type:\"String\",value:n.scanString()});case ql:case Pl:case Ol:case Fl:case _l:return{type:\"Spaces\",value:n.scanSpaces()};case ec:return t=n.nextCharCode(),n.isNameCharCode(t)?(n.pos++,{type:\"AtKeyword\",name:n.scanWord()}):dc(n);case Jl:case Yl:case nc:case Hl:case Ul:break;case oc:if(t=n.nextCharCode(),t<48||t>57)return dc(n);break;default:return n.isNameCharCode(t)?function(n){let e=n.scanWord();return n.charCode()===Vl?(n.pos++,{type:\"Function\",name:e}):mc(n,{type:\"Keyword\",name:e})}(n):dc(n)}}function wc(n){let e=new Nl(n),t=uc(e);return e.pos!==n.length&&e.error(\"Unexpected input\"),1===t.terms.length&&\"Group\"===t.terms[0].type?t.terms[0]:t}var bc=function(){};function fc(n){return\"function\"==typeof n?n:bc}function kc(n,e,t){let a=bc,o=bc;if(\"function\"==typeof e?a=e:e&&(a=fc(e.enter),o=fc(e.leave)),a===bc&&o===bc)throw new Error(\"Neither `enter` nor `leave` walker handler is set or both aren't a function\");!function n(e){switch(a.call(t,e),e.type){case\"Group\":e.terms.forEach(n);break;case\"Multiplier\":case\"Boolean\":n(e.term);break;case\"Type\":case\"Property\":case\"Keyword\":case\"AtKeyword\":case\"Function\":case\"String\":case\"Token\":case\"Comma\":break;default:throw new Error(\"Unknown type: \"+e.type)}o.call(t,e)}(n)}var yc={decorator(n){let e=[],t=null;return{...n,node(e){let a=t;t=e,n.node.call(this,e),t=a},emit(n,a,o){e.push({type:a,value:n,node:o?null:t})},result:()=>e}}};function vc(n,e){return\"string\"==typeof n?function(n){let e=[];return ls(n,(t,a,o)=>e.push({type:t,value:n.slice(a,o),node:null})),e}(n):e.generate(n,yc)}var jc={type:\"Match\"},Sc={type:\"Mismatch\"},xc={type:\"DisallowEmpty\"};function Cc(n,e,t){return e===jc&&t===Sc||n===jc&&e===jc&&t===jc?n:(\"If\"===n.type&&n.else===Sc&&e===jc&&(e=n.then,n=n.match),{type:\"If\",match:n,then:e,else:t})}function zc(n){return n.length>2&&40===n.charCodeAt(n.length-2)&&41===n.charCodeAt(n.length-1)}function Lc(n){return\"Keyword\"===n.type||\"AtKeyword\"===n.type||\"Function\"===n.type||\"Type\"===n.type&&zc(n.name)}function Ac(n,e=\" \",t=!1){return{type:\"Group\",terms:n,combinator:e,disallowEmpty:!1,explicit:t}}function Tc(n,e,t=new Set){if(!t.has(n))switch(t.add(n),n.type){case\"If\":n.match=Tc(n.match,e,t),n.then=Tc(n.then,e,t),n.else=Tc(n.else,e,t);break;case\"Type\":return e[n.name]||n}return n}function Ic(n,e,t){switch(n){case\" \":{let n=jc;for(let t=e.length-1;t>=0;t--){n=Cc(e[t],n,Sc)}return n}case\"|\":{let n=Sc,t=null;for(let a=e.length-1;a>=0;a--){let o=e[a];if(Lc(o)&&(null===t&&a>0&&Lc(e[a-1])&&(t=Object.create(null),n=Cc({type:\"Enum\",map:t},jc,n)),null!==t)){let n=(zc(o.name)?o.name.slice(0,-1):o.name).toLowerCase();if(!(n in t)){t[n]=o;continue}}t=null,n=Cc(o,jc,n)}return n}case\"&&\":{if(e.length>5)return{type:\"MatchOnce\",terms:e,all:!0};let t=Sc;for(let a=e.length-1;a>=0;a--){let o,i=e[a];o=e.length>1?Ic(n,e.filter(function(n){return n!==i}),!1):jc,t=Cc(i,o,t)}return t}case\"||\":{if(e.length>5)return{type:\"MatchOnce\",terms:e,all:!1};let a=t?jc:Sc;for(let t=e.length-1;t>=0;t--){let o,i=e[t];o=e.length>1?Ic(n,e.filter(function(n){return n!==i}),!0):jc,a=Cc(i,o,a)}return a}}}function Rc(n){if(\"function\"==typeof n)return{type:\"Generic\",fn:n};switch(n.type){case\"Group\":{let e=Ic(n.combinator,n.terms.map(Rc),!1);return n.disallowEmpty&&(e=Cc(e,xc,Sc)),e}case\"Multiplier\":return function(n){let e=jc,t=Rc(n.term);if(0===n.max)t=Cc(t,xc,Sc),e=Cc(t,null,Sc),e.then=Cc(jc,jc,e),n.comma&&(e.then.else=Cc({type:\"Comma\",syntax:n},e,Sc));else for(let a=n.min||1;a<=n.max;a++)n.comma&&e!==jc&&(e=Cc({type:\"Comma\",syntax:n},e,Sc)),e=Cc(t,Cc(jc,jc,e),Sc);if(0===n.min)e=Cc(jc,jc,e);else for(let a=0;a<n.min-1;a++)n.comma&&e!==jc&&(e=Cc({type:\"Comma\",syntax:n},e,Sc)),e=Cc(t,e,Sc);return e}(n);case\"Boolean\":{let e=Rc(n.term),t=Rc(Ac([Ac([{type:\"Keyword\",name:\"not\"},{type:\"Type\",name:\"!boolean-group\"}]),Ac([{type:\"Type\",name:\"!boolean-group\"},Ac([{type:\"Multiplier\",comma:!1,min:0,max:0,term:Ac([{type:\"Keyword\",name:\"and\"},{type:\"Type\",name:\"!boolean-group\"}])},{type:\"Multiplier\",comma:!1,min:0,max:0,term:Ac([{type:\"Keyword\",name:\"or\"},{type:\"Type\",name:\"!boolean-group\"}])}],\"|\")])],\"|\")),a=Rc(Ac([{type:\"Type\",name:\"!term\"},Ac([{type:\"Token\",value:\"(\"},{type:\"Type\",name:\"!self\"},{type:\"Token\",value:\")\"}]),{type:\"Type\",name:\"general-enclosed\"}],\"|\"));return Tc(a,{\"!term\":e,\"!self\":t}),Tc(t,{\"!boolean-group\":a}),t}case\"Type\":case\"Property\":return{type:n.type,name:n.name,syntax:n};case\"Keyword\":return{type:n.type,name:n.name.toLowerCase(),syntax:n};case\"AtKeyword\":return{type:n.type,name:\"@\"+n.name.toLowerCase(),syntax:n};case\"Function\":return{type:n.type,name:n.name.toLowerCase()+\"(\",syntax:n};case\"String\":return 3===n.value.length?{type:\"Token\",value:n.value.charAt(1),syntax:n}:{type:n.type,value:n.value.substr(1,n.value.length-2).replace(/\\\\'/g,\"'\"),syntax:n};case\"Token\":return{type:n.type,value:n.value,syntax:n};case\"Comma\":return{type:n.type,syntax:n};default:throw new Error(\"Unknown node type:\",n.type)}}function Ec(n,e){return\"string\"==typeof n&&(n=wc(n)),{type:\"MatchGraph\",match:Rc(n),syntax:e||null,source:n}}var{hasOwnProperty:Dc}=Object.prototype,Mc=\"Match\";function Bc(n,e){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++){let a=e.charCodeAt(t),o=n.charCodeAt(t);if(o>=65&&o<=90&&(o|=32),o!==a)return!1}return!0}function Nc(n){return null===n||(18===n.type||2===n.type||21===n.type||19===n.type||23===n.type||function(n){return 9===n.type&&\"?\"!==n.value}(n))}function Pc(n){return null===n||(22===n.type||20===n.type||24===n.type||9===n.type&&\"/\"===n.value)}function Oc(n,e,t){let a=function(n,e,t){function a(){do{f++,b=f<n.length?n[f]:null}while(null!==b&&(13===b.type||25===b.type))}function o(e){let t=f+e;return t<n.length?n[t]:null}function i(n,e){return{nextState:n,matchStack:y,syntaxStack:d,thenStack:h,tokenIndex:f,prev:e}}function r(n){h={nextState:n,matchStack:y,syntaxStack:d,prev:h}}function s(n){p=i(n,p)}function l(){y={type:1,syntax:e.syntax,token:b,prev:y},a(),u=null,f>k&&(k=f)}function c(){d={syntax:e.syntax,opts:e.syntax.opts||null!==d&&d.opts||null,prev:d},y={type:2,syntax:e.syntax,token:y.token,prev:y}}function m(){y=2===y.type?y.prev:{type:3,syntax:d.syntax,token:y.token,prev:y},d=d.prev}let d=null,h=null,p=null,u=null,g=0,w=null,b=null,f=-1,k=0,y={type:0,syntax:null,token:null,prev:null};for(a();null===w&&++g<15e3;)switch(e.type){case\"Match\":if(null===h){if(null!==b&&(f!==n.length-1||\"\\\\0\"!==b.value&&\"\\\\9\"!==b.value)){e=Sc;break}w=Mc;break}if((e=h.nextState)===xc){if(h.matchStack===y){e=Sc;break}e=jc}for(;h.syntaxStack!==d;)m();h=h.prev;break;case\"Mismatch\":if(null!==u&&!1!==u)(null===p||f>p.tokenIndex)&&(p=u,u=!1);else if(null===p){w=\"Mismatch\";break}e=p.nextState,h=p.thenStack,d=p.syntaxStack,y=p.matchStack,f=p.tokenIndex,b=f<n.length?n[f]:null,p=p.prev;break;case\"MatchGraph\":e=e.match;break;case\"If\":e.else!==Sc&&s(e.else),e.then!==jc&&r(e.then),e=e.match;break;case\"MatchOnce\":e={type:\"MatchOnceBuffer\",syntax:e,index:0,mask:0};break;case\"MatchOnceBuffer\":{let n=e.syntax.terms;if(e.index===n.length){if(0===e.mask||e.syntax.all){e=Sc;break}e=jc;break}if(e.mask===(1<<n.length)-1){e=jc;break}for(;e.index<n.length;e.index++){let t=1<<e.index;if(!(e.mask&t)){s(e),r({type:\"AddMatchOnce\",syntax:e.syntax,mask:e.mask|t}),e=n[e.index++];break}}break}case\"AddMatchOnce\":e={type:\"MatchOnceBuffer\",syntax:e.syntax,index:0,mask:e.mask};break;case\"Enum\":if(null!==b){let n=b.value.toLowerCase();if(-1!==n.indexOf(\"\\\\\")&&(n=n.replace(/\\\\[09].*$/,\"\")),Dc.call(e.map,n)){e=e.map[n];break}}e=Sc;break;case\"Generic\":{let n=null!==d?d.opts:null,t=f+Math.floor(e.fn(b,o,n));if(!isNaN(t)&&t>f){for(;f<t;)l();e=jc}else e=Sc;break}case\"Type\":case\"Property\":{let n=\"Type\"===e.type?\"types\":\"properties\",a=Dc.call(t,n)?t[n][e.name]:null;if(!a||!a.match)throw new Error(\"Bad syntax reference: \"+(\"Type\"===e.type?\"<\"+e.name+\">\":\"<'\"+e.name+\"'>\"));if(!1!==u&&null!==b&&\"Type\"===e.type&&(\"custom-ident\"===e.name&&1===b.type||\"length\"===e.name&&\"0\"===b.value)){null===u&&(u=i(e,p)),e=Sc;break}c(),e=a.matchRef||a.match;break}case\"Keyword\":{let n=e.name;if(null!==b){let t=b.value;if(-1!==t.indexOf(\"\\\\\")&&(t=t.replace(/\\\\[09].*$/,\"\")),Bc(t,n)){l(),e=jc;break}}e=Sc;break}case\"AtKeyword\":case\"Function\":if(null!==b&&Bc(b.value,e.name)){l(),e=jc;break}e=Sc;break;case\"Token\":if(null!==b&&b.value===e.value){l(),e=jc;break}e=Sc;break;case\"Comma\":null!==b&&18===b.type?Nc(y.token)?e=Sc:(l(),e=Pc(b)?Sc:jc):e=Nc(y.token)||Pc(b)?jc:Sc;break;case\"String\":let a=\"\",g=f;for(;g<n.length&&a.length<e.value.length;g++)a+=n[g].value;if(Bc(a,e.value)){for(;f<g;)l();e=jc}else e=Sc;break;default:throw new Error(\"Unknown node type: \"+e.type)}switch(w){case null:console.warn(\"[csstree-match] BREAK after 15000 iterations\"),w=\"Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)\",y=null;break;case Mc:for(;null!==d;)m();break;default:y=null}return{tokens:n,reason:w,iterations:g,match:y,longestMatch:k}}(n,e,t||{});if(null===a.match)return a;let o=a.match,i=a.match={syntax:e.syntax||null,match:[]},r=[i];for(o=function(n){let e=null,t=null,a=n;for(;null!==a;)t=a.prev,a.prev=e,e=a,a=t;return e}(o).prev;null!==o;){switch(o.type){case 2:i.match.push(i={syntax:o.syntax,match:[]}),r.push(i);break;case 3:r.pop(),i=r[r.length-1];break;default:i.match.push({syntax:o.syntax||null,token:o.token.value,node:o.token.node})}o=o.prev}return a}var _c={};function Fc(n){function e(n){return null!==n&&(\"Type\"===n.type||\"Property\"===n.type||\"Keyword\"===n.type)}let t=null;return null!==this.matched&&function a(o){if(Array.isArray(o.match)){for(let n=0;n<o.match.length;n++)if(a(o.match[n]))return e(o.syntax)&&t.unshift(o.syntax),!0}else if(o.node===n)return t=e(o.syntax)?[o.syntax]:[],!0;return!1}(this.matched),t}function qc(n,e){return Wc(this,n,n=>\"Type\"===n.type&&n.name===e)}function Uc(n,e){return Wc(this,n,n=>\"Property\"===n.type&&n.name===e)}function Hc(n){return Wc(this,n,n=>\"Keyword\"===n.type)}function Wc(n,e,t){let a=Fc.call(n,e);return null!==a&&a.some(t)}function Gc(n){return\"node\"in n?n.node:Gc(n.match[0])}function Vc(n){return\"node\"in n?n.node:Vc(n.match[n.match.length-1])}function Kc(n,e,t,a,o){let i=[];return null!==t.matched&&function t(r){if(null!==r.syntax&&r.syntax.type===a&&r.syntax.name===o){let t=Gc(r),a=Vc(r);n.syntax.walk(e,function(n,e,o){if(n===t){let n=new ms;do{if(n.appendData(e.data),e.data===a)break;e=e.next}while(null!==e);i.push({parent:o,nodes:n})}})}Array.isArray(r.match)&&r.match.forEach(t)}(t.matched),i}Ki(_c,{getTrace:()=>Fc,isKeyword:()=>Hc,isProperty:()=>Uc,isType:()=>qc});var{hasOwnProperty:Jc}=Object.prototype;function Yc(n){return\"number\"==typeof n&&isFinite(n)&&Math.floor(n)===n&&n>=0}function Zc(n){return!!n&&Yc(n.offset)&&Yc(n.line)&&Yc(n.column)}function $c(n,e){return function(t,a){if(!t||t.constructor!==Object)return a(t,\"Type of node should be an Object\");for(let o in t){let i=!0;if(!1!==Jc.call(t,o)){if(\"type\"===o)t.type!==n&&a(t,\"Wrong node type `\"+t.type+\"`, expected `\"+n+\"`\");else if(\"loc\"===o){if(null===t.loc)continue;if(t.loc&&t.loc.constructor===Object)if(\"string\"!=typeof t.loc.source)o+=\".source\";else if(Zc(t.loc.start)){if(Zc(t.loc.end))continue;o+=\".end\"}else o+=\".start\";i=!1}else if(e.hasOwnProperty(o)){i=!1;for(let n=0;!i&&n<e[o].length;n++){let a=e[o][n];switch(a){case String:i=\"string\"==typeof t[o];break;case Boolean:i=\"boolean\"==typeof t[o];break;case null:i=null===t[o];break;default:\"string\"==typeof a?i=t[o]&&t[o].type===a:Array.isArray(a)&&(i=t[o]instanceof ms)}}}else a(t,\"Unknown field `\"+o+\"` for \"+n+\" node type\");i||a(t,\"Bad value for `\"+n+\".\"+o+\"`\")}}for(let o in e)Jc.call(e,o)&&!1===Jc.call(t,o)&&a(t,\"Field `\"+n+\".\"+o+\"` is missed\")}}function Xc(n,e){let t=[];for(let a=0;a<n.length;a++){let o=n[a];if(o===String||o===Boolean)t.push(o.name.toLowerCase());else if(null===o)t.push(\"null\");else if(\"string\"==typeof o)t.push(o);else{if(!Array.isArray(o))throw new Error(\"Wrong value `\"+o+\"` in `\"+e+\"` structure definition\");t.push(\"List<\"+(Xc(o,e)||\"any\")+\">\")}}return t.join(\" | \")}function Qc(n,e){let t=e.structure,a={type:String,loc:!0},o={type:'\"'+n+'\"'};for(let e in t){if(!1===Jc.call(t,e))continue;let i=a[e]=Array.isArray(t[e])?t[e].slice():[t[e]];o[e]=Xc(i,n+\".\"+e)}return{docs:o,check:$c(n,a)}}function nm(n,e,t){let a={};for(let o in n)n[o].syntax&&(a[o]=t?n[o].syntax:Us(n[o].syntax,{compact:e}));return a}function em(n,e,t){let a={};for(let[o,i]of Object.entries(n))a[o]={prelude:i.prelude&&(t?i.prelude.syntax:Us(i.prelude.syntax,{compact:e})),descriptors:i.descriptors&&nm(i.descriptors,e,t)};return a}function tm(n,e,t){return{matched:n,iterations:t,error:e,..._c}}function am(n,e,t,a){let o,i=vc(t,n.syntax);return function(n){for(let e=0;e<n.length;e++)if(\"var(\"===n[e].value.toLowerCase())return!0;return!1}(i)?tm(null,new Error(\"Matching for a tree with var() is not supported\")):(a&&(o=Oc(i,n.cssWideKeywordsSyntax,n)),a&&o.match||(o=Oc(i,e.match,n),o.match)?tm(o.match,null,o.iterations):tm(null,new Ks(o.reason,e.syntax,t,o),o.iterations))}var om=class{constructor(n,e,t){if(this.cssWideKeywords=nl,this.syntax=e,this.generic=!1,this.units={...Cl},this.atrules=Object.create(null),this.properties=Object.create(null),this.types=Object.create(null),this.structure=t||function(n){let e={};if(n.node)for(let t in n.node)if(Jc.call(n.node,t)){let a=n.node[t];if(!a.structure)throw new Error(\"Missed `structure` field in `\"+t+\"` node type definition\");e[t]=Qc(t,a)}return e}(n),n){if(n.cssWideKeywords&&(this.cssWideKeywords=n.cssWideKeywords),n.units)for(let e of Object.keys(Cl))Array.isArray(n.units[e])&&(this.units[e]=n.units[e]);if(n.types)for(let[e,t]of Object.entries(n.types))this.addType_(e,t);if(n.generic){this.generic=!0;for(let[n,e]of Object.entries(function(n){return{...jl,...Sl,...xl(n)}}(this.units)))this.addType_(n,e)}if(n.atrules)for(let[e,t]of Object.entries(n.atrules))this.addAtrule_(e,t);if(n.properties)for(let[e,t]of Object.entries(n.properties))this.addProperty_(e,t)}this.cssWideKeywordsSyntax=Ec(this.cssWideKeywords.join(\" |  \"))}checkStructure(n){function e(n,e){a.push({node:n,message:e})}let t=this.structure,a=[];return this.syntax.walk(n,function(n){t.hasOwnProperty(n.type)?t[n.type].check(n,e):e(n,\"Unknown node type `\"+n.type+\"`\")}),!!a.length&&a}createDescriptor(n,e,t,a=null){let o={type:e,name:t},i={type:e,name:t,parent:a,serializable:\"string\"==typeof n||n&&\"string\"==typeof n.type,syntax:null,match:null,matchRef:null};return\"function\"==typeof n?i.match=Ec(n,o):(\"string\"==typeof n?Object.defineProperty(i,\"syntax\",{get:()=>(Object.defineProperty(i,\"syntax\",{value:wc(n)}),i.syntax)}):i.syntax=n,Object.defineProperty(i,\"match\",{get:()=>(Object.defineProperty(i,\"match\",{value:Ec(i.syntax,o)}),i.match)}),\"Property\"===e&&Object.defineProperty(i,\"matchRef\",{get(){let n=i.syntax,e=function(n){let e=n.terms[0];return!1===n.explicit&&1===n.terms.length&&\"Multiplier\"===e.type&&!0===e.comma}(n)?Ec({...n,terms:[n.terms[0].term]},o):null;return Object.defineProperty(i,\"matchRef\",{value:e}),e}})),i}addAtrule_(n,e){e&&(this.atrules[n]={type:\"Atrule\",name:n,prelude:e.prelude?this.createDescriptor(e.prelude,\"AtrulePrelude\",n):null,descriptors:e.descriptors?Object.keys(e.descriptors).reduce((t,a)=>(t[a]=this.createDescriptor(e.descriptors[a],\"AtruleDescriptor\",a,n),t),Object.create(null)):null})}addProperty_(n,e){e&&(this.properties[n]=this.createDescriptor(e,\"Property\",n))}addType_(n,e){e&&(this.types[n]=this.createDescriptor(e,\"Type\",n))}checkAtruleName(n){if(!this.getAtrule(n))return new Vs(\"Unknown at-rule\",\"@\"+n)}checkAtrulePrelude(n,e){let t=this.checkAtruleName(n);if(t)return t;let a=this.getAtrule(n);return!a.prelude&&e?new SyntaxError(\"At-rule `@\"+n+\"` should not contain a prelude\"):!a.prelude||e||am(this,a.prelude,\"\",!1).matched?void 0:new SyntaxError(\"At-rule `@\"+n+\"` should contain a prelude\")}checkAtruleDescriptorName(n,e){let t=this.checkAtruleName(n);if(t)return t;let a=this.getAtrule(n),o=Zs(e);return a.descriptors?a.descriptors[o.name]||a.descriptors[o.basename]?void 0:new Vs(\"Unknown at-rule descriptor\",e):new SyntaxError(\"At-rule `@\"+n+\"` has no known descriptors\")}checkPropertyName(n){if(!this.getProperty(n))return new Vs(\"Unknown property\",n)}matchAtrulePrelude(n,e){let t=this.checkAtrulePrelude(n,e);if(t)return tm(null,t);let a=this.getAtrule(n);return a.prelude?am(this,a.prelude,e||\"\",!1):tm(null,null)}matchAtruleDescriptor(n,e,t){let a=this.checkAtruleDescriptorName(n,e);if(a)return tm(null,a);let o=this.getAtrule(n),i=Zs(e);return am(this,o.descriptors[i.name]||o.descriptors[i.basename],t,!1)}matchDeclaration(n){return\"Declaration\"!==n.type?tm(null,new Error(\"Not a Declaration node\")):this.matchProperty(n.property,n.value)}matchProperty(n,e){if($s(n).custom)return tm(null,new Error(\"Lexer matching doesn't applicable for custom properties\"));let t=this.checkPropertyName(n);return t?tm(null,t):am(this,this.getProperty(n),e,!0)}matchType(n,e){let t=this.getType(n);return t?am(this,t,e,!1):tm(null,new Vs(\"Unknown type\",n))}match(n,e){return\"string\"==typeof n||n&&n.type?((\"string\"==typeof n||!n.match)&&(n=this.createDescriptor(n,\"Type\",\"anonymous\")),am(this,n,e,!1)):tm(null,new Vs(\"Bad syntax\"))}findValueFragments(n,e,t,a){return Kc(this,e,this.matchProperty(n,e),t,a)}findDeclarationValueFragments(n,e,t){return Kc(this,n.value,this.matchDeclaration(n),e,t)}findAllFragments(n,e,t){let a=[];return this.syntax.walk(n,{visit:\"Declaration\",enter:n=>{a.push.apply(a,this.findDeclarationValueFragments(n,e,t))}}),a}getAtrule(n,e=!0){let t=Zs(n);return(t.vendor&&e?this.atrules[t.name]||this.atrules[t.basename]:this.atrules[t.name])||null}getAtrulePrelude(n,e=!0){let t=this.getAtrule(n,e);return t&&t.prelude||null}getAtruleDescriptor(n,e){return this.atrules.hasOwnProperty(n)&&this.atrules.declarators&&this.atrules[n].declarators[e]||null}getProperty(n,e=!0){let t=$s(n);return(t.vendor&&e?this.properties[t.name]||this.properties[t.basename]:this.properties[t.name])||null}getType(n){return hasOwnProperty.call(this.types,n)?this.types[n]:null}validate(){function n(n,e){return e?`<${n}>`:`<'${n}'>`}function e(i,r,s,l){if(s.has(r))return s.get(r);s.set(r,!1),null!==l.syntax&&kc(l.syntax,function(l){if(\"Type\"!==l.type&&\"Property\"!==l.type)return;let c=\"Type\"===l.type?i.types:i.properties,m=\"Type\"===l.type?a:o;hasOwnProperty.call(c,l.name)?e(i,l.name,m,c[l.name])&&(t.push(`${n(r,s===a)} used broken syntax definition ${n(l.name,\"Type\"===l.type)}`),s.set(r,!0)):(t.push(`${n(r,s===a)} used missed syntax definition ${n(l.name,\"Type\"===l.type)}`),s.set(r,!0))},this)}let t=[],a=new Map,o=new Map;for(let n in this.types)e(this,n,a,this.types[n]);for(let n in this.properties)e(this,n,o,this.properties[n]);let i=[...a.keys()].filter(n=>a.get(n)),r=[...o.keys()].filter(n=>o.get(n));return i.length||r.length?{errors:t,types:i,properties:r}:null}dump(n,e){return{generic:this.generic,cssWideKeywords:this.cssWideKeywords,units:this.units,types:nm(this.types,!e,n),properties:nm(this.properties,!e,n),atrules:em(this.atrules,!e,n)}}toString(){return JSON.stringify(this.dump())}};function im(n,e){return\"string\"==typeof e&&/^\\s*\\|/.test(e)?\"string\"==typeof n?n+e:e.replace(/^\\s*\\|\\s*/,\"\"):e||null}function rm(n,e){let t=Object.create(null);for(let a of Object.keys(n))e.includes(a)&&(t[a]=n[a]);return t}function sm(n,e,t){let a={...n};for(let[n,o]of Object.entries(e))a[n]={...a[n],...t?rm(o,t):o};return a}function lm(n,e){let t={...n};for(let[a,o]of Object.entries(e))switch(a){case\"generic\":t[a]=!!o;break;case\"cssWideKeywords\":t[a]=n[a]?[...n[a],...o]:o||[];break;case\"units\":t[a]={...n[a]};for(let[n,e]of Object.entries(o))t[a][n]=Array.isArray(e)?e:[];break;case\"atrules\":t[a]={...n[a]};for(let[n,e]of Object.entries(o)){let o=t[a][n]||{},i=t[a][n]={prelude:o.prelude||null,descriptors:{...o.descriptors}};if(e){i.prelude=e.prelude?im(i.prelude,e.prelude):i.prelude||null;for(let[n,t]of Object.entries(e.descriptors||{}))i.descriptors[n]=t?im(i.descriptors[n],t):null;Object.keys(i.descriptors).length||(i.descriptors=null)}}break;case\"types\":case\"properties\":t[a]={...n[a]};for(let[n,e]of Object.entries(o))t[a][n]=im(t[a][n],e);break;case\"parseContext\":t[a]={...n[a],...o};break;case\"scope\":case\"features\":t[a]=sm(n[a],o);break;case\"atrule\":case\"pseudo\":t[a]=sm(n[a],o,[\"parse\"]);break;case\"node\":t[a]=sm(n[a],o,[\"name\",\"structure\",\"parse\",\"generate\",\"walkContext\"])}return t}function cm(n){let e=ks(n),t=_s(n),a=Rs(n),{fromPlainObject:o,toPlainObject:i}=function(n){return{fromPlainObject:e=>(n(e,{enter(n){n.children&&!(n.children instanceof ms)&&(n.children=(new ms).fromArray(n.children))}}),e),toPlainObject:e=>(n(e,{leave(n){n.children&&n.children instanceof ms&&(n.children=n.children.toArray())}}),e)}}(t),r={lexer:null,createLexer:n=>new om(n,r,r.lexer.structure),tokenize:ls,parse:e,generate:a,walk:t,find:t.find,findLast:t.findLast,findAll:t.findAll,fromPlainObject:o,toPlainObject:i,fork(e){let t=lm({},n);return cm(\"function\"==typeof e?e(t):lm(t,e))}};return r.lexer=new om({generic:n.generic,cssWideKeywords:n.cssWideKeywords,units:n.units,types:n.types,atrules:n.atrules,properties:n.properties,node:n.node},r),r}var mm={};Ki(mm,{AnPlusB:()=>dm,Atrule:()=>Cm,AtrulePrelude:()=>Dm,AttributeSelector:()=>_m,Block:()=>Xm,Brackets:()=>cd,CDC:()=>ud,CDO:()=>kd,ClassSelector:()=>xd,Combinator:()=>Id,Comment:()=>_d,Condition:()=>Vd,Declaration:()=>nh,DeclarationList:()=>fh,Dimension:()=>Ch,Feature:()=>Ih,FeatureFunction:()=>Nh,FeatureRange:()=>Uh,Function:()=>Qh,GeneralEnclosed:()=>ip,Hash:()=>mp,IdSelector:()=>vp,Identifier:()=>wp,Layer:()=>zp,LayerList:()=>Ep,MediaQuery:()=>Pp,MediaQueryList:()=>Up,NestingSelector:()=>Kp,Nth:()=>Qp,Number:()=>ou,Operator:()=>cu,Parentheses:()=>uu,Percentage:()=>ku,PseudoClassSelector:()=>xu,PseudoElementSelector:()=>Iu,Ratio:()=>Nu,Raw:()=>Hu,Rule:()=>Yu,Scope:()=>ag,Selector:()=>lg,SelectorList:()=>pg,String:()=>kg,StyleSheet:()=>Tg,SupportsDeclaration:()=>Pg,TypeSelector:()=>Ug,UnicodeRange:()=>Zg,Url:()=>lw,Value:()=>vw,WhiteSpace:()=>zw});var dm={};Ki(dm,{generate:()=>xm,name:()=>vm,parse:()=>Sm,structure:()=>jm});var hm=43,pm=45,um=110,gm=!0,wm=!1;function bm(n,e){let t=this.tokenStart+n,a=this.charCodeAt(t);for((a===hm||a===pm)&&(e&&this.error(\"Number sign is not allowed\"),t++);t<this.tokenEnd;t++)zr(this.charCodeAt(t))||this.error(\"Integer is expected\",t)}function fm(n){return bm.call(this,0,n)}function km(n,e){if(!this.cmpChar(this.tokenStart+n,e)){let t=\"\";switch(e){case um:t=\"N is expected\";break;case pm:t=\"HyphenMinus is expected\"}this.error(t,this.tokenStart+n)}}function ym(){let n=0,e=0,t=this.tokenType;for(;13===t||25===t;)t=this.lookupType(++n);if(10!==t){if(!this.isDelim(hm,n)&&!this.isDelim(pm,n))return null;e=this.isDelim(hm,n)?hm:pm;do{t=this.lookupType(++n)}while(13===t||25===t);10!==t&&(this.skip(n),fm.call(this,gm))}return n>0&&this.skip(n),0===e&&(t=this.charCodeAt(this.tokenStart),t!==hm&&t!==pm&&this.error(\"Number sign is expected\")),fm.call(this,0!==e),e===pm?\"-\"+this.consume(10):this.consume(10)}var vm=\"AnPlusB\",jm={a:[String,null],b:[String,null]};function Sm(){let n=this.tokenStart,e=null,t=null;if(10===this.tokenType)fm.call(this,wm),t=this.consume(10);else if(1===this.tokenType&&this.cmpChar(this.tokenStart,pm))switch(e=\"-1\",km.call(this,1,um),this.tokenEnd-this.tokenStart){case 2:this.next(),t=ym.call(this);break;case 3:km.call(this,2,pm),this.next(),this.skipSC(),fm.call(this,gm),t=\"-\"+this.consume(10);break;default:km.call(this,2,pm),bm.call(this,3,gm),this.next(),t=this.substrToCursor(n+2)}else if(1===this.tokenType||this.isDelim(hm)&&1===this.lookupType(1)){let a=0;switch(e=\"1\",this.isDelim(hm)&&(a=1,this.next()),km.call(this,0,um),this.tokenEnd-this.tokenStart){case 1:this.next(),t=ym.call(this);break;case 2:km.call(this,1,pm),this.next(),this.skipSC(),fm.call(this,gm),t=\"-\"+this.consume(10);break;default:km.call(this,1,pm),bm.call(this,2,gm),this.next(),t=this.substrToCursor(n+a+1)}}else if(12===this.tokenType){let a=this.charCodeAt(this.tokenStart),o=a===hm||a===pm,i=this.tokenStart+o;for(;i<this.tokenEnd&&zr(this.charCodeAt(i));i++);i===this.tokenStart+o&&this.error(\"Integer is expected\",this.tokenStart+o),km.call(this,i-this.tokenStart,um),e=this.substring(n,i),i+1===this.tokenEnd?(this.next(),t=ym.call(this)):(km.call(this,i-this.tokenStart+1,pm),i+2===this.tokenEnd?(this.next(),this.skipSC(),fm.call(this,gm),t=\"-\"+this.consume(10)):(bm.call(this,i-this.tokenStart+2,gm),this.next(),t=this.substrToCursor(i+1)))}else this.error();return null!==e&&e.charCodeAt(0)===hm&&(e=e.substr(1)),null!==t&&t.charCodeAt(0)===hm&&(t=t.substr(1)),{type:\"AnPlusB\",loc:this.getLocation(n,this.tokenStart),a:e,b:t}}function xm(n){if(n.a){let e=(\"+1\"===n.a||\"1\"===n.a?\"n\":\"-1\"===n.a&&\"-n\")||n.a+\"n\";if(n.b){let t=\"-\"===n.b[0]||\"+\"===n.b[0]?n.b:\"+\"+n.b;this.tokenize(e+t)}else this.tokenize(e)}else this.tokenize(n.b)}var Cm={};function zm(){return this.Raw(this.consumeUntilLeftCurlyBracketOrSemicolon,!0)}function Lm(){for(let n,e=1;n=this.lookupType(e);e++){if(24===n)return!0;if(23===n||3===n)return!1}return!1}Ki(Cm,{generate:()=>Em,name:()=>Am,parse:()=>Rm,structure:()=>Im,walkContext:()=>Tm});var Am=\"Atrule\",Tm=\"atrule\",Im={name:String,prelude:[\"AtrulePrelude\",\"Raw\",null],block:[\"Block\",null]};function Rm(n=!1){let e,t,a=this.tokenStart,o=null,i=null;switch(this.eat(3),e=this.substrToCursor(a+1),t=e.toLowerCase(),this.skipSC(),!1===this.eof&&23!==this.tokenType&&17!==this.tokenType&&(o=this.parseAtrulePrelude?this.parseWithFallback(this.AtrulePrelude.bind(this,e,n),zm):zm.call(this,this.tokenIndex),this.skipSC()),this.tokenType){case 17:this.next();break;case 23:i=hasOwnProperty.call(this.atrule,t)&&\"function\"==typeof this.atrule[t].block?this.atrule[t].block.call(this,n):this.Block(Lm.call(this))}return{type:\"Atrule\",loc:this.getLocation(a,this.tokenStart),name:e,prelude:o,block:i}}function Em(n){this.token(3,\"@\"+n.name),null!==n.prelude&&this.node(n.prelude),n.block?this.node(n.block):this.token(17,\";\")}var Dm={};Ki(Dm,{generate:()=>Om,name:()=>Mm,parse:()=>Pm,structure:()=>Nm,walkContext:()=>Bm});var Mm=\"AtrulePrelude\",Bm=\"atrulePrelude\",Nm={children:[[]]};function Pm(n){let e=null;return null!==n&&(n=n.toLowerCase()),this.skipSC(),e=hasOwnProperty.call(this.atrule,n)&&\"function\"==typeof this.atrule[n].prelude?this.atrule[n].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.skipSC(),!0!==this.eof&&23!==this.tokenType&&17!==this.tokenType&&this.error(\"Semicolon or block is expected\"),{type:\"AtrulePrelude\",loc:this.getLocationFromList(e),children:e}}function Om(n){this.children(n)}var _m={};Ki(_m,{generate:()=>$m,name:()=>Jm,parse:()=>Zm,structure:()=>Ym});var Fm=36,qm=42,Um=61,Hm=94,Wm=124,Gm=126;function Vm(){this.eof&&this.error(\"Unexpected end of input\");let n=this.tokenStart,e=!1;return this.isDelim(qm)?(e=!0,this.next()):this.isDelim(Wm)||this.eat(1),this.isDelim(Wm)?this.charCodeAt(this.tokenStart+1)!==Um?(this.next(),this.eat(1)):e&&this.error(\"Identifier is expected\",this.tokenEnd):e&&this.error(\"Vertical line is expected\"),{type:\"Identifier\",loc:this.getLocation(n,this.tokenStart),name:this.substrToCursor(n)}}function Km(){let n=this.tokenStart,e=this.charCodeAt(n);return e!==Um&&e!==Gm&&e!==Hm&&e!==Fm&&e!==qm&&e!==Wm&&this.error(\"Attribute selector (=, ~=, ^=, $=, *=, |=) is expected\"),this.next(),e!==Um&&(this.isDelim(Um)||this.error(\"Equal sign is expected\"),this.next()),this.substrToCursor(n)}var Jm=\"AttributeSelector\",Ym={name:\"Identifier\",matcher:[String,null],value:[\"String\",\"Identifier\",null],flags:[String,null]};function Zm(){let n,e=this.tokenStart,t=null,a=null,o=null;return this.eat(19),this.skipSC(),n=Vm.call(this),this.skipSC(),20!==this.tokenType&&(1!==this.tokenType&&(t=Km.call(this),this.skipSC(),a=5===this.tokenType?this.String():this.Identifier(),this.skipSC()),1===this.tokenType&&(o=this.consume(1),this.skipSC())),this.eat(20),{type:\"AttributeSelector\",loc:this.getLocation(e,this.tokenStart),name:n,matcher:t,value:a,flags:o}}function $m(n){this.token(9,\"[\"),this.node(n.name),null!==n.matcher&&(this.tokenize(n.matcher),this.node(n.value)),null!==n.flags&&this.token(1,n.flags),this.token(9,\"]\")}var Xm={};Ki(Xm,{generate:()=>ld,name:()=>od,parse:()=>sd,structure:()=>rd,walkContext:()=>id});var Qm=38;function nd(){return this.Raw(null,!0)}function ed(){return this.parseWithFallback(this.Rule,nd)}function td(){return this.Raw(this.consumeUntilSemicolonIncluded,!0)}function ad(){if(17===this.tokenType)return td.call(this,this.tokenIndex);let n=this.parseWithFallback(this.Declaration,td);return 17===this.tokenType&&this.next(),n}var od=\"Block\",id=\"block\",rd={children:[[\"Atrule\",\"Rule\",\"Declaration\"]]};function sd(n){let e=n?ad:ed,t=this.tokenStart,a=this.createList();this.eat(23);n:for(;!this.eof;)switch(this.tokenType){case 24:break n;case 13:case 25:this.next();break;case 3:a.push(this.parseWithFallback(this.Atrule.bind(this,n),nd));break;default:n&&this.isDelim(Qm)?a.push(ed.call(this)):a.push(e.call(this))}return this.eof||this.eat(24),{type:\"Block\",loc:this.getLocation(t,this.tokenStart),children:a}}function ld(n){this.token(23,\"{\"),this.children(n,n=>{\"Declaration\"===n.type&&this.token(17,\";\")}),this.token(24,\"}\")}var cd={};Ki(cd,{generate:()=>pd,name:()=>md,parse:()=>hd,structure:()=>dd});var md=\"Brackets\",dd={children:[[]]};function hd(n,e){let t=this.tokenStart,a=null;return this.eat(19),a=n.call(this,e),this.eof||this.eat(20),{type:\"Brackets\",loc:this.getLocation(t,this.tokenStart),children:a}}function pd(n){this.token(9,\"[\"),this.children(n),this.token(9,\"]\")}var ud={};Ki(ud,{generate:()=>fd,name:()=>gd,parse:()=>bd,structure:()=>wd});var gd=\"CDC\",wd=[];function bd(){let n=this.tokenStart;return this.eat(15),{type:\"CDC\",loc:this.getLocation(n,this.tokenStart)}}function fd(){this.token(15,\"--\\x3e\")}var kd={};Ki(kd,{generate:()=>Sd,name:()=>yd,parse:()=>jd,structure:()=>vd});var yd=\"CDO\",vd=[];function jd(){let n=this.tokenStart;return this.eat(14),{type:\"CDO\",loc:this.getLocation(n,this.tokenStart)}}function Sd(){this.token(14,\"\\x3c!--\")}var xd={};Ki(xd,{generate:()=>Td,name:()=>zd,parse:()=>Ad,structure:()=>Ld});var Cd=46,zd=\"ClassSelector\",Ld={name:String};function Ad(){return this.eatDelim(Cd),{type:\"ClassSelector\",loc:this.getLocation(this.tokenStart-1,this.tokenEnd),name:this.consume(1)}}function Td(n){this.token(9,\".\"),this.token(1,n.name)}var Id={};Ki(Id,{generate:()=>Od,name:()=>Bd,parse:()=>Pd,structure:()=>Nd});var Rd=43,Ed=47,Dd=62,Md=126,Bd=\"Combinator\",Nd={name:String};function Pd(){let n,e=this.tokenStart;switch(this.tokenType){case 13:n=\" \";break;case 9:switch(this.charCodeAt(this.tokenStart)){case Dd:case Rd:case Md:this.next();break;case Ed:this.next(),this.eatIdent(\"deep\"),this.eatDelim(Ed);break;default:this.error(\"Combinator is expected\")}n=this.substrToCursor(e)}return{type:\"Combinator\",loc:this.getLocation(e,this.tokenStart),name:n}}function Od(n){this.tokenize(n.name)}var _d={};Ki(_d,{generate:()=>Gd,name:()=>Ud,parse:()=>Wd,structure:()=>Hd});var Fd=42,qd=47,Ud=\"Comment\",Hd={value:String};function Wd(){let n=this.tokenStart,e=this.tokenEnd;return this.eat(25),e-n+2>=2&&this.charCodeAt(e-2)===Fd&&this.charCodeAt(e-1)===qd&&(e-=2),{type:\"Comment\",loc:this.getLocation(n,this.tokenStart),value:this.substring(n+2,e)}}function Gd(n){this.token(25,\"/*\"+n.value+\"*/\")}var Vd={};Ki(Vd,{generate:()=>Qd,name:()=>Jd,parse:()=>Xd,structure:()=>Yd});var Kd=new Set([16,22,0]),Jd=\"Condition\",Yd={kind:String,children:[[\"Identifier\",\"Feature\",\"FeatureFunction\",\"FeatureRange\",\"SupportsDeclaration\"]]};function Zd(n){return 1===this.lookupTypeNonSC(1)&&Kd.has(this.lookupTypeNonSC(2))?this.Feature(n):this.FeatureRange(n)}var $d={media:Zd,container:Zd,supports(){return this.SupportsDeclaration()}};function Xd(n=\"media\"){let e=this.createList();n:for(;!this.eof;)switch(this.tokenType){case 25:case 13:this.next();continue;case 1:e.push(this.Identifier());break;case 21:{let t=this.parseWithFallback(()=>$d[n].call(this,n),()=>null);t||(t=this.parseWithFallback(()=>{this.eat(21);let e=this.Condition(n);return this.eat(22),e},()=>this.GeneralEnclosed(n))),e.push(t);break}case 2:{let t=this.parseWithFallback(()=>this.FeatureFunction(n),()=>null);t||(t=this.GeneralEnclosed(n)),e.push(t);break}default:break n}return e.isEmpty&&this.error(\"Condition is expected\"),{type:\"Condition\",loc:this.getLocationFromList(e),kind:n,children:e}}function Qd(n){n.children.forEach(n=>{\"Condition\"===n.type?(this.token(21,\"(\"),this.node(n),this.token(22,\")\")):this.node(n)})}var nh={};Ki(nh,{generate:()=>gh,name:()=>dh,parse:()=>uh,structure:()=>ph,walkContext:()=>hh});var eh=33,th=35,ah=36,oh=38,ih=42,rh=43,sh=47;function lh(){return this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!0)}function ch(){return this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!1)}function mh(){let n=this.tokenIndex,e=this.Value();return\"Raw\"!==e.type&&!1===this.eof&&17!==this.tokenType&&!1===this.isDelim(eh)&&!1===this.isBalanceEdge(n)&&this.error(),e}var dh=\"Declaration\",hh=\"declaration\",ph={important:[Boolean,String],property:String,value:[\"Value\",\"Raw\"]};function uh(){let n,e=this.tokenStart,t=this.tokenIndex,a=wh.call(this),o=Xs(a),i=o?this.parseCustomProperty:this.parseValue,r=o?ch:lh,s=!1;this.skipSC(),this.eat(16);let l=this.tokenIndex;if(o||this.skipSC(),n=i?this.parseWithFallback(mh,r):r.call(this,this.tokenIndex),o&&\"Value\"===n.type&&n.children.isEmpty)for(let e=l-this.tokenIndex;e<=0;e++)if(13===this.lookupType(e)){n.children.appendData({type:\"WhiteSpace\",loc:null,value:\" \"});break}return this.isDelim(eh)&&(s=bh.call(this),this.skipSC()),!1===this.eof&&17!==this.tokenType&&!1===this.isBalanceEdge(t)&&this.error(),{type:\"Declaration\",loc:this.getLocation(e,this.tokenStart),important:s,property:a,value:n}}function gh(n){this.token(1,n.property),this.token(16,\":\"),this.node(n.value),n.important&&(this.token(9,\"!\"),this.token(1,!0===n.important?\"important\":n.important))}function wh(){let n=this.tokenStart;if(9===this.tokenType)switch(this.charCodeAt(this.tokenStart)){case ih:case ah:case rh:case th:case oh:this.next();break;case sh:this.next(),this.isDelim(sh)&&this.next()}return 4===this.tokenType?this.eat(4):this.eat(1),this.substrToCursor(n)}function bh(){this.eat(9),this.skipSC();let n=this.consume(1);return\"important\"===n||n}var fh={};Ki(fh,{generate:()=>xh,name:()=>vh,parse:()=>Sh,structure:()=>jh});var kh=38;function yh(){return this.Raw(this.consumeUntilSemicolonIncluded,!0)}var vh=\"DeclarationList\",jh={children:[[\"Declaration\",\"Atrule\",\"Rule\"]]};function Sh(){let n=this.createList();for(;!this.eof;)switch(this.tokenType){case 13:case 25:case 17:this.next();break;case 3:n.push(this.parseWithFallback(this.Atrule.bind(this,!0),yh));break;default:this.isDelim(kh)?n.push(this.parseWithFallback(this.Rule,yh)):n.push(this.parseWithFallback(this.Declaration,yh))}return{type:\"DeclarationList\",loc:this.getLocationFromList(n),children:n}}function xh(n){this.children(n,n=>{\"Declaration\"===n.type&&this.token(17,\";\")})}var Ch={};Ki(Ch,{generate:()=>Th,name:()=>zh,parse:()=>Ah,structure:()=>Lh});var zh=\"Dimension\",Lh={value:String,unit:String};function Ah(){let n=this.tokenStart,e=this.consumeNumber(12);return{type:\"Dimension\",loc:this.getLocation(n,this.tokenStart),value:e,unit:this.substring(n+e.length,this.tokenStart)}}function Th(n){this.token(12,n.value+n.unit)}var Ih={};Ki(Ih,{generate:()=>Bh,name:()=>Eh,parse:()=>Mh,structure:()=>Dh});var Rh=47,Eh=\"Feature\",Dh={kind:String,name:String,value:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\",null]};function Mh(n){let e,t=this.tokenStart,a=null;if(this.eat(21),this.skipSC(),e=this.consume(1),this.skipSC(),22!==this.tokenType){switch(this.eat(16),this.skipSC(),this.tokenType){case 10:a=9===this.lookupNonWSType(1)?this.Ratio():this.Number();break;case 12:a=this.Dimension();break;case 1:a=this.Identifier();break;case 2:a=this.parseWithFallback(()=>{let n=this.Function(this.readSequence,this.scope.Value);return this.skipSC(),this.isDelim(Rh)&&this.error(),n},()=>this.Ratio());break;default:this.error(\"Number, dimension, ratio or identifier is expected\")}this.skipSC()}return this.eof||this.eat(22),{type:\"Feature\",loc:this.getLocation(t,this.tokenStart),kind:n,name:e,value:a}}function Bh(n){this.token(21,\"(\"),this.token(1,n.name),null!==n.value&&(this.token(16,\":\"),this.node(n.value)),this.token(22,\")\")}var Nh={};Ki(Nh,{generate:()=>qh,name:()=>Ph,parse:()=>Fh,structure:()=>Oh});var Ph=\"FeatureFunction\",Oh={kind:String,feature:String,value:[\"Declaration\",\"Selector\"]};function _h(n,e){let t=(this.features[n]||{})[e];return\"function\"!=typeof t&&this.error(`Unknown feature ${e}()`),t}function Fh(n=\"unknown\"){let e=this.tokenStart,t=this.consumeFunctionName(),a=_h.call(this,n,t.toLowerCase());this.skipSC();let o=this.parseWithFallback(()=>{let n=this.tokenIndex,e=a.call(this);return!1===this.eof&&!1===this.isBalanceEdge(n)&&this.error(),e},()=>this.Raw(null,!1));return this.eof||this.eat(22),{type:\"FeatureFunction\",loc:this.getLocation(e,this.tokenStart),kind:n,feature:t,value:o}}function qh(n){this.token(2,n.feature+\"(\"),this.node(n.value),this.token(22,\")\")}var Uh={};Ki(Uh,{generate:()=>Xh,name:()=>Kh,parse:()=>$h,structure:()=>Jh});var Hh=47,Wh=60,Gh=61,Vh=62,Kh=\"FeatureRange\",Jh={kind:String,left:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\"],leftComparison:String,middle:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\"],rightComparison:[String,null],right:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\",null]};function Yh(){switch(this.skipSC(),this.tokenType){case 10:return this.isDelim(Hh,this.lookupOffsetNonSC(1))?this.Ratio():this.Number();case 12:return this.Dimension();case 1:return this.Identifier();case 2:return this.parseWithFallback(()=>{let n=this.Function(this.readSequence,this.scope.Value);return this.skipSC(),this.isDelim(Hh)&&this.error(),n},()=>this.Ratio());default:this.error(\"Number, dimension, ratio or identifier is expected\")}}function Zh(n){if(this.skipSC(),this.isDelim(Wh)||this.isDelim(Vh)){let n=this.source[this.tokenStart];return this.next(),this.isDelim(Gh)?(this.next(),n+\"=\"):n}if(this.isDelim(Gh))return\"=\";this.error(`Expected ${n?'\":\", ':\"\"}\"<\", \">\", \"=\" or \")\"`)}function $h(n=\"unknown\"){let e=this.tokenStart;this.skipSC(),this.eat(21);let t=Yh.call(this),a=Zh.call(this,\"Identifier\"===t.type),o=Yh.call(this),i=null,r=null;return 22!==this.lookupNonWSType(0)&&(i=Zh.call(this),r=Yh.call(this)),this.skipSC(),this.eat(22),{type:\"FeatureRange\",loc:this.getLocation(e,this.tokenStart),kind:n,left:t,leftComparison:a,middle:o,rightComparison:i,right:r}}function Xh(n){this.token(21,\"(\"),this.node(n.left),this.tokenize(n.leftComparison),this.node(n.middle),n.right&&(this.tokenize(n.rightComparison),this.node(n.right)),this.token(22,\")\")}var Qh={};Ki(Qh,{generate:()=>op,name:()=>np,parse:()=>ap,structure:()=>tp,walkContext:()=>ep});var np=\"Function\",ep=\"function\",tp={name:String,children:[[]]};function ap(n,e){let t,a=this.tokenStart,o=this.consumeFunctionName(),i=o.toLowerCase();return t=e.hasOwnProperty(i)?e[i].call(this,e):n.call(this,e),this.eof||this.eat(22),{type:\"Function\",loc:this.getLocation(a,this.tokenStart),name:o,children:t}}function op(n){this.token(2,n.name+\"(\"),this.children(n),this.token(22,\")\")}var ip={};Ki(ip,{generate:()=>cp,name:()=>rp,parse:()=>lp,structure:()=>sp});var rp=\"GeneralEnclosed\",sp={kind:String,function:[String,null],children:[[]]};function lp(n){let e=this.tokenStart,t=null;2===this.tokenType?t=this.consumeFunctionName():this.eat(21);let a=this.parseWithFallback(()=>{let n=this.tokenIndex,e=this.readSequence(this.scope.Value);return!1===this.eof&&!1===this.isBalanceEdge(n)&&this.error(),e},()=>this.createSingleNodeList(this.Raw(null,!1)));return this.eof||this.eat(22),{type:\"GeneralEnclosed\",loc:this.getLocation(e,this.tokenStart),kind:n,function:t,children:a}}function cp(n){n.function?this.token(2,n.function+\"(\"):this.token(21,\"(\"),this.children(n),this.token(22,\")\")}var mp={};Ki(mp,{generate:()=>gp,name:()=>hp,parse:()=>up,structure:()=>pp,xxx:()=>dp});var dp=\"XXX\",hp=\"Hash\",pp={value:String};function up(){let n=this.tokenStart;return this.eat(4),{type:\"Hash\",loc:this.getLocation(n,this.tokenStart),value:this.substrToCursor(n+1)}}function gp(n){this.token(4,\"#\"+n.value)}var wp={};Ki(wp,{generate:()=>yp,name:()=>bp,parse:()=>kp,structure:()=>fp});var bp=\"Identifier\",fp={name:String};function kp(){return{type:\"Identifier\",loc:this.getLocation(this.tokenStart,this.tokenEnd),name:this.consume(1)}}function yp(n){this.token(1,n.name)}var vp={};Ki(vp,{generate:()=>Cp,name:()=>jp,parse:()=>xp,structure:()=>Sp});var jp=\"IdSelector\",Sp={name:String};function xp(){let n=this.tokenStart;return this.eat(4),{type:\"IdSelector\",loc:this.getLocation(n,this.tokenStart),name:this.substrToCursor(n+1)}}function Cp(n){this.token(9,\"#\"+n.name)}var zp={};Ki(zp,{generate:()=>Rp,name:()=>Ap,parse:()=>Ip,structure:()=>Tp});var Lp=46,Ap=\"Layer\",Tp={name:String};function Ip(){let n=this.tokenStart,e=this.consume(1);for(;this.isDelim(Lp);)this.eat(9),e+=\".\"+this.consume(1);return{type:\"Layer\",loc:this.getLocation(n,this.tokenStart),name:e}}function Rp(n){this.tokenize(n.name)}var Ep={};Ki(Ep,{generate:()=>Np,name:()=>Dp,parse:()=>Bp,structure:()=>Mp});var Dp=\"LayerList\",Mp={children:[[\"Layer\"]]};function Bp(){let n=this.createList();for(this.skipSC();!this.eof&&(n.push(this.Layer()),18===this.lookupTypeNonSC(0));)this.skipSC(),this.next(),this.skipSC();return{type:\"LayerList\",loc:this.getLocationFromList(n),children:n}}function Np(n){this.children(n,()=>this.token(18,\",\"))}var Pp={};Ki(Pp,{generate:()=>qp,name:()=>Op,parse:()=>Fp,structure:()=>_p});var Op=\"MediaQuery\",_p={modifier:[String,null],mediaType:[String,null],condition:[\"Condition\",null]};function Fp(){let n=this.tokenStart,e=null,t=null,a=null;if(this.skipSC(),1===this.tokenType&&21!==this.lookupTypeNonSC(1)){let n=this.consume(1),o=n.toLowerCase();switch(\"not\"===o||\"only\"===o?(this.skipSC(),e=o,t=this.consume(1)):t=n,this.lookupTypeNonSC(0)){case 1:this.skipSC(),this.eatIdent(\"and\"),a=this.Condition(\"media\");break;case 23:case 17:case 18:case 0:break;default:this.error(\"Identifier or parenthesis is expected\")}}else switch(this.tokenType){case 1:case 21:case 2:a=this.Condition(\"media\");break;case 23:case 17:case 0:break;default:this.error(\"Identifier or parenthesis is expected\")}return{type:\"MediaQuery\",loc:this.getLocation(n,this.tokenStart),modifier:e,mediaType:t,condition:a}}function qp(n){n.mediaType?(n.modifier&&this.token(1,n.modifier),this.token(1,n.mediaType),n.condition&&(this.token(1,\"and\"),this.node(n.condition))):n.condition&&this.node(n.condition)}var Up={};Ki(Up,{generate:()=>Vp,name:()=>Hp,parse:()=>Gp,structure:()=>Wp});var Hp=\"MediaQueryList\",Wp={children:[[\"MediaQuery\"]]};function Gp(){let n=this.createList();for(this.skipSC();!this.eof&&(n.push(this.MediaQuery()),18===this.tokenType);)this.next();return{type:\"MediaQueryList\",loc:this.getLocationFromList(n),children:n}}function Vp(n){this.children(n,()=>this.token(18,\",\"))}var Kp={};Ki(Kp,{generate:()=>Xp,name:()=>Yp,parse:()=>$p,structure:()=>Zp});var Jp=38,Yp=\"NestingSelector\",Zp={};function $p(){let n=this.tokenStart;return this.eatDelim(Jp),{type:\"NestingSelector\",loc:this.getLocation(n,this.tokenStart)}}function Xp(){this.token(9,\"&\")}var Qp={};Ki(Qp,{generate:()=>au,name:()=>nu,parse:()=>tu,structure:()=>eu});var nu=\"Nth\",eu={nth:[\"AnPlusB\",\"Identifier\"],selector:[\"SelectorList\",null]};function tu(){this.skipSC();let n,e=this.tokenStart,t=e,a=null;return n=this.lookupValue(0,\"odd\")||this.lookupValue(0,\"even\")?this.Identifier():this.AnPlusB(),t=this.tokenStart,this.skipSC(),this.lookupValue(0,\"of\")&&(this.next(),a=this.SelectorList(),t=this.tokenStart),{type:\"Nth\",loc:this.getLocation(e,t),nth:n,selector:a}}function au(n){this.node(n.nth),null!==n.selector&&(this.token(1,\"of\"),this.node(n.selector))}var ou={};Ki(ou,{generate:()=>lu,name:()=>iu,parse:()=>su,structure:()=>ru});var iu=\"Number\",ru={value:String};function su(){return{type:\"Number\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consume(10)}}function lu(n){this.token(10,n.value)}var cu={};Ki(cu,{generate:()=>pu,name:()=>mu,parse:()=>hu,structure:()=>du});var mu=\"Operator\",du={value:String};function hu(){let n=this.tokenStart;return this.next(),{type:\"Operator\",loc:this.getLocation(n,this.tokenStart),value:this.substrToCursor(n)}}function pu(n){this.tokenize(n.value)}var uu={};Ki(uu,{generate:()=>fu,name:()=>gu,parse:()=>bu,structure:()=>wu});var gu=\"Parentheses\",wu={children:[[]]};function bu(n,e){let t=this.tokenStart,a=null;return this.eat(21),a=n.call(this,e),this.eof||this.eat(22),{type:\"Parentheses\",loc:this.getLocation(t,this.tokenStart),children:a}}function fu(n){this.token(21,\"(\"),this.children(n),this.token(22,\")\")}var ku={};Ki(ku,{generate:()=>Su,name:()=>yu,parse:()=>ju,structure:()=>vu});var yu=\"Percentage\",vu={value:String};function ju(){return{type:\"Percentage\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consumeNumber(11)}}function Su(n){this.token(11,n.value+\"%\")}var xu={};Ki(xu,{generate:()=>Tu,name:()=>Cu,parse:()=>Au,structure:()=>Lu,walkContext:()=>zu});var Cu=\"PseudoClassSelector\",zu=\"function\",Lu={name:String,children:[[\"Raw\"],null]};function Au(){let n,e,t=this.tokenStart,a=null;return this.eat(16),2===this.tokenType?(n=this.consumeFunctionName(),e=n.toLowerCase(),22==this.lookupNonWSType(0)?a=this.createList():hasOwnProperty.call(this.pseudo,e)?(this.skipSC(),a=this.pseudo[e].call(this),this.skipSC()):(a=this.createList(),a.push(this.Raw(null,!1))),this.eat(22)):n=this.consume(1),{type:\"PseudoClassSelector\",loc:this.getLocation(t,this.tokenStart),name:n,children:a}}function Tu(n){this.token(16,\":\"),null===n.children?this.token(1,n.name):(this.token(2,n.name+\"(\"),this.children(n),this.token(22,\")\"))}var Iu={};Ki(Iu,{generate:()=>Bu,name:()=>Ru,parse:()=>Mu,structure:()=>Du,walkContext:()=>Eu});var Ru=\"PseudoElementSelector\",Eu=\"function\",Du={name:String,children:[[\"Raw\"],null]};function Mu(){let n,e,t=this.tokenStart,a=null;return this.eat(16),this.eat(16),2===this.tokenType?(n=this.consumeFunctionName(),e=n.toLowerCase(),22==this.lookupNonWSType(0)?a=this.createList():hasOwnProperty.call(this.pseudo,e)?(this.skipSC(),a=this.pseudo[e].call(this),this.skipSC()):(a=this.createList(),a.push(this.Raw(null,!1))),this.eat(22)):n=this.consume(1),{type:\"PseudoElementSelector\",loc:this.getLocation(t,this.tokenStart),name:n,children:a}}function Bu(n){this.token(16,\":\"),this.token(16,\":\"),null===n.children?this.token(1,n.name):(this.token(2,n.name+\"(\"),this.children(n),this.token(22,\")\"))}var Nu={};Ki(Nu,{generate:()=>Uu,name:()=>_u,parse:()=>qu,structure:()=>Fu});var Pu=47;function Ou(){switch(this.skipSC(),this.tokenType){case 10:return this.Number();case 2:return this.Function(this.readSequence,this.scope.Value);default:this.error(\"Number of function is expected\")}}var _u=\"Ratio\",Fu={left:[\"Number\",\"Function\"],right:[\"Number\",\"Function\",null]};function qu(){let n=this.tokenStart,e=Ou.call(this),t=null;return this.skipSC(),this.isDelim(Pu)&&(this.eatDelim(Pu),t=Ou.call(this)),{type:\"Ratio\",loc:this.getLocation(n,this.tokenStart),left:e,right:t}}function Uu(n){this.node(n.left),this.token(9,\"/\"),n.right?this.node(n.right):this.node(10,1)}var Hu={};function Wu(){return this.tokenIndex>0&&13===this.lookupType(-1)?this.tokenIndex>1?this.getTokenStart(this.tokenIndex-1):this.firstCharOffset:this.tokenStart}Ki(Hu,{generate:()=>Ju,name:()=>Gu,parse:()=>Ku,structure:()=>Vu});var Gu=\"Raw\",Vu={value:String};function Ku(n,e){let t,a=this.getTokenStart(this.tokenIndex);return this.skipUntilBalanced(this.tokenIndex,n||this.consumeUntilBalanceEnd),t=e&&this.tokenStart>a?Wu.call(this):this.tokenStart,{type:\"Raw\",loc:this.getLocation(a,t),value:this.substring(a,t)}}function Ju(n){this.tokenize(n.value)}var Yu={};function Zu(){return this.Raw(this.consumeUntilLeftCurlyBracket,!0)}function $u(){let n=this.SelectorList();return\"Raw\"!==n.type&&!1===this.eof&&23!==this.tokenType&&this.error(),n}Ki(Yu,{generate:()=>tg,name:()=>Xu,parse:()=>eg,structure:()=>ng,walkContext:()=>Qu});var Xu=\"Rule\",Qu=\"rule\",ng={prelude:[\"SelectorList\",\"Raw\"],block:[\"Block\"]};function eg(){let n,e,t=this.tokenIndex,a=this.tokenStart;return n=this.parseRulePrelude?this.parseWithFallback($u,Zu):Zu.call(this,t),e=this.Block(!0),{type:\"Rule\",loc:this.getLocation(a,this.tokenStart),prelude:n,block:e}}function tg(n){this.node(n.prelude),this.node(n.block)}var ag={};Ki(ag,{generate:()=>sg,name:()=>og,parse:()=>rg,structure:()=>ig});var og=\"Scope\",ig={root:[\"SelectorList\",\"Raw\",null],limit:[\"SelectorList\",\"Raw\",null]};function rg(){let n=null,e=null;this.skipSC();let t=this.tokenStart;return 21===this.tokenType&&(this.next(),this.skipSC(),n=this.parseWithFallback(this.SelectorList,()=>this.Raw(!1,!0)),this.skipSC(),this.eat(22)),1===this.lookupNonWSType(0)&&(this.skipSC(),this.eatIdent(\"to\"),this.skipSC(),this.eat(21),this.skipSC(),e=this.parseWithFallback(this.SelectorList,()=>this.Raw(!1,!0)),this.skipSC(),this.eat(22)),{type:\"Scope\",loc:this.getLocation(t,this.tokenStart),root:n,limit:e}}function sg(n){n.root&&(this.token(21,\"(\"),this.node(n.root),this.token(22,\")\")),n.limit&&(this.token(1,\"to\"),this.token(21,\"(\"),this.node(n.limit),this.token(22,\")\"))}var lg={};Ki(lg,{generate:()=>hg,name:()=>cg,parse:()=>dg,structure:()=>mg});var cg=\"Selector\",mg={children:[[\"TypeSelector\",\"IdSelector\",\"ClassSelector\",\"AttributeSelector\",\"PseudoClassSelector\",\"PseudoElementSelector\",\"Combinator\"]]};function dg(){let n=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(n)&&this.error(\"Selector is expected\"),{type:\"Selector\",loc:this.getLocationFromList(n),children:n}}function hg(n){this.children(n)}var pg={};Ki(pg,{generate:()=>fg,name:()=>ug,parse:()=>bg,structure:()=>wg,walkContext:()=>gg});var ug=\"SelectorList\",gg=\"selector\",wg={children:[[\"Selector\",\"Raw\"]]};function bg(){let n=this.createList();for(;!this.eof&&(n.push(this.Selector()),18===this.tokenType);)this.next();return{type:\"SelectorList\",loc:this.getLocationFromList(n),children:n}}function fg(n){this.children(n,()=>this.token(18,\",\"))}var kg={};Ki(kg,{generate:()=>Ag,name:()=>Cg,parse:()=>Lg,structure:()=>zg});Ki({},{decode:()=>Sg,encode:()=>xg});var yg=92,vg=34,jg=39;function Sg(n){let e=n.length,t=n.charCodeAt(0),a=t===vg||t===jg?1:0,o=1===a&&e>1&&n.charCodeAt(e-1)===t?e-2:e-1,i=\"\";for(let t=a;t<=o;t++){let a=n.charCodeAt(t);if(a===yg){if(t===o){t!==e-1&&(i=n.substr(t+1));break}if(a=n.charCodeAt(++t),Mr(yg,a)){let e=t-1,a=Kr(n,e);t=a-1,i+=$r(n.substring(e+1,a))}else 13===a&&10===n.charCodeAt(t+1)&&t++}else i+=n[t]}return i}function xg(n,e){let t=e?\"'\":'\"',a=e?jg:vg,o=\"\",i=!1;for(let e=0;e<n.length;e++){let t=n.charCodeAt(e);0!==t?t<=31||127===t?(o+=\"\\\\\"+t.toString(16),i=!0):t===a||t===yg?(o+=\"\\\\\"+n.charAt(e),i=!1):(i&&(Lr(t)||Dr(t))&&(o+=\" \"),o+=n.charAt(e),i=!1):o+=\"�\"}return t+o+t}var Cg=\"String\",zg={value:String};function Lg(){return{type:\"String\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:Sg(this.consume(5))}}function Ag(n){this.token(5,xg(n.value))}var Tg={};Ki(Tg,{generate:()=>Ng,name:()=>Eg,parse:()=>Bg,structure:()=>Mg,walkContext:()=>Dg});var Ig=33;function Rg(){return this.Raw(null,!1)}var Eg=\"StyleSheet\",Dg=\"stylesheet\",Mg={children:[[\"Comment\",\"CDO\",\"CDC\",\"Atrule\",\"Rule\",\"Raw\"]]};function Bg(){let n,e=this.tokenStart,t=this.createList();for(;!this.eof;){switch(this.tokenType){case 13:this.next();continue;case 25:if(this.charCodeAt(this.tokenStart+2)!==Ig){this.next();continue}n=this.Comment();break;case 14:n=this.CDO();break;case 15:n=this.CDC();break;case 3:n=this.parseWithFallback(this.Atrule,Rg);break;default:n=this.parseWithFallback(this.Rule,Rg)}t.push(n)}return{type:\"StyleSheet\",loc:this.getLocation(e,this.tokenStart),children:t}}function Ng(n){this.children(n)}var Pg={};Ki(Pg,{generate:()=>qg,name:()=>Og,parse:()=>Fg,structure:()=>_g});var Og=\"SupportsDeclaration\",_g={declaration:\"Declaration\"};function Fg(){let n=this.tokenStart;this.eat(21),this.skipSC();let e=this.Declaration();return this.eof||this.eat(22),{type:\"SupportsDeclaration\",loc:this.getLocation(n,this.tokenStart),declaration:e}}function qg(n){this.token(21,\"(\"),this.node(n.declaration),this.token(22,\")\")}var Ug={};Ki(Ug,{generate:()=>Yg,name:()=>Vg,parse:()=>Jg,structure:()=>Kg});var Hg=42,Wg=124;function Gg(){1!==this.tokenType&&!1===this.isDelim(Hg)&&this.error(\"Identifier or asterisk is expected\"),this.next()}var Vg=\"TypeSelector\",Kg={name:String};function Jg(){let n=this.tokenStart;return this.isDelim(Wg)?(this.next(),Gg.call(this)):(Gg.call(this),this.isDelim(Wg)&&(this.next(),Gg.call(this))),{type:\"TypeSelector\",loc:this.getLocation(n,this.tokenStart),name:this.substrToCursor(n)}}function Yg(n){this.tokenize(n.name)}var Zg={};Ki(Zg,{generate:()=>sw,name:()=>ow,parse:()=>rw,structure:()=>iw});var $g=43,Xg=45,Qg=63;function nw(n,e){let t=0;for(let a=this.tokenStart+n;a<this.tokenEnd;a++){let o=this.charCodeAt(a);if(o===Xg&&e&&0!==t)return nw.call(this,n+t+1,!1),-1;Lr(o)||this.error(e&&0!==t?\"Hyphen minus\"+(t<6?\" or hex digit\":\"\")+\" is expected\":t<6?\"Hex digit is expected\":\"Unexpected input\",a),++t>6&&this.error(\"Too many hex digits\",a)}return this.next(),t}function ew(n){let e=0;for(;this.isDelim(Qg);)++e>n&&this.error(\"Too many question marks\"),this.next()}function tw(n){this.charCodeAt(this.tokenStart)!==n&&this.error((n===$g?\"Plus sign\":\"Hyphen minus\")+\" is expected\")}function aw(){let n=0;switch(this.tokenType){case 10:if(n=nw.call(this,1,!0),this.isDelim(Qg)){ew.call(this,6-n);break}if(12===this.tokenType||10===this.tokenType){tw.call(this,Xg),nw.call(this,1,!1);break}break;case 12:n=nw.call(this,1,!0),n>0&&ew.call(this,6-n);break;default:if(this.eatDelim($g),1===this.tokenType){n=nw.call(this,0,!0),n>0&&ew.call(this,6-n);break}if(this.isDelim(Qg)){this.next(),ew.call(this,5);break}this.error(\"Hex digit or question mark is expected\")}}var ow=\"UnicodeRange\",iw={value:String};function rw(){let n=this.tokenStart;return this.eatIdent(\"u\"),aw.call(this),{type:\"UnicodeRange\",loc:this.getLocation(n,this.tokenStart),value:this.substrToCursor(n)}}function sw(n){this.tokenize(n.value)}var lw={};Ki(lw,{generate:()=>yw,name:()=>bw,parse:()=>kw,structure:()=>fw});Ki({},{decode:()=>gw,encode:()=>ww});var cw=32,mw=92,dw=34,hw=39,pw=40,uw=41;function gw(n){let e=n.length,t=4,a=n.charCodeAt(e-1)===uw?e-2:e-1,o=\"\";for(;t<a&&Dr(n.charCodeAt(t));)t++;for(;t<a&&Dr(n.charCodeAt(a));)a--;for(let i=t;i<=a;i++){let t=n.charCodeAt(i);if(t===mw){if(i===a){i!==e-1&&(o=n.substr(i+1));break}if(t=n.charCodeAt(++i),Mr(mw,t)){let e=i-1,t=Kr(n,e);i=t-1,o+=$r(n.substring(e+1,t))}else 13===t&&10===n.charCodeAt(i+1)&&i++}else o+=n[i]}return o}function ww(n){let e=\"\",t=!1;for(let a=0;a<n.length;a++){let o=n.charCodeAt(a);0!==o?o<=31||127===o?(e+=\"\\\\\"+o.toString(16),t=!0):o===cw||o===mw||o===dw||o===hw||o===pw||o===uw?(e+=\"\\\\\"+n.charAt(a),t=!1):(t&&Lr(o)&&(e+=\" \"),e+=n.charAt(a),t=!1):e+=\"�\"}return\"url(\"+e+\")\"}var bw=\"Url\",fw={value:String};function kw(){let n,e=this.tokenStart;switch(this.tokenType){case 7:n=gw(this.consume(7));break;case 2:this.cmpStr(this.tokenStart,this.tokenEnd,\"url(\")||this.error(\"Function name must be `url`\"),this.eat(2),this.skipSC(),n=Sg(this.consume(5)),this.skipSC(),this.eof||this.eat(22);break;default:this.error(\"Url or Function is expected\")}return{type:\"Url\",loc:this.getLocation(e,this.tokenStart),value:n}}function yw(n){this.token(7,ww(n.value))}var vw={};Ki(vw,{generate:()=>Cw,name:()=>jw,parse:()=>xw,structure:()=>Sw});var jw=\"Value\",Sw={children:[[]]};function xw(){let n=this.tokenStart,e=this.readSequence(this.scope.Value);return{type:\"Value\",loc:this.getLocation(n,this.tokenStart),children:e}}function Cw(n){this.children(n)}var zw={};Ki(zw,{generate:()=>Rw,name:()=>Aw,parse:()=>Iw,structure:()=>Tw});var Lw=Object.freeze({type:\"WhiteSpace\",loc:null,value:\" \"}),Aw=\"WhiteSpace\",Tw={value:String};function Iw(){return this.eat(13),Lw}function Rw(n){this.token(13,n.value)}var Ew={generic:!0,cssWideKeywords:nl,generic:!0,cssWideKeywords:[\"initial\",\"inherit\",\"unset\",\"revert\",\"revert-layer\"],units:{angle:[\"deg\",\"grad\",\"rad\",\"turn\"],decibel:[\"db\"],flex:[\"fr\"],frequency:[\"hz\",\"khz\"],length:[\"cm\",\"mm\",\"q\",\"in\",\"pt\",\"pc\",\"px\",\"em\",\"rem\",\"ex\",\"rex\",\"cap\",\"rcap\",\"ch\",\"rch\",\"ic\",\"ric\",\"lh\",\"rlh\",\"vw\",\"svw\",\"lvw\",\"dvw\",\"vh\",\"svh\",\"lvh\",\"dvh\",\"vi\",\"svi\",\"lvi\",\"dvi\",\"vb\",\"svb\",\"lvb\",\"dvb\",\"vmin\",\"svmin\",\"lvmin\",\"dvmin\",\"vmax\",\"svmax\",\"lvmax\",\"dvmax\",\"cqw\",\"cqh\",\"cqi\",\"cqb\",\"cqmin\",\"cqmax\"],resolution:[\"dpi\",\"dpcm\",\"dppx\",\"x\"],semitones:[\"st\"],time:[\"s\",\"ms\"]},types:{\"abs()\":\"abs( <calc-sum> )\",\"absolute-size\":\"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large\",\"acos()\":\"acos( <calc-sum> )\",\"alpha-value\":\"<number>|<percentage>\",\"an+b\":\"odd|even|<integer>|<n-dimension>|'+'? † n|-n|<ndashdigit-dimension>|'+'? † <ndashdigit-ident>|<dashndashdigit-ident>|<n-dimension> <signed-integer>|'+'? † n <signed-integer>|-n <signed-integer>|<ndash-dimension> <signless-integer>|'+'? † n- <signless-integer>|-n- <signless-integer>|<n-dimension> ['+'|'-'] <signless-integer>|'+'? † n ['+'|'-'] <signless-integer>|-n ['+'|'-'] <signless-integer>\",\"anchor()\":\"anchor( <anchor-name>?&&<anchor-side> , <length-percentage>? )\",\"anchor-name\":\"<dashed-ident>\",\"anchor-side\":\"inside|outside|top|left|right|bottom|start|end|self-start|self-end|<percentage>|center\",\"anchor-size\":\"width|height|block|inline|self-block|self-inline\",\"anchor-size()\":\"anchor-size( [<anchor-name>||<anchor-size>]? , <length-percentage>? )\",\"angle-percentage\":\"<angle>|<percentage>\",\"angular-color-hint\":\"<angle-percentage>|<zero>\",\"angular-color-stop\":\"<color> <color-stop-angle>?\",\"angular-color-stop-list\":\"<angular-color-stop> , [<angular-color-hint>? , <angular-color-stop>]#?\",\"animateable-feature\":\"scroll-position|contents|<custom-ident>\",\"asin()\":\"asin( <calc-sum> )\",\"atan()\":\"atan( <calc-sum> )\",\"atan2()\":\"atan2( <calc-sum> , <calc-sum> )\",attachment:\"scroll|fixed|local\",\"attr()\":\"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )\",\"attr-matcher\":\"['~'|'|'|'^'|'$'|'*']? '='\",\"attr-modifier\":\"i|s\",\"attribute-selector\":\"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'\",\"auto-repeat\":\"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )\",\"auto-track-list\":\"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?\",axis:\"block|inline|x|y\",\"baseline-position\":\"[first|last]? baseline\",\"basic-shape\":\"<inset()>|<xywh()>|<rect()>|<circle()>|<ellipse()>|<polygon()>|<path()>\",\"basic-shape-rect\":\"<inset()>|<rect()>|<xywh()>\",\"bg-clip\":\"<visual-box>|border-area|text\",\"bg-image\":\"none|<image>\",\"bg-layer\":\"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<visual-box>||<visual-box>\",\"bg-position\":\"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]\",\"bg-size\":\"[<length-percentage>|auto]{1,2}|cover|contain\",\"blend-mode\":\"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity\",\"blur()\":\"blur( <length>? )\",\"brightness()\":\"brightness( [<number>|<percentage>]? )\",\"calc()\":\"calc( <calc-sum> )\",\"calc-constant\":\"e|pi|infinity|-infinity|NaN\",\"calc-product\":\"<calc-value> ['*' <calc-value>|'/' <number>]*\",\"calc-size()\":\"calc-size( <calc-size-basis> , <calc-sum> )\",\"calc-size-basis\":\"<intrinsic-size-keyword>|<calc-size()>|any|<calc-sum>\",\"calc-sum\":\"<calc-product> [['+'|'-'] <calc-product>]*\",\"calc-value\":\"<number>|<dimension>|<percentage>|<calc-constant>|( <calc-sum> )\",\"cf-final-image\":\"<image>|<color>\",\"cf-mixing-image\":\"<percentage>?&&<image>\",\"circle()\":\"circle( <radial-size>? [at <position>]? )\",\"clamp()\":\"clamp( <calc-sum>#{3} )\",\"class-selector\":\"'.' <ident-token>\",\"clip-source\":\"<url>\",color:\"<color-base>|currentColor|<system-color>|<device-cmyk()>|<light-dark()>|<-non-standard-color>\",\"color()\":\"color( <colorspace-params> [/ [<alpha-value>|none]]? )\",\"color-base\":\"<hex-color>|<color-function>|<named-color>|<color-mix()>|transparent\",\"color-function\":\"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hwb()>|<lab()>|<lch()>|<oklab()>|<oklch()>|<color()>\",\"color-interpolation-method\":\"in [<rectangular-color-space>|<polar-color-space> <hue-interpolation-method>?|<custom-color-space>]\",\"color-mix()\":\"color-mix( <color-interpolation-method> , [<color>&&<percentage [0,100]>?]#{2} )\",\"color-stop\":\"<color-stop-length>|<color-stop-angle>\",\"color-stop-angle\":\"[<angle-percentage>|<zero>]{1,2}\",\"color-stop-length\":\"<length-percentage>{1,2}\",\"color-stop-list\":\"<linear-color-stop> , [<linear-color-hint>? , <linear-color-stop>]#?\",\"colorspace-params\":\"[<predefined-rgb-params>|<xyz-params>]\",combinator:\"'>'|'+'|'~'|['|' '|']\",\"common-lig-values\":\"[common-ligatures|no-common-ligatures]\",\"compat-auto\":\"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button\",\"complex-selector\":\"<complex-selector-unit> [<combinator>? <complex-selector-unit>]*\",\"complex-selector-list\":\"<complex-selector>#\",\"composite-style\":\"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor\",\"compositing-operator\":\"add|subtract|intersect|exclude\",\"compound-selector\":\"[<type-selector>? <subclass-selector>*]!\",\"compound-selector-list\":\"<compound-selector>#\",\"conic-gradient()\":\"conic-gradient( [<conic-gradient-syntax>] )\",\"conic-gradient-syntax\":\"[[[from [<angle>|<zero>]]? [at <position>]?]||<color-interpolation-method>]? , <angular-color-stop-list>\",\"container-condition\":\"not <query-in-parens>|<query-in-parens> [[and <query-in-parens>]*|[or <query-in-parens>]*]\",\"container-name\":\"<custom-ident>\",\"container-query\":\"not <query-in-parens>|<query-in-parens> [[and <query-in-parens>]*|[or <query-in-parens>]*]\",\"content-distribution\":\"space-between|space-around|space-evenly|stretch\",\"content-list\":\"[<string>|contents|<image>|<counter>|<quote>|<target>|<leader()>|<attr()>]+\",\"content-position\":\"center|start|end|flex-start|flex-end\",\"content-replacement\":\"<image>\",\"contextual-alt-values\":\"[contextual|no-contextual]\",\"contrast()\":\"contrast( [<number>|<percentage>]? )\",\"coord-box\":\"content-box|padding-box|border-box|fill-box|stroke-box|view-box\",\"cos()\":\"cos( <calc-sum> )\",counter:\"<counter()>|<counters()>\",\"counter()\":\"counter( <counter-name> , <counter-style>? )\",\"counter-name\":\"<custom-ident>\",\"counter-style\":\"<counter-style-name>|symbols( )\",\"counter-style-name\":\"<custom-ident>\",\"counters()\":\"counters( <counter-name> , <string> , <counter-style>? )\",\"cross-fade()\":\"cross-fade( <cf-mixing-image> , <cf-final-image>? )\",\"cubic-bezier()\":\"cubic-bezier( [<number [0,1]> , <number>]#{2} )\",\"cubic-bezier-timing-function\":\"ease|ease-in|ease-out|ease-in-out|<cubic-bezier()>\",\"custom-color-space\":\"<dashed-ident>\",\"custom-params\":\"<dashed-ident> [<number>|<percentage>|none]+\",dasharray:\"[[<length-percentage>|<number>]+]#\",\"dashndashdigit-ident\":\"<ident-token>\",\"deprecated-system-color\":\"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonHighlight|ButtonShadow|CaptionText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText\",\"discretionary-lig-values\":\"[discretionary-ligatures|no-discretionary-ligatures]\",\"display-box\":\"contents|none\",\"display-inside\":\"flow|flow-root|table|flex|grid|ruby\",\"display-internal\":\"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container\",\"display-legacy\":\"inline-block|inline-list-item|inline-table|inline-flex|inline-grid\",\"display-listitem\":\"<display-outside>?&&[flow|flow-root]?&&list-item\",\"display-outside\":\"block|inline|run-in\",\"drop-shadow()\":\"drop-shadow( [<color>?&&<length>{2,3}] )\",\"easing-function\":\"<linear-easing-function>|<cubic-bezier-easing-function>|<step-easing-function>\",\"east-asian-variant-values\":\"[jis78|jis83|jis90|jis04|simplified|traditional]\",\"east-asian-width-values\":\"[full-width|proportional-width]\",\"element()\":\"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )\",\"ellipse()\":\"ellipse( <radial-size>? [at <position>]? )\",\"env()\":\"env( <custom-ident> , <declaration-value>? )\",\"exp()\":\"exp( <calc-sum> )\",\"explicit-track-list\":\"[<line-names>? <track-size>]+ <line-names>?\",\"family-name\":\"<string>|<custom-ident>+\",\"feature-tag-value\":\"<string> [<integer>|on|off]?\",\"feature-type\":\"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation\",\"feature-value-block\":\"<feature-type> '{' <feature-value-declaration-list> '}'\",\"feature-value-block-list\":\"<feature-value-block>+\",\"feature-value-declaration\":\"<custom-ident> : <integer>+ ;\",\"feature-value-declaration-list\":\"<feature-value-declaration>\",\"feature-value-name\":\"<custom-ident>\",\"filter-function\":\"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>\",\"filter-value-list\":\"[<filter-function>|<url>]+\",\"final-bg-layer\":\"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<visual-box>||<visual-box>\",\"fit-content()\":\"fit-content( <length-percentage [0,∞]> )\",\"fixed-breadth\":\"<length-percentage>\",\"fixed-repeat\":\"repeat( [<integer [1,∞]>] , [<line-names>? <fixed-size>]+ <line-names>? )\",\"fixed-size\":\"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )\",\"font-stretch-absolute\":\"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>\",\"font-variant-css21\":\"[normal|small-caps]\",\"font-weight-absolute\":\"normal|bold|<number [1,1000]>\",\"form-control-identifier\":\"select\",\"frequency-percentage\":\"<frequency>|<percentage>\",\"generic-complete\":\"serif|sans-serif|system-ui|cursive|fantasy|math|monospace\",\"general-enclosed\":\"[<function-token> <any-value>? )]|[( <any-value>? )]\",\"generic-family\":\"<generic-script-specific>|<generic-complete>|<generic-incomplete>|<-non-standard-generic-family>\",\"generic-incomplete\":\"ui-serif|ui-sans-serif|ui-monospace|ui-rounded\",\"geometry-box\":\"<shape-box>|fill-box|stroke-box|view-box\",gradient:\"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<repeating-conic-gradient()>|<-legacy-gradient>\",\"grayscale()\":\"grayscale( [<number>|<percentage>]? )\",\"grid-line\":\"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]\",\"historical-lig-values\":\"[historical-ligatures|no-historical-ligatures]\",\"hsl()\":\"hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )|hsl( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"hsla()\":\"hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )|hsla( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",hue:\"<number>|<angle>\",\"hue-interpolation-method\":\"[shorter|longer|increasing|decreasing] hue\",\"hue-rotate()\":\"hue-rotate( [<angle>|<zero>]? )\",\"hwb()\":\"hwb( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"hypot()\":\"hypot( <calc-sum># )\",image:\"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>\",\"image()\":\"image( <image-tags>? [<image-src>? , <color>?]! )\",\"image-set()\":\"image-set( <image-set-option># )\",\"image-set-option\":\"[<image>|<string>] [<resolution>||type( <string> )]\",\"image-src\":\"<url>|<string>\",\"image-tags\":\"ltr|rtl\",\"inflexible-breadth\":\"<length-percentage>|min-content|max-content|auto\",\"inset()\":\"inset( <length-percentage>{1,4} [round <'border-radius'>]? )\",\"invert()\":\"invert( [<number>|<percentage>]? )\",\"keyframe-block\":\"<keyframe-selector># { <declaration-list> }\",\"keyframe-selector\":\"from|to|<percentage [0,100]>|<timeline-range-name> <percentage>\",\"keyframes-name\":\"<custom-ident>|<string>\",\"lab()\":\"lab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"layer()\":\"layer( <layer-name> )\",\"layer-name\":\"<ident> ['.' <ident>]*\",\"lch()\":\"lch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )\",\"leader()\":\"leader( <leader-type> )\",\"leader-type\":\"dotted|solid|space|<string>\",\"length-percentage\":\"<length>|<percentage>\",\"light-dark()\":\"light-dark( <color> , <color> )\",\"line-name-list\":\"[<line-names>|<name-repeat>]+\",\"line-names\":\"'[' <custom-ident>* ']'\",\"line-style\":\"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset\",\"line-width\":\"<length>|thin|medium|thick\",\"linear()\":\"linear( [<number>&&<percentage>{0,2}]# )\",\"linear-color-hint\":\"<length-percentage>\",\"linear-color-stop\":\"<color> <color-stop-length>?\",\"linear-easing-function\":\"linear|<linear()>\",\"linear-gradient()\":\"linear-gradient( [<linear-gradient-syntax>] )\",\"linear-gradient-syntax\":\"[[<angle>|<zero>|to <side-or-corner>]||<color-interpolation-method>]? , <color-stop-list>\",\"log()\":\"log( <calc-sum> , <calc-sum>? )\",\"mask-layer\":\"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>\",\"mask-position\":\"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?\",\"mask-reference\":\"none|<image>|<mask-source>\",\"mask-source\":\"<url>\",\"masking-mode\":\"alpha|luminance|match-source\",\"matrix()\":\"matrix( <number>#{6} )\",\"matrix3d()\":\"matrix3d( <number>#{16} )\",\"max()\":\"max( <calc-sum># )\",\"media-and\":\"<media-in-parens> [and <media-in-parens>]+\",\"media-condition\":\"<media-not>|<media-and>|<media-or>|<media-in-parens>\",\"media-condition-without-or\":\"<media-not>|<media-and>|<media-in-parens>\",\"media-feature\":\"( [<mf-plain>|<mf-boolean>|<mf-range>] )\",\"media-in-parens\":\"( <media-condition> )|<media-feature>|<general-enclosed>\",\"media-not\":\"not <media-in-parens>\",\"media-or\":\"<media-in-parens> [or <media-in-parens>]+\",\"media-query\":\"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?\",\"media-query-list\":\"<media-query>#\",\"media-type\":\"<ident>\",\"mf-boolean\":\"<mf-name>\",\"mf-name\":\"<ident>\",\"mf-plain\":\"<mf-name> : <mf-value>\",\"mf-range\":\"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>\",\"mf-value\":\"<number>|<dimension>|<ident>|<ratio>\",\"min()\":\"min( <calc-sum># )\",\"minmax()\":\"minmax( [<length-percentage>|min-content|max-content|auto] , [<length-percentage>|<flex>|min-content|max-content|auto] )\",\"mod()\":\"mod( <calc-sum> , <calc-sum> )\",\"n-dimension\":\"<dimension-token>\",\"name-repeat\":\"repeat( [<integer [1,∞]>|auto-fill] , <line-names>+ )\",\"named-color\":\"aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen\",\"namespace-prefix\":\"<ident>\",\"ndash-dimension\":\"<dimension-token>\",\"ndashdigit-dimension\":\"<dimension-token>\",\"ndashdigit-ident\":\"<ident-token>\",\"ns-prefix\":\"[<ident-token>|'*']? '|'\",\"number-percentage\":\"<number>|<percentage>\",\"numeric-figure-values\":\"[lining-nums|oldstyle-nums]\",\"numeric-fraction-values\":\"[diagonal-fractions|stacked-fractions]\",\"numeric-spacing-values\":\"[proportional-nums|tabular-nums]\",\"offset-path\":\"<ray()>|<url>|<basic-shape>\",\"oklab()\":\"oklab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"oklch()\":\"oklch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )\",\"opacity()\":\"opacity( [<number>|<percentage>]? )\",\"opacity-value\":\"<number>|<percentage>\",\"outline-line-style\":\"none|dotted|dashed|solid|double|groove|ridge|inset|outset\",\"outline-radius\":\"<length>|<percentage>\",\"overflow-position\":\"unsafe|safe\",\"page-body\":\"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>\",\"page-margin-box\":\"<page-margin-box-type> '{' <declaration-list> '}'\",\"page-margin-box-type\":\"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom\",\"page-selector\":\"<pseudo-page>+|<ident> <pseudo-page>*\",\"page-selector-list\":\"[<page-selector>#]?\",\"page-size\":\"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger\",paint:\"none|<color>|<url> [none|<color>]?|context-fill|context-stroke\",\"paint()\":\"paint( <ident> , <declaration-value>? )\",\"paint-box\":\"<visual-box>|fill-box|stroke-box\",\"palette-identifier\":\"<dashed-ident>\",\"palette-mix()\":\"palette-mix( <color-interpolation-method> , [[normal|light|dark|<palette-identifier>|<palette-mix()>]&&<percentage [0,100]>?]#{2} )\",\"path()\":\"path( <'fill-rule'>? , <string> )\",\"perspective()\":\"perspective( [<length [0,∞]>|none] )\",\"polar-color-space\":\"hsl|hwb|lch|oklch\",\"polygon()\":\"polygon( <'fill-rule'>? , [<length-percentage> <length-percentage>]# )\",position:\"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]\",\"position-area\":\"[[left|center|right|span-left|span-right|x-start|x-end|span-x-start|span-x-end|x-self-start|x-self-end|span-x-self-start|span-x-self-end|span-all]||[top|center|bottom|span-top|span-bottom|y-start|y-end|span-y-start|span-y-end|y-self-start|y-self-end|span-y-self-start|span-y-self-end|span-all]|[block-start|center|block-end|span-block-start|span-block-end|span-all]||[inline-start|center|inline-end|span-inline-start|span-inline-end|span-all]|[self-block-start|center|self-block-end|span-self-block-start|span-self-block-end|span-all]||[self-inline-start|center|self-inline-end|span-self-inline-start|span-self-inline-end|span-all]|[start|center|end|span-start|span-end|span-all]{1,2}|[self-start|center|self-end|span-self-start|span-self-end|span-all]{1,2}]\",\"pow()\":\"pow( <calc-sum> , <calc-sum> )\",\"predefined-rgb\":\"srgb|srgb-linear|display-p3|a98-rgb|prophoto-rgb|rec2020\",\"predefined-rgb-params\":\"<predefined-rgb> [<number>|<percentage>|none]{3}\",\"pseudo-class-selector\":\"':' <ident-token>|':' <function-token> <any-value> ')'\",\"pseudo-element-selector\":\"':' <pseudo-class-selector>|<legacy-pseudo-element-selector>\",\"pseudo-page\":\": [left|right|first|blank]\",\"query-in-parens\":\"( <container-condition> )|( <size-feature> )|style( <style-query> )|<general-enclosed>\",quote:\"open-quote|close-quote|no-open-quote|no-close-quote\",\"radial-extent\":\"closest-corner|closest-side|farthest-corner|farthest-side\",\"radial-gradient()\":\"radial-gradient( [<radial-gradient-syntax>] )\",\"radial-gradient-syntax\":\"[[[<radial-shape>||<radial-size>]? [at <position>]?]||<color-interpolation-method>]? , <color-stop-list>\",\"radial-shape\":\"circle|ellipse\",\"radial-size\":\"<radial-extent>|<length [0,∞]>|<length-percentage [0,∞]>{2}\",ratio:\"<number [0,∞]> [/ <number [0,∞]>]?\",\"ray()\":\"ray( <angle>&&<ray-size>?&&contain?&&[at <position>]? )\",\"ray-size\":\"closest-side|closest-corner|farthest-side|farthest-corner|sides\",\"rect()\":\"rect( [<length-percentage>|auto]{4} [round <'border-radius'>]? )\",\"rectangular-color-space\":\"srgb|srgb-linear|display-p3|a98-rgb|prophoto-rgb|rec2020|lab|oklab|xyz|xyz-d50|xyz-d65\",\"relative-selector\":\"<combinator>? <complex-selector>\",\"relative-selector-list\":\"<relative-selector>#\",\"relative-size\":\"larger|smaller\",\"rem()\":\"rem( <calc-sum> , <calc-sum> )\",\"repeat-style\":\"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}\",\"repeating-conic-gradient()\":\"repeating-conic-gradient( [<conic-gradient-syntax>] )\",\"repeating-linear-gradient()\":\"repeating-linear-gradient( [<linear-gradient-syntax>] )\",\"repeating-radial-gradient()\":\"repeating-radial-gradient( [<radial-gradient-syntax>] )\",\"reversed-counter-name\":\"reversed( <counter-name> )\",\"rgb()\":\"rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )|rgb( [<number>|<percentage>|none]{3} [/ [<alpha-value>|none]]? )\",\"rgba()\":\"rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )|rgba( [<number>|<percentage>|none]{3} [/ [<alpha-value>|none]]? )\",\"rotate()\":\"rotate( [<angle>|<zero>] )\",\"rotate3d()\":\"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )\",\"rotateX()\":\"rotateX( [<angle>|<zero>] )\",\"rotateY()\":\"rotateY( [<angle>|<zero>] )\",\"rotateZ()\":\"rotateZ( [<angle>|<zero>] )\",\"round()\":\"round( <rounding-strategy>? , <calc-sum> , <calc-sum> )\",\"rounding-strategy\":\"nearest|up|down|to-zero\",\"saturate()\":\"saturate( [<number>|<percentage>]? )\",\"scale()\":\"scale( [<number>|<percentage>]#{1,2} )\",\"scale3d()\":\"scale3d( [<number>|<percentage>]#{3} )\",\"scaleX()\":\"scaleX( [<number>|<percentage>] )\",\"scaleY()\":\"scaleY( [<number>|<percentage>] )\",\"scaleZ()\":\"scaleZ( [<number>|<percentage>] )\",\"scope-end\":\"<forgiving-selector-list>\",\"scope-start\":\"<forgiving-selector-list>\",\"scroll()\":\"scroll( [<scroller>||<axis>]? )\",scroller:\"root|nearest|self\",\"scroll-state-feature\":\"<media-query-list>\",\"scroll-state-in-parens\":\"( <scroll-state-query> )|( <scroll-state-feature> )|<general-enclosed>\",\"scroll-state-query\":\"not <scroll-state-in-parens>|<scroll-state-in-parens> [[and <scroll-state-in-parens>]*|[or <scroll-state-in-parens>]*]|<scroll-state-feature>\",\"selector-list\":\"<complex-selector-list>\",\"self-position\":\"center|start|end|self-start|self-end|flex-start|flex-end\",\"sepia()\":\"sepia( [<number>|<percentage>]? )\",shadow:\"inset?&&<length>{2,4}&&<color>?\",\"shadow-t\":\"[<length>{2,3}&&<color>?]\",shape:\"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )\",\"shape-box\":\"<visual-box>|margin-box\",\"side-or-corner\":\"[left|right]||[top|bottom]\",\"sign()\":\"sign( <calc-sum> )\",\"signed-integer\":\"<number-token>\",\"signless-integer\":\"<number-token>\",\"sin()\":\"sin( <calc-sum> )\",\"single-animation\":\"<'animation-duration'>||<easing-function>||<'animation-delay'>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]||<single-animation-timeline>\",\"single-animation-composition\":\"replace|add|accumulate\",\"single-animation-direction\":\"normal|reverse|alternate|alternate-reverse\",\"single-animation-fill-mode\":\"none|forwards|backwards|both\",\"single-animation-iteration-count\":\"infinite|<number>\",\"single-animation-play-state\":\"running|paused\",\"single-animation-timeline\":\"auto|none|<dashed-ident>|<scroll()>|<view()>\",\"single-transition\":\"[none|<single-transition-property>]||<time>||<easing-function>||<time>||<transition-behavior-value>\",\"single-transition-property\":\"all|<custom-ident>\",size:\"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}\",\"size-feature\":\"<mf-plain>|<mf-boolean>|<mf-range>\",\"skew()\":\"skew( [<angle>|<zero>] , [<angle>|<zero>]? )\",\"skewX()\":\"skewX( [<angle>|<zero>] )\",\"skewY()\":\"skewY( [<angle>|<zero>] )\",\"sqrt()\":\"sqrt( <calc-sum> )\",\"step-position\":\"jump-start|jump-end|jump-none|jump-both|start|end\",\"step-easing-function\":\"step-start|step-end|<steps()>\",\"steps()\":\"steps( <integer> , <step-position>? )\",\"style-feature\":\"<declaration>\",\"style-in-parens\":\"( <style-condition> )|( <style-feature> )|<general-enclosed>\",\"style-query\":\"<style-condition>|<style-feature>\",\"subclass-selector\":\"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>\",\"supports-condition\":\"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*\",\"supports-decl\":\"( <declaration> )\",\"supports-feature\":\"<supports-decl>|<supports-selector-fn>\",\"supports-in-parens\":\"( <supports-condition> )|<supports-feature>|<general-enclosed>\",\"supports-selector-fn\":\"selector( <complex-selector> )\",symbol:\"<string>|<image>|<custom-ident>\",\"symbols()\":\"symbols( <symbols-type>? [<string>|<image>]+ )\",\"symbols-type\":\"cyclic|numeric|alphabetic|symbolic|fixed\",\"system-color\":\"AccentColor|AccentColorText|ActiveText|ButtonBorder|ButtonFace|ButtonText|Canvas|CanvasText|Field|FieldText|GrayText|Highlight|HighlightText|LinkText|Mark|MarkText|SelectedItem|SelectedItemText|VisitedText\",\"tan()\":\"tan( <calc-sum> )\",target:\"<target-counter()>|<target-counters()>|<target-text()>\",\"target-counter()\":\"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )\",\"target-counters()\":\"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )\",\"target-text()\":\"target-text( [<string>|<url>] , [content|before|after|first-letter]? )\",\"text-edge\":\"[text|cap|ex|ideographic|ideographic-ink] [text|alphabetic|ideographic|ideographic-ink]?\",\"time-percentage\":\"<time>|<percentage>\",\"timeline-range-name\":\"cover|contain|entry|exit|entry-crossing|exit-crossing\",\"track-breadth\":\"<length-percentage>|<flex>|min-content|max-content|auto\",\"track-list\":\"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?\",\"track-repeat\":\"repeat( [<integer [1,∞]>] , [<line-names>? <track-size>]+ <line-names>? )\",\"track-size\":\"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( <length-percentage> )\",\"transform-function\":\"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>\",\"transform-list\":\"<transform-function>+\",\"transition-behavior-value\":\"normal|allow-discrete\",\"translate()\":\"translate( <length-percentage> , <length-percentage>? )\",\"translate3d()\":\"translate3d( <length-percentage> , <length-percentage> , <length> )\",\"translateX()\":\"translateX( <length-percentage> )\",\"translateY()\":\"translateY( <length-percentage> )\",\"translateZ()\":\"translateZ( <length> )\",\"try-size\":\"most-width|most-height|most-block-size|most-inline-size\",\"try-tactic\":\"flip-block||flip-inline||flip-start\",\"type-or-unit\":\"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%\",\"type-selector\":\"<wq-name>|<ns-prefix>? '*'\",\"var()\":\"var( <custom-property-name> , <declaration-value>? )\",\"view()\":\"view( [<axis>||<'view-timeline-inset'>]? )\",\"viewport-length\":\"auto|<length-percentage>\",\"visual-box\":\"content-box|padding-box|border-box\",\"wq-name\":\"<ns-prefix>? <ident-token>\",\"xywh()\":\"xywh( <length-percentage>{2} <length-percentage [0,∞]>{2} [round <'border-radius'>]? )\",xyz:\"xyz|xyz-d50|xyz-d65\",\"xyz-params\":\"<xyz-space> [<number>|<percentage>|none]{3}\",\"-legacy-gradient\":\"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>\",\"-legacy-linear-gradient\":\"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )\",\"-legacy-repeating-linear-gradient\":\"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )\",\"-legacy-linear-gradient-arguments\":\"[<angle>|<side-or-corner>]? , <color-stop-list>\",\"-legacy-radial-gradient\":\"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )\",\"-legacy-repeating-radial-gradient\":\"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )\",\"-legacy-radial-gradient-arguments\":\"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>\",\"-legacy-radial-gradient-size\":\"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover\",\"-legacy-radial-gradient-shape\":\"circle|ellipse\",\"-non-standard-font\":\"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body\",\"-non-standard-color\":\"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text\",\"-non-standard-image-rendering\":\"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast\",\"-non-standard-overflow\":\"overlay|-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable\",\"-non-standard-size\":\"intrinsic|min-intrinsic|-webkit-fill-available|-webkit-fit-content|-webkit-min-content|-webkit-max-content|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content\",\"-webkit-gradient()\":\"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )\",\"-webkit-gradient-color-stop\":\"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )\",\"-webkit-gradient-point\":\"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]\",\"-webkit-gradient-radius\":\"<length>|<percentage>\",\"-webkit-gradient-type\":\"linear|radial\",\"-webkit-mask-box-repeat\":\"repeat|stretch|round\",\"-ms-filter-function-list\":\"<-ms-filter-function>+\",\"-ms-filter-function\":\"<-ms-filter-function-progid>|<-ms-filter-function-legacy>\",\"-ms-filter-function-progid\":\"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]\",\"-ms-filter-function-legacy\":\"<ident-token>|<function-token> <any-value>? )\",age:\"child|young|old\",\"attr-name\":\"<wq-name>\",\"attr-fallback\":\"<any-value>\",bottom:\"<length>|auto\",\"cubic-bezier-easing-function\":\"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )\",\"generic-voice\":\"[<age>? <gender> <integer>?]\",gender:\"male|female|neutral\",\"generic-script-specific\":\"generic( kai )|generic( fangsong )|generic( nastaliq )\",\"-non-standard-generic-family\":\"-apple-system|BlinkMacSystemFont\",\"intrinsic-size-keyword\":\"min-content|max-content|fit-content\",left:\"<length>|auto\",\"device-cmyk()\":\"<legacy-device-cmyk-syntax>|<modern-device-cmyk-syntax>\",\"legacy-device-cmyk-syntax\":\"device-cmyk( <number>#{4} )\",\"modern-device-cmyk-syntax\":\"device-cmyk( <cmyk-component>{4} [/ [<alpha-value>|none]]? )\",\"cmyk-component\":\"<number>|<percentage>|none\",\"color-space\":\"<rectangular-color-space>|<polar-color-space>|<custom-color-space>\",right:\"<length>|auto\",\"forgiving-selector-list\":\"<complex-real-selector-list>\",\"forgiving-relative-selector-list\":\"<relative-real-selector-list>\",\"complex-real-selector-list\":\"<complex-real-selector>#\",\"simple-selector-list\":\"<simple-selector>#\",\"relative-real-selector-list\":\"<relative-real-selector>#\",\"complex-selector-unit\":\"[<compound-selector>? <pseudo-compound-selector>*]!\",\"complex-real-selector\":\"<compound-selector> [<combinator>? <compound-selector>]*\",\"relative-real-selector\":\"<combinator>? <complex-real-selector>\",\"pseudo-compound-selector\":\"<pseudo-element-selector> <pseudo-class-selector>*\",\"simple-selector\":\"<type-selector>|<subclass-selector>\",\"legacy-pseudo-element-selector\":\"':' [before|after|first-line|first-letter]\",\"svg-length\":\"<percentage>|<length>|<number>\",\"svg-writing-mode\":\"lr-tb|rl-tb|tb-rl|lr|rl|tb\",top:\"<length>|auto\",x:\"<number>\",y:\"<number>\",declaration:\"<ident-token> : <declaration-value>? ['!' important]?\",\"declaration-list\":\"[<declaration>? ';']* <declaration>?\",url:\"url( <string> <url-modifier>* )|<url-token>\",\"url-modifier\":\"<ident>|<function-token> <any-value> )\",\"number-zero-one\":\"<number [0,1]>\",\"number-one-or-greater\":\"<number [1,∞]>\",\"xyz-space\":\"xyz|xyz-d50|xyz-d65\",\"style-condition\":\"not <style-in-parens>|<style-in-parens> [[and <style-in-parens>]*|[or <style-in-parens>]*]\",\"-non-standard-display\":\"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box\",\"inset-area\":\"[[left|center|right|span-left|span-right|x-start|x-end|span-x-start|span-x-end|x-self-start|x-self-end|span-x-self-start|span-x-self-end|span-all]||[top|center|bottom|span-top|span-bottom|y-start|y-end|span-y-start|span-y-end|y-self-start|y-self-end|span-y-self-start|span-y-self-end|span-all]|[block-start|center|block-end|span-block-start|span-block-end|span-all]||[inline-start|center|inline-end|span-inline-start|span-inline-end|span-all]|[self-block-start|self-block-end|span-self-block-start|span-self-block-end|span-all]||[self-inline-start|self-inline-end|span-self-inline-start|span-self-inline-end|span-all]|[start|center|end|span-start|span-end|span-all]{1,2}|[self-start|center|self-end|span-self-start|span-self-end|span-all]{1,2}]\",\"font-variant-css2\":\"normal|small-caps\",\"font-width-css3\":\"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded\",\"system-family-name\":\"caption|icon|menu|message-box|small-caption|status-bar\"},properties:{\"--*\":\"<declaration-value>\",\"-ms-accelerator\":\"false|true\",\"-ms-block-progression\":\"tb|rl|bt|lr\",\"-ms-content-zoom-chaining\":\"none|chained\",\"-ms-content-zoom-limit\":\"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>\",\"-ms-content-zoom-limit-max\":\"<percentage>\",\"-ms-content-zoom-limit-min\":\"<percentage>\",\"-ms-content-zoom-snap\":\"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>\",\"-ms-content-zoom-snap-points\":\"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )\",\"-ms-content-zoom-snap-type\":\"none|proximity|mandatory\",\"-ms-content-zooming\":\"none|zoom\",\"-ms-filter\":\"<string>\",\"-ms-flow-from\":\"[none|<custom-ident>]#\",\"-ms-flow-into\":\"[none|<custom-ident>]#\",\"-ms-grid-columns\":\"none|<track-list>|<auto-track-list>\",\"-ms-grid-rows\":\"none|<track-list>|<auto-track-list>\",\"-ms-high-contrast-adjust\":\"auto|none\",\"-ms-hyphenate-limit-chars\":\"auto|<integer>{1,3}\",\"-ms-hyphenate-limit-lines\":\"no-limit|<integer>\",\"-ms-hyphenate-limit-zone\":\"<percentage>|<length>\",\"-ms-ime-align\":\"auto|after\",\"-ms-overflow-style\":\"auto|none|scrollbar|-ms-autohiding-scrollbar\",\"-ms-scroll-chaining\":\"chained|none\",\"-ms-scroll-limit\":\"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>\",\"-ms-scroll-limit-x-max\":\"auto|<length>\",\"-ms-scroll-limit-x-min\":\"<length>\",\"-ms-scroll-limit-y-max\":\"auto|<length>\",\"-ms-scroll-limit-y-min\":\"<length>\",\"-ms-scroll-rails\":\"none|railed\",\"-ms-scroll-snap-points-x\":\"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )\",\"-ms-scroll-snap-points-y\":\"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )\",\"-ms-scroll-snap-type\":\"none|proximity|mandatory\",\"-ms-scroll-snap-x\":\"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>\",\"-ms-scroll-snap-y\":\"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>\",\"-ms-scroll-translation\":\"none|vertical-to-horizontal\",\"-ms-scrollbar-3dlight-color\":\"<color>\",\"-ms-scrollbar-arrow-color\":\"<color>\",\"-ms-scrollbar-base-color\":\"<color>\",\"-ms-scrollbar-darkshadow-color\":\"<color>\",\"-ms-scrollbar-face-color\":\"<color>\",\"-ms-scrollbar-highlight-color\":\"<color>\",\"-ms-scrollbar-shadow-color\":\"<color>\",\"-ms-scrollbar-track-color\":\"<color>\",\"-ms-text-autospace\":\"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space\",\"-ms-touch-select\":\"grippers|none\",\"-ms-user-select\":\"none|element|text\",\"-ms-wrap-flow\":\"auto|both|start|end|maximum|clear\",\"-ms-wrap-margin\":\"<length>\",\"-ms-wrap-through\":\"wrap|none\",\"-moz-appearance\":\"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized\",\"-moz-binding\":\"<url>|none\",\"-moz-border-bottom-colors\":\"<color>+|none\",\"-moz-border-left-colors\":\"<color>+|none\",\"-moz-border-right-colors\":\"<color>+|none\",\"-moz-border-top-colors\":\"<color>+|none\",\"-moz-context-properties\":\"none|[fill|fill-opacity|stroke|stroke-opacity]#\",\"-moz-float-edge\":\"border-box|content-box|margin-box|padding-box\",\"-moz-force-broken-image-icon\":\"0|1\",\"-moz-image-region\":\"<shape>|auto\",\"-moz-orient\":\"inline|block|horizontal|vertical\",\"-moz-outline-radius\":\"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?\",\"-moz-outline-radius-bottomleft\":\"<outline-radius>\",\"-moz-outline-radius-bottomright\":\"<outline-radius>\",\"-moz-outline-radius-topleft\":\"<outline-radius>\",\"-moz-outline-radius-topright\":\"<outline-radius>\",\"-moz-stack-sizing\":\"ignore|stretch-to-fit\",\"-moz-text-blink\":\"none|blink\",\"-moz-user-focus\":\"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none\",\"-moz-user-input\":\"auto|none|enabled|disabled\",\"-moz-user-modify\":\"read-only|read-write|write-only\",\"-moz-window-dragging\":\"drag|no-drag\",\"-moz-window-shadow\":\"default|menu|tooltip|sheet|none\",\"-webkit-appearance\":\"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button\",\"-webkit-border-before\":\"<'border-width'>||<'border-style'>||<color>\",\"-webkit-border-before-color\":\"<color>\",\"-webkit-border-before-style\":\"<'border-style'>\",\"-webkit-border-before-width\":\"<'border-width'>\",\"-webkit-box-reflect\":\"[above|below|right|left]? <length>? <image>?\",\"-webkit-line-clamp\":\"none|<integer>\",\"-webkit-mask\":\"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<visual-box>|border|padding|content|text]||[<visual-box>|border|padding|content]]#\",\"-webkit-mask-attachment\":\"<attachment>#\",\"-webkit-mask-clip\":\"[<coord-box>|no-clip|border|padding|content|text]#\",\"-webkit-mask-composite\":\"<composite-style>#\",\"-webkit-mask-image\":\"<mask-reference>#\",\"-webkit-mask-origin\":\"[<coord-box>|border|padding|content]#\",\"-webkit-mask-position\":\"<position>#\",\"-webkit-mask-position-x\":\"[<length-percentage>|left|center|right]#\",\"-webkit-mask-position-y\":\"[<length-percentage>|top|center|bottom]#\",\"-webkit-mask-repeat\":\"<repeat-style>#\",\"-webkit-mask-repeat-x\":\"repeat|no-repeat|space|round\",\"-webkit-mask-repeat-y\":\"repeat|no-repeat|space|round\",\"-webkit-mask-size\":\"<bg-size>#\",\"-webkit-overflow-scrolling\":\"auto|touch\",\"-webkit-tap-highlight-color\":\"<color>\",\"-webkit-text-fill-color\":\"<color>\",\"-webkit-text-stroke\":\"<length>||<color>\",\"-webkit-text-stroke-color\":\"<color>\",\"-webkit-text-stroke-width\":\"<length>\",\"-webkit-touch-callout\":\"default|none\",\"-webkit-user-modify\":\"read-only|read-write|read-write-plaintext-only\",\"-webkit-user-select\":\"auto|none|text|all\",\"accent-color\":\"auto|<color>\",\"align-content\":\"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>\",\"align-items\":\"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]\",\"align-self\":\"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>\",\"align-tracks\":\"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#\",\"alignment-baseline\":\"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical\",all:\"initial|inherit|unset|revert|revert-layer\",\"anchor-name\":\"none|<dashed-ident>#\",\"anchor-scope\":\"none|all|<dashed-ident>#\",animation:\"<single-animation>#\",\"animation-composition\":\"<single-animation-composition>#\",\"animation-delay\":\"<time>#\",\"animation-direction\":\"<single-animation-direction>#\",\"animation-duration\":\"<time>#\",\"animation-fill-mode\":\"<single-animation-fill-mode>#\",\"animation-iteration-count\":\"<single-animation-iteration-count>#\",\"animation-name\":\"[none|<keyframes-name>]#\",\"animation-play-state\":\"<single-animation-play-state>#\",\"animation-range\":\"[<'animation-range-start'> <'animation-range-end'>?]#\",\"animation-range-end\":\"[normal|<length-percentage>|<timeline-range-name> <length-percentage>?]#\",\"animation-range-start\":\"[normal|<length-percentage>|<timeline-range-name> <length-percentage>?]#\",\"animation-timeline\":\"<single-animation-timeline>#\",\"animation-timing-function\":\"<easing-function>#\",appearance:\"none|auto|textfield|menulist-button|<compat-auto>\",\"aspect-ratio\":\"auto||<ratio>\",\"backdrop-filter\":\"none|<filter-value-list>\",\"backface-visibility\":\"visible|hidden\",background:\"[<bg-layer> ,]* <final-bg-layer>\",\"background-attachment\":\"<attachment>#\",\"background-blend-mode\":\"<blend-mode>#\",\"background-clip\":\"<bg-clip>#\",\"background-color\":\"<color>\",\"background-image\":\"<bg-image>#\",\"background-origin\":\"<visual-box>#\",\"background-position\":\"<bg-position>#\",\"background-position-x\":\"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#\",\"background-position-y\":\"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#\",\"background-repeat\":\"<repeat-style>#\",\"background-size\":\"<bg-size>#\",\"baseline-shift\":\"baseline|sub|super|<svg-length>\",\"block-size\":\"<'width'>\",border:\"<line-width>||<line-style>||<color>\",\"border-block\":\"<'border-block-start'>\",\"border-block-color\":\"<'border-top-color'>{1,2}\",\"border-block-end\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-block-end-color\":\"<'border-top-color'>\",\"border-block-end-style\":\"<'border-top-style'>\",\"border-block-end-width\":\"<'border-top-width'>\",\"border-block-start\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-block-start-color\":\"<'border-top-color'>\",\"border-block-start-style\":\"<'border-top-style'>\",\"border-block-start-width\":\"<'border-top-width'>\",\"border-block-style\":\"<'border-top-style'>{1,2}\",\"border-block-width\":\"<'border-top-width'>{1,2}\",\"border-bottom\":\"<line-width>||<line-style>||<color>\",\"border-bottom-color\":\"<'border-top-color'>\",\"border-bottom-left-radius\":\"<length-percentage>{1,2}\",\"border-bottom-right-radius\":\"<length-percentage>{1,2}\",\"border-bottom-style\":\"<line-style>\",\"border-bottom-width\":\"<line-width>\",\"border-collapse\":\"collapse|separate\",\"border-color\":\"<color>{1,4}\",\"border-end-end-radius\":\"<'border-top-left-radius'>\",\"border-end-start-radius\":\"<'border-top-left-radius'>\",\"border-image\":\"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>\",\"border-image-outset\":\"[<length>|<number>]{1,4}\",\"border-image-repeat\":\"[stretch|repeat|round|space]{1,2}\",\"border-image-slice\":\"<number-percentage>{1,4}&&fill?\",\"border-image-source\":\"none|<image>\",\"border-image-width\":\"[<length-percentage>|<number>|auto]{1,4}\",\"border-inline\":\"<'border-block-start'>\",\"border-inline-color\":\"<'border-top-color'>{1,2}\",\"border-inline-end\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-inline-end-color\":\"<'border-top-color'>\",\"border-inline-end-style\":\"<'border-top-style'>\",\"border-inline-end-width\":\"<'border-top-width'>\",\"border-inline-start\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-inline-start-color\":\"<'border-top-color'>\",\"border-inline-start-style\":\"<'border-top-style'>\",\"border-inline-start-width\":\"<'border-top-width'>\",\"border-inline-style\":\"<'border-top-style'>{1,2}\",\"border-inline-width\":\"<'border-top-width'>{1,2}\",\"border-left\":\"<line-width>||<line-style>||<color>\",\"border-left-color\":\"<color>\",\"border-left-style\":\"<line-style>\",\"border-left-width\":\"<line-width>\",\"border-radius\":\"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?\",\"border-right\":\"<line-width>||<line-style>||<color>\",\"border-right-color\":\"<color>\",\"border-right-style\":\"<line-style>\",\"border-right-width\":\"<line-width>\",\"border-spacing\":\"<length> <length>?\",\"border-start-end-radius\":\"<'border-top-left-radius'>\",\"border-start-start-radius\":\"<'border-top-left-radius'>\",\"border-style\":\"<line-style>{1,4}\",\"border-top\":\"<line-width>||<line-style>||<color>\",\"border-top-color\":\"<color>\",\"border-top-left-radius\":\"<length-percentage>{1,2}\",\"border-top-right-radius\":\"<length-percentage>{1,2}\",\"border-top-style\":\"<line-style>\",\"border-top-width\":\"<line-width>\",\"border-width\":\"<line-width>{1,4}\",bottom:\"<length>|<percentage>|auto\",\"box-align\":\"start|center|end|baseline|stretch\",\"box-decoration-break\":\"slice|clone\",\"box-direction\":\"normal|reverse|inherit\",\"box-flex\":\"<number>\",\"box-flex-group\":\"<integer>\",\"box-lines\":\"single|multiple\",\"box-ordinal-group\":\"<integer>\",\"box-orient\":\"horizontal|vertical|inline-axis|block-axis|inherit\",\"box-pack\":\"start|center|end|justify\",\"box-shadow\":\"none|<shadow>#\",\"box-sizing\":\"content-box|border-box\",\"break-after\":\"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region\",\"break-before\":\"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region\",\"break-inside\":\"auto|avoid|avoid-page|avoid-column|avoid-region\",\"caption-side\":\"top|bottom\",caret:\"<'caret-color'>||<'caret-shape'>\",\"caret-color\":\"auto|<color>\",\"caret-shape\":\"auto|bar|block|underscore\",clear:\"none|left|right|both|inline-start|inline-end\",clip:\"<shape>|auto\",\"clip-path\":\"<clip-source>|[<basic-shape>||<geometry-box>]|none\",\"clip-rule\":\"nonzero|evenodd\",color:\"<color>\",\"color-interpolation-filters\":\"auto|sRGB|linearRGB\",\"color-scheme\":\"normal|[light|dark|<custom-ident>]+&&only?\",\"column-count\":\"<integer>|auto\",\"column-fill\":\"auto|balance\",\"column-gap\":\"normal|<length-percentage>\",\"column-rule\":\"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>\",\"column-rule-color\":\"<color>\",\"column-rule-style\":\"<'border-style'>\",\"column-rule-width\":\"<'border-width'>\",\"column-span\":\"none|all\",\"column-width\":\"<length>|auto\",columns:\"<'column-width'>||<'column-count'>\",contain:\"none|strict|content|[[size||inline-size]||layout||style||paint]\",\"contain-intrinsic-block-size\":\"auto? [none|<length>]\",\"contain-intrinsic-height\":\"auto? [none|<length>]\",\"contain-intrinsic-inline-size\":\"auto? [none|<length>]\",\"contain-intrinsic-size\":\"[auto? [none|<length>]]{1,2}\",\"contain-intrinsic-width\":\"auto? [none|<length>]\",container:\"<'container-name'> [/ <'container-type'>]?\",\"container-name\":\"none|<custom-ident>+\",\"container-type\":\"normal|[[size|inline-size]||scroll-state]\",content:\"normal|none|[<content-replacement>|<content-list>] [/ [<string>|<counter>]+]?\",\"content-visibility\":\"visible|auto|hidden\",\"counter-increment\":\"[<counter-name> <integer>?]+|none\",\"counter-reset\":\"[<counter-name> <integer>?|<reversed-counter-name> <integer>?]+|none\",\"counter-set\":\"[<counter-name> <integer>?]+|none\",cursor:\"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]\",cx:\"<length>|<percentage>\",cy:\"<length>|<percentage>\",d:\"none|path( <string> )\",direction:\"ltr|rtl\",display:\"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>\",\"dominant-baseline\":\"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge\",\"empty-cells\":\"show|hide\",\"field-sizing\":\"content|fixed\",fill:\"<paint>\",\"fill-opacity\":\"<number-zero-one>\",\"fill-rule\":\"nonzero|evenodd\",filter:\"none|<filter-value-list>|<-ms-filter-function-list>\",flex:\"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]\",\"flex-basis\":\"content|<'width'>\",\"flex-direction\":\"row|row-reverse|column|column-reverse\",\"flex-flow\":\"<'flex-direction'>||<'flex-wrap'>\",\"flex-grow\":\"<number>\",\"flex-shrink\":\"<number>\",\"flex-wrap\":\"nowrap|wrap|wrap-reverse\",float:\"left|right|none|inline-start|inline-end\",\"flood-color\":\"<color>\",\"flood-opacity\":\"<'opacity'>\",font:\"[[<'font-style'>||<font-variant-css2>||<'font-weight'>||<font-width-css3>]? <'font-size'> [/ <'line-height'>]? <'font-family'>#]|<system-family-name>|<-non-standard-font>\",\"font-family\":\"[<family-name>|<generic-family>]#\",\"font-feature-settings\":\"normal|<feature-tag-value>#\",\"font-kerning\":\"auto|normal|none\",\"font-language-override\":\"normal|<string>\",\"font-optical-sizing\":\"auto|none\",\"font-palette\":\"normal|light|dark|<palette-identifier>|<palette-mix()>\",\"font-size\":\"<absolute-size>|<relative-size>|<length-percentage [0,∞]>|math\",\"font-size-adjust\":\"none|[ex-height|cap-height|ch-width|ic-width|ic-height]? [from-font|<number>]\",\"font-smooth\":\"auto|never|always|<absolute-size>|<length>\",\"font-stretch\":\"<font-stretch-absolute>\",\"font-style\":\"normal|italic|oblique <angle>?\",\"font-synthesis\":\"none|[weight||style||small-caps||position]\",\"font-synthesis-position\":\"auto|none\",\"font-synthesis-small-caps\":\"auto|none\",\"font-synthesis-style\":\"auto|none\",\"font-synthesis-weight\":\"auto|none\",\"font-variant\":\"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]\",\"font-variant-alternates\":\"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]\",\"font-variant-caps\":\"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps\",\"font-variant-east-asian\":\"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]\",\"font-variant-emoji\":\"normal|text|emoji|unicode\",\"font-variant-ligatures\":\"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]\",\"font-variant-numeric\":\"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]\",\"font-variant-position\":\"normal|sub|super\",\"font-variation-settings\":\"normal|[<string> <number>]#\",\"font-weight\":\"<font-weight-absolute>|bolder|lighter\",\"forced-color-adjust\":\"auto|none|preserve-parent-color\",gap:\"<'row-gap'> <'column-gap'>?\",grid:\"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>\",\"grid-area\":\"<grid-line> [/ <grid-line>]{0,3}\",\"grid-auto-columns\":\"<track-size>+\",\"grid-auto-flow\":\"[row|column]||dense\",\"grid-auto-rows\":\"<track-size>+\",\"grid-column\":\"<grid-line> [/ <grid-line>]?\",\"grid-column-end\":\"<grid-line>\",\"grid-column-gap\":\"<length-percentage>\",\"grid-column-start\":\"<grid-line>\",\"grid-gap\":\"<'grid-row-gap'> <'grid-column-gap'>?\",\"grid-row\":\"<grid-line> [/ <grid-line>]?\",\"grid-row-end\":\"<grid-line>\",\"grid-row-gap\":\"<length-percentage>\",\"grid-row-start\":\"<grid-line>\",\"grid-template\":\"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?\",\"grid-template-areas\":\"none|<string>+\",\"grid-template-columns\":\"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?\",\"grid-template-rows\":\"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?\",\"hanging-punctuation\":\"none|[first||[force-end|allow-end]||last]\",height:\"auto|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"hyphenate-character\":\"auto|<string>\",\"hyphenate-limit-chars\":\"[auto|<integer>]{1,3}\",hyphens:\"none|manual|auto\",\"image-orientation\":\"from-image|<angle>|[<angle>? flip]\",\"image-rendering\":\"auto|crisp-edges|pixelated|smooth|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>\",\"image-resolution\":\"[from-image||<resolution>]&&snap?\",\"ime-mode\":\"auto|normal|active|inactive|disabled\",\"initial-letter\":\"normal|[<number> <integer>?]\",\"initial-letter-align\":\"[auto|alphabetic|hanging|ideographic]\",\"inline-size\":\"<'width'>\",inset:\"<'top'>{1,4}\",\"inset-block\":\"<'top'>{1,2}\",\"inset-block-end\":\"<'top'>\",\"inset-block-start\":\"<'top'>\",\"inset-inline\":\"<'top'>{1,2}\",\"inset-inline-end\":\"<'top'>\",\"inset-inline-start\":\"<'top'>\",\"interpolate-size\":\"numeric-only|allow-keywords\",isolation:\"auto|isolate\",\"justify-content\":\"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]\",\"justify-items\":\"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]\",\"justify-self\":\"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]\",\"justify-tracks\":\"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#\",left:\"<length>|<percentage>|auto\",\"letter-spacing\":\"normal|<length-percentage>\",\"lighting-color\":\"<color>\",\"line-break\":\"auto|loose|normal|strict|anywhere\",\"line-clamp\":\"none|<integer>\",\"line-height\":\"normal|<number>|<length>|<percentage>\",\"line-height-step\":\"<length>\",\"list-style\":\"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>\",\"list-style-image\":\"<image>|none\",\"list-style-position\":\"inside|outside\",\"list-style-type\":\"<counter-style>|<string>|none\",margin:\"<'margin-top'>{1,4}\",\"margin-block\":\"<'margin-top'>{1,2}\",\"margin-block-end\":\"<'margin-top'>\",\"margin-block-start\":\"<'margin-top'>\",\"margin-bottom\":\"<length-percentage>|auto\",\"margin-inline\":\"<'margin-top'>{1,2}\",\"margin-inline-end\":\"<'margin-top'>\",\"margin-inline-start\":\"<'margin-top'>\",\"margin-left\":\"<length-percentage>|auto\",\"margin-right\":\"<length-percentage>|auto\",\"margin-top\":\"<length-percentage>|auto\",\"margin-trim\":\"none|in-flow|all\",marker:\"none|<url>\",\"marker-end\":\"none|<url>\",\"marker-mid\":\"none|<url>\",\"marker-start\":\"none|<url>\",mask:\"<mask-layer>#\",\"mask-border\":\"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>\",\"mask-border-mode\":\"luminance|alpha\",\"mask-border-outset\":\"[<length>|<number>]{1,4}\",\"mask-border-repeat\":\"[stretch|repeat|round|space]{1,2}\",\"mask-border-slice\":\"<number-percentage>{1,4} fill?\",\"mask-border-source\":\"none|<image>\",\"mask-border-width\":\"[<length-percentage>|<number>|auto]{1,4}\",\"mask-clip\":\"[<coord-box>|no-clip]#\",\"mask-composite\":\"<compositing-operator>#\",\"mask-image\":\"<mask-reference>#\",\"mask-mode\":\"<masking-mode>#\",\"mask-origin\":\"<coord-box>#\",\"mask-position\":\"<position>#\",\"mask-repeat\":\"<repeat-style>#\",\"mask-size\":\"<bg-size>#\",\"mask-type\":\"luminance|alpha\",\"masonry-auto-flow\":\"[pack|next]||[definite-first|ordered]\",\"math-depth\":\"auto-add|add( <integer> )|<integer>\",\"math-shift\":\"normal|compact\",\"math-style\":\"normal|compact\",\"max-block-size\":\"<'max-width'>\",\"max-height\":\"none|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"max-inline-size\":\"<'max-width'>\",\"max-lines\":\"none|<integer>\",\"max-width\":\"none|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"min-block-size\":\"<'min-width'>\",\"min-height\":\"auto|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"min-inline-size\":\"<'min-width'>\",\"min-width\":\"auto|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"mix-blend-mode\":\"<blend-mode>|plus-lighter\",\"object-fit\":\"fill|contain|cover|none|scale-down\",\"object-position\":\"<position>\",\"object-view-box\":\"none|<basic-shape-rect>\",offset:\"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?\",\"offset-anchor\":\"auto|<position>\",\"offset-distance\":\"<length-percentage>\",\"offset-path\":\"none|<offset-path>||<coord-box>\",\"offset-position\":\"normal|auto|<position>\",\"offset-rotate\":\"[auto|reverse]||<angle>\",opacity:\"<opacity-value>\",order:\"<integer>\",orphans:\"<integer>\",outline:\"<'outline-width'>||<'outline-style'>||<'outline-color'>\",\"outline-color\":\"auto|<color>\",\"outline-offset\":\"<length>\",\"outline-style\":\"auto|<outline-line-style>\",\"outline-width\":\"<line-width>\",overflow:\"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>\",\"overflow-anchor\":\"auto|none\",\"overflow-block\":\"visible|hidden|clip|scroll|auto\",\"overflow-clip-box\":\"padding-box|content-box\",\"overflow-clip-margin\":\"<visual-box>||<length [0,∞]>\",\"overflow-inline\":\"visible|hidden|clip|scroll|auto\",\"overflow-wrap\":\"normal|break-word|anywhere\",\"overflow-x\":\"visible|hidden|clip|scroll|auto|<-non-standard-overflow>\",\"overflow-y\":\"visible|hidden|clip|scroll|auto|<-non-standard-overflow>\",overlay:\"none|auto\",\"overscroll-behavior\":\"[contain|none|auto]{1,2}\",\"overscroll-behavior-block\":\"contain|none|auto\",\"overscroll-behavior-inline\":\"contain|none|auto\",\"overscroll-behavior-x\":\"contain|none|auto\",\"overscroll-behavior-y\":\"contain|none|auto\",padding:\"<'padding-top'>{1,4}\",\"padding-block\":\"<'padding-top'>{1,2}\",\"padding-block-end\":\"<'padding-top'>\",\"padding-block-start\":\"<'padding-top'>\",\"padding-bottom\":\"<length-percentage [0,∞]>\",\"padding-inline\":\"<'padding-top'>{1,2}\",\"padding-inline-end\":\"<'padding-top'>\",\"padding-inline-start\":\"<'padding-top'>\",\"padding-left\":\"<length-percentage [0,∞]>\",\"padding-right\":\"<length-percentage [0,∞]>\",\"padding-top\":\"<length-percentage [0,∞]>\",page:\"auto|<custom-ident>\",\"page-break-after\":\"auto|always|avoid|left|right|recto|verso\",\"page-break-before\":\"auto|always|avoid|left|right|recto|verso\",\"page-break-inside\":\"auto|avoid\",\"paint-order\":\"normal|[fill||stroke||markers]\",perspective:\"none|<length>\",\"perspective-origin\":\"<position>\",\"place-content\":\"<'align-content'> <'justify-content'>?\",\"place-items\":\"<'align-items'> <'justify-items'>?\",\"place-self\":\"<'align-self'> <'justify-self'>?\",\"pointer-events\":\"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit\",position:\"static|relative|absolute|sticky|fixed|-webkit-sticky\",\"position-anchor\":\"auto|<anchor-name>\",\"position-area\":\"none|<position-area>\",\"position-try\":\"<'position-try-order'>? <'position-try-fallbacks'>\",\"position-try-fallbacks\":\"none|[[<dashed-ident>||<try-tactic>]|<'position-area'>]#\",\"position-try-order\":\"normal|<try-size>\",\"position-visibility\":\"always|[anchors-valid||anchors-visible||no-overflow]\",\"print-color-adjust\":\"economy|exact\",quotes:\"none|auto|[<string> <string>]+\",r:\"<length>|<percentage>\",resize:\"none|both|horizontal|vertical|block|inline\",right:\"<length>|<percentage>|auto\",rotate:\"none|<angle>|[x|y|z|<number>{3}]&&<angle>\",\"row-gap\":\"normal|<length-percentage>\",\"ruby-align\":\"start|center|space-between|space-around\",\"ruby-merge\":\"separate|collapse|auto\",\"ruby-position\":\"[alternate||[over|under]]|inter-character\",rx:\"<length>|<percentage>\",ry:\"<length>|<percentage>\",scale:\"none|[<number>|<percentage>]{1,3}\",\"scroll-behavior\":\"auto|smooth\",\"scroll-initial-target\":\"none|nearest\",\"scroll-margin\":\"<length>{1,4}\",\"scroll-margin-block\":\"<length>{1,2}\",\"scroll-margin-block-end\":\"<length>\",\"scroll-margin-block-start\":\"<length>\",\"scroll-margin-bottom\":\"<length>\",\"scroll-margin-inline\":\"<length>{1,2}\",\"scroll-margin-inline-end\":\"<length>\",\"scroll-margin-inline-start\":\"<length>\",\"scroll-margin-left\":\"<length>\",\"scroll-margin-right\":\"<length>\",\"scroll-margin-top\":\"<length>\",\"scroll-padding\":\"[auto|<length-percentage>]{1,4}\",\"scroll-padding-block\":\"[auto|<length-percentage>]{1,2}\",\"scroll-padding-block-end\":\"auto|<length-percentage>\",\"scroll-padding-block-start\":\"auto|<length-percentage>\",\"scroll-padding-bottom\":\"auto|<length-percentage>\",\"scroll-padding-inline\":\"[auto|<length-percentage>]{1,2}\",\"scroll-padding-inline-end\":\"auto|<length-percentage>\",\"scroll-padding-inline-start\":\"auto|<length-percentage>\",\"scroll-padding-left\":\"auto|<length-percentage>\",\"scroll-padding-right\":\"auto|<length-percentage>\",\"scroll-padding-top\":\"auto|<length-percentage>\",\"scroll-snap-align\":\"[none|start|end|center]{1,2}\",\"scroll-snap-coordinate\":\"none|<position>#\",\"scroll-snap-destination\":\"<position>\",\"scroll-snap-points-x\":\"none|repeat( <length-percentage> )\",\"scroll-snap-points-y\":\"none|repeat( <length-percentage> )\",\"scroll-snap-stop\":\"normal|always\",\"scroll-snap-type\":\"none|[x|y|block|inline|both] [mandatory|proximity]?\",\"scroll-snap-type-x\":\"none|mandatory|proximity\",\"scroll-snap-type-y\":\"none|mandatory|proximity\",\"scroll-timeline\":\"[<'scroll-timeline-name'> <'scroll-timeline-axis'>?]#\",\"scroll-timeline-axis\":\"[block|inline|x|y]#\",\"scroll-timeline-name\":\"[none|<dashed-ident>]#\",\"scrollbar-color\":\"auto|<color>{2}\",\"scrollbar-gutter\":\"auto|stable&&both-edges?\",\"scrollbar-width\":\"auto|thin|none\",\"shape-image-threshold\":\"<opacity-value>\",\"shape-margin\":\"<length-percentage>\",\"shape-outside\":\"none|[<shape-box>||<basic-shape>]|<image>\",\"shape-rendering\":\"auto|optimizeSpeed|crispEdges|geometricPrecision\",\"speak-as\":\"normal|spell-out||digits||[literal-punctuation|no-punctuation]\",\"stop-color\":\"<'color'>\",\"stop-opacity\":\"<'opacity'>\",stroke:\"<paint>\",\"stroke-dasharray\":\"none|[<svg-length>+]#\",\"stroke-dashoffset\":\"<svg-length>\",\"stroke-linecap\":\"butt|round|square\",\"stroke-linejoin\":\"miter|round|bevel\",\"stroke-miterlimit\":\"<number-one-or-greater>\",\"stroke-opacity\":\"<'opacity'>\",\"stroke-width\":\"<svg-length>\",\"tab-size\":\"<integer>|<length>\",\"table-layout\":\"auto|fixed\",\"text-align\":\"start|end|left|right|center|justify|match-parent\",\"text-align-last\":\"auto|start|end|left|right|center|justify\",\"text-anchor\":\"start|middle|end\",\"text-box\":\"normal|<'text-box-trim'>||<'text-box-edge'>\",\"text-box-edge\":\"auto|<text-edge>\",\"text-box-trim\":\"none|trim-start|trim-end|trim-both\",\"text-combine-upright\":\"none|all|[digits <integer>?]\",\"text-decoration\":\"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>\",\"text-decoration-color\":\"<color>\",\"text-decoration-line\":\"none|[underline||overline||line-through||blink]|spelling-error|grammar-error\",\"text-decoration-skip\":\"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]\",\"text-decoration-skip-ink\":\"auto|all|none\",\"text-decoration-style\":\"solid|double|dotted|dashed|wavy\",\"text-decoration-thickness\":\"auto|from-font|<length>|<percentage>\",\"text-emphasis\":\"<'text-emphasis-style'>||<'text-emphasis-color'>\",\"text-emphasis-color\":\"<color>\",\"text-emphasis-position\":\"auto|[over|under]&&[right|left]?\",\"text-emphasis-style\":\"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>\",\"text-indent\":\"<length-percentage>&&hanging?&&each-line?\",\"text-justify\":\"auto|inter-character|inter-word|none\",\"text-orientation\":\"mixed|upright|sideways\",\"text-overflow\":\"[clip|ellipsis|<string>]{1,2}\",\"text-rendering\":\"auto|optimizeSpeed|optimizeLegibility|geometricPrecision\",\"text-shadow\":\"none|<shadow-t>#\",\"text-size-adjust\":\"none|auto|<percentage>\",\"text-spacing-trim\":\"space-all|normal|space-first|trim-start\",\"text-transform\":\"none|[capitalize|uppercase|lowercase]||full-width||full-size-kana|math-auto\",\"text-underline-offset\":\"auto|<length>|<percentage>\",\"text-underline-position\":\"auto|from-font|[under||[left|right]]\",\"text-wrap\":\"<'text-wrap-mode'>||<'text-wrap-style'>\",\"text-wrap-mode\":\"wrap|nowrap\",\"text-wrap-style\":\"auto|balance|stable|pretty\",\"timeline-scope\":\"none|<dashed-ident>#\",top:\"<length>|<percentage>|auto\",\"touch-action\":\"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation\",transform:\"none|<transform-list>\",\"transform-box\":\"content-box|border-box|fill-box|stroke-box|view-box\",\"transform-origin\":\"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?\",\"transform-style\":\"flat|preserve-3d\",transition:\"<single-transition>#\",\"transition-behavior\":\"<transition-behavior-value>#\",\"transition-delay\":\"<time>#\",\"transition-duration\":\"<time>#\",\"transition-property\":\"none|<single-transition-property>#\",\"transition-timing-function\":\"<easing-function>#\",translate:\"none|<length-percentage> [<length-percentage> <length>?]?\",\"unicode-bidi\":\"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext\",\"user-select\":\"auto|text|none|all\",\"vector-effect\":\"none|non-scaling-stroke|non-scaling-size|non-rotation|fixed-position\",\"vertical-align\":\"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>\",\"view-timeline\":\"[<'view-timeline-name'> [<'view-timeline-axis'>||<'view-timeline-inset'>]?]#\",\"view-timeline-axis\":\"[block|inline|x|y]#\",\"view-timeline-inset\":\"[[auto|<length-percentage>]{1,2}]#\",\"view-timeline-name\":\"[none|<dashed-ident>]#\",\"view-transition-class\":\"none|<custom-ident>+\",\"view-transition-name\":\"none|<custom-ident>\",visibility:\"visible|hidden|collapse\",\"white-space\":\"normal|pre|pre-wrap|pre-line|<'white-space-collapse'>||<'text-wrap-mode'>\",\"white-space-collapse\":\"collapse|preserve|preserve-breaks|preserve-spaces|break-spaces\",widows:\"<integer>\",width:\"auto|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"will-change\":\"auto|<animateable-feature>#\",\"word-break\":\"normal|break-all|keep-all|break-word|auto-phrase\",\"word-spacing\":\"normal|<length>\",\"word-wrap\":\"normal|break-word\",\"writing-mode\":\"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>\",x:\"<length>|<percentage>\",y:\"<length>|<percentage>\",\"z-index\":\"auto|<integer>\",zoom:\"normal|reset|<number [0,∞]>||<percentage [0,∞]>\",\"-moz-background-clip\":\"padding|border\",\"-moz-border-radius-bottomleft\":\"<'border-bottom-left-radius'>\",\"-moz-border-radius-bottomright\":\"<'border-bottom-right-radius'>\",\"-moz-border-radius-topleft\":\"<'border-top-left-radius'>\",\"-moz-border-radius-topright\":\"<'border-bottom-right-radius'>\",\"-moz-control-character-visibility\":\"visible|hidden\",\"-moz-osx-font-smoothing\":\"auto|grayscale\",\"-moz-user-select\":\"none|text|all|-moz-none\",\"-ms-flex-align\":\"start|end|center|baseline|stretch\",\"-ms-flex-item-align\":\"auto|start|end|center|baseline|stretch\",\"-ms-flex-line-pack\":\"start|end|center|justify|distribute|stretch\",\"-ms-flex-negative\":\"<'flex-shrink'>\",\"-ms-flex-pack\":\"start|end|center|justify|distribute\",\"-ms-flex-order\":\"<integer>\",\"-ms-flex-positive\":\"<'flex-grow'>\",\"-ms-flex-preferred-size\":\"<'flex-basis'>\",\"-ms-interpolation-mode\":\"nearest-neighbor|bicubic\",\"-ms-grid-column-align\":\"start|end|center|stretch\",\"-ms-grid-row-align\":\"start|end|center|stretch\",\"-ms-hyphenate-limit-last\":\"none|always|column|page|spread\",\"-webkit-background-clip\":\"[<visual-box>|border|padding|content|text]#\",\"-webkit-column-break-after\":\"always|auto|avoid\",\"-webkit-column-break-before\":\"always|auto|avoid\",\"-webkit-column-break-inside\":\"always|auto|avoid\",\"-webkit-font-smoothing\":\"auto|none|antialiased|subpixel-antialiased\",\"-webkit-mask-box-image\":\"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?\",\"-webkit-print-color-adjust\":\"economy|exact\",\"-webkit-text-security\":\"none|circle|disc|square\",\"-webkit-user-drag\":\"none|element|auto\",behavior:\"<url>+\",cue:\"<'cue-before'> <'cue-after'>?\",\"cue-after\":\"<url> <decibel>?|none\",\"cue-before\":\"<url> <decibel>?|none\",\"glyph-orientation-horizontal\":\"<angle>\",\"glyph-orientation-vertical\":\"<angle>\",kerning:\"auto|<svg-length>\",pause:\"<'pause-before'> <'pause-after'>?\",\"pause-after\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"pause-before\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"position-try-options\":\"<'position-try-fallbacks'>\",rest:\"<'rest-before'> <'rest-after'>?\",\"rest-after\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"rest-before\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",speak:\"auto|never|always\",\"voice-balance\":\"<number>|left|center|right|leftwards|rightwards\",\"voice-duration\":\"auto|<time>\",\"voice-family\":\"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve\",\"voice-pitch\":\"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]\",\"voice-range\":\"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]\",\"voice-rate\":\"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>\",\"voice-stress\":\"normal|strong|moderate|none|reduced\",\"voice-volume\":\"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]\",\"white-space-trim\":\"none|discard-before||discard-after||discard-inner\"},atrules:{charset:{prelude:\"<string>\",descriptors:null},\"counter-style\":{prelude:\"<counter-style-name>\",descriptors:{\"additive-symbols\":\"[<integer>&&<symbol>]#\",fallback:\"<counter-style-name>\",negative:\"<symbol> <symbol>?\",pad:\"<integer>&&<symbol>\",prefix:\"<symbol>\",range:\"[[<integer>|infinite]{2}]#|auto\",\"speak-as\":\"auto|bullets|numbers|words|spell-out|<counter-style-name>\",suffix:\"<symbol>\",symbols:\"<symbol>+\",system:\"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]\"}},container:{prelude:\"[<container-name>]? <container-condition>\",descriptors:null},document:{prelude:\"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#\",descriptors:null},\"font-face\":{prelude:null,descriptors:{\"ascent-override\":\"normal|<percentage>\",\"descent-override\":\"normal|<percentage>\",\"font-display\":\"auto|block|swap|fallback|optional\",\"font-family\":\"<family-name>\",\"font-feature-settings\":\"normal|<feature-tag-value>#\",\"font-stretch\":\"<font-stretch-absolute>{1,2}\",\"font-style\":\"normal|italic|oblique <angle>{0,2}\",\"font-variation-settings\":\"normal|[<string> <number>]#\",\"font-weight\":\"<font-weight-absolute>{1,2}\",\"line-gap-override\":\"normal|<percentage>\",\"size-adjust\":\"<percentage>\",src:\"[<url> [format( <string># )]?|local( <family-name> )]#\",\"unicode-range\":\"<unicode-range-token>#\"}},\"font-feature-values\":{prelude:\"<family-name>#\",descriptors:null},\"font-palette-values\":{prelude:\"<dashed-ident>\",descriptors:{\"base-palette\":\"light|dark|<integer [0,∞]>\",\"font-family\":\"<family-name>#\",\"override-colors\":\"[<integer [0,∞]> <color>]#\"}},import:{prelude:\"[<string>|<url>] [layer|layer( <layer-name> )]? [supports( [<supports-condition>|<declaration>] )]? <media-query-list>?\",descriptors:null},keyframes:{prelude:\"<keyframes-name>\",descriptors:null},layer:{prelude:\"[<layer-name>#|<layer-name>?]\",descriptors:null},media:{prelude:\"<media-query-list>\",descriptors:null},namespace:{prelude:\"<namespace-prefix>? [<string>|<url>]\",descriptors:null},page:{prelude:\"<page-selector-list>\",descriptors:{bleed:\"auto|<length>\",marks:\"none|[crop||cross]\",\"page-orientation\":\"upright|rotate-left|rotate-right\",size:\"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]\"}},\"position-try\":{prelude:\"<dashed-ident>\",descriptors:{top:\"<'top'>\",left:\"<'left'>\",bottom:\"<'bottom'>\",right:\"<'right'>\",\"inset-block-start\":\"<'inset-block-start'>\",\"inset-block-end\":\"<'inset-block-end'>\",\"inset-inline-start\":\"<'inset-inline-start'>\",\"inset-inline-end\":\"<'inset-inline-end'>\",\"inset-block\":\"<'inset-block'>\",\"inset-inline\":\"<'inset-inline'>\",inset:\"<'inset'>\",\"margin-top\":\"<'margin-top'>\",\"margin-left\":\"<'margin-left'>\",\"margin-bottom\":\"<'margin-bottom'>\",\"margin-right\":\"<'margin-right'>\",\"margin-block-start\":\"<'margin-block-start'>\",\"margin-block-end\":\"<'margin-block-end'>\",\"margin-inline-start\":\"<'margin-inline-start'>\",\"margin-inline-end\":\"<'margin-inline-end'>\",margin:\"<'margin'>\",\"margin-block\":\"<'margin-block'>\",\"margin-inline\":\"<'margin-inline'>\",width:\"<'width'>\",height:\"<'height'>\",\"min-width\":\"<'min-width'>\",\"min-height\":\"<'min-height'>\",\"max-width\":\"<'max-width'>\",\"max-height\":\"<'max-height'>\",\"block-size\":\"<'block-size'>\",\"inline-size\":\"<'inline-size'>\",\"min-block-size\":\"<'min-block-size'>\",\"min-inline-size\":\"<'min-inline-size'>\",\"max-block-size\":\"<'max-block-size'>\",\"max-inline-size\":\"<'max-inline-size'>\",\"align-self\":\"<'align-self'>|anchor-center\",\"justify-self\":\"<'justify-self'>|anchor-center\"}},property:{prelude:\"<custom-property-name>\",descriptors:{inherits:\"true|false\",\"initial-value\":\"<declaration-value>?\",syntax:\"<string>\"}},scope:{prelude:\"[( <scope-start> )]? [to ( <scope-end> )]?\",descriptors:null},\"starting-style\":{prelude:null,descriptors:null},supports:{prelude:\"<supports-condition>\",descriptors:null},\"view-transition\":{prelude:null,descriptors:{navigation:\"auto|none\",types:\"none|<custom-ident>+\"}},nest:{prelude:\"<complex-selector-list>\",descriptors:null}},node:mm},Dw={};Ki(Dw,{AtrulePrelude:()=>Bw,Selector:()=>Nw,Value:()=>Ow});function Mw(n){switch(this.tokenType){case 4:return this.Hash();case 18:return this.Operator();case 21:return this.Parentheses(this.readSequence,n.recognizer);case 19:return this.Brackets(this.readSequence,n.recognizer);case 5:return this.String();case 12:return this.Dimension();case 11:return this.Percentage();case 10:return this.Number();case 2:return this.cmpStr(this.tokenStart,this.tokenEnd,\"url(\")?this.Url():this.Function(this.readSequence,n.recognizer);case 7:return this.Url();case 1:return this.cmpChar(this.tokenStart,117)&&this.cmpChar(this.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case 9:{let n=this.charCodeAt(this.tokenStart);if(47===n||42===n||43===n||45===n)return this.Operator();35===n&&this.error(\"Hex or identifier is expected\",this.tokenStart+1);break}}}var Bw={getNode:Mw};var Nw={onWhiteSpace:function(n,e){null!==e.last&&\"Combinator\"!==e.last.type&&null!==n&&\"Combinator\"!==n.type&&e.push({type:\"Combinator\",loc:null,name:\" \"})},getNode:function(){switch(this.tokenType){case 19:return this.AttributeSelector();case 4:return this.IdSelector();case 16:return 16===this.lookupType(1)?this.PseudoElementSelector():this.PseudoClassSelector();case 1:return this.TypeSelector();case 10:case 11:return this.Percentage();case 12:46===this.charCodeAt(this.tokenStart)&&this.error(\"Identifier is expected\",this.tokenStart+1);break;case 9:switch(this.charCodeAt(this.tokenStart)){case 43:case 62:case 126:case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector();case 38:return this.NestingSelector()}}}};function Pw(n){return null!==n&&\"Operator\"===n.type&&(\"-\"===n.value[n.value.length-1]||\"+\"===n.value[n.value.length-1])}var Ow={getNode:Mw,onWhiteSpace(n,e){Pw(n)&&(n.value=\" \"+n.value),Pw(e.last)&&(e.last.value+=\" \")},expression:function(){return this.createSingleNodeList(this.Raw(null,!1))},var:function(){let n=this.createList();if(this.skipSC(),n.push(this.Identifier()),this.skipSC(),18===this.tokenType){n.push(this.Operator());let e=this.tokenIndex,t=this.parseCustomProperty?this.Value(null):this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!1);if(\"Value\"===t.type&&t.children.isEmpty)for(let n=e-this.tokenIndex;n<=0;n++)if(13===this.lookupType(n)){t.children.appendData({type:\"WhiteSpace\",loc:null,value:\" \"});break}n.push(t)}return n}},_w=new Set([\"none\",\"and\",\"not\",\"or\"]),Fw={parse:{prelude(){let n=this.createList();if(1===this.tokenType){let e=this.substring(this.tokenStart,this.tokenEnd);_w.has(e.toLowerCase())||n.push(this.Identifier())}return n.push(this.Condition(\"container\")),n},block(n=!1){return this.Block(n)}}},qw={parse:{prelude:null,block(){return this.Block(!0)}}};function Uw(n,e){return this.parseWithFallback(()=>{try{return n.call(this)}finally{this.skipSC(),22!==this.lookupNonWSType(0)&&this.error()}},e||(()=>this.Raw(null,!0)))}var Hw={layer(){this.skipSC();let n=this.createList(),e=Uw.call(this,this.Layer);return(\"Raw\"!==e.type||\"\"!==e.value)&&n.push(e),n},supports(){this.skipSC();let n=this.createList(),e=Uw.call(this,this.Declaration,()=>Uw.call(this,()=>this.Condition(\"supports\")));return(\"Raw\"!==e.type||\"\"!==e.value)&&n.push(e),n}},Ww={parse:{prelude(){let n=this.createList();switch(this.tokenType){case 5:n.push(this.String());break;case 7:case 2:n.push(this.Url());break;default:this.error(\"String or url() is expected\")}return this.skipSC(),1===this.tokenType&&this.cmpStr(this.tokenStart,this.tokenEnd,\"layer\")?n.push(this.Identifier()):2===this.tokenType&&this.cmpStr(this.tokenStart,this.tokenEnd,\"layer(\")&&n.push(this.Function(null,Hw)),this.skipSC(),2===this.tokenType&&this.cmpStr(this.tokenStart,this.tokenEnd,\"supports(\")&&n.push(this.Function(null,Hw)),(1===this.lookupNonWSType(0)||21===this.lookupNonWSType(0))&&n.push(this.MediaQueryList()),n},block:null}},Gw={parse:{prelude(){return this.createSingleNodeList(this.LayerList())},block(){return this.Block(!1)}}},Vw={parse:{prelude(){return this.createSingleNodeList(this.MediaQueryList())},block(n=!1){return this.Block(n)}}},Kw={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(!0)}}},Jw={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(!0)}}},Yw={parse:{prelude(){return this.createSingleNodeList(this.Scope())},block(n=!1){return this.Block(n)}}},Zw={parse:{prelude:null,block(n=!1){return this.Block(n)}}},$w={parse:{prelude(){return this.createSingleNodeList(this.Condition(\"supports\"))},block(n=!1){return this.Block(n)}}},Xw={container:Fw,\"font-face\":qw,import:Ww,layer:Gw,media:Vw,nest:Kw,page:Jw,scope:Yw,\"starting-style\":Zw,supports:$w};var Qw={parse(){return this.createSingleNodeList(this.SelectorList())}},nb={parse(){return this.createSingleNodeList(this.Selector())}},eb={parse(){return this.createSingleNodeList(this.Identifier())}},tb={parse:function(){let n=this.createList();this.skipSC();n:for(;!this.eof;){switch(this.tokenType){case 1:n.push(this.Identifier());break;case 5:n.push(this.String());break;case 18:n.push(this.Operator());break;case 22:break n;default:this.error(\"Identifier, string or comma is expected\")}this.skipSC()}return n}},ab={parse(){return this.createSingleNodeList(this.Nth())}},ob={dir:eb,has:Qw,lang:tb,matches:Qw,is:Qw,\"-moz-any\":Qw,\"-webkit-any\":Qw,where:Qw,not:Qw,\"nth-child\":ab,\"nth-last-child\":ab,\"nth-last-of-type\":ab,\"nth-of-type\":ab,slotted:nb,host:nb,\"host-context\":nb},ib={};Ki(ib,{AnPlusB:()=>Sm,Atrule:()=>Rm,AtrulePrelude:()=>Pm,AttributeSelector:()=>Zm,Block:()=>sd,Brackets:()=>hd,CDC:()=>bd,CDO:()=>jd,ClassSelector:()=>Ad,Combinator:()=>Pd,Comment:()=>Wd,Condition:()=>Xd,Declaration:()=>uh,DeclarationList:()=>Sh,Dimension:()=>Ah,Feature:()=>Mh,FeatureFunction:()=>Fh,FeatureRange:()=>$h,Function:()=>ap,GeneralEnclosed:()=>lp,Hash:()=>up,IdSelector:()=>xp,Identifier:()=>kp,Layer:()=>Ip,LayerList:()=>Bp,MediaQuery:()=>Fp,MediaQueryList:()=>Gp,NestingSelector:()=>$p,Nth:()=>tu,Number:()=>su,Operator:()=>hu,Parentheses:()=>bu,Percentage:()=>ju,PseudoClassSelector:()=>Au,PseudoElementSelector:()=>Mu,Ratio:()=>qu,Raw:()=>Ku,Rule:()=>eg,Scope:()=>rg,Selector:()=>dg,SelectorList:()=>bg,String:()=>Lg,StyleSheet:()=>Bg,SupportsDeclaration:()=>Fg,TypeSelector:()=>Jg,UnicodeRange:()=>rw,Url:()=>kw,Value:()=>xw,WhiteSpace:()=>Iw});var rb={parseContext:{default:\"StyleSheet\",stylesheet:\"StyleSheet\",atrule:\"Atrule\",atrulePrelude(n){return this.AtrulePrelude(n.atrule?String(n.atrule):null)},mediaQueryList:\"MediaQueryList\",mediaQuery:\"MediaQuery\",condition(n){return this.Condition(n.kind)},rule:\"Rule\",selectorList:\"SelectorList\",selector:\"Selector\",block(){return this.Block(!0)},declarationList:\"DeclarationList\",declaration:\"Declaration\",value:\"Value\"},features:{supports:{selector(){return this.Selector()}},container:{style(){return this.Declaration()}}},scope:Dw,atrule:Xw,pseudo:ob,node:ib},sb=(n=>cm(lm({},n)))({...Ew,...rb,...{node:mm}});function lb(n){let e={};for(let t of Object.keys(n)){let a=n[t];a&&(Array.isArray(a)||a instanceof ms?a=a.map(lb):a.constructor===Object&&(a=lb(a))),e[t]=a}return e}Ki({},{decode:()=>mb,encode:()=>db});var cb=92;function mb(n){let e=n.length-1,t=\"\";for(let a=0;a<n.length;a++){let o=n.charCodeAt(a);if(o===cb){if(a===e)break;if(o=n.charCodeAt(++a),Mr(cb,o)){let e=a-1,o=Kr(n,e);a=o-1,t+=$r(n.substring(e+1,o))}else 13===o&&10===n.charCodeAt(a+1)&&a++}else t+=n[a]}return t}function db(n){let e=\"\";if(1===n.length&&45===n.charCodeAt(0))return\"\\\\-\";for(let t=0;t<n.length;t++){let a=n.charCodeAt(t);0!==a?a<=31||127===a||a>=48&&a<=57&&(0===t||1===t&&45===n.charCodeAt(0))?e+=\"\\\\\"+a.toString(16)+\" \":Ir(a)?e+=n.charAt(t):e+=\"\\\\\"+n.charAt(t):e+=\"�\"}return e}var{tokenize:hb,parse:pb,generate:ub,lexer:gb,createLexer:wb,walk:bb,find:fb,findLast:kb,findAll:yb,toPlainObject:vb,fromPlainObject:jb,fork:Sb}=sb;const xb=new Set([\"inherit\",\"initial\",\"unset\"]),Cb=new Set([\"caption\",\"icon\",\"menu\",\"message-box\",\"small-caption\",\"status-bar\"]),zb=new Set([\"normal\",\"bold\",\"bolder\",\"lighter\",\"100\",\"200\",\"300\",\"400\",\"500\",\"600\",\"700\",\"800\",\"900\"]),Lb=new Set([\"normal\",\"italic\",\"oblique\"]),Ab=new Set([\"normal\",\"small-caps\"]),Tb=new Set([\"normal\",\"condensed\",\"semi-condensed\",\"extra-condensed\",\"ultra-condensed\",\"expanded\",\"semi-expanded\",\"extra-expanded\",\"ultra-expanded\"]),Ib=new Set([\"Dimension\",\"Identifier\",\"Percentage\",\"Number\",\"Function\",\"UnaryExpression\"]),Rb=new Set([\"style\",\"variant\",\"weight\",\"stretch\"]),Eb=\"Operator\",Db=\"Identifier\",Mb=\"normal\";function Bb(n){return new Error(\"[parse-css-font] \"+n)}function Nb(n){return n?(('\"'===n[0]&&'\"'===n[n.length-1]||\"'\"===n[0]&&\"'\"===n[n.length-1])&&(n=n.slice(1,-1)),u(n).trim()):n}function Pb(n,e=0){const t=[{mode:\"normal\",character:null}],a=[];let o=0,i=\"\",r=null,s=null,l=e,c=n;\"(\"===n[0]&&\")\"===n[n.length-1]&&(c=n.substring(1,n.length-1),l++);for(let n=0;n<c.length;n++){const e=c[n];if(\"'\"!==e&&'\"'!==e||(!0===t[o].isCalculationEnabled?(t.push({mode:\"string\",isCalculationEnabled:!1,character:e}),o++):\"string\"===t[o].mode&&t[o].character===e&&\"\\\\\"!==c[n-1]&&(t.pop(),o--)),\"{\"===e?(t.push({mode:\"interpolation\",isCalculationEnabled:!0}),o++):\"}\"===e&&(t.pop(),o--),\"normal\"===t[o].mode&&\":\"===e){const e=c.substring(n+1);s={type:\"value\",before:/^(\\s*)/.exec(e)[1],after:/(\\s*)$/.exec(e)[1],value:e.trim()},s.sourceIndex=s.before.length+n+1+l,r={type:\"colon\",sourceIndex:n+l,after:s.before,value:\":\"};break}i+=e}return i={type:\"media-feature\",before:/^(\\s*)/.exec(i)[1],after:/(\\s*)$/.exec(i)[1],value:i.trim()},i.sourceIndex=i.before.length+l,a.push(i),null!==r&&(r.before=i.after,a.push(r)),null!==s&&a.push(s),a}function Ob(n,e=0){const t=[];let a,o=0,i=!1;function r(){return{before:\"\",after:\"\",value:\"\"}}a={before:\"\",after:\"\",value:\"\"};for(let s=0;s<n.length;s++){const l=n[s];i?(a.value+=l,\"{\"!==l&&\"(\"!==l||o++,\")\"!==l&&\"}\"!==l||o--):-1!==l.search(/\\s/)?a.before+=l:(\"(\"===l&&(a.type=\"media-feature-expression\",o++),a.value=l,a.sourceIndex=e+s,i=!0),!i||0!==o||\")\"!==l&&s!==n.length-1&&-1===n[s+1].search(/\\s/)||(-1!==[\"not\",\"only\",\"and\"].indexOf(a.value)&&(a.type=\"keyword\"),\"media-feature-expression\"===a.type&&(a.nodes=Pb(a.value,a.sourceIndex)),t.push(Array.isArray(a.nodes)?new _b(a):new Fb(a)),a=r(),i=!1)}for(let n=0;n<t.length;n++)if(a=t[n],n>0&&(t[n-1].after=a.before),void 0===a.type){if(n>0){if(\"media-feature-expression\"===t[n-1].type){a.type=\"keyword\";continue}if(\"not\"===t[n-1].value||\"only\"===t[n-1].value){a.type=\"media-type\";continue}if(\"and\"===t[n-1].value){a.type=\"media-feature-expression\";continue}\"media-type\"===t[n-1].type&&(t[n+1]?a.type=\"media-feature-expression\"===t[n+1].type?\"keyword\":\"media-feature-expression\":a.type=\"media-feature-expression\")}if(0===n){if(!t[n+1]){a.type=\"media-type\";continue}if(t[n+1]&&(\"media-feature-expression\"===t[n+1].type||\"keyword\"===t[n+1].type)){a.type=\"media-type\";continue}if(t[n+2]){if(\"media-feature-expression\"===t[n+2].type){a.type=\"media-type\",t[n+1].type=\"keyword\";continue}if(\"keyword\"===t[n+2].type){a.type=\"keyword\",t[n+1].type=\"media-type\";continue}}if(t[n+3]&&\"media-feature-expression\"===t[n+3].type){a.type=\"keyword\",t[n+1].type=\"media-type\",t[n+2].type=\"keyword\";continue}}}return t}function _b(n){this.constructor(n),this.nodes=n.nodes,void 0===this.after&&(this.after=this.nodes.length>0?this.nodes[this.nodes.length-1].after:\"\"),void 0===this.before&&(this.before=this.nodes.length>0?this.nodes[0].before:\"\"),void 0===this.sourceIndex&&(this.sourceIndex=this.before.length),this.nodes.forEach(n=>{n.parent=this})}function Fb(n){this.after=n.after,this.before=n.before,this.type=n.type,this.value=n.value,this.sourceIndex=n.sourceIndex}_b.prototype=Object.create(Fb.prototype),_b.constructor=Fb,_b.prototype.walk=function(n,e){const t=\"string\"==typeof n||n instanceof RegExp,a=t?e:n,o=\"string\"==typeof n?new RegExp(n):n;for(let i=0;i<this.nodes.length;i++){const r=this.nodes[i];if((!t||o.test(r.type))&&a&&!1===a(r,i,this.nodes))return!1;if(r.nodes&&!1===r.walk(n,e))return!1}return!0},_b.prototype.each=function(n=()=>{}){for(let e=0;e<this.nodes.length;e++){if(!1===n(this.nodes[e],e,this.nodes))return!1}return!0};const qb=\"___PRESERVED_TOKEN_\",Ub={maxLineLen:0,expandVars:!1,uglyComments:!1,cuteComments:!1,debug:!1,output:\"\"},Hb=/url\\(\\s*([\"']?)data:/g,Wb=/\\s+/g,Gb=/\\n/g;const Vb=/(=\\s*?[\"']?)?#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])(\\}|[^0-9a-f{][^{]*?\\})/gi;const Kb=/@[a-z0-9-_]*keyframes\\s+[a-z0-9-_]+\\s*{/gi,Jb=/(^\\s|\\s$)/g;const Yb=/\"([^\\\\\"])*\"/g,Zb=/\"(\\\\.)*\"/g,$b=/\"(\\\\)*\"/g,Xb=/'([^\\\\'])*'/g,Qb=/'(\\\\.)*'/g,nf=/'(\\\\)*'/g,ef=/progid:DXImageTransform.Microsoft.Alpha\\(Opacity=/gi,tf=/\\r\\n/g,af=/[\\r\\n]/g,of=/@variables\\s*\\{\\s*([^}]+)\\s*\\}/g,rf=/\\s*([a-z0-9-]+)\\s*:\\s*([^;}]+)\\s*/gi,sf=/var\\s*\\(\\s*([^)]+)\\s*\\)/g,lf=/calc\\(([^;}]*)\\)/g,cf=/(^\\s*|\\s*$)/g,mf=/\\( /g,df=/ \\)/g,hf=/\\s*filter:\\s*progid:DXImageTransform.Microsoft.Matrix\\(([^)]+)\\);/g,pf=/(^|\\})(([^{:])+:)+([^{]*{)/g,uf=/\\s+([!{;:>+()\\],])/g,gf=/([^\\\\])\\s+([}])/g,wf=/!important/g,bf=/___PSEUDOCLASSCOLON___/g,ff=/:/g,kf=/\\s*(animation|animation-delay|animation-duration|transition|transition-delay|transition-duration):\\s*([^;}]+)/gi,yf=/(^|\\D)0?\\.?0(m?s)/gi,vf=/\\s*(flex|flex-basis):\\s*([^;}]+)/gi,jf=/\\s+/,Sf=/(hsla?)\\(([^)]+)\\)/g,xf=/(^\\s+|\\s+$)/g,Cf=/:first-(line|letter)(\\{|,)/gi,zf=/^(.*)(@charset)( \"[^\"]*\";)/gi,Lf=/^((\\s*)(@charset)( [^;]+;\\s*))+/gi,Af=/@(font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframe|media|page|namespace)/gi,Tf=/:(active|after|before|checked|disabled|empty|enabled|first-(?:child|of-type)|focus|hover|last-(?:child|of-type)|link|only-(?:child|of-type)|root|:selection|target|visited)/gi,If=/^(.*)(@charset \"[^\"]*\";)/g,Rf=/^(\\s*@charset [^;]+;\\s*)+/g,Ef=/:(lang|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?any)\\(/gi,Df=/([:,( ]\\s*)(attr|color-stop|from|rgba|to|url|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|max|min|(?:repeating-)?(?:linear|radial)-gradient)|-webkit-gradient)/gi,Mf=/\\s*\\/\\*/g,Bf=/\\*\\/\\s*/g,Nf=/\\band\\(/gi,Pf=/([^:])not\\(/gi,Of=/\\bor\\(/gi,_f=/([!{}:;>+([,])\\s+/g,Ff=/;+\\}/g,qf=/([0-9])\\.0(ex|ch|r?em|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|g?rad|turn|m?s|k?Hz|dpi|dpcm|dppx|%| |;)/gi,Uf=/:0 0 0 0(;|\\})/g,Hf=/:0 0 0(;|\\})/g,Wf=/(transform-origin|webkit-transform-origin|moz-transform-origin|o-transform-origin|ms-transform-origin|box-shadow):0(;|\\})/gi,Gf=/(:|\\s)0+\\.(\\d+)/g,Vf=/rgb\\s*\\(\\s*([0-9,\\s]+)\\s*\\)/gi,Kf=/(border|border-top|border-right|border-bottom|border-left|outline|background):none(;|\\})/gi,Jf=/progid:DXImageTransform\\.Microsoft\\.Alpha\\(Opacity=/gi,Yf=/\\(([-A-Za-z]+):([0-9]+)\\/([0-9]+)\\)/g,Zf=/___QUERY_FRACTION___/g,$f=/;;+/g,Xf=/(:|\\s)(#f00)(;|})/g,Qf=/___PRESERVED_NEWLINE___/g,nk=/(:|\\s)(#000080)(;|})/g,ek=/(:|\\s)(#808080)(;|})/g,tk=/(:|\\s)(#808000)(;|})/g,ak=/(:|\\s)(#800080)(;|})/g,ok=/(:|\\s)(#c0c0c0)(;|})/g,ik=/(:|\\s)(#008080)(;|})/g,rk=/(:|\\s)(#ffa500)(;|})/g,sk=/(:|\\s)(#800000)(;|})/g;function lk(n=\"\",e=Ub){const t=[],a=[];let o;const i=n;function r(e){n=n.replace(e,n=>{const e=n.substring(0,1);if((n=n.slice(1,-1)).indexOf(\"___PRESERVE_CANDIDATE_COMMENT_\")>=0)for(let e=0,a=t.length;e<a;e+=1)n=n.replace(\"___PRESERVE_CANDIDATE_COMMENT_\"+e+\"___\",t[e]);return n=n.replace(ef,\"alpha(opacity=\"),a.push(n),e+qb+(a.length-1)+\"___\"+e})}n=function(n,e){const t=Hb,a=n.length-1,o=[];let i,r=0;for(;null!==(i=t.exec(n));){const s=i.index+4;let l=i[1];0===l.length&&(l=\")\");let c=!1,m=t.lastIndex-1;for(;!1===c&&m+1<=a&&-1!=m;)m=n.indexOf(l,m+1),m>0&&\"\\\\\"!==n.charAt(m-1)&&(c=!0,\")\"!=l&&(m=n.indexOf(\")\",m)));if(o.push(n.substring(r,i.index)),c){let t=n.substring(s,m);const a=t.split(\",\");a.length>1&&\";base64\"==a[0].slice(-7)?t=t.replace(Wb,\"\"):(t=t.replace(Gb,\" \"),t=t.replace(Wb,\" \"),t=t.replace(xf,\"\")),e.push(t);const i=\"url(\"+qb+(e.length-1)+\"___)\";o.push(i),r=m+1}else o.push(n.substring(i.index,t.lastIndex)),r=t.lastIndex}return o.push(n.substring(r)),o.join(\"\")}(n,a),n=function(n,e){const t=[];let a,o=0;for(;;){const i=n.indexOf(\"/*\",o);if(!(i>-1))break;if(a=n.indexOf(\"*/\",i+2),!(a>-1)){a=-2;break}e.push(n.slice(i+2,a)),t.push(n.slice(o,i)),t.push(\"/*___PRESERVE_CANDIDATE_COMMENT_\"+(e.length-1)+\"___*/\"),o=a+2}return t.push(n.slice(a+2)),t.join(\"\")}(n,t),r(Yb),r(Zb),r($b),r(Xb),r(Qb),r(nf);for(let o=0,i=t.length;o<i;o+=1){const i=t[o],r=\"___PRESERVE_CANDIDATE_COMMENT_\"+o+\"___\";if(\"!\"!==i.charAt(0))if(\"\\\\\"!==i.charAt(i.length-1)){if(0===i.length){const e=n.indexOf(r);e>2&&\">\"===n.charAt(e-3)&&(a.push(\"\"),n=n.replace(r,qb+(a.length-1)+\"___\"))}n=n.replace(`/*${r}*/`,\"\")}else a.push(\"\\\\\"),n=n.replace(r,qb+(a.length-1)+\"___\"),o+=1,a.push(\"\"),n=n.replace(\"___PRESERVE_CANDIDATE_COMMENT_\"+o+\"___\",qb+(a.length-1)+\"___\");else e.cuteComments?a.push(i.substring(1).replace(tf,\"\\n\")):e.uglyComments?a.push(i.substring(1).replace(af,\"\")):a.push(i),n=n.replace(r,qb+(a.length-1)+\"___\")}if(e.expandVars){const e={};o=of,n=n.replace(o,(n,t)=>(o=rf,t.replace(o,(n,t,a)=>(t&&a&&(e[t]=a),\"\")),\"\")),o=sf,n=n.replace(o,(n,t)=>e[t]||\"none\")}n=n.replace(Wb,\" \"),o=lf,n=n.replace(o,(n,e)=>(a.push(\"calc(\"+e.replace(cf,\"\").replace(mf,\"(\").replace(df,\")\")+\")\"),qb+(a.length-1)+\"___\")),o=hf,n=n.replace(o,(n,e)=>(a.push(e),\"filter:progid:DXImageTransform.Microsoft.Matrix(\"+qb+(a.length-1)+\"___);\"));try{o=pf,n=n.replace(o,n=>n.replace(ff,\"___PSEUDOCLASSCOLON___\"))}catch(n){}if(n=(n=(n=(n=n.replace(uf,\"$1\")).replace(gf,\"$1$2\")).replace(wf,\" !important\")).replace(bf,\":\"),o=kf,n=n.replace(o,(n,e,t)=>e+\":\"+(t=t.replace(yf,(n,e,t)=>(a.push(\"0\"+t),e+qb+(a.length-1)+\"___\")))),o=vf,n=function(n,e){const t=Kb;let a,o=0;const i=(n,t)=>{\"0\"===(n=n.replace(Jb,\"\")).charAt(0)&&(e.push(n),a[t]=qb+(e.length-1)+\"___\")};for(;;){let e=0;a=\"\";let r=n.slice(o).search(t);if(r<0)break;o+=r,r=o;const s=n.length,l=[];for(;o<s;++o){const t=n.charAt(o);if(\"{\"===t)0===e?l.push(a.replace(Jb,\"\")):1===e&&(a=a.split(\",\"),a.forEach(i),l.push(a.join(\",\").replace(Jb,\"\"))),a=\"\",e+=1;else if(\"}\"===t){if(2===e)l.push(\"{\"+a.replace(Jb,\"\")+\"}\"),a=\"\";else if(1===e){n=n.slice(0,r)+l.shift()+\"{\"+l.join(\"\")+n.slice(o);break}e-=1}if(e<0)break;\"{\"!==t&&\"}\"!==t&&(a+=t)}}return n}(n=(n=n.replace(o,(n,e,t)=>{let o=t.split(jf);return a.push(o.pop()),o.push(qb+(a.length-1)+\"___\"),o=o.join(\" \"),`${e}:${o}`})).replace(Sf,(n,e,t)=>{const o=[];return t.split(\",\").forEach(n=>{\"0%\"===(n=n.replace(xf,\"\"))?(a.push(\"0%\"),o.push(qb+(a.length-1)+\"___\")):o.push(n)}),e+\"(\"+o.join(\",\")+\")\"}),a),n=n.replace(Cf,(n,e,t)=>\":first-\"+e.toLowerCase()+\" \"+t),n=e.cuteComments?(n=n.replace(Mf,\"___PRESERVED_NEWLINE___/*\")).replace(Bf,\"*/___PRESERVED_NEWLINE___\"):n.replace(Bf,\"*/\"),o=zf,n=n.replace(o,(n,e,t,a)=>t.toLowerCase()+a+e),o=Lf,n=n.replace(o,(n,e,t,a,o)=>t+a.toLowerCase()+o),o=Af,n=n.replace(o,(n,e)=>\"@\"+e.toLowerCase()),o=Tf,n=(n=(n=n.replace(o,(n,e)=>\":\"+e.toLowerCase())).replace(If,\"$2$1\")).replace(Rf,\"$1\"),o=Ef,n=n.replace(o,(n,e)=>\":\"+e.toLowerCase()+\"(\"),o=Df,n=(n=(n=(n=(n=(n=(n=(n=(n=n.replace(o,(n,e,t)=>e+t.toLowerCase())).replace(Nf,\"and (\")).replace(Pf,\"$1not (\")).replace(Of,\"or (\")).replace(_f,\"$1\")).replace(Ff,\"}\")).replace(qf,\"$1$2\")).replace(Uf,\":0$1\")).replace(Hf,\":0$1\"),o=Wf,n=(n=n.replace(o,(n,e,t)=>e.toLowerCase()+\":0 0\"+t)).replace(Gf,\"$1.$2\"),o=Vf,n=function(n){const e=Vb,t=[];let a,o=0;for(;null!==(a=e.exec(n));)t.push(n.substring(o,a.index)),a[1]?t.push(a[1]+\"#\"+(a[2]+a[3]+a[4]+a[5]+a[6]+a[7])):a[2].toLowerCase()==a[3].toLowerCase()&&a[4].toLowerCase()==a[5].toLowerCase()&&a[6].toLowerCase()==a[7].toLowerCase()?t.push(\"#\"+(a[3]+a[5]+a[7]).toLowerCase()):t.push(\"#\"+(a[2]+a[3]+a[4]+a[5]+a[6]+a[7]).toLowerCase()),o=e.lastIndex=e.lastIndex-a[8].length;return t.push(n.substring(o)),t.join(\"\")}(n=n.replace(o,(n,e)=>{const t=e.split(\",\");let a=\"#\";for(let n=0;n<t.length;n+=1){let e=parseInt(t[n],10);e<16&&(a+=\"0\"),e>255&&(e=255),a+=e.toString(16)}return a})),n=(n=(n=(n=(n=(n=(n=(n=(n=n.replace(Xf,\"$1red$3\")).replace(nk,\"$1navy$3\")).replace(ek,\"$1gray$3\")).replace(tk,\"$1olive$3\")).replace(ak,\"$1purple$3\")).replace(ok,\"$1silver$3\")).replace(ik,\"$1teal$3\")).replace(rk,\"$1orange$3\")).replace(sk,\"$1maroon$3\"),o=Kf,n=(n=(n=(n=n.replace(o,(n,e,t)=>e.toLowerCase()+\":0\"+t)).replace(Jf,\"alpha(opacity=\")).replace(Yf,\"($1:$2___QUERY_FRACTION___$3)\")).replace(Zf,\"/\"),e.maxLineLen>0){const t=[];let a=[];for(let o=0,i=n.length;o<i;o+=1){const i=n.charAt(o);a.push(i),\"}\"===i&&a.length>e.maxLineLen&&(t.push(a.join(\"\")),a=[])}a.length&&t.push(a.join(\"\")),n=t.join(\"\\n\")}if(n=(n=n.replace($f,\";\")).replace(cf,\"\"),a.length>1e3)return i;for(let e=a.length-1;e>=0;e--)n=n.replace(qb+e+\"___\",a[e],\"g\");return n=n.replace(Qf,\"\\n\")}function ck(n){function e(n){return\" \"===n||\"\\t\"===n||\"\\n\"===n||\"\\f\"===n||\"\\r\"===n}function t(e){let t;const a=e.exec(n.substring(g));if(a)return t=a[0],g+=t.length,t}const a=n.length,o=/^[ \\t\\n\\r\\u000c]+/,i=/^[, \\t\\n\\r\\u000c]+/,r=/^[^ \\t\\n\\r\\u000c]+/,s=/[,]+$/,l=/^\\d+$/,c=/^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;let m,d,h,p,u,g=0;const w=[];for(;;){if(t(i),g>=a)return w;m=t(r),d=[],\",\"===m.slice(-1)?(m=m.replace(s,\"\"),f()):b()}function b(){for(t(o),h=\"\",p=\"in descriptor\";;){if(u=n.charAt(g),\"in descriptor\"===p)if(e(u))h&&(d.push(h),h=\"\",p=\"after descriptor\");else{if(\",\"===u)return g+=1,h&&d.push(h),void f();if(\"(\"===u)h+=u,p=\"in parens\";else{if(\"\"===u)return h&&d.push(h),void f();h+=u}}else if(\"in parens\"===p)if(\")\"===u)h+=u,p=\"in descriptor\";else{if(\"\"===u)return d.push(h),void f();h+=u}else if(\"after descriptor\"===p)if(e(u));else{if(\"\"===u)return void f();p=\"in descriptor\",g-=1}g+=1}}function f(){let e,t,a,o,i,r,s,h,p,u=!1;const g={};for(o=0;o<d.length;o++)i=d[o],r=i[i.length-1],s=i.substring(0,i.length-1),h=parseInt(s,10),p=parseFloat(s),l.test(s)&&\"w\"===r?((e||t)&&(u=!0),0===h?u=!0:e=h):c.test(s)&&\"x\"===r?((e||t||a)&&(u=!0),p<0?u=!0:t=p):l.test(s)&&\"h\"===r?((a||t)&&(u=!0),0===h?u=!0:a=h):u=!0;u?console&&console.log&&console.log('Invalid srcset descriptor found in \"'+n+'\" at \"'+i+'\".'):(g.url=m,e&&(g.w=e),t&&(g.d=t),a&&(g.h=a),w.push(g))}}let mk,dk,hk,pk;mk={},mk.removeLeadingAndTrailingHTTPWhitespace=n=>n.replace(/^[ \\t\\n\\r]+/,\"\").replace(/[ \\t\\n\\r]+$/,\"\"),mk.removeTrailingHTTPWhitespace=n=>n.replace(/[ \\t\\n\\r]+$/,\"\"),mk.isHTTPWhitespaceChar=n=>\" \"===n||\"\\t\"===n||\"\\n\"===n||\"\\r\"===n,mk.solelyContainsHTTPTokenCodePoints=n=>/^[-!#$%&'*+.^_`|~A-Za-z0-9]*$/.test(n),mk.soleyContainsHTTPQuotedStringTokenCodePoints=n=>/^[\\t\\u0020-\\u007E\\u0080-\\u00FF]*$/.test(n),mk.asciiLowercase=n=>n.replace(/[A-Z]/g,n=>n.toLowerCase()),mk.collectAnHTTPQuotedString=(n,e)=>{let t=\"\";for(e++;;){for(;e<n.length&&'\"'!==n[e]&&\"\\\\\"!==n[e];)t+=n[e],++e;if(e>=n.length)break;const a=n[e];if(++e,\"\\\\\"!==a)break;if(e>=n.length){t+=\"\\\\\";break}t+=n[e],++e}return[t,e]};{const{solelyContainsHTTPTokenCodePoints:n}=mk;hk=e=>{let t=`${e.type}/${e.subtype}`;if(0===e.parameters.size)return t;for(let[a,o]of e.parameters)t+=\";\",t+=a,t+=\"=\",n(o)&&0!==o.length||(o=o.replace(/([\"\\\\])/g,\"\\\\$1\"),o=`\"${o}\"`),t+=o;return t}}{const{removeLeadingAndTrailingHTTPWhitespace:n,removeTrailingHTTPWhitespace:e,isHTTPWhitespaceChar:t,solelyContainsHTTPTokenCodePoints:a,soleyContainsHTTPQuotedStringTokenCodePoints:o,asciiLowercase:i,collectAnHTTPQuotedString:r}=mk;dk=s=>{s=n(s);let l=0,c=\"\";for(;l<s.length&&\"/\"!==s[l];)c+=s[l],++l;if(0===c.length||!a(c))return null;if(l>=s.length)return null;++l;let m=\"\";for(;l<s.length&&\";\"!==s[l];)m+=s[l],++l;if(m=e(m),0===m.length||!a(m))return null;const d={type:i(c),subtype:i(m),parameters:new Map};for(;l<s.length;){for(++l;t(s[l]);)++l;let n=\"\";for(;l<s.length&&\";\"!==s[l]&&\"=\"!==s[l];)n+=s[l],++l;if(n=i(n),l<s.length){if(\";\"===s[l])continue;++l}let c=null;if('\"'===s[l])for([c,l]=r(s,l);l<s.length&&\";\"!==s[l];)++l;else{for(c=\"\";l<s.length&&\";\"!==s[l];)c+=s[l],++l;if(c=e(c),\"\"===c)continue}n.length>0&&a(n)&&o(c)&&!d.parameters.has(n)&&d.parameters.set(n,c)}return d}}{const n=dk,e=hk,{asciiLowercase:t,solelyContainsHTTPTokenCodePoints:a,soleyContainsHTTPQuotedStringTokenCodePoints:o}=mk;pk=class{constructor(e){e=String(e);const t=n(e);if(null===t)throw new Error(`Could not parse MIME type string \"${e}\"`);this._type=t.type,this._subtype=t.subtype,this._parameters=new i(t.parameters)}static parse(n){try{return new this(n)}catch(n){return null}}get essence(){return`${this.type}/${this.subtype}`}get type(){return this._type}set type(n){if(0===(n=t(String(n))).length)throw new Error(\"Invalid type: must be a non-empty string\");if(!a(n))throw new Error(`Invalid type ${n}: must contain only HTTP token code points`);this._type=n}get subtype(){return this._subtype}set subtype(n){if(0===(n=t(String(n))).length)throw new Error(\"Invalid subtype: must be a non-empty string\");if(!a(n))throw new Error(`Invalid subtype ${n}: must contain only HTTP token code points`);this._subtype=n}get parameters(){return this._parameters}toString(){return e(this)}isJavaScript({allowParameters:n=!1}={}){switch(this._type){case\"text\":switch(this._subtype){case\"ecmascript\":case\"javascript\":case\"javascript1.0\":case\"javascript1.1\":case\"javascript1.2\":case\"javascript1.3\":case\"javascript1.4\":case\"javascript1.5\":case\"jscript\":case\"livescript\":case\"x-ecmascript\":case\"x-javascript\":return n||0===this._parameters.size;default:return!1}case\"application\":switch(this._subtype){case\"ecmascript\":case\"javascript\":case\"x-ecmascript\":case\"x-javascript\":return n||0===this._parameters.size;default:return!1}default:return!1}}isXML(){return\"xml\"===this._subtype&&(\"text\"===this._type||\"application\"===this._type)||this._subtype.endsWith(\"+xml\")}isHTML(){return\"html\"===this._subtype&&\"text\"===this._type}};class i{constructor(n){this._map=n}get size(){return this._map.size}get(n){return n=t(String(n)),this._map.get(n)}has(n){return n=t(String(n)),this._map.has(n)}set(n,e){if(n=t(String(n)),e=String(e),!a(n))throw new Error(`Invalid MIME type parameter name \"${n}\": only HTTP token code points are valid.`);if(!o(e))throw new Error(`Invalid MIME type parameter value \"${e}\": only HTTP quoted-string token code points are valid.`);return this._map.set(n,e)}clear(){this._map.clear()}delete(n){return n=t(String(n)),this._map.delete(n)}forEach(n,e){this._map.forEach(n,e)}keys(){return this._map.keys()}values(){return this._map.values()}entries(){return this._map.entries()}[Symbol.iterator](){return this._map[Symbol.iterator]()}}}const uk={normalizeFontFamily:An,flatten:Nn,getFontWeight:Dn,removeQuotes:En},gk=/\\s*,\\s*/,wk=/-/,bk=/\\?/g,fk=/^U\\+/i,kk=[/^normal$/,/^italic$/,/^oblique$/,/^oblique\\s+/];function yk(n,e,t,a){const o={rules:{processed:0,discarded:0},fonts:{processed:0,discarded:0}},i={declared:[],used:[]},r=n.createElement(\"style\");let s=\"\";n.body.appendChild(r),e.forEach(e=>{if(e.stylesheet){const t=e.stylesheet.children;t&&(o.processed+=t.size,o.discarded+=t.size,vk(t,i,a),s=Ek(n,t,r,s))}}),t.forEach(n=>{const e=Lk(n,a);e.length&&i.used.push(e),s=Dk(n.children,r,s)}),r.remove(),s+=n.body.innerText,globalThis.getComputedStyle&&a.doc&&(i.used=i.used.map(n=>n.map(n=>{const e=n.match(/^var\\((--.*)\\)$/);if(e&&e[1]){const t=globalThis.getComputedStyle(a.doc.body).getPropertyValue(e[1]);return t&&t.split(\",\").map(n=>uk.normalizeFontFamily(n))||n}return n})),i.used=i.used.map(n=>uk.flatten(n)));let l,c;i.used.find(n=>n.find(n=>n.match(/^var\\(--/)))?l=[]:(c=new Map,i.used.forEach(n=>n.forEach(n=>{if(i.declared.find(e=>e.fontFamily==n)){const e=a.usedFonts&&a.usedFonts.filter(e=>e[0]==n);e&&e.length&&c.set(n,e)}})),l=i.declared.filter(n=>!c.has(n.fontFamily)));const m=Array.from(new Set(s)).map(n=>n.charCodeAt(0)).sort((n,e)=>n-e);return e.forEach(n=>{if(n.stylesheet){const e=n.stylesheet.children;e&&(jk(e,i.declared,l,c,m),o.rules.discarded-=e.size)}}),o}function vk(n,e,t){n.forEach(n=>{if(\"Atrule\"==n.type&&(\"media\"==n.name||\"supports\"==n.name||\"layer\"==n.name||\"container\"==n.name)&&n.block&&n.block.children)vk(n.block.children,e,t);else if(\"Rule\"==n.type){const a=Lk(n.block,t);a.length&&e.used.push(a)}else if(\"Atrule\"==n.type&&\"font-face\"==n.name){const t=uk.normalizeFontFamily(zk(n.block.children,\"font-family\"));if(t){const a=zk(n.block.children,\"font-weight\")||\"400\",o=zk(n.block.children,\"font-style\")||\"normal\",i=zk(n.block.children,\"font-variant\")||\"normal\";a.split(\",\").forEach(n=>e.declared.push({fontFamily:t,fontWeight:uk.getFontWeight(uk.removeQuotes(n)),fontStyle:o,fontVariant:i}))}}})}function jk(n,e,t,a,o){const i=[];for(let r=n.head;r;r=r.next){const n=r.data;if(\"Atrule\"==n.type&&\"import\"==n.name&&n.prelude&&n.prelude.children&&n.prelude.children.head.data.importedChildren)jk(n.prelude.children.head.data.importedChildren,e,t,a,o);else if(\"Atrule\"==n.type&&(\"media\"==n.name||\"supports\"==n.name||\"layer\"==n.name||\"container\"==n.name)&&n.block&&n.block.children)jk(n.block.children,e,t,a,o);else if(\"Atrule\"==n.type&&\"font-face\"==n.name){const s=uk.normalizeFontFamily(zk(n.block.children,\"font-family\"));if(s){const l=zk(n.block.children,\"unicode-range\");!t.find(n=>n.fontFamily==s)&&Bk(o,l)&&Sk(n,s,e,a)||i.push(r)}const l=[];for(let e=n.block.children.head;e;e=e.next)\"font-display\"==e.data.property&&l.push(e);l.length&&l.forEach(e=>n.block.children.remove(e))}}i.forEach(e=>n.remove(e))}function Sk(n,e,t,a){let o;const i=a&&a.get(e);if(i&&i.length){let a=zk(n.block.children,\"font-style\")||\"normal\";if(kk.find(n=>a.trim().match(n))){const r=uk.getFontWeight(zk(n.block.children,\"font-weight\")||\"400\"),s=t.filter(n=>n.fontFamily==e&&n.fontStyle==a).map(n=>n.fontWeight.split(\" \")).sort((n,e)=>Number.parseInt(n[0],10)-Number.parseInt(e[0],10));let l=i.map(n=>Tk(n,a,s)).filter(n=>n);o=xk(r,l),o||(l=i.map(n=>((n=Array.from(n))[2]=\"normal\",Tk(n,a,s))).filter(n=>n),o=xk(r,l),o||(l=i.map(n=>((n=Array.from(n))[2]=a=\"normal\",Tk(n,a,s))).filter(n=>n),o=xk(r,l)))}else o=!0}else o=!0;return o}function xk(n,e){let t;for(const a of n.split(\",\")){let{min:n,max:o}=Ck(a);o||(o=900),t=t||e.find(e=>{let{min:t,max:a}=Ck(e);return a||(a=t),t>=n&&a<=o})}return t}function Ck(n){const e=n.split(\" \");return{min:Number.parseInt(uk.getFontWeight(e[0]),10),max:e[1]&&Number.parseInt(uk.getFontWeight(e[1]),10)}}function zk(n,e){let t;if(n&&(t=n.filter(n=>n.property==e).tail),t)try{return uk.removeQuotes(ub(t.data.value)).toLowerCase()}catch(n){}}function Lk(n,e){let t=n.children.filter(n=>\"font-family\"==n.property).tail,a=[];t&&(t.data.value.children?Ak(t.data.value,a):(t=ub(t.data.value),t&&a.push(uk.normalizeFontFamily(t))));const o=n.children.filter(n=>\"font\"==n.property).tail;if(o&&o.data&&o.data.value)try{let n=o.data.value;const t=ub(n).match(/^var\\((--.*)\\)$/);t&&t[1]&&(n=pb(globalThis.getComputedStyle(e.doc.body).getPropertyValue(t[1]),{context:\"value\"}));const i=function(n){const e=ub(n),t=e.toLowerCase();if(Cb.has(t))return{system:e};if(xb.has(t))return{global:e};const a=n.children,o={lineHeight:Mb,stretch:Mb,style:Mb,variant:Mb,weight:Mb},i={style:!1,variant:!1,weight:!1,stretch:!1};for(let n=a.head;n;n=n.next){const e=n.data.name||n.data.value||ub(n.data),t=e.toLowerCase();if(t!==Mb)if(zb.has(t))i.weight||(o.weight=e,i.weight=!0);else if(Lb.has(t))i.style||(o.style=e,i.style=!0);else if(Ab.has(t))i.variant||(o.variant=e,i.variant=!0);else{if(!Tb.has(t)){if(Ib.has(n.data.type)){if(o.size=ub(n.data),n=n.next,n&&n.data.type==Eb&&\"/\"==n.data.value&&n.next&&(o.lineHeight=ub(n.next.data),n=n.next.next),!n)throw Bb(\"Missing required font-family.\");o.family=[];let e=\"\";for(;n;){for(;n&&n.data.type==Eb&&\",\"==n.data.value;)n=n.next;if(n)if(n.data.type==Db)for(;n&&n.data.type==Db;)e+=\" \"+ub(n.data),n=n.next;else e=Nb(ub(n.data)),n=n.next;e=e.trim(),e&&(o.family.push(e),e=\"\")}return o}throw Bb(\"Unknown or unsupported font token: \"+e)}i.stretch||(o.stretch=e,i.stretch=!0)}else Rb.forEach(n=>{i[n]||(o[n]=e)})}throw Bb(\"Missing required font-size.\")}(n);i.family.forEach(n=>a.push(uk.normalizeFontFamily(n)))}catch(n){}return a}function Ak(n,e){let t=n.children.head;for(;t;)if(\"Identifier\"==t.data.type){let n=t.data.name,a=t.next;for(;a&&\"Operator\"!=a.data.type&&\",\"!=a.data.value;)n+=\" \"+a.data.name,a=a.next;e.push(uk.normalizeFontFamily(n)),t=t.next}else if(\"Function\"==t.data.type&&\"var\"==t.data.name&&t.data.children){const n=t.data.children.head.data.name;e.push(uk.normalizeFontFamily(\"var(\"+n+\")\"));let a=t.data.children.head.next;for(;a&&\"Operator\"==a.data.type&&\",\"==a.data.value;)a=a.next;const o=a;o&&(o.data.children?Ak(o.data,e):e.push(uk.normalizeFontFamily(o.data.value))),t=t.next}else\"String\"==t.data.type?(e.push(uk.normalizeFontFamily(t.data.value)),t=t.next):\"Number\"==t.data.type?(e.push(uk.normalizeFontFamily(String(t.data.value))),t=t.next):t=t.next}function Tk(n,e,t){let a;if(t=t.map(n=>n.map(n=>String(Number.parseInt(n,10)))),n[2]==e){let e=Number(n[1]);t.length>1?(e>=400&&e<=500&&(a=t.find(n=>n[0]>=e&&n[0]<=500),a||(a=Ik(e,t)),a||(a=Rk(e,t))),e<400&&(a=t.slice().reverse().find(n=>n[n.length-1]<=e),a||(a=Rk(e,t))),e>500&&(a=t.find(n=>n[0]>=e),a||(a=Ik(e,t))),a||(a=t.find(n=>n[0]<=e&&n[n.length-1]>=e))):a=t[0]}return a?a.join(\" \"):void 0}function Ik(n,e){return e.slice().reverse().find(e=>e[e.length-1]<n)}function Rk(n,e){return e.find(e=>e[0]>n)}function Ek(n,e,t,a){return e.forEach(e=>{e.block&&e.block.children&&e.prelude&&e.prelude.children&&(\"Atrule\"!=e.type||\"media\"!=e.name&&\"supports\"!=e.name&&\"layer\"!=e.name&&\"container\"!=e.name?\"Rule\"==e.type&&(a=Dk(e.block.children,t,a)):a=Ek(n,e.block.children,t,a))}),a}function Dk(n,e,t){const a=Mk(n,\"content\",e),o=Mk(n,\"quotes\",e);return t.includes(a)||(t+=a),t.includes(o)||(t+=o),t}function Mk(n,e,t){const a=zk(n,e)||\"\";return a?(t.textContent='tmp { content:\"'+a+'\"}',t.sheet&&t.sheet.cssRules?uk.removeQuotes(t.sheet.cssRules[0].style.getPropertyValue(\"content\")):a):\"\"}function Bk(n,e){if(e){const t=e.split(gk),a=t.filter(e=>{const t=e.split(wk);if(2==t.length)t[0]=Nk(t[0]),t[1]=Nk(t[1]);else if(1==t.length)if(t[0].includes(\"?\")){const n=t[0],e=n;t[0]=Nk(n.replace(bk,\"0\")),t[1]=Nk(e.replace(bk,\"F\"))}else t[0]&&(t[0]=t[1]=Nk(t[0]));if(!t[0]||n.find(n=>n>=t[0]&&n<=t[1]))return!0});return Boolean(!t.length||a.length)}return!0}function Nk(n){return n=n.replace(fk,\"\"),parseInt(n,16)}function Pk(n){return function(n){const e=[];let t=0,a=0;const o=/^(\\s*)url\\s*\\(/.exec(n);if(null!==o){let a=o[0].length,i=1;for(;i>0;){const e=n[a];\"(\"===e&&i++,\")\"===e&&i--,a++}e.unshift(new Fb({type:\"url\",value:n.substring(0,a).trim(),sourceIndex:o[1].length,before:o[1],after:/^(\\s*)/.exec(n.substring(a))[1]})),t=a}for(let o=t;o<n.length;o++){const i=n[o];if(\"(\"===i&&a++,\")\"===i&&a--,0===a&&\",\"===i){const a=n.substring(t,o),i=/^(\\s*)/.exec(a)[1];e.push(new _b({type:\"media-query\",value:a.trim(),sourceIndex:t+i.length,nodes:Ob(a,t),before:i,after:/(\\s*)$/.exec(a)[1]})),t=o+1}}const i=n.substring(t),r=/^(\\s*)/.exec(i)[1];return e.push(new _b({type:\"media-query\",value:i.trim(),sourceIndex:t+r.length,nodes:Ob(i,t),before:r,after:/(\\s*)$/.exec(i)[1]})),e}(n)}function Ok(n){if(!n||!n.nodes)return!1;for(const e of n.nodes)if(e&&\"keyword\"===e.type&&e.value&&\"not\"===e.value.toLowerCase())return!0;return!1}function _k(n,e){for(let t=e-1;t>=0;t--){const e=n.nodes[t];if(e){if(\"operator\"===e.type&&\",\"===e.value)break;if(\"keyword\"===e.type&&e.value&&\"not\"===e.value.toLowerCase())return!0}}return!1}function Fk(n,e=[]){for(let t=0;t<n.nodes.length;t++){const a=n.nodes[t];if(\"media-query\"!=a.type){if(\"media-type\"==a.type){const o=_k(n,t);e.push({not:o,value:a.value})}}else Fk(a,e)}return e}function qk(n){if(!n||!n.nodes)return!1;for(const e of n.nodes)if(e){if(\"media-feature-expression\"===e.type)return!0;if(\"keyword\"===e.type&&e.value&&\"and\"===e.value.toLowerCase())return!0}return!!Ok(n)}const Uk={flatten:Nn},Hk=\"all\";function Wk(n,{keepPrintStyleSheets:e}={}){const t={processed:0,discarded:0};return n.forEach((a,o)=>{if(a.stylesheet)if(Vk(a.mediaText||Hk,e)&&a.stylesheet.children){Gk(a.stylesheet.children,t,e).forEach(({cssRules:n,cssRule:e})=>n.remove(e))}else n.delete(o),o.element&&o.element.remove()}),t}function Gk(n,e,t,a=[]){for(let o=n.head;o;o=o.next){const i=o.data;\"Atrule\"==i.type&&\"media\"==i.name&&i.block&&i.block.children&&i.prelude&&i.prelude.children&&(e.processed++,Vk(ub(i.prelude),t)?Gk(i.block.children,e,t,a):(a.push({cssRules:n,cssRule:o}),e.discarded++))}return a}function Vk(n,e){let t;try{t=Pk(n);for(const n of t)if(n&&n.nodes){if(qk(n))return!0;if(Ok(n))return!0}}catch{return!0}let a=Uk.flatten(t.filter(n=>n&&n.nodes).map(n=>Fk(n)));return a&&a.length||(a=[{not:!1,value:Hk}]),a.some(n=>!n.not&&(\"screen\"==n.value||n.value==Hk||e&&\"print\"==n.value))}function Kk(n,e={a:0,b:0,c:0}){if(!n||!n.type)return e;switch(n.type){case\"Selector\":Yk(n.children,n=>Kk(n,e));break;case\"IdSelector\":e.a++;break;case\"ClassSelector\":case\"AttributeSelector\":e.b++;break;case\"TypeSelector\":\"*\"!==n.name&&e.c++;break;case\"PseudoElementSelector\":e.c++;break;case\"PseudoClassSelector\":{const t=n.name.toLowerCase();if(\"where\"===t)break;if(\"is\"===t||\"not\"===t||\"has\"===t){Yk(n.children,n=>{\"SelectorList\"===n.type&&Jk(e,Zk(n))});break}if(\"nth-child\"===t||\"nth-last-child\"===t){e.b++,Yk(n.children,n=>{\"Nth\"===n.type&&n.selector&&Jk(e,Zk(n.selector))});break}\"scope\"===t?e.c++:e.b++;break}}return e}function Jk(n,e){n.a+=e.a,n.b+=e.b,n.c+=e.c}function Yk(n,e){if(!n)return;let t=n.head;for(;t;)e(t.data),t=t.next}function Zk(n){let e={a:0,b:0,c:0};return Yk(n.children,n=>{const t=Kk(n,{a:0,b:0,c:0});(t.a>e.a||t.a===e.a&&t.b>e.b||t.a===e.a&&t.b===e.b&&t.c>e.c)&&(e=t)}),e}function $k(n,e,t){if(!e||!e.length){let e={a:0,b:0,c:0};const a=[];return bb(n,{enter(n){if(a.push(n),\"Selector\"===n.type){if(a.some(n=>\"PseudoClassSelector\"===n.type&&\"where\"===n.name))return;const t=Kk(n);(t.a>e.a||t.a===e.a&&t.b>e.b||t.a===e.a&&t.b===e.b&&t.c>e.c)&&(e=t)}},leave(){a.pop()}}),t&&t.length&&e.b++,e}const a=ub(n);let o=[\"\"];e.forEach(n=>{if(!n||!n.children||!n.children.size)return;const e=n.children.toArray(),t=[];o.forEach(n=>e.forEach(e=>{const a=ub(e),o=n?n+\" \"+a:a;t.includes(o)||t.push(o)})),t.length&&(o=t)});let i={a:0,b:0,c:0};const r=new Set;return o.forEach(n=>{const e=function(n,e){return n?e?-1!==e.indexOf(\"&\")?e.split(\"&\").join(n):n+\" \"+e:n:e}(n,a);if(!r.has(e)){r.add(e);try{const n=$k(pb(e,{context:\"selectorList\"}));(n.a>i.a||n.a===i.a&&n.b>i.b||n.a===i.a&&n.b===i.b&&n.c>i.c)&&(i=n)}catch{}}}),i}const Xk=new Set([\"after\",\"before\",\"first-letter\",\"first-line\",\"placeholder\",\"selection\",\"part\",\"marker\"]);function Qk(n){if(!n||!n.children)return[];const e=[];for(let t=n.children.head;t;t=t.next){const n=t.data;e.push({data:n,text:ub(n)})}return e}const ny=[\"root\",\"empty\",\"first-child\",\"last-child\",\"only-child\",\"first-of-type\",\"last-of-type\",\"only-of-type\"],ey=[\"nth-child\",\"nth-last-child\",\"heading\",\"nth-of-type\",\"nth-last-of-type\"],ty=[\"not\",\"is\",\"where\",\"has\"];function ay(n,e,t){if(t.normalizedSelectorText||(t.normalizedSelectorText=new WeakMap),t.normalizedSelectorText.has(n))return t.normalizedSelectorText.get(n);const a=pb(ub(n.data),{context:\"selectorList\"});oy(a,e);let o=ub(a);return o&&o.trim()||(o=\"*\"),t.normalizedSelectorText.set(n,o),o}function oy(n,e){let t=n.children.head;for(;t;){const a=t.next,o=t.data;if(\"NestingSelector\"===o.type){if(e&&e.length){const a=e[e.length-1];let o=a&&a.data?a.data:a;if(o&&\"SelectorList\"===o.type&&o.children&&o.children.tail&&(o=o.children.tail.data),o&&o.children){for(let e=o.children.head;e;e=e.next){const a=lb(e.data);n.children.insertData(a,t)}n.children.remove(t)}}}else\"TypeSelector\"===o.type&&\"string\"==typeof o.name&&o.name.includes(\"|\")?o.name=o.name.substring(o.name.lastIndexOf(\"|\")+1):\"PseudoElementSelector\"===o.type?n.children.remove(t):\"PseudoClassSelector\"===o.type?ry(o)&&iy(n.children,t):\"Selector\"===o.type&&oy(o,e);t=a}}function iy(n,e){null==e.prev||\"Combinator\"==e.prev.data.type||\"WhiteSpace\"==e.prev.data.type?n.replace(e,pb(\"*\",{context:\"selector\"}).children.head):n.remove(e)}function ry(n){const e=n.name.toLowerCase();return n.children?!ey.includes(e)&&!ty.includes(e):!ny.includes(e)}const sy=new Set([\"after\",\"before\",\"first-letter\",\"first-line\"]),ly=\"media\",cy=\"supports\",my=new Set([ly,cy,\"container\"]),dy=\"Rule\",hy=\"Atrule\",py=\"Declaration\",uy=\"Raw\",gy=\"Value\",wy=\"layer\",by=\"font-face\",fy=\"keyframes\",ky=\"style\",yy=\"selectorList\",vy=\"declarationList\",jy=\"-\",Sy=\"|\",xy=/\\\\(?![0-9a-fA-F]{1,6}\\s|[^0-9a-zA-Z])/;function Cy(n,e){const t={doc:n,stats:{processed:0,discarded:0},matchedElements:new Set,matchedSelectors:new Map,matchingSelectors:new Map,layerDeclarationCounter:0,layerDeclarations:[],layerOrder:new Map,selectorData:new Map,selectorTexts:new Map,preludeTexts:new Map,rulesCounter:0,scopeIdCounter:0};return function(n,e){n.forEach((n,t)=>{n.scoped||!n.stylesheet||t.urlNode||Ky(n.stylesheet)&&zy(n.stylesheet.children,{layerStack:[],conditionalStack:[]},e)})}(e,t),function(n){const e=[];for(let t=0;t<n.layerDeclarations.length;t++){const a=n.layerDeclarations[t];e.push(a.name)}for(let t=0;t<e.length;t++){const a=e[t];n.layerOrder.has(a)||n.layerOrder.set(a,n.layerOrder.size)}}(t),function(n,e){n.forEach((t,a)=>{if(!t.scoped&&t.stylesheet&&!a.urlNode&&Ky(t.stylesheet)){const a=t.mediaText?[{name:ly,prelude:t.mediaText}]:[];Iy(t.stylesheet.children,n,{ancestorsSelectors:[],layerStack:[],scopeStack:[],conditionalStack:a},e)}})}(e,t),function(n){const e=new Set;n.matchedElements.forEach(t=>function(n,e,t){const a=new Map,o=function(n,e){const t=e.matchingSelectors.get(n),a=[];t.forEach(n=>{const t=e.selectorData.get(n).rule;if(Ky(t.block)){for(let a=t.block.children.head;a;a=a.next){const{type:t,value:o}=a.data;t===py&&o&&i(a,e.selectorData.get(n).specificity,!1,n)}}});const o=function(n){const e=n.getAttribute(ky);if(e){let n;try{n=pb(e,{context:vy})}catch{return[]}const t=[];for(let e=n.children&&n.children.head;e;e=e.next)e.data.type===py&&t.push({declaration:e,specificity:{a:1,b:0,c:0},isInline:!0});return t}return[]}(n);for(const n of o)i(n.declaration,n.specificity,!0);return a;function i(n,e,t,o){const{property:i,value:r}=n.data,s=r.type===uy,l=Ky(r)||r.type===uy;let c;if(r.type===gy&&l&&1==r.children.size&&(r.children.head.data.name&&(c=r.children.head.data.name.startsWith(jy)||xy.test(r.children.head.data.name)),!i.startsWith(jy)&&r.children.head.data.value))try{c=!gb.matchProperty(i,r).matched}catch{}!l||s||c||a.push({declaration:n,selector:o,specificity:e,isInline:t})}}(n,t),i=new Map;o.forEach(n=>{const{selector:e}=n,a=By(Ny(e,t));i.has(a)||i.set(a,[]),i.get(a).push(n)}),i.forEach(n=>{n.sort((n,e)=>function(n,e,t){const a=n.declaration.data.important?1:0,o=e.declaration.data.important?1:0;if(a!==o)return a-o;if(n.isInline&&!e.isInline)return 1;if(!n.isInline&&e.isInline)return-1;const i=n.selector?t.selectorData.get(n.selector):null,r=e.selector?t.selectorData.get(e.selector):null;if(i&&r){const o=function(n,e,t){const a=0===n.length,o=0===e.length;if(a&&o)return 0;if(a)return 1;if(o)return-1;const i=Zy(n),r=Zy(e);if(i===r)return 0;const s=Math.min(n.length,e.length),l=t.layerOrder;for(let t=0;t<s;t++)if(n[t]!==e[t]){const a=Zy(n.slice(0,t+1)),o=Zy(e.slice(0,t+1)),i=l.get(a),r=l.get(o);return void 0!==i&&void 0!==r?i-r:void 0!==i?-1:void 0!==r?1:0}return n.length-e.length}(i.layerStack,r.layerStack,t);if(0!==o)return a?-o:o;const s=n.specificity,l=e.specificity;return s.a!==l.a?s.a-l.a:s.b!==l.b?s.b-l.b:s.c!==l.c?s.c-l.c:i.rule.order!==r.rule.order?i.rule.order-r.rule.order:0}{const t=n.specificity,a=e.specificity;return t.a!==a.a?t.a-a.a:t.b!==a.b?t.b-a.b:t.c!==a.c?t.c-a.c:0}}(n,e,t)),n.forEach(n=>{const{selector:e,declaration:o}=n,i=Ny(e,t);a.set(o.data.property+\":\"+By(i),{selector:e,declaration:o})})}),a.forEach(({declaration:n})=>e.add(n))}(t,e,n)),function(n,e){const t=new Map,a=new Set;e.matchedElements.forEach(n=>{const o=e.matchingSelectors.get(n);o&&o.forEach(n=>{const o=e.selectorData.get(n).rule;if(Ky(o.block)){const n=o.block.children;for(let e=n.head;e;e=e.next)if(e.data.type===py){t.set(e,n);const{property:i,value:r}=e.data;(i&&i.startsWith(\"--\")||r&&r.type===uy||o.hasUnqueryableSelector)&&a.add(e)}}})}),t.forEach((e,t)=>{n.has(t)||a.has(t)||e.remove(t)})}(e,n)}(t),function(n,e){n.forEach((n,t)=>{n.scoped||!n.stylesheet||t.urlNode||Ky(n.stylesheet)&&Wy(n.stylesheet.children,e)})}(e,t),t.stats}function zy(n,e,t){const{layerStack:a,conditionalStack:o}=e;for(let i=n.head;i;i=i.next){const n=i.data;if(n.type===hy&&n.name===wy)Ly(n,a,o,t);else if(n.type===hy&&Ky(n.block)){const e=Ay(o,n,t);zy(n.block.children,{layerStack:a,conditionalStack:e},t)}else n.type===dy&&Ky(n.block)&&zy(n.block.children,e,t)}}function Ly(n,e,t,a){if(n.block){const o=Yy(n.prelude,a);Ty(e,o,t,a),zy(n.block.children,{layerStack:[...e,o],conditionalStack:t},a)}else if(n.prelude){Yy(n.prelude,a).split(\",\").forEach(n=>Ty(e,n,t,a))}}function Ay(n,e,t){return my.has(e.name)?[...n,{name:e.name,prelude:Yy(e.prelude,t)}]:n}function Ty(n,e,t,a){const o=Zy([...n,e]);a.layerDeclarations.push({name:o,order:a.layerDeclarationCounter++,conditionalStack:t.slice()})}function Iy(n,e,t,a){const o=new Set;for(let i=n.head;i;i=i.next)a.stats.processed++,Ry(i.data,i,e,t,o,a);o.forEach(e=>n.remove(e))}function Ry(n,e,t,a,o,i){n.type===hy&&\"import\"===n.name&&Ky(n.prelude)&&n.prelude.children.head.data.importedChildren?function(n,e,t,a,o,i){const r=n.prelude.children.head.data,s=r.importedMediaText?[{name:ly,prelude:r.importedMediaText}]:[];void 0!==r.importedLayerName&&s.push({name:wy,prelude:r.importedLayerName});void 0!==r.importedSupportsCondition&&s.push({name:cy,prelude:r.importedSupportsCondition});Iy(r.importedChildren,t,{...a,conditionalStack:s},i)}(n,0,t,a,0,i):n.type===hy&&n.name===wy&&Ky(n.block)?function(n,e,t,a,o,i){const r=Yy(n.prelude,i),s={...a,layerStack:[...a.layerStack,r]};Gy(n),Iy(n.block.children,t,s,i),Ky(n.block)||(i.stats.discarded++,o.add(e))}(n,e,t,a,o,i):n.type===hy&&\"scope\"===n.name&&Ky(n.block)?function(n,e,t,a,o,i){let r;try{r=function(n,e,t){const a=e.scopeStack||[],o=n&&n.include?n.include:[];let i=[];i=o.length?function(n,e,t){const a=new Set;return n.forEach(n=>{const o=ay(n,null,t);Uy(Xy(t.doc,o),e).forEach(n=>a.add(n))}),Array.from(a)}(o,a,t):a.length?Array.from(a[a.length-1].rootElements):function(n){const e=[];n.doc&&n.doc.documentElement&&e.push(n.doc.documentElement);!e.length&&n.doc&&n.doc.body&&e.push(n.doc.body);!e.length&&n.doc&&n.doc.children&&e.push(...Array.from(n.doc.children).filter(n=>1===n.nodeType));return e}(t);const r=Array.from(new Set(i.filter(Boolean)));if(!r.length)return null;const s=function(n,e,t){const a=new Set;if(!n.length||!e.length)return a;return n.forEach(n=>{const o=ay(n,null,t);e.forEach(n=>{Oy(n,o).forEach(n=>a.add(n))})}),a}(n.exclude||[],r,t);return{id:t.scopeIdCounter++,rootElements:new Set(r),stopElements:s}}(function(n){if(!n)return{include:[],exclude:[]};const e=function(n){if(!n||!n.children)return null;for(let e=n.children.head;e;e=e.next)if(e.data&&\"Scope\"===e.data.type)return e.data;return null}(n);if(!e)return{include:[],exclude:[]};const t=Qk(e.root),a=Qk(e.limit);function o(n){let e=!1;return bb(n,{visit:\"PseudoElementSelector\",enter(){e=!0}}),e||bb(n,{visit:\"PseudoClassSelector\",enter(n){const t=(n.name||\"\").toLowerCase();Xk.has(t)&&(e=!0)}}),e}for(const n of t)if(o(n.data))throw new Error(\"Pseudo-elements are not allowed in @scope prelude (scope-start)\");for(const n of a)if(o(n.data))throw new Error(\"Pseudo-elements are not allowed in @scope prelude (scope-end)\");return{include:t,exclude:a}}(n.prelude),a,i)}catch(n){}if(!r)return i.stats.discarded++,void o.add(e);const s={...a,scopeStack:[...a.scopeStack||[],r]};Gy(n),Iy(n.block.children,t,s,i),Ky(n.block)||(i.stats.discarded++,o.add(e))}(n,e,t,a,o,i):n.type===hy&&n.name!==by&&n.name!==fy&&!n.name.startsWith(jy)&&Ky(n.block)?function(n,e,t,a,o,i){const r=Ay(a.conditionalStack,n,i),s={...a,conditionalStack:r};Gy(n),Iy(n.block.children,t,s,i),Ky(n.block)||(i.stats.discarded++,o.add(e))}(n,e,t,a,o,i):n.type===dy&&Ky(n.prelude)&&function(n,e,t,a,o,i){n.order=i.rulesCounter++;const r=function(n,e,t){const a=[],{ancestorsSelectors:o}=e;for(let i=n.prelude.children.head,r=0;i;i=i.next,r++){const{startsWithCombinator:r,hasUnqueryableSelector:s}=Ey(i.data);if(s&&(n.hasUnqueryableSelector=!0),My(i,n,e,t),!(s||r&&o&&o.length)){const n=Py(i,o,e.scopeStack,t);n.length?Dy(n,i,t):a.push(i)}}return a}(n,a,i),s=function(n,e,t,a,o){e&&e.length&&e.forEach(e=>n.prelude.children.remove(e));if(!Ky(n.prelude))return o.stats.discarded++,t.add(a),!0;return!1}(n,r,o,e,i);!s&&Ky(n.block)&&function(n,e,t,a){Gy(n);const o={...t,ancestorsSelectors:[...t.ancestorsSelectors,n.prelude]};Iy(n.block.children,e,o,a)}(n,t,a,i)}(n,e,t,a,o,i)}function Ey(n){let e=!1,t=!1;bb(n,{enter(n){(\"PseudoElementSelector\"===n.type||\"PseudoClassSelector\"===n.type&&(sy.has(n.name)||ry(n)))&&(e=!0)}});const a=n.children.head.data;return t=a&&\"Combinator\"===a.type,{hasUnqueryableSelector:e,startsWithCombinator:t}}function Dy(n,e,t){n.forEach(n=>{t.matchedElements.add(n);let a=t.matchingSelectors.get(n);a||(a=[],t.matchingSelectors.set(n,a),n.matchingSelectors=a),a.push(e)})}function My(n,e,t,a){const{ancestorsSelectors:o,layerStack:i,scopeStack:r,conditionalStack:s}=t;a.selectorData.set(n,{specificity:$k(n.data,o,r),rule:e,layerStack:i,conditionalStack:s})}function By(n){return n.map(n=>`${n.name}:${n.prelude}`).join(\"|\")}function Ny(n,e){let t=[];if(n){const a=e.selectorData.get(n);a&&a.conditionalStack&&(t=a.conditionalStack)}return t}function Py(n,e,t,a){const o=function(n,e,t){let a;if(e&&e.length){a=function(n,e,t){const a=Jy(n,t);if(e&&e.length){let n=[\"\"];e.forEach(e=>{if(Ky(e)){const a=e.children.toArray(),o=[];n.forEach(n=>a.forEach(e=>{const a=Jy(e,t),i=n?Vy(n,a):a;o.includes(i)||o.push(i)})),o.length&&(n=o)}});const o=new Set;return n.forEach(n=>{const e=n?Vy(n,a):a;o.add(e)}),Array.from(o).join(\",\")}return a}(n.data,e,t);a=ay({data:$y(a,yy)},e,t)}a||(a=ay(n,e,t));return a}(n,e,a),i=function(n,e){if(!e||!e.length)return n;const t=e.map(n=>n.id).join(Sy);return`${n}${Sy}${t}`}(o,t),r=a.matchedSelectors.get(i);if(r)return r;let s;return t&&t.length?(s=function(n,e){const t=e[e.length-1],a=Array.from(t.rootElements);if(!a.length)return[];const o=new Set;return a.forEach(e=>{Oy(e,n).forEach(n=>o.add(n))}),Array.from(o)}(o,t),s=Uy(s,t)):s=Xy(a.doc,o),a.matchedSelectors.set(i,s),s}function Oy(n,e){const t=new Set;if(!n||1!==n.nodeType)return t;let a;_y(n,e)&&t.add(n);try{a=n.querySelectorAll(e)}catch{a=Fy([n],e,!0)}for(const n of a)t.add(n);return Array.from(t)}function _y(n,e){if(!n||1!==n.nodeType)return!1;try{return n.matches(e)}catch{return!1}}function Fy(n,e,t){const a=[],o=new Set,i=[];for(n.forEach(n=>{n&&1===n.nodeType&&i.push({node:n,include:!t})});i.length;){const{node:n,include:t}=i.pop();if(n&&!o.has(n)){o.add(n),t&&_y(n,e)&&a.push(n);for(let e=n.firstElementChild;e;e=e.nextElementSibling)i.push({node:e,include:!0})}}return a}function qy(n){if(!n)return[];if(9===n.nodeType||11===n.nodeType){const e=[];return n.documentElement&&e.push(n.documentElement),!n.body||e.length&&n.body===e[0]||e.push(n.body),!e.length&&n.children&&e.push(...Array.from(n.children).filter(n=>1===n.nodeType)),e}return[n]}function Uy(n,e){return e&&e.length?n.filter(n=>function(n,e){if(!n)return!1;for(let t=0;t<e.length;t++)if(!Hy(n,e[t]))return!1;return!0}(n,e)):n}function Hy(n,e){let t=n;for(;t&&1===t.nodeType;){if(e.stopElements&&e.stopElements.has(t))return!1;if(e.rootElements.has(t))return!0;t=t.parentElement}return!1}function Wy(n,e){const t=new Set;for(let a=n.head;a;a=a.next){const n=a.data;n.type===dy?Ky(n.block)?Wy(n.block.children,e):(e.stats.discarded++,t.add(a)):n.type===hy&&n.block&&n.name!==by&&n.name!==fy&&(Wy(n.block.children,e),Ky(n.block)||(e.stats.discarded++,t.add(a)))}t.forEach(e=>n.remove(e))}function Gy(n){const e=[];if(Ky(n.block))for(let t=n.block.children.head;t;t=t.next)if(t.data.type===uy)if(-1!==t.data.value.indexOf(\"{\")&&t.data.value.indexOf(\"{\")<t.data.value.indexOf(\"}\"))try{for(let n=$y(t.data.value,\"stylesheet\").children.head;n;n=n.next)e.push(n)}catch(n){}else e.push(t);else e.push(t);n.block.children.clear(),e.forEach(e=>n.block.children.appendData(e.data))}function Vy(n,e){const t=$y(e||\"&\"),a=n?$y(n):null;let o=!1;if(bb(t,{visit:\"NestingSelector\",enter(n,e,t){if(o=!0,!a)return void t.remove(e);a.children.toArray().map(n=>lb(n)).forEach(n=>t.insertData(n,e)),t.remove(e)}}),o)return ub(t);if(!a)return ub(t);const i=$y(`${n} ${e}`);return ub(i)}function Ky(n){return Boolean(n&&n.children&&n.children.head)}function Jy(n,e){return e.selectorTexts.has(n)||e.selectorTexts.set(n,ub(n)),e.selectorTexts.get(n)}function Yy(n,e){return n?(e.preludeTexts.has(n)||e.preludeTexts.set(n,ub(n)),e.preludeTexts.get(n)):\"\"}function Zy(n){return n.map(n=>\"\"===n?\"\\0\":n).join(\".\")}function $y(n,e=\"selector\"){return pb(n,{context:e})}function Xy(n,e){if(!n)return[];const t=9===n.nodeType||11===n.nodeType,a=Boolean(e&&-1!==e.indexOf(\":scope\"));if(t&&a)return function(n,e){const t=qy(n);if(!t.length)return[];const a=new Set;return t.forEach(n=>{Oy(n,e).forEach(n=>a.add(n))}),Array.from(a)}(n,e);try{return Array.from(n.querySelectorAll(e))}catch{return Fy(qy(n),e,!1)}}const Qy=\"data:,\";function nv(n){n.querySelectorAll(\"picture\").forEach(n=>{const e=n.querySelector(\"img\");if(e){let{src:t,srcset:a}=ev(e);if(!t){const e=function(n){let e=n.find(n=>n.src),t=e&&e.src,a=e&&e.srcset;t||(e=n.find(n=>av(n.src)),t=e&&e.src,t==Qy&&(t=null));a||(e=n.find(n=>av(n.srcset)),a=e&&e.srcset,a==Qy&&(a=null));return{src:t,srcset:a}}(Array.from(n.querySelectorAll(\"source\")).reverse());t=e.src,a||(a=e.srcset)}tv({src:t,srcset:a},e,n)}}),n.querySelectorAll(\":not(picture) > img[srcset]\").forEach(n=>tv(ev(n),n))}function ev(n){let e=n.getAttribute(\"src\");e==Qy&&(e=null);let t=av(n.getAttribute(\"srcset\"));return t==Qy&&(t=null),{src:e,srcset:t}}function tv(n,e,t){n.src?(e.setAttribute(\"src\",n.src),e.setAttribute(\"srcset\",\"\"),e.setAttribute(\"sizes\",\"\")):(e.setAttribute(\"src\",Qy),n.srcset?e.setAttribute(\"srcset\",n.srcset):(e.setAttribute(\"srcset\",\"\"),e.setAttribute(\"sizes\",\"\"))),t&&t.querySelectorAll(\"source\").forEach(n=>n.remove())}function av(n){if(n)try{const e=ck(n);if(e.length)return e.find(n=>n.url).url}catch(n){}}const ov=[\"allowfullscreen\",\"async\",\"autofocus\",\"autoplay\",\"checked\",\"compact\",\"controls\",\"declare\",\"default\",\"defaultchecked\",\"defaultmuted\",\"defaultselected\",\"defer\",\"disabled\",\"enabled\",\"formnovalidate\",\"hidden\",\"indeterminate\",\"inert\",\"ismap\",\"itemscope\",\"loop\",\"multiple\",\"muted\",\"nohref\",\"noresize\",\"noshade\",\"novalidate\",\"nowrap\",\"open\",\"pauseonexit\",\"readonly\",\"required\",\"reversed\",\"scoped\",\"seamless\",\"selected\",\"sortable\",\"truespeed\",\"typemustmatch\",\"visible\"],iv=[\"SCRIPT\",\"STYLE\",\"PRE\",\"TEXTAREA\"],rv=[\"id\",\"class\",\"style\",\"lang\",\"dir\",\"onclick\",\"ondblclick\",\"onmousedown\",\"onmouseup\",\"onmouseover\",\"onmousemove\",\"onmouseout\",\"onkeypress\",\"onkeydown\",\"onkeyup\"],sv={FORM:{method:\"get\"},SCRIPT:{language:\"javascript\",type:\"text/javascript\",charset:n=>!n.getAttribute(\"src\")},STYLE:{media:\"all\",type:\"text/css\"},LINK:{media:\"all\"}},lv=/[ \\t\\f\\r]+/g,cv=/[ \\t\\f\\r]{2,}|[\\t\\f\\r]/g,mv=/\\n{2,}/g,dv=/^\\s+$/,hv=[function(n){1==n.nodeType&&Array.from(n.attributes).forEach(e=>{ov.includes(e.name)&&n.setAttribute(e.name,\"\")})},function(n){3==n.nodeType&&n.previousSibling&&3==n.previousSibling.nodeType&&(n.textContent=n.previousSibling.textContent+n.textContent,n.previousSibling.remove())},function(n,e){if(3==n.nodeType){let t=n.parentElement;if(!(\"\"==t.getAttribute(e.PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME))){const e=n.textContent;let a=pv(t);for(;a;)t=t.parentElement,a=t&&pv(t);if((!t||a)&&e.length>1){const t=function(n){return n.parentElement&&\"HEAD\"==uv(n.parentElement)?\"\\n\":\" \"}(n);let a;a=\" \"==t?e.replace(cv,\" \"):e.replace(lv,t),a=a.replace(mv,\"\\n\"),a!=e&&(n.textContent=a)}}}},function(n){if(8==n.nodeType&&\"HTML\"!=uv(n.parentElement))return!n.textContent.toLowerCase().trim().startsWith(\"[if\")},function(n){1==n.nodeType&&Array.from(n.attributes).forEach(e=>{if(rv.includes(e.name.toLowerCase())){const t=n.getAttribute(e.name);(\"\"==t||(t||\"\").match(dv))&&n.removeAttribute(e.name)}})},function(n){if(1==n.nodeType){const e=sv[uv(n)];e&&Object.keys(e).forEach(t=>{const a=e[t];(\"function\"==typeof a?a(n):n.getAttribute(t)==a)&&n.removeAttribute(t)})}},function(n){if(1==n.nodeType&&\"SCRIPT\"==uv(n)&&\"application/ld+json\"==n.type&&n.textContent.trim())try{n.textContent=JSON.stringify(JSON.parse(n.textContent))}catch(n){}}];function pv(n){return n&&!iv.includes(uv(n))}function uv(n){return n.tagName&&n.tagName.toUpperCase()}const gv=1048576,wv={\"image/svg+xml\":\".svg\",\"image/png\":\".png\",\"image/gif\":\".gif\",\"image/tiff\":\".tiff\",\"image/bmp\":\".bmp\",\"image/x-icon\":\".ico\",\"image/heif\":\".heif\",\"image/heic\":\".heic\",\"image/avif\":\".avif\",\"image/apng\":\".apng\",\"image/jpeg\":\".jpg\",\"image/webp\":\".webp\",\"audio/mpeg\":\".mp3\",\"audio/ogg\":\".ogg\",\"audio/wav\":\".wav\",\"audio/webm\":\".webm\",\"video/3gpp\":\".3gp\",\"video/3gpp2\":\".3g2\",\"video/mpeg\":\".mpeg\",\"video/quicktime\":\".mov\",\"video/x-msvideo\":\".avi\",\"video/webm\":\".webm\",\"video/ogg\":\".ogv\",\"video/mp4\":\".mp4\",\"video/mp2t\":\".ts\",\"font/otf\":\".otf\",\"font/ttf\":\".ttf\",\"font/woff\":\".woff\",\"font/woff2\":\".woff2\",\"application/vnd.ms-fontobject\":\".eot\",\"font/collection\":\".ttc\"},bv=\"application/octet-stream\",fv=globalThis.URL,kv=globalThis.DOMParser,yv=globalThis.Blob,vv=globalThis.FileReader,jv=(n,e)=>(e.cache=\"force-cache\",e.referrerPolicy=\"strict-origin-when-cross-origin\",globalThis.fetch(n,e)),Sv=globalThis.TextDecoder,xv=globalThis.URLSearchParams;async function Cv(n,e,t,a,o){if(t)if(e.asBinary)if(e.inline){const n=new vv;n.readAsDataURL(new yv([t],{type:o+(e.charset?\";charset=\"+e.charset:\"\")})),t=await new Promise((e,t)=>{n.addEventListener(\"load\",()=>e(n.result),!1),n.addEventListener(\"error\",t,!1)})}else t=new Uint8Array(t);else{const n=new Uint8Array(t.slice(0,4));132==n[0]&&49==n[1]&&149==n[2]&&51==n[3]?a=\"gb18030\":255==n[0]&&254==n[1]?a=\"utf-16le\":254==n[0]&&255==n[1]&&(a=\"utf-16be\");try{t=new Sv(a).decode(t)}catch(n){t=new Sv(a=\"utf-8\").decode(t)}t=t.replace(/\\ufeff/gi,\"\")}else e.inline&&(t=e.asBinary?dn:\"\");return{data:t,resourceURL:n,charset:a,contentType:o}}function zv(n){const e=n.doctype;let t=\"\";return e&&(t=\"<!DOCTYPE \"+e.nodeName,e.publicId?(t+=' PUBLIC \"'+e.publicId+'\"',e.systemId&&(t+=' \"'+e.systemId+'\"')):e.systemId&&(t+=' SYSTEM \"'+e.systemId+'\"'),e.internalSubset&&(t+=\" [\"+e.internalSubset+\"]\"),t+=\"> \"),t}const Lv=((Av=Av||{}).fetch=Av.fetch||jv,Av.frameFetch=Av.frameFetch||Av.fetch||jv,{getDoctypeString:zv,getFilenameExtension(n,e,t,a){let o;try{o=new fv(n).pathname.match(/(\\.[^\\\\/.]*)$/)}catch(n){}return(o&&o[1]&&this.getValidFilename(o[1],e,t,a)||\"\").toLowerCase()},getContentTypeExtension:n=>wv[n]||\"\",getContent:async function(n,e){let t,a,o,i;const r=Av.fetch,s=Av.frameFetch;if(e.blockMixedContent&&/^https:/i.test(e.baseURI)&&!/^https:/i.test(n))return Cv(n,e);o=e.networkTimeout?new Promise((n,t)=>{i=n,a=globalThis.setTimeout(()=>t(new Error(\"network timeout\")),e.networkTimeout)}):new Promise(n=>{i=n});try{const a=e.acceptHeaders?e.acceptHeaders[e.expectedType]:\"*/*\";if(e.frameId)try{t=await Promise.race([s(n,{frameId:e.frameId,referrer:e.resourceReferrer,headers:{accept:a}}),o])}catch(e){t=await Promise.race([r(n,{headers:{accept:a}}),o])}else t=await Promise.race([r(n,{referrer:e.resourceReferrer,headers:{accept:a}}),o])}catch(t){return Cv(n,e)}finally{i(),e.networkTimeout&&globalThis.clearTimeout(a)}let l;try{l=await t.arrayBuffer()}catch(t){return e.inline?{data:e.asBinary?dn:\"\",resourceURL:n}:{resourceURL:n}}n=t.url||n;let c,m=\"\";try{const n=new pk(t.headers.get(\"content-type\"));m=n.type+\"/\"+n.subtype,c=n.parameters.get(\"charset\")}catch(n){}if((!m||m==bv&&e.asBinary)&&(m=function(n,e){if(\"image\"==n){if(t([255,255,255,255],[0,0,1,0]))return\"image/x-icon\";if(t([255,255,255,255],[0,0,2,0]))return\"image/x-icon\";if(t([255,255],[78,77]))return\"image/bmp\";if(t([255,255,255,255,255,255],[71,73,70,56,57,97]))return\"image/gif\";if(t([255,255,255,255,255,255],[71,73,70,56,59,97]))return\"image/gif\";if(t([255,255,255,255,0,0,0,0,255,255,255,255,255,255],[82,73,70,70,0,0,0,0,87,69,66,80,86,80]))return\"image/webp\";if(t([255,255,255,255,255,255,255,255],[137,80,78,71,13,10,26,10]))return\"image/png\";if(t([255,255,255],[255,216,255]))return\"image/jpeg\"}if(\"font\"==n){if(t([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,80]))return\"application/vnd.ms-fontobject\";if(t([255,255,255,255],[0,1,0,0]))return\"font/ttf\";if(t([255,255,255,255],[79,84,84,79]))return\"font/otf\";if(t([255,255,255,255],[116,116,99,102]))return\"font/collection\";if(t([255,255,255,255],[119,79,70,70]))return\"font/woff\";if(t([255,255,255,255],[119,79,70,50]))return\"font/woff2\"}if(\"video\"==n){if(t([0,0,0,0,255,255,255,255,255,255,255,255],[0,0,0,0,102,116,121,112,105,115,111,109]))return\"video/mp4\";if(t([255,255,255,255,0,0,0,0,255,255,255,255],[82,73,70,70,0,0,0,0,87,65,86,69]))return\"video/x-msvideo\";if(t([255,255,255,255],[0,0,1,179])||t([255,255,255,255],[0,0,1,186]))return\"video/mpeg\";if(t([255,255,255,255],[79,103,103,83]))return\"video/ogg\";if(t([255],[71]))return\"video/mp2t\";if(t([255,255,255,255],[26,69,223,163]))return\"video/webm\";if(t([0,0,0,0,255,255,255,255,255,255],[0,0,0,0,102,116,121,112,51,103]))return\"video/3gpp\"}if(\"audio\"==n){if(t([255,255],[255,249])||t([255,255],[255,254]))return\"audio/aac\";if(t([255,255,255,255],[77,84,104,100]))return\"audio/midi\";if(t([255,255,255,255],[0,0,1,179])||t([255,255,255,255],[0,0,1,186]))return\"audio/mpeg\";if(t([255,255],[255,251])||t([255,255],[255,243])||t([255,255],[255,242])||t([255,255,255],[73,68,51]))return\"audio/mpeg\";if(t([255,255,255,255],[79,103,103,83]))return\"audio/ogg\";if(t([255,255,255,255,0,0,0,0,255,255,255,255],[82,73,70,70,0,0,0,0,87,65,86,69]))return\"audio/wav\";if(t([255,255,255,255],[26,69,223,163]))return\"audio/webm\";if(t([0,0,0,0,255,255,255,255,255,255],[0,0,0,0,102,116,121,112,51,103]))return\"audio/3gpp\"}function t(n,t){let a=!0,o=0;if(e.byteLength>=t.length){const i=new Uint8Array(e,0,n.length);for(o=0;o<n.length&&a;o++)a=a&&(i[o]&n[o])==t[o];return a}}}(e.expectedType,l),m||(m=e.contentType?e.contentType:e.asBinary?bv:\"\")),!c&&e.charset&&(c=e.charset),e.asBinary){if(t.status>=400)return Cv(n,e);try{return e.maxResourceSizeEnabled&&l.byteLength>e.maxResourceSize*gv?Cv(n,e):Cv(n,e,l,null,m)}catch(t){return Cv(n,e)}}else{if(t.status>=400||e.validateTextContentType&&m&&!m.startsWith(\"text/\"))return Cv(n,e);if(c||(c=\"utf-8\"),e.maxResourceSizeEnabled&&l.byteLength>e.maxResourceSize*gv)return Cv(n,e,null,c);try{return Cv(n,e,l,c,m)}catch(t){return Cv(n,e,null,c)}}},parseURL:(n,e)=>void 0===e?new fv(n):new fv(n,e),resolveURL(n,e){return this.parseURL(n,e).href},getSearchParams:n=>Array.from(new xv(n)),getValidFilename:(n,e,t,a)=>On(n,e,t,a),parseDocContent:(n,e)=>_n(n,e),parseXMLContent:n=>(new kv).parseFromString(n,\"text/xml\"),parseSVGContent(n){const e=(new kv).parseFromString(n,\"image/svg+xml\");return e.querySelector(\"parsererror\")?(new kv).parseFromString(n,\"text/html\"):e},fixInvalidNesting(n,e=!0){xn(n,un,e)},markInvalidNesting(n){Sn(n)},getFixInvalidNestingSource:()=>xn.toString().replace(/\\s+/g,\" \"),digest:async(n,e)=>Bn(n,e),getContentSize:n=>Mn(n),formatFilename:(n,e,t)=>Zn(n,e,t),getMimeType:n=>!n.compressContent||n.selfExtractingArchive?\"text/html\":\"application/zip\",evalTemplate:async(n,e,t,a,o)=>$n(n,e,t,a,o),minifyHTML:(n,e)=>function(n,e){!function(n){n.querySelectorAll(\"style, script:not([src])\").forEach(n=>{n.textContent.trim()||n.remove()})}(n);const t=n.createTreeWalker(n.documentElement,4294967295,null,!1);let a=t.nextNode();for(;a;){const n=hv.find(n=>n(a,e)),o=a;a=t.nextNode(),n&&o.remove()}}(n,e),minifyCSSRules:(n,e)=>Cy(n,e),removeUnusedFonts:(n,e,t,a)=>yk(n,e,t,a),compressCSS:(n,e)=>lk(n,e),minifyMedias:(n,e)=>Wk(n,e),removeAlternativeImages:n=>nv(n),parseSrcset:n=>ck(n),preProcessDoc:(n,e,t)=>jn(n,e,t),postProcessDoc(n,e,t){!function(n,e,t){if(n.querySelectorAll(\"[\"+X+\"]\").forEach(n=>{n.textContent=n.getAttribute(X),n.removeAttribute(X)}),n.querySelectorAll(\"meta[disabled-http-equiv]\").forEach(n=>{n.setAttribute(\"http-equiv\",n.getAttribute(\"disabled-http-equiv\")),n.removeAttribute(\"disabled-http-equiv\")}),n.head&&n.head.querySelectorAll(\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\").forEach(n=>n.removeAttribute(\"hidden\")),!e){const t=[N,_,P,F,H,W,G,V,J,Y,q,$,en];e=n.querySelectorAll(t.map(n=>\"[\"+n+\"]\").join(\",\"))}e.forEach(n=>{n.removeAttribute(N),n.removeAttribute(P),n.removeAttribute(O),n.removeAttribute(_),n.removeAttribute(F),n.removeAttribute(H),n.removeAttribute(W),n.removeAttribute(G),n.removeAttribute(V),n.removeAttribute(J),n.removeAttribute(Y),n.removeAttribute(q),n.removeAttribute($),n.removeAttribute(en),n.removeAttribute(K)}),t&&t.forEach((n,e)=>n.replaceWith(e))}(n,e,t)},serialize:(n,e)=>r(n,e),removeQuotes:n=>En(n),appendInfobar:(n,e)=>function(n,e,t){return L(n,e,t)}(n,e),findLast(n,e){if(n.findLast&&\"function\"==typeof n.findLast)return n.findLast(e);{let t=n.length;for(;t--;)if(e(n[t],t,n))return n[t]}},ON_BEFORE_CAPTURE_EVENT_NAME:R,ON_AFTER_CAPTURE_EVENT_NAME:E,WIN_ID_ATTRIBUTE_NAME:U,REMOVED_CONTENT_ATTRIBUTE_NAME:N,HIDDEN_CONTENT_ATTRIBUTE_NAME:P,HIDDEN_FRAME_ATTRIBUTE_NAME:_,IMAGE_ATTRIBUTE_NAME:H,POSTER_ATTRIBUTE_NAME:W,VIDEO_ATTRIBUTE_NAME:G,CANVAS_ATTRIBUTE_NAME:V,STYLE_ATTRIBUTE_NAME:K,INPUT_VALUE_ATTRIBUTE_NAME:J,INPUT_CHECKED_ATTRIBUTE_NAME:Y,SHADOW_ROOT_ATTRIBUTE_NAME:q,PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME:F,STYLESHEET_ATTRIBUTE_NAME:$,SELECTED_CONTENT_ATTRIBUTE_NAME:Q,INVALID_ELEMENT_ATTRIBUTE_NAME:nn,COMMENT_HEADER:\"Page saved with SingleFile\",COMMENT_HEADER_LEGACY:\"Archive processed by SingleFile\",SINGLE_FILE_UI_ELEMENT_CLASS:cn,EMPTY_RESOURCE:dn,INFOBAR_TAGNAME:mn,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:\"_singleFile_waitForUserScript\",NO_SCRIPT_PROPERTY_NAME:\"singleFileDisabledNoscript\",NESTING_TRACK_ID_ATTRIBUTE_NAME:un});var Av;const Tv={serialize:(n,e)=>r(n,e),getDoctypeString:n=>Lv.getDoctypeString(n),appendInfobar:(n,e,t)=>L(n,e,t),extractInfobarData:n=>A(n),displayIcon:(n,e,t={})=>function(n,e,t={}){const a=A(n);a.saveUrl&&(a.openInfobar=t.openInfobar,a.infobarPositionAbsolute=t.infobarPositionAbsolute,a.infobarPositionTop=t.infobarPositionTop,a.infobarPositionRight=t.infobarPositionRight,a.infobarPositionBottom=t.infobarPositionBottom,a.infobarPositionLeft=t.infobarPositionLeft,L(n,a,e),T(n,a))}(n,e,t),fixInvalidNesting:(n,e=!1)=>Lv.fixInvalidNesting(n,e),markInvalidNesting:n=>Lv.markInvalidNesting(n),zip:_i,extract:async function(n,{password:e,prompt:t=()=>{},zipOptions:a={useWebWorkers:!0},noBlobURL:o}={}){const i={gif:\"image/gif\",jpg:\"image/jpeg\",png:\"image/png\",tif:\"image/tiff\",tiff:\"image/tiff\",bmp:\"image/bmp\",ico:\"image/vnd.microsoft.icon\",webp:\"image/webp\",svg:\"image/svg+xml\",avi:\"video/x-msvideo\",ogv:\"video/ogg\",mp4:\"video/mp4\",mpeg:\"video/mpeg\",ts:\"video/mp2t\",webm:\"video/webm\",\"3gp\":\"video/3gpp\",\"3g2\":\"video/3gpp\",mp3:\"audio/mpeg\",oga:\"audio/ogg\",mid:\"audio/midi\",midi:\"audio/midi\",opus:\"audio/opus\",wav:\"audio/wav\",weba:\"audio/webm\",heif:\"image/heif\",heic:\"image/heic\",avif:\"image/avif\",apng:\"image/apng\",mov:\"video/quicktime\",otf:\"font/otf\",ttf:\"font/ttf\",woff:\"font/woff\",woff2:\"font/woff2\",eot:\"application/vnd.ms-fontobject\",pdf:\"application/pdf\"},r=/stylesheet_[0-9]+\\.css/,s=/scripts\\/[0-9]+\\.js/,l=/^([0-9_]+\\/)?index\\.html$/,c=/index\\.html$/,m=/frames\\//,d=/^frames\\/\\d+\\/index.html/,h=/manifest\\.json$/,p=\";charset=utf-8\",u=/([{}()^$&.*?/+|[\\\\\\\\]|\\]|-)/g;let g;zip.configure(a),n.readUint8Array?g=n:(Array.isArray(n)&&(n=new Blob([new Uint8Array(n)])),g=new zip.BlobReader(n));const w=new zip.ZipReader(g),b=await w.getEntries(),f={password:e};let k,y,v,j=[],S=[],x=[];await Promise.all(b.map(async n=>{const{filename:e}=n;let a,l,d,h;const u={};if(!f.password&&n.encrypted&&(f.password=t(\"Please enter the password to view the page\")),e.match(c)||e.match(r)||e.match(s))e.match(c)?S.push(u):x.push(u),a=new zip.TextWriter,d=n.uncompressedSize>0?await n.getData(a,f):\"\",e.match(c)?h=\"text/html\"+p:e.match(r)?h=\"text/css\"+p:e.match(s)&&(h=\"text/javascript\"+p);else{j.push(u);const t=e.match(/\\.([^.]+)/);if(h=t&&t[1]&&i[t[1]]?i[t[1]]:\"application/octet-stream\",e.match(m)||o)l=await n.getData(new zip.Data64URIWriter(h),f);else{const e=await n.getData(new zip.BlobWriter(h),f);l=URL.createObjectURL(e)}}const g=n.filename.match(/^([0-9_]+\\/)?(.*)$/)[2];let w=\"\";const b=e.match(/(.*\\/)[^/]+$/);b&&b[1]&&(w=b[1]),Object.assign(u,{prefixPath:w,filename:n.filename,name:g,url:n.comment,content:l,mimeType:h,textContent:d,parentResources:[]})})),await w.close(),S.sort(L),x.sort(function(n,e){const t=n.filename.length-e.filename.length;return t||n.filename.localeCompare(e.filename)}),j=j.sort(L).concat(...x).concat(...S);for(const n of j){const{filename:e,prefixPath:t}=n;let{textContent:a}=n;void 0!==a&&(e.match(l)&&(y=a),e.match(s)||(j.forEach(e=>{const{filename:o,parentResources:i,content:r}=e;if(o.startsWith(t)&&o!=n.filename){const s=o.substring(t.length);s.match(h)||a.includes(s)&&(i.push(n.filename),void 0===e.textContent&&(a=z(a,s,r)))}}),n.textContent=a))}for(const n of j){let{textContent:e,prefixPath:t,filename:a}=n;if(void 0!==e){if(!a.match(s)){const o=a;for(const n of j){const{filename:a}=n;if(a.startsWith(t)&&a!=o){const o=a.substring(t.length);if(!o.match(h)){-1!=e.indexOf(o)&&(n.content=await C(n),e=z(e,o,n.content))}}}n.textContent=e,n.content=await C(n)}a.match(l)&&(k=e,v=n.url)}}return{docContent:k,origDocContent:y,resources:j,url:v};async function C(n){return n.filename.match(m)&&!n.filename.match(d)||o?await async function(n,e){const t=new FileReader;return t.readAsDataURL(new Blob([n],{type:e})),new Promise((n,e)=>{t.onload=()=>n(t.result.replace(p,\"\")),t.onerror=e})}(n.textContent,n.mimeType):URL.createObjectURL(new Blob([n.textContent],{type:n.mimeType}))}function z(n,e,t){if(\"function\"==typeof n.replaceAll)return n.replaceAll(e,t);{const a=new RegExp(e.replace(u,\"\\\\$1\"),\"g\");return n.replace(a,t)}}function L(n,e){const t=e.filename.length-n.filename.length;return t||e.filename.localeCompare(n.filename)}},display:async function(n,e,{disableFramePointerEvents:t}={}){e=(e=e.replace(/<noscript/gi,\"<template disabled-noscript\")).replaceAll(/<\\/noscript/gi,\"</template\");const a=(new DOMParser).parseFromString(e,\"text/html\");t&&a.querySelectorAll(\"iframe\").forEach(n=>{const e=\"pointer-events\";n.style.setProperty(\"-sf-\"+e,n.style.getPropertyValue(e),n.style.getPropertyPriority(e)),n.style.setProperty(e,\"none\",\"important\")}),n.open(),n.write(function(n){const e=n.doctype;let t=\"\";e&&(t=\"<!DOCTYPE \"+e.nodeName,e.publicId?(t+=' PUBLIC \"'+e.publicId+'\"',e.systemId&&(t+=' \"'+e.systemId+'\"')):e.systemId&&(t+=' SYSTEM \"'+e.systemId+'\"'),e.internalSubset&&(t+=\" [\"+e.internalSubset+\"]\"),t+=\"> \");return t}(a)),n.write(a.documentElement.outerHTML),n.close(),n.querySelectorAll(\"template[disabled-noscript]\").forEach(e=>{const t=n.createElement(\"noscript\");e.removeAttribute(\"disabled-noscript\"),Array.from(e.attributes).forEach(n=>t.setAttribute(n.name,n.value)),t.textContent=e.innerHTML,e.parentElement.replaceChild(t,e)}),n.documentElement.setAttribute(\"data-sfz\",\"\"),n.querySelectorAll(\"link[rel*=icon]\").forEach(n=>n.replaceWith(n.cloneNode(!0)))},formatFilename:Zn,INFOBAR_TAGNAME:z,NESTING_TRACK_ID_ATTRIBUTE_NAME:Lv.NESTING_TRACK_ID_ATTRIBUTE_NAME};n.helper=Tv});\n"
  },
  {
    "path": "lib/single-file-extension-editor.js",
    "content": "(function () {\n\t'use strict';\n\n\t/*\n\t * Copyright 2010-2020 Gildas Lormeau\n\t * contact : gildas.lormeau <at> gmail.com\n\t * \n\t * This file is part of SingleFile.\n\t *\n\t *   The code in this file is free software: you can redistribute it and/or \n\t *   modify it under the terms of the GNU Affero General Public License \n\t *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n\t *   of the License, or (at your option) any later version.\n\t * \n\t *   The code in this file is distributed in the hope that it will be useful, \n\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n\t *   General Public License for more details.\n\t *\n\t *   As additional permission under GNU AGPL version 3 section 7, you may \n\t *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n\t *   AGPL normally required by section 4, provided you include this license \n\t *   notice and a URL through which recipients can access the Corresponding \n\t *   Source.\n\t */\n\n\t/* global document, getComputedStyle, FileReader, Image, OffscreenCanvas, createImageBitmap */\n\n\tconst singlefile$1 = globalThis.singlefile;\n\n\tconst CLOSE_ICON = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSlUqHewg4hChOogFURFHqWIRLJS2QqsOJpf+CE0akhQXR8G14ODPYtXBxVlXB1dBEPwBcXNzUnSREr9LCi1ivOO4h/e+9+XuO0Col5lqdowDqmYZqXhMzOZWxMAruhGiOYohiZl6Ir2Qgef4uoeP73dRnuVd9+foVfImA3wi8SzTDYt4nXh609I57xOHWUlSiM+Jxwy6IPEj12WX3zgXHRZ4ZtjIpOaIw8RisY3lNmYlQyWeIo4oqkb5QtZlhfMWZ7VcZc178hcG89pymuu0BhHHIhJIQoSMKjZQhoUo7RopJlJ0HvPwDzj+JLlkcm2AkWMeFaiQHD/4H/zurVmYnHCTgjGg88W2P4aBwC7QqNn297FtN04A/zNwpbX8lTow80l6raVFjoDQNnBx3dLkPeByB+h/0iVDciQ/LaFQAN7P6JtyQN8t0LPq9q15jtMHIEO9WroBDg6BkSJlr3m8u6u9b//WNPv3A6mTcr3f/E/sAAAABmJLR0QAigCKAIrj2uckAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QkPDysvCdPVuwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAELSURBVHja7ZpLFsIwDAPj3v/OsGHDe1BIa8tKO7Mnlkw+dpoxAAAAAGCfx4ur6Yx/B337UUS4mp/VuWUEcjSfOgO+BXCZCWe0hSqQo/npBLglIUNLdAV2MH84Ad1JyIwdLkK6YoabIHWscBWmihHuAqvHtv+XqmdXOK9TxdKy3axUm2vZkXXGgPJksTuz1bVFeeU2Y6ijsLIpXbtKa1kDs2ews69o7+A+ihJ2lvI+/lcS1G21zUVG18XKNm4OS4BNkGOQQohSmGaIdpgLESvzyiRwKepsXjE2H0ZWMF8Zi4+jK5mviM0DiRXNZ2rhkdTK5jO0xermz2o8dCnq+FS2XNNVH0sDAAAA3JYnre9cH8BZmhEAAAAASUVORK5CYII=\";\n\n\tconst SINGLE_FILE_UI_ELEMENT_CLASS$1 = singlefile$1.helper.SINGLE_FILE_UI_ELEMENT_CLASS;\n\tconst SHARE_PAGE_BAR_TAGNAME = \"singlefile-share-page-bar\";\n\tlet EMBEDDED_IMAGE_BUTTON_MESSAGE$1, SHARE_PAGE_BUTTON_MESSAGE$1, SHARE_SELECTION_BUTTON_MESSAGE$1, ERROR_TITLE_MESSAGE$1;\n\n\tconst CSS_PROPERTIES$1 = new Set(Array.from(getComputedStyle(document.documentElement)));\n\n\tfunction setLabels(labels) {\n\t\t({ EMBEDDED_IMAGE_BUTTON_MESSAGE: EMBEDDED_IMAGE_BUTTON_MESSAGE$1, SHARE_PAGE_BUTTON_MESSAGE: SHARE_PAGE_BUTTON_MESSAGE$1, SHARE_SELECTION_BUTTON_MESSAGE: SHARE_SELECTION_BUTTON_MESSAGE$1, ERROR_TITLE_MESSAGE: ERROR_TITLE_MESSAGE$1 } = labels);\n\t}\n\n\tfunction getSharePageBar() {\n\t\tlet resolvePromise;\n\t\treturn {\n\t\t\tdisplay: async function (selectedContent) {\n\t\t\t\treturn new Promise(resolve => {\n\t\t\t\t\tresolvePromise = resolve;\n\t\t\t\t\tdisplayBar(SHARE_PAGE_BAR_TAGNAME, \"\", {\n\t\t\t\t\t\tbuttonLabel: selectedContent ? SHARE_SELECTION_BUTTON_MESSAGE$1 : SHARE_PAGE_BUTTON_MESSAGE$1,\n\t\t\t\t\t\tbuttonOnclick: resolve\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\thide: function () {\n\t\t\t\tconst barElement = document.querySelector(SHARE_PAGE_BAR_TAGNAME);\n\t\t\t\tif (barElement) {\n\t\t\t\t\tbarElement.remove();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcancel: function () {\n\t\t\t\tthis.hide();\n\t\t\t\tif (resolvePromise) {\n\t\t\t\t\tresolvePromise(true);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction displayBar(tagName, message, { link, buttonLabel, buttonOnclick } = {}) {\n\t\ttry {\n\t\t\tconst barElement = document.querySelector(tagName);\n\t\t\tif (!barElement) {\n\t\t\t\tconst barElement = createElement$1(tagName);\n\t\t\t\tconst shadowRoot = barElement.attachShadow({ mode: \"open\" });\n\t\t\t\tconst styleElement = document.createElement(\"style\");\n\t\t\t\tstyleElement.textContent = `\n\t\t\t\t.container {\n\t\t\t\t\tbackground-color: #ff6c00;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\ttop: 0px;\n\t\t\t\t\tleft: 0px;\n\t\t\t\t\tright: 0px;\n\t\t\t\t\theight: auto;\n\t\t\t\t\twidth: auto;\n\t\t\t\t\tmin-height: 24px;\n\t\t\t\t\tmin-width: 24px;\t\t\t\t\t\n\t\t\t\t\tz-index: 2147483647;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tpadding: 2px;\n\t\t\t\t\tfont-family: Arial;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar.container, .singlefile-share-page-bar.container {\n\t\t\t\t\tbackground-color: gainsboro;\n\t\t\t\t\tborder-block-end: gray 1px solid;\n\t\t\t\t}\n\t\t\t\t.text {\n\t\t\t\t\tflex: 1;\n\t\t\t\t\tpadding-top: 4px;\n\t\t\t\t\tpadding-bottom: 4px;\n\t\t\t\t\tpadding-left: 8px;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbutton {\n\t\t\t\t\tbackground-color: grey;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tborder: 1px solid darkgrey;\n\t\t\t\t\tpadding: 3px;\n\t\t\t\t\tpadding-left: 8px;\n\t\t\t\t\tpadding-right: 8px;\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\t\t\t\t.close-button {\n\t\t\t\t\topacity: .7;\n\t\t\t\t\tpadding-left: 8px;\n\t\t\t\t\tpadding-right: 8px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t\ttransition: opacity 250ms;\n\t\t\t\t\theight: 16px;\n\t\t\t\t\tfont-size: .8rem;\n\t\t\t\t\talign-self: center;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar button, .singlefile-share-page-bar button{\n\t\t\t\t\tbackground-color: dimgrey;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar .close-button, .singlefile-share-page-bar .close-button{\n\t\t\t\t\tfilter: invert(1);\n\t\t\t\t}\n\t\t\t\ta {\n\t\t\t\t\tcolor: #303036;\n\t\t\t\t}\n\t\t\t\t.close-button:hover {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t`;\n\t\t\t\tshadowRoot.appendChild(styleElement);\n\t\t\t\tconst containerElement = document.createElement(\"div\");\n\t\t\t\tcontainerElement.classList.add(tagName);\n\t\t\t\tcontainerElement.classList.add(\"container\");\n\t\t\t\tconst textElement = document.createElement(\"span\");\n\t\t\t\ttextElement.classList.add(\"text\");\n\t\t\t\tconst content = message.split(\"__DOC_LINK__\");\n\t\t\t\ttextElement.textContent = content[0];\n\t\t\t\tif (link && content.length == 2) {\n\t\t\t\t\tconst linkElement = document.createElement(\"a\");\n\t\t\t\t\tlinkElement.textContent = link;\n\t\t\t\t\tlinkElement.href = link;\n\t\t\t\t\tlinkElement.target = \"_blank\";\n\t\t\t\t\ttextElement.appendChild(linkElement);\n\t\t\t\t\ttextElement.appendChild(document.createTextNode(content[1]));\n\t\t\t\t}\n\t\t\t\tif (buttonLabel && buttonOnclick) {\n\t\t\t\t\tconst buttonElement = document.createElement(\"button\");\n\t\t\t\t\tbuttonElement.textContent = buttonLabel;\n\t\t\t\t\tbuttonElement.onclick = () => buttonOnclick();\n\t\t\t\t\ttextElement.appendChild(buttonElement);\n\t\t\t\t}\n\t\t\t\tcontainerElement.appendChild(textElement);\n\t\t\t\tconst closeElement = document.createElement(\"img\");\n\t\t\t\tcloseElement.classList.add(\"close-button\");\n\t\t\t\tcontainerElement.appendChild(closeElement);\n\t\t\t\tshadowRoot.appendChild(containerElement);\n\t\t\t\tcloseElement.src = CLOSE_ICON;\n\t\t\t\tcloseElement.onclick = event => {\n\t\t\t\t\tif (event.button === 0) {\n\t\t\t\t\t\tif (buttonOnclick) {\n\t\t\t\t\t\t\tbuttonOnclick(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbarElement.remove();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tdocument.documentElement.appendChild(barElement);\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// iignored\n\t\t}\n\t}\n\n\tfunction createElement$1(tagName, parentElement) {\n\t\tconst element = document.createElement(tagName);\n\t\telement.className = SINGLE_FILE_UI_ELEMENT_CLASS$1;\n\t\tCSS_PROPERTIES$1.forEach(property => element.style.setProperty(property, \"initial\", \"important\"));\n\t\treturn element;\n\t}\n\n\t/* global TextEncoder, TextDecoder */\n\n\tconst TYPE_REFERENCE = 0;\n\tconst SPECIAL_TYPES = [TYPE_REFERENCE];\n\tconst EMPTY_SLOT_VALUE = Symbol();\n\n\tconst textEncoder = new TextEncoder();\n\tconst textDecoder = new TextDecoder();\n\tconst types = new Array(256);\n\tlet typeIndex = 0;\n\n\tregisterType(serializeCircularReference, parseCircularReference, testCircularReference, TYPE_REFERENCE);\n\tregisterType(null, parseObject, testObject);\n\tregisterType(serializeArray, parseArray, testArray);\n\tregisterType(serializeString, parseString, testString);\n\tregisterType(serializeTypedArray, parseFloat64Array, testFloat64Array);\n\tregisterType(serializeTypedArray, parseFloat32Array, testFloat32Array);\n\tregisterType(serializeTypedArray, parseUint32Array, testUint32Array);\n\tregisterType(serializeTypedArray, parseInt32Array, testInt32Array);\n\tregisterType(serializeTypedArray, parseUint16Array, testUint16Array);\n\tregisterType(serializeTypedArray, parseInt16Array, testInt16Array);\n\tregisterType(serializeTypedArray, parseUint8ClampedArray, testUint8ClampedArray);\n\tregisterType(serializeTypedArray, parseUint8Array, testUint8Array);\n\tregisterType(serializeTypedArray, parseInt8Array, testInt8Array);\n\tregisterType(serializeArrayBuffer, parseArrayBuffer, testArrayBuffer);\n\tregisterType(serializeNumber, parseNumber, testNumber);\n\tregisterType(serializeUint32, parseUint32, testUint32);\n\tregisterType(serializeInt32, parseInt32, testInt32);\n\tregisterType(serializeUint16, parseUint16, testUint16);\n\tregisterType(serializeInt16, parseInt16, testInt16);\n\tregisterType(serializeUint8, parseUint8, testUint8);\n\tregisterType(serializeInt8, parseInt8, testInt8);\n\tregisterType(null, parseUndefined, testUndefined);\n\tregisterType(null, parseNull, testNull);\n\tregisterType(null, parseNaN, testNaN);\n\tregisterType(serializeBoolean, parseBoolean, testBoolean);\n\tregisterType(serializeSymbol, parseSymbol, testSymbol);\n\tregisterType(null, parseEmptySlot, testEmptySlot);\n\tregisterType(serializeMap, parseMap, testMap);\n\tregisterType(serializeSet, parseSet, testSet);\n\tregisterType(serializeDate, parseDate, testDate);\n\tregisterType(serializeError, parseError, testError);\n\tregisterType(serializeRegExp, parseRegExp, testRegExp);\n\tregisterType(serializeStringObject, parseStringObject, testStringObject);\n\tregisterType(serializeNumberObject, parseNumberObject, testNumberObject);\n\tregisterType(serializeBooleanObject, parseBooleanObject, testBooleanObject);\n\n\tfunction registerType(serialize, parse, test, type) {\n\t\tif (type === undefined) {\n\t\t\ttypeIndex++;\n\t\t\tif (types.length - typeIndex >= SPECIAL_TYPES.length) {\n\t\t\t\ttypes[types.length - typeIndex] = { serialize, parse, test };\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Reached maximum number of custom types\");\n\t\t\t}\n\t\t} else {\n\t\t\ttypes[type] = { serialize, parse, test };\n\t\t}\n\t}\n\n\tasync function serializeValue(data, value) {\n\t\tconst type = types.findIndex(({ test } = {}) => test && test(value, data));\n\t\tdata.addObject(value);\n\t\tawait data.append(new Uint8Array([type]));\n\t\tconst serialize = types[type].serialize;\n\t\tif (serialize) {\n\t\t\tawait serialize(data, value);\n\t\t}\n\t\tif (type != TYPE_REFERENCE && testObject(value)) {\n\t\t\tawait serializeSymbols(data, value);\n\t\t\tawait serializeOwnProperties(data, value);\n\t\t}\n\t}\n\n\tasync function serializeSymbols(data, value) {\n\t\tconst ownPropertySymbols = Object.getOwnPropertySymbols(value);\n\t\tconst symbols = ownPropertySymbols.map(propertySymbol => [propertySymbol, value[propertySymbol]]);\n\t\tawait serializeArray(data, symbols);\n\t}\n\n\tasync function serializeOwnProperties(data, value) {\n\t\tif (!ArrayBuffer.isView(value)) {\n\t\t\tlet entries = Object.entries(value);\n\t\t\tif (testArray(value)) {\n\t\t\t\tentries = entries.filter(([key]) => !testInteger(Number(key)));\n\t\t\t}\n\t\t\tawait serializeValue(data, entries.length);\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tawait serializeString(data, key);\n\t\t\t\tawait serializeValue(data, value);\n\t\t\t}\n\t\t} else {\n\t\t\tawait serializeValue(data, 0);\n\t\t}\n\t}\n\n\tasync function serializeCircularReference(data, value) {\n\t\tconst index = data.objects.indexOf(value);\n\t\tawait serializeValue(data, index);\n\t}\n\n\tasync function serializeArray(data, array) {\n\t\tawait serializeValue(data, array.length);\n\t\tconst notEmptyIndexes = Object.keys(array).filter(key => testInteger(Number(key))).map(key => Number(key));\n\t\tlet indexNotEmptyIndexes = 0, currentNotEmptyIndex = notEmptyIndexes[indexNotEmptyIndexes];\n\t\tfor (const [indexArray, value] of array.entries()) {\n\t\t\tif (currentNotEmptyIndex == indexArray) {\n\t\t\t\tcurrentNotEmptyIndex = notEmptyIndexes[++indexNotEmptyIndexes];\n\t\t\t\tawait serializeValue(data, value);\n\t\t\t} else {\n\t\t\t\tawait serializeValue(data, EMPTY_SLOT_VALUE);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function serializeString(data, string) {\n\t\tconst encodedString = textEncoder.encode(string);\n\t\tawait serializeValue(data, encodedString.length);\n\t\tawait data.append(encodedString);\n\t}\n\n\tasync function serializeTypedArray(data, array) {\n\t\tawait serializeValue(data, array.length);\n\t\tawait data.append(array.constructor.name == \"Uint8Array\" ? array : new Uint8Array(array.buffer));\n\t}\n\n\tasync function serializeArrayBuffer(data, arrayBuffer) {\n\t\tawait serializeValue(data, arrayBuffer.byteLength);\n\t\tawait data.append(new Uint8Array(arrayBuffer));\n\t}\n\n\tasync function serializeNumber(data, number) {\n\t\tconst serializedNumber = new Uint8Array(new Float64Array([number]).buffer);\n\t\tawait data.append(serializedNumber);\n\t}\n\n\tasync function serializeUint32(data, number) {\n\t\tconst serializedNumber = new Uint8Array(new Uint32Array([number]).buffer);\n\t\tawait data.append(serializedNumber);\n\t}\n\n\tasync function serializeInt32(data, number) {\n\t\tconst serializedNumber = new Uint8Array(new Int32Array([number]).buffer);\n\t\tawait data.append(serializedNumber);\n\t}\n\n\tasync function serializeUint16(data, number) {\n\t\tconst serializedNumber = new Uint8Array(new Uint16Array([number]).buffer);\n\t\tawait data.append(serializedNumber);\n\t}\n\n\tasync function serializeInt16(data, number) {\n\t\tconst serializedNumber = new Uint8Array(new Int16Array([number]).buffer);\n\t\tawait data.append(serializedNumber);\n\t}\n\n\tasync function serializeUint8(data, number) {\n\t\tconst serializedNumber = new Uint8Array([number]);\n\t\tawait data.append(serializedNumber);\n\t}\n\n\tasync function serializeInt8(data, number) {\n\t\tconst serializedNumber = new Uint8Array(new Int8Array([number]).buffer);\n\t\tawait data.append(serializedNumber);\n\t}\n\n\tasync function serializeBoolean(data, boolean) {\n\t\tconst serializedBoolean = new Uint8Array([Number(boolean)]);\n\t\tawait data.append(serializedBoolean);\n\t}\n\n\tasync function serializeMap(data, map) {\n\t\tconst entries = map.entries();\n\t\tawait serializeValue(data, map.size);\n\t\tfor (const [key, value] of entries) {\n\t\t\tawait serializeValue(data, key);\n\t\t\tawait serializeValue(data, value);\n\t\t}\n\t}\n\n\tasync function serializeSet(data, set) {\n\t\tawait serializeValue(data, set.size);\n\t\tfor (const value of set) {\n\t\t\tawait serializeValue(data, value);\n\t\t}\n\t}\n\n\tasync function serializeDate(data, date) {\n\t\tawait serializeNumber(data, date.getTime());\n\t}\n\n\tasync function serializeError(data, error) {\n\t\tawait serializeString(data, error.message);\n\t\tawait serializeString(data, error.stack);\n\t}\n\n\tasync function serializeRegExp(data, regExp) {\n\t\tawait serializeString(data, regExp.source);\n\t\tawait serializeString(data, regExp.flags);\n\t}\n\n\tasync function serializeStringObject(data, string) {\n\t\tawait serializeString(data, string.valueOf());\n\t}\n\n\tasync function serializeNumberObject(data, number) {\n\t\tawait serializeNumber(data, number.valueOf());\n\t}\n\n\tasync function serializeBooleanObject(data, boolean) {\n\t\tawait serializeBoolean(data, boolean.valueOf());\n\t}\n\n\tasync function serializeSymbol(data, symbol) {\n\t\tawait serializeString(data, symbol.description);\n\t}\n\n\tclass Reference {\n\t\tconstructor(index, data) {\n\t\t\tthis.index = index;\n\t\t\tthis.data = data;\n\t\t}\n\n\t\tgetObject() {\n\t\t\treturn this.data.objects[this.index];\n\t\t}\n\t}\n\n\tasync function parseValue(data) {\n\t\tconst array = await data.consume(1);\n\t\tconst parserType = array[0];\n\t\tconst parse = types[parserType].parse;\n\t\tconst valueId = data.getObjectId();\n\t\tconst result = await parse(data);\n\t\tif (parserType != TYPE_REFERENCE && testObject(result)) {\n\t\t\tawait parseSymbols(data, result);\n\t\t\tawait parseOwnProperties(data, result);\n\t\t}\n\t\tdata.resolveObject(valueId, result);\n\t\treturn result;\n\t}\n\n\tasync function parseSymbols(data, value) {\n\t\tconst symbols = await parseArray(data);\n\t\tdata.setObject([symbols], symbols => symbols.forEach(([symbol, propertyValue]) => value[symbol] = propertyValue));\n\t}\n\n\tasync function parseOwnProperties(data, object) {\n\t\tconst size = await parseValue(data);\n\t\tif (size) {\n\t\t\tawait parseNextProperty();\n\t\t}\n\n\t\tasync function parseNextProperty(indexKey = 0) {\n\t\t\tconst key = await parseString(data);\n\t\t\tconst value = await parseValue(data);\n\t\t\tdata.setObject([value], value => object[key] = value);\n\t\t\tif (indexKey < size - 1) {\n\t\t\t\tawait parseNextProperty(indexKey + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function parseCircularReference(data) {\n\t\tconst index = await parseValue(data);\n\t\tconst result = new Reference(index, data);\n\t\treturn result;\n\t}\n\n\tfunction parseObject() {\n\t\treturn {};\n\t}\n\n\tasync function parseArray(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = new Array(length);\n\t\tif (length) {\n\t\t\tawait parseNextSlot();\n\t\t}\n\t\treturn array;\n\n\t\tasync function parseNextSlot(indexArray = 0) {\n\t\t\tconst value = await parseValue(data);\n\t\t\tif (!testEmptySlot(value)) {\n\t\t\t\tdata.setObject([value], value => array[indexArray] = value);\n\t\t\t}\n\t\t\tif (indexArray < length - 1) {\n\t\t\t\tawait parseNextSlot(indexArray + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction parseEmptySlot() {\n\t\treturn EMPTY_SLOT_VALUE;\n\t}\n\n\tasync function parseString(data) {\n\t\tconst size = await parseValue(data);\n\t\tconst array = await data.consume(size);\n\t\treturn textDecoder.decode(array);\n\t}\n\n\tasync function parseFloat64Array(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length * 8);\n\t\treturn new Float64Array(array.buffer);\n\t}\n\n\tasync function parseFloat32Array(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length * 4);\n\t\treturn new Float32Array(array.buffer);\n\t}\n\n\tasync function parseUint32Array(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length * 4);\n\t\treturn new Uint32Array(array.buffer);\n\t}\n\n\tasync function parseInt32Array(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length * 4);\n\t\treturn new Int32Array(array.buffer);\n\t}\n\n\tasync function parseUint16Array(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length * 2);\n\t\treturn new Uint16Array(array.buffer);\n\t}\n\n\tasync function parseInt16Array(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length * 2);\n\t\treturn new Int16Array(array.buffer);\n\t}\n\n\tasync function parseUint8ClampedArray(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length);\n\t\treturn new Uint8ClampedArray(array.buffer);\n\t}\n\n\tasync function parseUint8Array(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length);\n\t\treturn array;\n\t}\n\n\tasync function parseInt8Array(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length);\n\t\treturn new Int8Array(array.buffer);\n\t}\n\n\tasync function parseArrayBuffer(data) {\n\t\tconst length = await parseValue(data);\n\t\tconst array = await data.consume(length);\n\t\treturn array.buffer;\n\t}\n\n\tasync function parseNumber(data) {\n\t\tconst array = await data.consume(8);\n\t\treturn new Float64Array(array.buffer)[0];\n\t}\n\n\tasync function parseUint32(data) {\n\t\tconst array = await data.consume(4);\n\t\treturn new Uint32Array(array.buffer)[0];\n\t}\n\n\tasync function parseInt32(data) {\n\t\tconst array = await data.consume(4);\n\t\treturn new Int32Array(array.buffer)[0];\n\t}\n\n\tasync function parseUint16(data) {\n\t\tconst array = await data.consume(2);\n\t\treturn new Uint16Array(array.buffer)[0];\n\t}\n\n\tasync function parseInt16(data) {\n\t\tconst array = await data.consume(2);\n\t\treturn new Int16Array(array.buffer)[0];\n\t}\n\n\tasync function parseUint8(data) {\n\t\tconst array = await data.consume(1);\n\t\treturn new Uint8Array(array.buffer)[0];\n\t}\n\n\tasync function parseInt8(data) {\n\t\tconst array = await data.consume(1);\n\t\treturn new Int8Array(array.buffer)[0];\n\t}\n\n\tfunction parseUndefined() {\n\t\treturn undefined;\n\t}\n\n\tfunction parseNull() {\n\t\treturn null;\n\t}\n\n\tfunction parseNaN() {\n\t\treturn NaN;\n\t}\n\n\tasync function parseBoolean(data) {\n\t\tconst array = await data.consume(1);\n\t\treturn Boolean(array[0]);\n\t}\n\n\tasync function parseMap(data) {\n\t\tconst size = await parseValue(data);\n\t\tconst map = new Map();\n\t\tif (size) {\n\t\t\tawait parseNextEntry();\n\t\t}\n\t\treturn map;\n\n\t\tasync function parseNextEntry(indexKey = 0) {\n\t\t\tconst key = await parseValue(data);\n\t\t\tconst value = await parseValue(data);\n\t\t\tdata.setObject([key, value], (key, value) => map.set(key, value));\n\t\t\tif (indexKey < size - 1) {\n\t\t\t\tawait parseNextEntry(indexKey + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function parseSet(data) {\n\t\tconst size = await parseValue(data);\n\t\tconst set = new Set();\n\t\tif (size) {\n\t\t\tawait parseNextEntry();\n\t\t}\n\t\treturn set;\n\n\t\tasync function parseNextEntry(indexKey = 0) {\n\t\t\tconst value = await parseValue(data);\n\t\t\tdata.setObject([value], value => set.add(value));\n\t\t\tif (indexKey < size - 1) {\n\t\t\t\tawait parseNextEntry(indexKey + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function parseDate(data) {\n\t\tconst milliseconds = await parseNumber(data);\n\t\treturn new Date(milliseconds);\n\t}\n\n\tasync function parseError(data) {\n\t\tconst message = await parseString(data);\n\t\tconst stack = await parseString(data);\n\t\tconst error = new Error(message);\n\t\terror.stack = stack;\n\t\treturn error;\n\t}\n\n\tasync function parseRegExp(data) {\n\t\tconst source = await parseString(data);\n\t\tconst flags = await parseString(data);\n\t\treturn new RegExp(source, flags);\n\t}\n\n\tasync function parseStringObject(data) {\n\t\treturn new String(await parseString(data));\n\t}\n\n\tasync function parseNumberObject(data) {\n\t\treturn new Number(await parseNumber(data));\n\t}\n\n\tasync function parseBooleanObject(data) {\n\t\treturn new Boolean(await parseBoolean(data));\n\t}\n\n\tasync function parseSymbol(data) {\n\t\tconst description = await parseString(data);\n\t\treturn Symbol(description);\n\t}\n\n\tfunction testCircularReference(value, data) {\n\t\treturn testObject(value) && data.objects.includes(value);\n\t}\n\n\tfunction testObject(value) {\n\t\treturn value === Object(value);\n\t}\n\n\tfunction testArray(value) {\n\t\treturn typeof value.length == \"number\";\n\t}\n\n\tfunction testEmptySlot(value) {\n\t\treturn value === EMPTY_SLOT_VALUE;\n\t}\n\n\tfunction testString(value) {\n\t\treturn typeof value == \"string\";\n\t}\n\n\tfunction testFloat64Array(value) {\n\t\treturn value.constructor.name == \"Float64Array\";\n\t}\n\n\tfunction testUint32Array(value) {\n\t\treturn value.constructor.name == \"Uint32Array\";\n\t}\n\n\tfunction testInt32Array(value) {\n\t\treturn value.constructor.name == \"Int32Array\";\n\t}\n\n\tfunction testUint16Array(value) {\n\t\treturn value.constructor.name == \"Uint16Array\";\n\t}\n\n\tfunction testFloat32Array(value) {\n\t\treturn value.constructor.name == \"Float32Array\";\n\t}\n\n\tfunction testInt16Array(value) {\n\t\treturn value.constructor.name == \"Int16Array\";\n\t}\n\n\tfunction testUint8ClampedArray(value) {\n\t\treturn value.constructor.name == \"Uint8ClampedArray\";\n\t}\n\n\tfunction testUint8Array(value) {\n\t\treturn value.constructor.name == \"Uint8Array\";\n\t}\n\n\tfunction testInt8Array(value) {\n\t\treturn value.constructor.name == \"Int8Array\";\n\t}\n\n\tfunction testArrayBuffer(value) {\n\t\treturn value.constructor.name == \"ArrayBuffer\";\n\t}\n\n\tfunction testNumber(value) {\n\t\treturn typeof value == \"number\";\n\t}\n\n\tfunction testUint32(value) {\n\t\treturn testInteger(value) && value >= 0 && value <= 4294967295;\n\t}\n\n\tfunction testInt32(value) {\n\t\treturn testInteger(value) && value >= -2147483648 && value <= 2147483647;\n\t}\n\n\tfunction testUint16(value) {\n\t\treturn testInteger(value) && value >= 0 && value <= 65535;\n\t}\n\n\tfunction testInt16(value) {\n\t\treturn testInteger(value) && value >= -32768 && value <= 32767;\n\t}\n\n\tfunction testUint8(value) {\n\t\treturn testInteger(value) && value >= 0 && value <= 255;\n\t}\n\n\tfunction testInt8(value) {\n\t\treturn testInteger(value) && value >= -128 && value <= 127;\n\t}\n\n\tfunction testInteger(value) {\n\t\treturn testNumber(value) && Number.isInteger(value);\n\t}\n\n\tfunction testUndefined(value) {\n\t\treturn value === undefined;\n\t}\n\n\tfunction testNull(value) {\n\t\treturn value === null;\n\t}\n\n\tfunction testNaN(value) {\n\t\treturn Number.isNaN(value);\n\t}\n\n\tfunction testBoolean(value) {\n\t\treturn typeof value == \"boolean\";\n\t}\n\n\tfunction testMap(value) {\n\t\treturn value instanceof Map;\n\t}\n\n\tfunction testSet(value) {\n\t\treturn value instanceof Set;\n\t}\n\n\tfunction testDate(value) {\n\t\treturn value instanceof Date;\n\t}\n\n\tfunction testError(value) {\n\t\treturn value instanceof Error;\n\t}\n\n\tfunction testRegExp(value) {\n\t\treturn value instanceof RegExp;\n\t}\n\n\tfunction testStringObject(value) {\n\t\treturn value instanceof String;\n\t}\n\n\tfunction testNumberObject(value) {\n\t\treturn value instanceof Number;\n\t}\n\n\tfunction testBooleanObject(value) {\n\t\treturn value instanceof Boolean;\n\t}\n\n\tfunction testSymbol(value) {\n\t\treturn typeof value == \"symbol\";\n\t}\n\n\t/*\n\t * Copyright 2010-2020 Gildas Lormeau\n\t * contact : gildas.lormeau <at> gmail.com\n\t * \n\t * This file is part of SingleFile.\n\t *\n\t *   The code in this file is free software: you can redistribute it and/or \n\t *   modify it under the terms of the GNU Affero General Public License \n\t *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n\t *   of the License, or (at your option) any later version.\n\t * \n\t *   The code in this file is distributed in the hope that it will be useful, \n\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n\t *   General Public License for more details.\n\t *\n\t *   As additional permission under GNU AGPL version 3 section 7, you may \n\t *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n\t *   AGPL normally required by section 4, provided you include this license \n\t *   notice and a URL through which recipients can access the Corresponding \n\t *   Source.\n\t */\n\n\t/* global browser, document, prompt, getComputedStyle, addEventListener, removeEventListener, requestAnimationFrame, setTimeout, getSelection, Node, URL */\n\n\tconst singlefile = globalThis.singlefile;\n\n\tsinglefile.helper.SELECTED_CONTENT_ATTRIBUTE_NAME;\n\tconst LOGS_WINDOW_TAGNAME = \"singlefile-logs-window\";\n\tconst LOGS_CLASSNAME = \"singlefile-logs\";\n\tconst LOGS_LINE_CLASSNAME = \"singlefile-logs-line\";\n\tconst LOGS_LINE_TEXT_ELEMENT_CLASSNAME = \"singlefile-logs-line-text\";\n\tconst LOGS_LINE_STATUS_ELEMENT_CLASSNAME = \"singlefile-logs-line-icon\";\n\tconst SINGLE_FILE_UI_ELEMENT_CLASS = singlefile.helper.SINGLE_FILE_UI_ELEMENT_CLASS;\n\tconst CSS_PROPERTIES = new Set(Array.from(getComputedStyle(document.documentElement)));\n\tlet LOG_PANEL_WIDTH, LOG_PANEL_DEFERRED_IMAGES_MESSAGE, LOG_PANEL_FRAME_CONTENTS_MESSAGE, LOG_PANEL_EMBEDDED_IMAGE_MESSAGE, LOG_PANEL_STEP_MESSAGE;\n\ttry {\n\t\tLOG_PANEL_WIDTH = browser.i18n.getMessage(\"logPanelWidth\");\n\t\tLOG_PANEL_DEFERRED_IMAGES_MESSAGE = browser.i18n.getMessage(\"logPanelDeferredImages\");\n\t\tLOG_PANEL_FRAME_CONTENTS_MESSAGE = browser.i18n.getMessage(\"logPanelFrameContents\");\n\t\tLOG_PANEL_EMBEDDED_IMAGE_MESSAGE = browser.i18n.getMessage(\"logPanelEmbeddedImage\");\n\t\tLOG_PANEL_STEP_MESSAGE = browser.i18n.getMessage(\"logPanelStep\");\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n\n\tlet logsWindowElement;\n\tcreateLogsWindowElement();\n\n\tfunction promptMessage(message, defaultValue) {\n\t\treturn prompt(message, defaultValue);\n\t}\n\n\tfunction createLogsWindowElement() {\n\t\ttry {\n\t\t\tlogsWindowElement = document.querySelector(LOGS_WINDOW_TAGNAME);\n\t\t\tif (!logsWindowElement) {\n\t\t\t\tlogsWindowElement = createElement(LOGS_WINDOW_TAGNAME);\n\t\t\t\tconst shadowRoot = logsWindowElement.attachShadow({ mode: \"open\" });\n\t\t\t\tconst styleElement = document.createElement(\"style\");\n\t\t\t\tstyleElement.textContent = `\n\t\t\t\t@keyframes single-file-pulse { \n\t\t\t\t\t0% { \n\t\t\t\t\t\topacity: .25;\n\t\t\t\t\t} \n\t\t\t\t\t100% { \n\t\t\t\t\t\topacity: 1;\n\t\t\t\t\t} \n\t\t\t\t}\n\t\t\t\t.${LOGS_CLASSNAME} {\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\tbottom: 24px;\n\t\t\t\t\tleft: 8px;\n\t\t\t\t\tz-index: 2147483647;\n\t\t\t\t\topacity: 0.9;\n\t\t\t\t\tpadding: 4px;\n\t\t\t\t\tbackground-color: white;\n\t\t\t\t\tmin-width: ${LOG_PANEL_WIDTH}px;\n\t\t\t\t\tmin-height: 16px;\n\t\t\t\t\ttransition: height 100ms;\n\t\t\t\t}\n\t\t\t\t.${LOGS_LINE_CLASSNAME} {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: space-between;\n\t\t\t\t\tpadding: 2px;\n\t\t\t\t\tfont-family: arial, sans-serif;\n\t\t\t\t\tcolor: black;\n\t\t\t\t\tbackground-color: white;\n\t\t\t\t}\n\t\t\t\t.${LOGS_LINE_TEXT_ELEMENT_CLASSNAME} {\n\t\t\t\t\tfont-size: 13px;\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransition: opacity 200ms;\n\t\t\t\t}\n\t\t\t\t.${LOGS_LINE_STATUS_ELEMENT_CLASSNAME} {\n\t\t\t\t\tfont-size: 11px;\n\t\t\t\t\tmin-width: 15px;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t\tposition: relative;\n\t\t\t\t\ttop: 1px;\n\t\t\t\t}\n\t\t\t`;\n\t\t\t\tshadowRoot.appendChild(styleElement);\n\t\t\t\tconst logsContentElement = document.createElement(\"div\");\n\t\t\t\tlogsContentElement.classList.add(LOGS_CLASSNAME);\n\t\t\t\tshadowRoot.appendChild(logsContentElement);\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t}\n\n\tfunction createElement(tagName, parentElement) {\n\t\tconst element = document.createElement(tagName);\n\t\telement.className = SINGLE_FILE_UI_ELEMENT_CLASS;\n\t\tCSS_PROPERTIES.forEach(property => element.style.setProperty(property, \"initial\", \"important\"));\n\t\treturn element;\n\t}\n\n\t/*\n\t * Copyright 2010-2020 Gildas Lormeau\n\t * contact : gildas.lormeau <at> gmail.com\n\t * \n\t * This file is part of SingleFile.\n\t *\n\t *   The code in this file is free software: you can redistribute it and/or \n\t *   modify it under the terms of the GNU Affero General Public License \n\t *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n\t *   of the License, or (at your option) any later version.\n\t * \n\t *   The code in this file is distributed in the hope that it will be useful, \n\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n\t *   General Public License for more details.\n\t *\n\t *   As additional permission under GNU AGPL version 3 section 7, you may \n\t *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n\t *   AGPL normally required by section 4, provided you include this license \n\t *   notice and a URL through which recipients can access the Corresponding \n\t *   Source.\n\t */\n\n\n\tlet EMBEDDED_IMAGE_BUTTON_MESSAGE, SHARE_PAGE_BUTTON_MESSAGE, SHARE_SELECTION_BUTTON_MESSAGE, ERROR_TITLE_MESSAGE;\n\n\ttry {\n\t\tEMBEDDED_IMAGE_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelEmbeddedImageButton\");\n\t\tSHARE_PAGE_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelSharePageButton\");\n\t\tSHARE_SELECTION_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelShareSelectionButton\");\n\t\tERROR_TITLE_MESSAGE = browser.i18n.getMessage(\"topPanelError\");\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n\n\tlet sharePageBar;\n\tsetLabels({\n\t\tEMBEDDED_IMAGE_BUTTON_MESSAGE,\n\t\tSHARE_PAGE_BUTTON_MESSAGE,\n\t\tSHARE_SELECTION_BUTTON_MESSAGE,\n\t\tERROR_TITLE_MESSAGE\n\t});\n\n\tasync function downloadPageForeground(pageData, options) {\n\t\tif (Array.isArray(pageData.content)) {\n\t\t\tpageData.content = new Uint8Array(pageData.content);\n\t\t}\n\t\tif (options.sharePage && navigator.share) {\n\t\t\tawait sharePage(pageData, options);\n\t\t} else {\n\t\t\tlet filename = pageData.filename;\n\t\t\tif (options.confirmFilename) {\n\t\t\t\tfilename = promptMessage(\"Save as\", pageData.filename);\n\t\t\t\tif (filename) {\n\t\t\t\t\tpageData.filename = filename;\n\t\t\t\t} else {\n\t\t\t\t\tbrowser.runtime.sendMessage({ method: \"downloads.cancel\" });\n\t\t\t\t\tbrowser.runtime.sendMessage({ method: \"ui.processCancelled\" });\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (filename) {\n\t\t\t\tconst link = document.createElement(\"a\");\n\t\t\t\tlink.download = pageData.filename;\n\t\t\t\tlink.href = URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType }));\n\t\t\t\tlink.dispatchEvent(new MouseEvent(\"click\"));\n\t\t\t\treturn new Promise(resolve => setTimeout(() => { URL.revokeObjectURL(link.href); resolve(); }, 1000));\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function sharePage(pageData, options) {\n\t\tsharePageBar = getSharePageBar();\n\t\tconst cancelled = await sharePageBar.display(options.selected);\n\t\tif (!cancelled) {\n\t\t\tconst data = { files: [new File([pageData.content], pageData.filename, { type: pageData.mimeType })] };\n\t\t\ttry {\n\t\t\t\tawait navigator.share(data);\n\t\t\t\tsharePageBar.hide();\n\t\t\t} catch (error) {\n\t\t\t\tsharePageBar.hide();\n\t\t\t\tif (error.name === \"AbortError\") {\n\t\t\t\t\tawait sharePage(pageData, options);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* global URL, TextDecoder, TextEncoder, btoa, atob */\n\n\tconst EVENT_HANDLER_ATTRIBUTES = [\n\t    \"onafterprint\",\n\t    \"onbeforeprint\",\n\t    \"onbeforeunload\",\n\t    \"onhashchange\",\n\t    \"onlanguagechange\",\n\t    \"onmessage\",\n\t    \"onmessageerror\",\n\t    \"onoffline\",\n\t    \"ononline\",\n\t    \"onpagehide\",\n\t    \"onpageshow\",\n\t    \"onpopstate\",\n\t    \"onrejectionhandled\",\n\t    \"onstorage\",\n\t    \"onunhandledrejection\",\n\t    \"onunload\",\n\t    \"ongamepadconnected\",\n\t    \"ongamepaddisconnected\",\n\t    \"onabort\",\n\t    \"onblur\",\n\t    \"onfocus\",\n\t    \"oncancel\",\n\t    \"onauxclick\",\n\t    \"onbeforeinput\",\n\t    \"onbeforetoggle\",\n\t    \"oncanplay\",\n\t    \"oncanplaythrough\",\n\t    \"onchange\",\n\t    \"onclick\",\n\t    \"onclose\",\n\t    \"oncontentvisibilityautostatechange\",\n\t    \"oncontextlost\",\n\t    \"oncontextmenu\",\n\t    \"oncontextrestored\",\n\t    \"oncopy\",\n\t    \"oncuechange\",\n\t    \"oncut\",\n\t    \"ondblclick\",\n\t    \"ondrag\",\n\t    \"ondragend\",\n\t    \"ondragenter\",\n\t    \"ondragleave\",\n\t    \"ondragover\",\n\t    \"ondragstart\",\n\t    \"ondrop\",\n\t    \"ondurationchange\",\n\t    \"onemptied\",\n\t    \"onended\",\n\t    \"onformdata\",\n\t    \"oninput\",\n\t    \"oninvalid\",\n\t    \"onkeydown\",\n\t    \"onkeypress\",\n\t    \"onkeyup\",\n\t    \"onload\",\n\t    \"onloadeddata\",\n\t    \"onloadedmetadata\",\n\t    \"onloadstart\",\n\t    \"onmousedown\",\n\t    \"onmouseenter\",\n\t    \"onmouseleave\",\n\t    \"onmousemove\",\n\t    \"onmouseout\",\n\t    \"onmouseover\",\n\t    \"onmouseup\",\n\t    \"onwheel\",\n\t    \"onpaste\",\n\t    \"onpause\",\n\t    \"onplay\",\n\t    \"onplaying\",\n\t    \"onprogress\",\n\t    \"onratechange\",\n\t    \"onreset\",\n\t    \"onresize\",\n\t    \"onscroll\",\n\t    \"onscrollend\",\n\t    \"onsecuritypolicyviolation\",\n\t    \"onseeked\",\n\t    \"onseeking\",\n\t    \"onselect\",\n\t    \"onslotchange\",\n\t    \"onstalled\",\n\t    \"onsubmit\",\n\t    \"onsuspend\",\n\t    \"ontimeupdate\",\n\t    \"onvolumechange\",\n\t    \"onwaiting\",\n\t    \"onselectstart\",\n\t    \"onselectionchange\",\n\t    \"ontoggle\",\n\t    \"onpointercancel\",\n\t    \"onpointerdown\",\n\t    \"onpointerup\",\n\t    \"onpointermove\",\n\t    \"onpointerout\",\n\t    \"onpointerover\",\n\t    \"onpointerenter\",\n\t    \"onpointerleave\",\n\t    \"ongotpointercapture\",\n\t    \"onlostpointercapture\",\n\t    \"onanimationcancel\",\n\t    \"onanimationend\",\n\t    \"onanimationiteration\",\n\t    \"onanimationstart\",\n\t    \"ontransitioncancel\",\n\t    \"ontransitionend\",\n\t    \"ontransitionrun\",\n\t    \"ontransitionstart\",\n\t    \"onerror\",\n\t    \"onfullscreenchange\",\n\t    \"onfullscreenerror\"\n\t];\n\n\tfunction decodeQuotedPrintable(array) {\n\t    const result = [];\n\t    for (let i = 0; i < array.length; i++) {\n\t        if (array[i] === 0x3D) {\n\t            if (isHex(array[i + 1]) && isHex(array[i + 2])) {\n\t                const hex = parseInt(String.fromCharCode(array[i + 1], array[i + 2]), 16);\n\t                result.push(hex);\n\t                i += 2;\n\t            } else {\n\t                result.push(array[i]);\n\t            }\n\t        } else {\n\t            result.push(array[i]);\n\t        }\n\t    }\n\t    return new Uint8Array(result);\n\n\t    function isHex(value) {\n\t        return value >= 0x30 && value <= 0x39 || value >= 0x41 && value <= 0x46;\n\t    }\n\t}\n\n\tfunction decodeBinary(array) {\n\t    let data = \"\";\n\t    for (let indexData = 0; indexData < array.length; indexData++) {\n\t        data += String.fromCharCode(array[indexData]);\n\t    }\n\t    return btoa(data);\n\t}\n\n\tfunction decodeBase64(value, charset) {\n\t    const decodedData = new Uint8Array(atob(value).split(\"\").map(char => char.charCodeAt(0)));\n\t    return new TextDecoder(charset).decode(decodedData);\n\t}\n\n\tfunction decodeMimeHeader(encodedSubject) {\n\t    if (encodedSubject && encodedSubject.startsWith(\"=?\") && encodedSubject.endsWith(\"?=\")) {\n\t        const encodedSubjectParts = [];\n\t        let index = 0;\n\t        while (index < encodedSubject.length) {\n\t            const start = encodedSubject.indexOf(\"=?\", index);\n\t            if (start === -1) {\n\t                break;\n\t            }\n\t            const endCharset = encodedSubject.indexOf(\"?\", start + 2);\n\t            if (endCharset === -1) {\n\t                break;\n\t            }\n\t            const charset = encodedSubject.substring(start + 2, endCharset);\n\t            const endEncoding = encodedSubject.indexOf(\"?\", endCharset + 1);\n\t            if (endEncoding === -1) {\n\t                break;\n\t            }\n\t            const encoding = encodedSubject.substring(endCharset + 1, endEncoding);\n\t            const endValue = encodedSubject.indexOf(\"?=\", endEncoding + 1);\n\t            if (endValue === -1) {\n\t                break;\n\t            }\n\t            const value = encodedSubject.substring(endEncoding + 1, endValue);\n\t            index = endValue + 2;\n\t            if (encoding === \"Q\") {\n\t                encodedSubjectParts.push(new TextDecoder(charset).decode(decodeQuotedPrintable(new TextEncoder().encode(value))));\n\t            } else if (encoding === \"B\") {\n\t                encodedSubjectParts.push(decodeBase64(value, charset));\n\t            }\n\t        }\n\t        encodedSubject = encodedSubjectParts.join(\"\");\n\t    }\n\t    return encodedSubject || \"\";\n\t}\n\n\tfunction parseDOM(asset, contentType = \"text/html\", DOMParser = globalThis.DOMParser) {\n\t    let document;\n\t    try {\n\t        document = new DOMParser().parseFromString(asset, contentType);\n\t        // eslint-disable-next-line no-unused-vars\n\t    } catch (_) {\n\t        document = new DOMParser().parseFromString(asset, \"text/html\");\n\t    }\n\t    return {\n\t        document,\n\t        serialize() {\n\t            let result = \"\";\n\t            if (this.document.doctype) {\n\t                result += serializeDocType(this.document.doctype) + \"\\n\";\n\t            }\n\t            result += this.document.documentElement.outerHTML;\n\t            return result;\n\t        }\n\t    };\n\t}\n\n\tfunction serializeDocType(doctype) {\n\t    return `<!DOCTYPE ${doctype.name}${(doctype.publicId ? ` PUBLIC \"${doctype.publicId}\"` : \"\")}${(doctype.systemId ? ` \"${doctype.systemId}\"` : \"\")}>`;\n\t}\n\n\tfunction decodeString(array, charset) {\n\t    return new TextDecoder(charset).decode(array);\n\t}\n\n\tfunction encodeString(string, charset) {\n\t    return new TextEncoder(charset).encode(string);\n\t}\n\n\tfunction getCharset(contentType) {\n\t    const charsetMatch = contentType.match(/charset=([^;]+)/);\n\t    if (charsetMatch) {\n\t        return removeQuotes(charsetMatch[1]).toLowerCase();\n\t    }\n\t}\n\n\tfunction removeQuotes(value) {\n\t    return value.replace(/^\"(.*)\"$/, \"$1\").replace(/^'(.*)'$/, \"$1\").trim();\n\t}\n\n\tfunction replaceCharset(contentType, charset) {\n\t    return contentType.replace(/charset=([^;]+)/, `charset=${charset}`);\n\t}\n\n\tfunction isDocument(contentType) {\n\t    return contentType.startsWith(\"text/html\") || contentType.startsWith(\"application/xhtml+xml\");\n\t}\n\n\tfunction isStylesheet(contentType) {\n\t    return contentType.startsWith(\"text/css\");\n\t}\n\n\tfunction isText(contentType) {\n\t    return contentType.startsWith(\"text/\");\n\t}\n\n\tfunction isMultipartAlternative(contentType) {\n\t    return contentType.startsWith(\"multipart/alternative\");\n\t}\n\n\tfunction getBoundary(contentType) {\n\t    const contentTypeParams = contentType.split(\";\");\n\t    contentTypeParams.shift();\n\t    const boundaryParam = contentTypeParams.find(param => param.startsWith(\"boundary=\"));\n\t    if (boundaryParam) {\n\t        return removeQuotes(boundaryParam.substring(9));\n\t    }\n\t}\n\n\tfunction indexOf(array, string) {\n\t    const stringBytes = new TextEncoder().encode(string);\n\t    for (let i = 0; i < array.length; i++) {\n\t        if (array[i] === stringBytes[0]) {\n\t            let match = true;\n\t            for (let j = 1; j < stringBytes.length; j++) {\n\t                if (array[i + j] !== stringBytes[j]) {\n\t                    match = false;\n\t                    break;\n\t                }\n\t            }\n\t            if (match) {\n\t                // return index\n\t                return i;\n\t            }\n\t        }\n\t    }\n\t    return -1;\n\t}\n\n\tfunction isLineFeed(array) {\n\t    return array.length == 2 ? array[0] == 0x0D && array[1] == 0x0A : array.length == 1 ? array[0] == 0x0A : false;\n\t}\n\n\tfunction endsWithCRLF(array) {\n\t    return array.length >= 2 ? array[array.length - 2] == 0x0D && array[array.length - 1] == 0x0A : array.length >= 1 ? array[array.length - 1] == 0x0D : false;\n\t}\n\n\tfunction endsWithLF(array) {\n\t    return array.length >= 1 ? array[array.length - 1] == 0x0A : false;\n\t}\n\n\tfunction startsWithBoundary(array) {\n\t    return array.length >= 2 ? array[0] == 0x2D && array[1] == 0x2D : false;\n\t}\n\n\tfunction getResourceURI({ contentType, transferEncoding, data }) {\n\t    return `data:${contentType};${\"base64\"},${transferEncoding === \"base64\" ? data : btoa(unescape(encodeURIComponent(data)))}`;\n\t}\n\n\tfunction resolvePath(path, base) {\n\t    if (base && !path.startsWith(\"data:\")) {\n\t        try {\n\t            return new URL(path, base).href;\n\t            // eslint-disable-next-line no-unused-vars\n\t        } catch (_) {\n\t            if (path.startsWith(\"//\")) {\n\t                const protocol = base.match(/^[^:]+/);\n\t                if (protocol) {\n\t                    return `${protocol[0]}:${path}`;\n\t                } else {\n\t                    return path;\n\t                }\n\t            } else {\n\t                return path;\n\t            }\n\t        }\n\t    } else {\n\t        return path;\n\t    }\n\t}\n\n\t// dist/csstree.esm.js from https://github.com/csstree/csstree/tree/b3fe3e026ce131aa559427162451a60792589730\n\n\t/*\n\t * Copyright (C) 2016-2024 by Roman Dvornov\n\t * \n\t * Permission is hereby granted, free of charge, to any person obtaining a copy\n\t * of this software and associated documentation files (the \"Software\"), to deal\n\t * in the Software without restriction, including without limitation the rights\n\t * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\t * copies of the Software, and to permit persons to whom the Software is\n\t * furnished to do so, subject to the following conditions:\n\t * \n\t * The above copyright notice and this permission notice shall be included in\n\t * all copies or substantial portions of the Software.\n\t * \n\t * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\t * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\t * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\t * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\t * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\t * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\t * THE SOFTWARE.\n\t */\n\n\tvar Ra=Object.create;var or=Object.defineProperty;var Fa=Object.getOwnPropertyDescriptor;var Ma=Object.getOwnPropertyNames;var Ba=Object.getPrototypeOf,_a=Object.prototype.hasOwnProperty;var Me=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),f=(e,t)=>{for(var r in t)or(e,r,{get:t[r],enumerable:true});},Wa=(e,t,r,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of Ma(t))!_a.call(e,i)&&i!==r&&or(e,i,{get:()=>t[i],enumerable:!(n=Fa(t,i))||n.enumerable});return e};var qa=(e,t,r)=>(r=e!=null?Ra(Ba(e)):{},Wa(or(r,\"default\",{value:e,enumerable:true}),e));var So=Me(fr=>{var vo=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");fr.encode=function(e){if(0<=e&&e<vo.length)return vo[e];throw new TypeError(\"Must be between 0 and 63: \"+e)};fr.decode=function(e){var t=65,r=90,n=97,i=122,o=48,s=57,u=43,c=47,a=26,l=52;return t<=e&&e<=r?e-t:n<=e&&e<=i?e-n+a:o<=e&&e<=s?e-o+l:e==u?62:e==c?63:-1};});var Eo=Me(br=>{var Co=So(),gr=5,To=1<<gr,Ao=To-1,Lo=To;function Za(e){return e<0?(-e<<1)+1:(e<<1)+0}function Ja(e){var t=(e&1)===1,r=e>>1;return t?-r:r}br.encode=function(t){var r=\"\",n,i=Za(t);do n=i&Ao,i>>>=gr,i>0&&(n|=Lo),r+=Co.encode(n);while(i>0);return r};br.decode=function(t,r,n){var i=t.length,o=0,s=0,u,c;do{if(r>=i)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(c=Co.decode(t.charCodeAt(r++)),c===-1)throw new Error(\"Invalid base64 digit: \"+t.charAt(r-1));u=!!(c&Lo),c&=Ao,o=o+(c<<s),s+=gr;}while(u);n.value=Ja(o),n.rest=r;};});var Rt=Me(W=>{function el(e,t,r){if(t in e)return e[t];if(arguments.length===3)return r;throw new Error('\"'+t+'\" is a required argument.')}W.getArg=el;var zo=/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/,tl=/^data:.+\\,.+$/;function lt(e){var t=e.match(zo);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}W.urlParse=lt;function Ge(e){var t=\"\";return e.scheme&&(t+=e.scheme+\":\"),t+=\"//\",e.auth&&(t+=e.auth+\"@\"),e.host&&(t+=e.host),e.port&&(t+=\":\"+e.port),e.path&&(t+=e.path),t}W.urlGenerate=Ge;var rl=32;function nl(e){var t=[];return function(r){for(var n=0;n<t.length;n++)if(t[n].input===r){var i=t[0];return t[0]=t[n],t[n]=i,t[0].result}var o=e(r);return t.unshift({input:r,result:o}),t.length>rl&&t.pop(),o}}var xr=nl(function(t){var r=t,n=lt(t);if(n){if(!n.path)return t;r=n.path;}for(var i=W.isAbsolute(r),o=[],s=0,u=0;;)if(s=u,u=r.indexOf(\"/\",s),u===-1){o.push(r.slice(s));break}else for(o.push(r.slice(s,u));u<r.length&&r[u]===\"/\";)u++;for(var c,a=0,u=o.length-1;u>=0;u--)c=o[u],c===\".\"?o.splice(u,1):c===\"..\"?a++:a>0&&(c===\"\"?(o.splice(u+1,a),a=0):(o.splice(u,2),a--));return r=o.join(\"/\"),r===\"\"&&(r=i?\"/\":\".\"),n?(n.path=r,Ge(n)):r});W.normalize=xr;function Po(e,t){e===\"\"&&(e=\".\"),t===\"\"&&(t=\".\");var r=lt(t),n=lt(e);if(n&&(e=n.path||\"/\"),r&&!r.scheme)return n&&(r.scheme=n.scheme),Ge(r);if(r||t.match(tl))return t;if(n&&!n.host&&!n.path)return n.host=t,Ge(n);var i=t.charAt(0)===\"/\"?t:xr(e.replace(/\\/+$/,\"\")+\"/\"+t);return n?(n.path=i,Ge(n)):i}W.join=Po;W.isAbsolute=function(e){return e.charAt(0)===\"/\"||zo.test(e)};function il(e,t){e===\"\"&&(e=\".\"),e=e.replace(/\\/$/,\"\");for(var r=0;t.indexOf(e+\"/\")!==0;){var n=e.lastIndexOf(\"/\");if(n<0||(e=e.slice(0,n),e.match(/^([^\\/]+:\\/)?\\/*$/)))return t;++r;}return Array(r+1).join(\"../\")+t.substr(e.length+1)}W.relative=il;var Io=function(){var e=Object.create(null);return !(\"__proto__\"in e)}();function Do(e){return e}function ol(e){return No(e)?\"$\"+e:e}W.toSetString=Io?Do:ol;function sl(e){return No(e)?e.slice(1):e}W.fromSetString=Io?Do:sl;function No(e){if(!e)return  false;var t=e.length;if(t<9||e.charCodeAt(t-1)!==95||e.charCodeAt(t-2)!==95||e.charCodeAt(t-3)!==111||e.charCodeAt(t-4)!==116||e.charCodeAt(t-5)!==111||e.charCodeAt(t-6)!==114||e.charCodeAt(t-7)!==112||e.charCodeAt(t-8)!==95||e.charCodeAt(t-9)!==95)return  false;for(var r=t-10;r>=0;r--)if(e.charCodeAt(r)!==36)return  false;return  true}function al(e,t,r){var n=ke(e.source,t.source);return n!==0||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0||r)||(n=e.generatedColumn-t.generatedColumn,n!==0)||(n=e.generatedLine-t.generatedLine,n!==0)?n:ke(e.name,t.name)}W.compareByOriginalPositions=al;function ll(e,t,r){var n;return n=e.originalLine-t.originalLine,n!==0||(n=e.originalColumn-t.originalColumn,n!==0||r)||(n=e.generatedColumn-t.generatedColumn,n!==0)||(n=e.generatedLine-t.generatedLine,n!==0)?n:ke(e.name,t.name)}W.compareByOriginalPositionsNoSource=ll;function cl(e,t,r){var n=e.generatedLine-t.generatedLine;return n!==0||(n=e.generatedColumn-t.generatedColumn,n!==0||r)||(n=ke(e.source,t.source),n!==0)||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0)?n:ke(e.name,t.name)}W.compareByGeneratedPositionsDeflated=cl;function ul(e,t,r){var n=e.generatedColumn-t.generatedColumn;return n!==0||r||(n=ke(e.source,t.source),n!==0)||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0)?n:ke(e.name,t.name)}W.compareByGeneratedPositionsDeflatedNoLine=ul;function ke(e,t){return e===t?0:e===null?1:t===null?-1:e>t?1:-1}function pl(e,t){var r=e.generatedLine-t.generatedLine;return r!==0||(r=e.generatedColumn-t.generatedColumn,r!==0)||(r=ke(e.source,t.source),r!==0)||(r=e.originalLine-t.originalLine,r!==0)||(r=e.originalColumn-t.originalColumn,r!==0)?r:ke(e.name,t.name)}W.compareByGeneratedPositionsInflated=pl;function hl(e){return JSON.parse(e.replace(/^\\)]}'[^\\n]*\\n/,\"\"))}W.parseSourceMapInput=hl;function ml(e,t,r){if(t=t||\"\",e&&(e[e.length-1]!==\"/\"&&t[0]!==\"/\"&&(e+=\"/\"),t=e+t),r){var n=lt(r);if(!n)throw new Error(\"sourceMapURL could not be parsed\");if(n.path){var i=n.path.lastIndexOf(\"/\");i>=0&&(n.path=n.path.substring(0,i+1));}t=Po(Ge(n),t);}return xr(t)}W.computeSourceURL=ml;});var Ro=Me(Oo=>{var yr=Rt(),kr=Object.prototype.hasOwnProperty,Ne=typeof Map<\"u\";function we(){this._array=[],this._set=Ne?new Map:Object.create(null);}we.fromArray=function(t,r){for(var n=new we,i=0,o=t.length;i<o;i++)n.add(t[i],r);return n};we.prototype.size=function(){return Ne?this._set.size:Object.getOwnPropertyNames(this._set).length};we.prototype.add=function(t,r){var n=Ne?t:yr.toSetString(t),i=Ne?this.has(t):kr.call(this._set,n),o=this._array.length;(!i||r)&&this._array.push(t),i||(Ne?this._set.set(t,o):this._set[n]=o);};we.prototype.has=function(t){if(Ne)return this._set.has(t);var r=yr.toSetString(t);return kr.call(this._set,r)};we.prototype.indexOf=function(t){if(Ne){var r=this._set.get(t);if(r>=0)return r}else {var n=yr.toSetString(t);if(kr.call(this._set,n))return this._set[n]}throw new Error('\"'+t+'\" is not in the set.')};we.prototype.at=function(t){if(t>=0&&t<this._array.length)return this._array[t];throw new Error(\"No element indexed by \"+t)};we.prototype.toArray=function(){return this._array.slice()};Oo.ArraySet=we;});var Bo=Me(Mo=>{var Fo=Rt();function dl(e,t){var r=e.generatedLine,n=t.generatedLine,i=e.generatedColumn,o=t.generatedColumn;return n>r||n==r&&o>=i||Fo.compareByGeneratedPositionsInflated(e,t)<=0}function Ft(){this._array=[],this._sorted=true,this._last={generatedLine:-1,generatedColumn:0};}Ft.prototype.unsortedForEach=function(t,r){this._array.forEach(t,r);};Ft.prototype.add=function(t){dl(this._last,t)?(this._last=t,this._array.push(t)):(this._sorted=false,this._array.push(t));};Ft.prototype.toArray=function(){return this._sorted||(this._array.sort(Fo.compareByGeneratedPositionsInflated),this._sorted=true),this._array};Mo.MappingList=Ft;});var Wo=Me(_o=>{var ct=Eo(),F=Rt(),Mt=Ro().ArraySet,fl=Bo().MappingList;function ne(e){e||(e={}),this._file=F.getArg(e,\"file\",null),this._sourceRoot=F.getArg(e,\"sourceRoot\",null),this._skipValidation=F.getArg(e,\"skipValidation\",false),this._sources=new Mt,this._names=new Mt,this._mappings=new fl,this._sourcesContents=null;}ne.prototype._version=3;ne.fromSourceMap=function(t){var r=t.sourceRoot,n=new ne({file:t.file,sourceRoot:r});return t.eachMapping(function(i){var o={generated:{line:i.generatedLine,column:i.generatedColumn}};i.source!=null&&(o.source=i.source,r!=null&&(o.source=F.relative(r,o.source)),o.original={line:i.originalLine,column:i.originalColumn},i.name!=null&&(o.name=i.name)),n.addMapping(o);}),t.sources.forEach(function(i){var o=i;r!==null&&(o=F.relative(r,i)),n._sources.has(o)||n._sources.add(o);var s=t.sourceContentFor(i);s!=null&&n.setSourceContent(i,s);}),n};ne.prototype.addMapping=function(t){var r=F.getArg(t,\"generated\"),n=F.getArg(t,\"original\",null),i=F.getArg(t,\"source\",null),o=F.getArg(t,\"name\",null);this._skipValidation||this._validateMapping(r,n,i,o),i!=null&&(i=String(i),this._sources.has(i)||this._sources.add(i)),o!=null&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:r.line,generatedColumn:r.column,originalLine:n!=null&&n.line,originalColumn:n!=null&&n.column,source:i,name:o});};ne.prototype.setSourceContent=function(t,r){var n=t;this._sourceRoot!=null&&(n=F.relative(this._sourceRoot,n)),r!=null?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[F.toSetString(n)]=r):this._sourcesContents&&(delete this._sourcesContents[F.toSetString(n)],Object.keys(this._sourcesContents).length===0&&(this._sourcesContents=null));};ne.prototype.applySourceMap=function(t,r,n){var i=r;if(r==null){if(t.file==null)throw new Error(`SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map's \"file\" property. Both were omitted.`);i=t.file;}var o=this._sourceRoot;o!=null&&(i=F.relative(o,i));var s=new Mt,u=new Mt;this._mappings.unsortedForEach(function(c){if(c.source===i&&c.originalLine!=null){var a=t.originalPositionFor({line:c.originalLine,column:c.originalColumn});a.source!=null&&(c.source=a.source,n!=null&&(c.source=F.join(n,c.source)),o!=null&&(c.source=F.relative(o,c.source)),c.originalLine=a.line,c.originalColumn=a.column,a.name!=null&&(c.name=a.name));}var l=c.source;l!=null&&!s.has(l)&&s.add(l);var p=c.name;p!=null&&!u.has(p)&&u.add(p);},this),this._sources=s,this._names=u,t.sources.forEach(function(c){var a=t.sourceContentFor(c);a!=null&&(n!=null&&(c=F.join(n,c)),o!=null&&(c=F.relative(o,c)),this.setSourceContent(c,a));},this);};ne.prototype._validateMapping=function(t,r,n,i){if(r&&typeof r.line!=\"number\"&&typeof r.column!=\"number\")throw new Error(\"original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.\");if(!(t&&\"line\"in t&&\"column\"in t&&t.line>0&&t.column>=0&&!r&&!n&&!i)){if(t&&\"line\"in t&&\"column\"in t&&r&&\"line\"in r&&\"column\"in r&&t.line>0&&t.column>=0&&r.line>0&&r.column>=0&&n)return;throw new Error(\"Invalid mapping: \"+JSON.stringify({generated:t,source:n,original:r,name:i}))}};ne.prototype._serializeMappings=function(){for(var t=0,r=1,n=0,i=0,o=0,s=0,u=\"\",c,a,l,p,h=this._mappings.toArray(),d=0,g=h.length;d<g;d++){if(a=h[d],c=\"\",a.generatedLine!==r)for(t=0;a.generatedLine!==r;)c+=\";\",r++;else if(d>0){if(!F.compareByGeneratedPositionsInflated(a,h[d-1]))continue;c+=\",\";}c+=ct.encode(a.generatedColumn-t),t=a.generatedColumn,a.source!=null&&(p=this._sources.indexOf(a.source),c+=ct.encode(p-s),s=p,c+=ct.encode(a.originalLine-1-i),i=a.originalLine-1,c+=ct.encode(a.originalColumn-n),n=a.originalColumn,a.name!=null&&(l=this._names.indexOf(a.name),c+=ct.encode(l-o),o=l)),u+=c;}return u};ne.prototype._generateSourcesContent=function(t,r){return t.map(function(n){if(!this._sourcesContents)return null;r!=null&&(n=F.relative(r,n));var i=F.toSetString(n);return Object.prototype.hasOwnProperty.call(this._sourcesContents,i)?this._sourcesContents[i]:null},this)};ne.prototype.toJSON=function(){var t={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return this._file!=null&&(t.file=this._file),this._sourceRoot!=null&&(t.sourceRoot=this._sourceRoot),this._sourcesContents&&(t.sourcesContent=this._generateSourcesContent(t.sources,t.sourceRoot)),t};ne.prototype.toString=function(){return JSON.stringify(this.toJSON())};_o.SourceMapGenerator=ne;});var sr={};f(sr,{AtKeyword:()=>D,BadString:()=>Be,BadUrl:()=>H,CDC:()=>G,CDO:()=>ze,Colon:()=>B,Comma:()=>Y,Comment:()=>N,Delim:()=>v,Dimension:()=>k,EOF:()=>be,Function:()=>y,Hash:()=>A,Ident:()=>m,LeftCurlyBracket:()=>R,LeftParenthesis:()=>S,LeftSquareBracket:()=>X,Number:()=>b,Percentage:()=>P,RightCurlyBracket:()=>$,RightParenthesis:()=>x,RightSquareBracket:()=>Z,Semicolon:()=>_,String:()=>te,Url:()=>M,WhiteSpace:()=>L});var be=0,m=1,y=2,D=3,A=4,te=5,Be=6,M=7,H=8,v=9,b=10,P=11,k=12,L=13,ze=14,G=15,B=16,_=17,Y=18,X=19,Z=20,S=21,x=22,R=23,$=24,N=25;function O(e){return e>=48&&e<=57}function J(e){return O(e)||e>=65&&e<=70||e>=97&&e<=102}function Lt(e){return e>=65&&e<=90}function ja(e){return e>=97&&e<=122}function Ua(e){return Lt(e)||ja(e)}function Ha(e){return e>=128}function At(e){return Ua(e)||Ha(e)||e===95}function _e(e){return At(e)||O(e)||e===45}function Ga(e){return e>=0&&e<=8||e===11||e>=14&&e<=31||e===127}function tt(e){return e===10||e===13||e===12}function me(e){return tt(e)||e===32||e===9}function K(e,t){return !(e!==92||tt(t)||t===0)}function We(e,t,r){return e===45?At(t)||t===45||K(t,r):At(e)?true:e===92?K(e,t):false}function Et(e,t,r){return e===43||e===45?O(t)?2:t===46&&O(r)?3:0:e===46?O(t)?2:0:O(e)?1:0}function zt(e){return e===65279||e===65534?1:0}var ar=new Array(128),Ya=128,rt=130,lr=131,Pt=132,cr=133;for(let e=0;e<ar.length;e++)ar[e]=me(e)&&rt||O(e)&&lr||At(e)&&Pt||Ga(e)&&cr||e||Ya;function It(e){return e<128?ar[e]:Pt}function qe(e,t){return t<e.length?e.charCodeAt(t):0}function Dt(e,t,r){return r===13&&qe(e,t+1)===10?2:1}function xe(e,t,r){let n=e.charCodeAt(t);return Lt(n)&&(n=n|32),n===r}function ye(e,t,r,n){if(r-t!==n.length||t<0||r>e.length)return  false;for(let i=t;i<r;i++){let o=n.charCodeAt(i-t),s=e.charCodeAt(i);if(Lt(s)&&(s=s|32),s!==o)return  false}return  true}function lo(e,t){for(;t>=0&&me(e.charCodeAt(t));t--);return t+1}function nt(e,t){for(;t<e.length&&me(e.charCodeAt(t));t++);return t}function ur(e,t){for(;t<e.length&&O(e.charCodeAt(t));t++);return t}function se(e,t){if(t+=2,J(qe(e,t-1))){for(let n=Math.min(e.length,t+5);t<n&&J(qe(e,t));t++);let r=qe(e,t);me(r)&&(t+=Dt(e,t,r));}return t}function it(e,t){for(;t<e.length;t++){let r=e.charCodeAt(t);if(!_e(r)){if(K(r,qe(e,t+1))){t=se(e,t)-1;continue}break}}return t}function Pe(e,t){let r=e.charCodeAt(t);if((r===43||r===45)&&(r=e.charCodeAt(t+=1)),O(r)&&(t=ur(e,t+1),r=e.charCodeAt(t)),r===46&&O(e.charCodeAt(t+1))&&(t+=2,t=ur(e,t)),xe(e,t,101)){let n=0;r=e.charCodeAt(t+1),(r===45||r===43)&&(n=1,r=e.charCodeAt(t+2)),O(r)&&(t=ur(e,t+1+n+1));}return t}function Nt(e,t){for(;t<e.length;t++){let r=e.charCodeAt(t);if(r===41){t++;break}K(r,qe(e,t+1))&&(t=se(e,t));}return t}function je(e){if(e.length===1&&!J(e.charCodeAt(0)))return e[0];let t=parseInt(e,16);return (t===0||t>=55296&&t<=57343||t>1114111)&&(t=65533),String.fromCodePoint(t)}var Ie=[\"EOF-token\",\"ident-token\",\"function-token\",\"at-keyword-token\",\"hash-token\",\"string-token\",\"bad-string-token\",\"url-token\",\"bad-url-token\",\"delim-token\",\"number-token\",\"percentage-token\",\"dimension-token\",\"whitespace-token\",\"CDO-token\",\"CDC-token\",\"colon-token\",\"semicolon-token\",\"comma-token\",\"[-token\",\"]-token\",\"(-token\",\")-token\",\"{-token\",\"}-token\",\"comment-token\"];function Ue(e=null,t){return e===null||e.length<t?new Uint32Array(Math.max(t+1024,16384)):e}var co=10,Ka=12,uo=13;function po(e){let t=e.source,r=t.length,n=t.length>0?zt(t.charCodeAt(0)):0,i=Ue(e.lines,r),o=Ue(e.columns,r),s=e.startLine,u=e.startColumn;for(let c=n;c<r;c++){let a=t.charCodeAt(c);i[c]=s,o[c]=u++,(a===co||a===uo||a===Ka)&&(a===uo&&c+1<r&&t.charCodeAt(c+1)===co&&(c++,i[c]=s,o[c]=u),s++,u=1);}i[r]=s,o[r]=u,e.lines=i,e.columns=o,e.computed=true;}var ot=class{constructor(t,r,n,i){this.setSource(t,r,n,i),this.lines=null,this.columns=null;}setSource(t=\"\",r=0,n=1,i=1){this.source=t,this.startOffset=r,this.startLine=n,this.startColumn=i,this.computed=false;}getLocation(t,r){return this.computed||po(this),{source:r,offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}getLocationRange(t,r,n){return this.computed||po(this),{source:n,start:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]},end:{offset:this.startOffset+r,line:this.lines[r],column:this.columns[r]}}}};var ae=16777215,le=24,at=1,Ot=2,Se=new Uint8Array(32);Se[2]=22;Se[21]=22;Se[19]=20;Se[23]=24;var ce=new Uint8Array(32);ce[2]=at;ce[21]=at;ce[19]=at;ce[23]=at;ce[22]=Ot;ce[20]=Ot;ce[24]=Ot;function ho(e,t,r){return e<t?t:e>r?r:e}var st=class{constructor(t,r){this.setSource(t,r);}reset(){this.eof=false,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset;}setSource(t=\"\",r=()=>{}){t=String(t||\"\");let n=t.length,i=Ue(this.offsetAndType,t.length+1),o=Ue(this.balance,t.length+1),s=0,u=-1,c=0,a=t.length;this.offsetAndType=null,this.balance=null,o.fill(0),r(t,(l,p,h)=>{let d=s++;if(i[d]=l<<le|h,u===-1&&(u=p),o[d]=a,l===c){let g=o[a];o[a]=d,a=g,c=Se[i[g]>>le];}else this.isBlockOpenerTokenType(l)&&(a=d,c=Se[l]);}),i[s]=0<<le|n,o[s]=s;for(let l=0;l<s;l++){let p=o[l];if(p<=l){let h=o[p];h!==l&&(o[l]=h);}else p>s&&(o[l]=s);}this.source=t,this.firstCharOffset=u===-1?0:u,this.tokenCount=s,this.offsetAndType=i,this.balance=o,this.reset(),this.next();}lookupType(t){return t+=this.tokenIndex,t<this.tokenCount?this.offsetAndType[t]>>le:0}lookupTypeNonSC(t){for(let r=this.tokenIndex;r<this.tokenCount;r++){let n=this.offsetAndType[r]>>le;if(n!==13&&n!==25&&t--===0)return n}return 0}lookupOffset(t){return t+=this.tokenIndex,t<this.tokenCount?this.offsetAndType[t-1]&ae:this.source.length}lookupOffsetNonSC(t){for(let r=this.tokenIndex;r<this.tokenCount;r++){let n=this.offsetAndType[r]>>le;if(n!==13&&n!==25&&t--===0)return r-this.tokenIndex}return 0}lookupValue(t,r){return t+=this.tokenIndex,t<this.tokenCount?ye(this.source,this.offsetAndType[t-1]&ae,this.offsetAndType[t]&ae,r):false}getTokenStart(t){return t===this.tokenIndex?this.tokenStart:t>0?t<this.tokenCount?this.offsetAndType[t-1]&ae:this.offsetAndType[this.tokenCount]&ae:this.firstCharOffset}getTokenEnd(t){return t===this.tokenIndex?this.tokenEnd:this.offsetAndType[ho(t,0,this.tokenCount)]&ae}getTokenType(t){return t===this.tokenIndex?this.tokenType:this.offsetAndType[ho(t,0,this.tokenCount)]>>le}substrToCursor(t){return this.source.substring(t,this.tokenStart)}isBlockOpenerTokenType(t){return ce[t]===at}isBlockCloserTokenType(t){return ce[t]===Ot}getBlockTokenPairIndex(t){let r=this.getTokenType(t);if(ce[r]===1){let n=this.balance[t],i=this.getTokenType(n);return Se[r]===i?n:-1}else if(ce[r]===2){let n=this.balance[t],i=this.getTokenType(n);return Se[i]===r?n:-1}return  -1}isBalanceEdge(t){return this.balance[this.tokenIndex]<t}isDelim(t,r){return r?this.lookupType(r)===9&&this.source.charCodeAt(this.lookupOffset(r))===t:this.tokenType===9&&this.source.charCodeAt(this.tokenStart)===t}skip(t){let r=this.tokenIndex+t;r<this.tokenCount?(this.tokenIndex=r,this.tokenStart=this.offsetAndType[r-1]&ae,r=this.offsetAndType[r],this.tokenType=r>>le,this.tokenEnd=r&ae):(this.tokenIndex=this.tokenCount,this.next());}next(){let t=this.tokenIndex+1;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=this.tokenEnd,t=this.offsetAndType[t],this.tokenType=t>>le,this.tokenEnd=t&ae):(this.eof=true,this.tokenIndex=this.tokenCount,this.tokenType=0,this.tokenStart=this.tokenEnd=this.source.length);}skipSC(){for(;this.tokenType===13||this.tokenType===25;)this.next();}skipUntilBalanced(t,r){let n=t,i=0,o=0;e:for(;n<this.tokenCount;n++){if(i=this.balance[n],i<t)break e;switch(o=n>0?this.offsetAndType[n-1]&ae:this.firstCharOffset,r(this.source.charCodeAt(o))){case 1:break e;case 2:n++;break e;default:this.isBlockOpenerTokenType(this.offsetAndType[n]>>le)&&(n=i);}}this.skip(n-this.tokenIndex);}forEachToken(t){for(let r=0,n=this.firstCharOffset;r<this.tokenCount;r++){let i=n,o=this.offsetAndType[r],s=o&ae,u=o>>le;n=s,t(u,i,s,r);}}dump(){let t=new Array(this.tokenCount);return this.forEachToken((r,n,i,o)=>{t[o]={idx:o,type:Ie[r],chunk:this.source.substring(n,i),balance:this.balance[o]};}),t}};function Ce(e,t){function r(p){return p<u?e.charCodeAt(p):0}function n(){if(a=Pe(e,a),We(r(a),r(a+1),r(a+2))){l=12,a=it(e,a);return}if(r(a)===37){l=11,a++;return}l=10;}function i(){let p=a;if(a=it(e,a),ye(e,p,a,\"url\")&&r(a)===40){if(a=nt(e,a+1),r(a)===34||r(a)===39){l=2,a=p+4;return}s();return}if(r(a)===40){l=2,a++;return}l=1;}function o(p){for(p||(p=r(a++)),l=5;a<e.length;a++){let h=e.charCodeAt(a);switch(It(h)){case p:a++;return;case rt:if(tt(h)){a+=Dt(e,a,h),l=6;return}break;case 92:if(a===e.length-1)break;let d=r(a+1);tt(d)?a+=Dt(e,a+1,d):K(h,d)&&(a=se(e,a)-1);break}}}function s(){for(l=7,a=nt(e,a);a<e.length;a++){let p=e.charCodeAt(a);switch(It(p)){case 41:a++;return;case rt:if(a=nt(e,a),r(a)===41||a>=e.length){a<e.length&&a++;return}a=Nt(e,a),l=8;return;case 34:case 39:case 40:case cr:a=Nt(e,a),l=8;return;case 92:if(K(p,r(a+1))){a=se(e,a)-1;break}a=Nt(e,a),l=8;return}}}e=String(e||\"\");let u=e.length,c=zt(r(0)),a=c,l;for(;a<u;){let p=e.charCodeAt(a);switch(It(p)){case rt:l=13,a=nt(e,a+1);break;case 34:o();break;case 35:_e(r(a+1))||K(r(a+1),r(a+2))?(l=4,a=it(e,a+1)):(l=9,a++);break;case 39:o();break;case 40:l=21,a++;break;case 41:l=22,a++;break;case 43:Et(p,r(a+1),r(a+2))?n():(l=9,a++);break;case 44:l=18,a++;break;case 45:Et(p,r(a+1),r(a+2))?n():r(a+1)===45&&r(a+2)===62?(l=15,a=a+3):We(p,r(a+1),r(a+2))?i():(l=9,a++);break;case 46:Et(p,r(a+1),r(a+2))?n():(l=9,a++);break;case 47:r(a+1)===42?(l=25,a=e.indexOf(\"*/\",a+2),a=a===-1?e.length:a+2):(l=9,a++);break;case 58:l=16,a++;break;case 59:l=17,a++;break;case 60:r(a+1)===33&&r(a+2)===45&&r(a+3)===45?(l=14,a=a+4):(l=9,a++);break;case 64:We(r(a+1),r(a+2),r(a+3))?(l=3,a=it(e,a+1)):(l=9,a++);break;case 91:l=19,a++;break;case 92:K(p,r(a+1))?i():(l=9,a++);break;case 93:l=20,a++;break;case 123:l=23,a++;break;case 125:l=24,a++;break;case lr:n();break;case Pt:i();break;default:l=9,a++;}t(l,c,c=a);}}var He=null,V=class e{static createItem(t){return {prev:null,next:null,data:t}}constructor(){this.head=null,this.tail=null,this.cursor=null;}createItem(t){return e.createItem(t)}allocateCursor(t,r){let n;return He!==null?(n=He,He=He.cursor,n.prev=t,n.next=r,n.cursor=this.cursor):n={prev:t,next:r,cursor:this.cursor},this.cursor=n,n}releaseCursor(){let{cursor:t}=this;this.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=He,He=t;}updateCursors(t,r,n,i){let{cursor:o}=this;for(;o!==null;)o.prev===t&&(o.prev=r),o.next===n&&(o.next=i),o=o.cursor;}*[Symbol.iterator](){for(let t=this.head;t!==null;t=t.next)yield t.data;}get size(){let t=0;for(let r=this.head;r!==null;r=r.next)t++;return t}get isEmpty(){return this.head===null}get first(){return this.head&&this.head.data}get last(){return this.tail&&this.tail.data}fromArray(t){let r=null;this.head=null;for(let n of t){let i=e.createItem(n);r!==null?r.next=i:this.head=i,i.prev=r,r=i;}return this.tail=r,this}toArray(){return [...this]}toJSON(){return [...this]}forEach(t,r=this){let n=this.allocateCursor(null,this.head);for(;n.next!==null;){let i=n.next;n.next=i.next,t.call(r,i.data,i,this);}this.releaseCursor();}forEachRight(t,r=this){let n=this.allocateCursor(this.tail,null);for(;n.prev!==null;){let i=n.prev;n.prev=i.prev,t.call(r,i.data,i,this);}this.releaseCursor();}reduce(t,r,n=this){let i=this.allocateCursor(null,this.head),o=r,s;for(;i.next!==null;)s=i.next,i.next=s.next,o=t.call(n,o,s.data,s,this);return this.releaseCursor(),o}reduceRight(t,r,n=this){let i=this.allocateCursor(this.tail,null),o=r,s;for(;i.prev!==null;)s=i.prev,i.prev=s.prev,o=t.call(n,o,s.data,s,this);return this.releaseCursor(),o}some(t,r=this){for(let n=this.head;n!==null;n=n.next)if(t.call(r,n.data,n,this))return  true;return  false}map(t,r=this){let n=new e;for(let i=this.head;i!==null;i=i.next)n.appendData(t.call(r,i.data,i,this));return n}filter(t,r=this){let n=new e;for(let i=this.head;i!==null;i=i.next)t.call(r,i.data,i,this)&&n.appendData(i.data);return n}nextUntil(t,r,n=this){if(t===null)return;let i=this.allocateCursor(null,t);for(;i.next!==null;){let o=i.next;if(i.next=o.next,r.call(n,o.data,o,this))break}this.releaseCursor();}prevUntil(t,r,n=this){if(t===null)return;let i=this.allocateCursor(t,null);for(;i.prev!==null;){let o=i.prev;if(i.prev=o.prev,r.call(n,o.data,o,this))break}this.releaseCursor();}clear(){this.head=null,this.tail=null;}copy(){let t=new e;for(let r of this)t.appendData(r);return t}prepend(t){return this.updateCursors(null,t,this.head,t),this.head!==null?(this.head.prev=t,t.next=this.head):this.tail=t,this.head=t,this}prependData(t){return this.prepend(e.createItem(t))}append(t){return this.insert(t)}appendData(t){return this.insert(e.createItem(t))}insert(t,r=null){if(r!==null)if(this.updateCursors(r.prev,t,r,t),r.prev===null){if(this.head!==r)throw new Error(\"before doesn't belong to list\");this.head=t,r.prev=t,t.next=r,this.updateCursors(null,t);}else r.prev.next=t,t.prev=r.prev,r.prev=t,t.next=r;else this.updateCursors(this.tail,t,null,t),this.tail!==null?(this.tail.next=t,t.prev=this.tail):this.head=t,this.tail=t;return this}insertData(t,r){return this.insert(e.createItem(t),r)}remove(t){if(this.updateCursors(t,t.prev,t,t.next),t.prev!==null)t.prev.next=t.next;else {if(this.head!==t)throw new Error(\"item doesn't belong to list\");this.head=t.next;}if(t.next!==null)t.next.prev=t.prev;else {if(this.tail!==t)throw new Error(\"item doesn't belong to list\");this.tail=t.prev;}return t.prev=null,t.next=null,t}push(t){this.insert(e.createItem(t));}pop(){return this.tail!==null?this.remove(this.tail):null}unshift(t){this.prepend(e.createItem(t));}shift(){return this.head!==null?this.remove(this.head):null}prependList(t){return this.insertList(t,this.head)}appendList(t){return this.insertList(t)}insertList(t,r){return t.head===null?this:(r!=null?(this.updateCursors(r.prev,t.tail,r,t.head),r.prev!==null?(r.prev.next=t.head,t.head.prev=r.prev):this.head=t.head,r.prev=t.tail,t.tail.next=r):(this.updateCursors(this.tail,t.tail,null,t.head),this.tail!==null?(this.tail.next=t.head,t.head.prev=this.tail):this.head=t.head,this.tail=t.tail),t.head=null,t.tail=null,this)}replace(t,r){\"head\"in r?this.insertList(r,t):this.insert(r,t),this.remove(t);}};function De(e,t){let r=Object.create(SyntaxError.prototype),n=new Error;return Object.assign(r,{name:e,message:t,get stack(){return (n.stack||\"\").replace(/^(.+\\n){1,3}/,`${e}: ${t}\n`)}})}var pr=100,mo=60,fo=\"    \";function go({source:e,line:t,column:r,baseLine:n,baseColumn:i},o){function s(g,ee){return a.slice(g,ee).map((j,w)=>String(g+w+1).padStart(h)+\" |\"+j).join(`\n`)}let u=`\n`.repeat(Math.max(n-1,0)),c=\" \".repeat(Math.max(i-1,0)),a=(u+c+e).split(/\\r\\n?|\\n|\\f/),l=Math.max(1,t-o)-1,p=Math.min(t+o,a.length+1),h=Math.max(4,String(p).length)+1,d=0;r+=(fo.length-1)*(a[t-1].substr(0,r-1).match(/\\t/g)||[]).length,r>pr&&(d=r-mo+3,r=mo-2);for(let g=l;g<=p;g++)g>=0&&g<a.length&&(a[g]=a[g].replace(/\\t/g,fo),a[g]=(d>0&&a[g].length>d?\"\\u2026\":\"\")+a[g].substr(d,pr-2)+(a[g].length>d+pr-1?\"\\u2026\":\"\"));return [s(l,t),new Array(r+h+2).join(\"-\")+\"^\",s(t,p)].filter(Boolean).join(`\n`).replace(/^(\\s+\\d+\\s+\\|\\n)+/,\"\").replace(/\\n(\\s+\\d+\\s+\\|)+$/,\"\")}function hr(e,t,r,n,i,o=1,s=1){return Object.assign(De(\"SyntaxError\",e),{source:t,offset:r,line:n,column:i,sourceFragment(c){return go({source:t,line:n,column:i,baseLine:o,baseColumn:s},isNaN(c)?0:c)},get formattedMessage(){return `Parse error: ${e}\n`+go({source:t,line:n,column:i,baseLine:o,baseColumn:s},2)}})}function bo(e){let t=this.createList(),r=false,n={recognizer:e};for(;!this.eof;){switch(this.tokenType){case 25:this.next();continue;case 13:r=true,this.next();continue}let i=e.getNode.call(this,n);if(i===void 0)break;r&&(e.onWhiteSpace&&e.onWhiteSpace.call(this,i,t,n),r=false),t.push(i);}return r&&e.onWhiteSpace&&e.onWhiteSpace.call(this,null,t,n),t}var xo=()=>{},Va=33,Qa=35,mr=59,yo=123,ko=0;function Xa(e){return function(){return this[e]()}}function dr(e){let t=Object.create(null);for(let r of Object.keys(e)){let n=e[r],i=n.parse||n;i&&(t[r]=i);}return t}function $a(e){let t={context:Object.create(null),features:Object.assign(Object.create(null),e.features),scope:Object.assign(Object.create(null),e.scope),atrule:dr(e.atrule),pseudo:dr(e.pseudo),node:dr(e.node)};for(let[r,n]of Object.entries(e.parseContext))switch(typeof n){case \"function\":t.context[r]=n;break;case \"string\":t.context[r]=Xa(n);break}return {config:t,...t,...t.node}}function wo(e){let t=\"\",r=\"<unknown>\",n=false,i=xo,o=false,s=new ot,u=Object.assign(new st,$a(e||{}),{parseAtrulePrelude:true,parseRulePrelude:true,parseValue:true,parseCustomProperty:false,readSequence:bo,consumeUntilBalanceEnd:()=>0,consumeUntilLeftCurlyBracket(l){return l===yo?1:0},consumeUntilLeftCurlyBracketOrSemicolon(l){return l===yo||l===mr?1:0},consumeUntilExclamationMarkOrSemicolon(l){return l===Va||l===mr?1:0},consumeUntilSemicolonIncluded(l){return l===mr?2:0},createList(){return new V},createSingleNodeList(l){return new V().appendData(l)},getFirstListNode(l){return l&&l.first},getLastListNode(l){return l&&l.last},parseWithFallback(l,p){let h=this.tokenIndex;try{return l.call(this)}catch(d){if(o)throw d;this.skip(h-this.tokenIndex);let g=p.call(this);return o=true,i(d,g),o=false,g}},lookupNonWSType(l){let p;do if(p=this.lookupType(l++),p!==13&&p!==25)return p;while(p!==ko);return ko},charCodeAt(l){return l>=0&&l<t.length?t.charCodeAt(l):0},substring(l,p){return t.substring(l,p)},substrToCursor(l){return this.source.substring(l,this.tokenStart)},cmpChar(l,p){return xe(t,l,p)},cmpStr(l,p,h){return ye(t,l,p,h)},consume(l){let p=this.tokenStart;return this.eat(l),this.substrToCursor(p)},consumeFunctionName(){let l=t.substring(this.tokenStart,this.tokenEnd-1);return this.eat(2),l},consumeNumber(l){let p=t.substring(this.tokenStart,Pe(t,this.tokenStart));return this.eat(l),p},eat(l){if(this.tokenType!==l){let p=Ie[l].slice(0,-6).replace(/-/g,\" \").replace(/^./,g=>g.toUpperCase()),h=`${/[[\\](){}]/.test(p)?`\"${p}\"`:p} is expected`,d=this.tokenStart;switch(l){case 1:this.tokenType===2||this.tokenType===7?(d=this.tokenEnd-1,h=\"Identifier is expected but function found\"):h=\"Identifier is expected\";break;case 4:this.isDelim(Qa)&&(this.next(),d++,h=\"Name is expected\");break;case 11:this.tokenType===10&&(d=this.tokenEnd,h=\"Percent sign is expected\");break}this.error(h,d);}this.next();},eatIdent(l){(this.tokenType!==1||this.lookupValue(0,l)===false)&&this.error(`Identifier \"${l}\" is expected`),this.next();},eatDelim(l){this.isDelim(l)||this.error(`Delim \"${String.fromCharCode(l)}\" is expected`),this.next();},getLocation(l,p){return n?s.getLocationRange(l,p,r):null},getLocationFromList(l){if(n){let p=this.getFirstListNode(l),h=this.getLastListNode(l);return s.getLocationRange(p!==null?p.loc.start.offset-s.startOffset:this.tokenStart,h!==null?h.loc.end.offset-s.startOffset:this.tokenStart,r)}return null},error(l,p){let h=typeof p<\"u\"&&p<t.length?s.getLocation(p):this.eof?s.getLocation(lo(t,t.length-1)):s.getLocation(this.tokenStart);throw new hr(l||\"Unexpected input\",t,h.offset,h.line,h.column,s.startLine,s.startColumn)}}),c=()=>({filename:r,source:t,tokenCount:u.tokenCount,getTokenType:l=>u.getTokenType(l),getTokenTypeName:l=>Ie[u.getTokenType(l)],getTokenStart:l=>u.getTokenStart(l),getTokenEnd:l=>u.getTokenEnd(l),getTokenValue:l=>u.source.substring(u.getTokenStart(l),u.getTokenEnd(l)),substring:(l,p)=>u.source.substring(l,p),balance:u.balance.subarray(0,u.tokenCount+1),isBlockOpenerTokenType:u.isBlockOpenerTokenType,isBlockCloserTokenType:u.isBlockCloserTokenType,getBlockTokenPairIndex:l=>u.getBlockTokenPairIndex(l),getLocation:l=>s.getLocation(l,r),getRangeLocation:(l,p)=>s.getLocationRange(l,p,r)});return Object.assign(function(l,p){t=l,p=p||{},u.setSource(t,Ce),s.setSource(t,p.offset,p.line,p.column),r=p.filename||\"<unknown>\",n=!!p.positions,i=typeof p.onParseError==\"function\"?p.onParseError:xo,o=false,u.parseAtrulePrelude=\"parseAtrulePrelude\"in p?!!p.parseAtrulePrelude:true,u.parseRulePrelude=\"parseRulePrelude\"in p?!!p.parseRulePrelude:true,u.parseValue=\"parseValue\"in p?!!p.parseValue:true,u.parseCustomProperty=\"parseCustomProperty\"in p?!!p.parseCustomProperty:false;let{context:h=\"default\",onComment:d,onToken:g}=p;if(!(h in u.context))throw new Error(\"Unknown context `\"+h+\"`\");Array.isArray(g)?u.forEachToken((j,w,T)=>{g.push({type:j,start:w,end:T});}):typeof g==\"function\"&&u.forEachToken(g.bind(c())),typeof d==\"function\"&&u.forEachToken((j,w,T)=>{if(j===25){let he=u.getLocation(w,T),z=ye(t,T-2,T,\"*/\")?t.slice(w+2,T-2):t.slice(w+2,T);d(z,he);}});let ee=u.context[h].call(u,p);return u.eof||u.error(),ee},{SyntaxError:hr,config:u.config})}var jo=qa(Wo()),qo=new Set([\"Atrule\",\"Selector\",\"Declaration\"]);function Uo(e){let t=new jo.SourceMapGenerator,r={line:1,column:0},n={line:0,column:0},i={line:1,column:0},o={generated:i},s=1,u=0,c=false,a=e.node;e.node=function(h){if(h.loc&&h.loc.start&&qo.has(h.type)){let d=h.loc.start.line,g=h.loc.start.column-1;(n.line!==d||n.column!==g)&&(n.line=d,n.column=g,r.line=s,r.column=u,c&&(c=false,(r.line!==i.line||r.column!==i.column)&&t.addMapping(o)),c=true,t.addMapping({source:h.loc.source,original:n,generated:r}));}a.call(this,h),c&&qo.has(h.type)&&(i.line=s,i.column=u);};let l=e.emit;e.emit=function(h,d,g){for(let ee=0;ee<h.length;ee++)h.charCodeAt(ee)===10?(s++,u=0):u++;l(h,d,g);};let p=e.result;return e.result=function(){return c&&t.addMapping(o),{css:p(),map:t}},e}var Bt={};f(Bt,{safe:()=>vr,spec:()=>yl});var gl=43,bl=45,wr=(e,t)=>{if(e===9&&(e=t),typeof e==\"string\"){let r=e.charCodeAt(0);return r>127?32768:r<<8}return e},Ho=[[1,1],[1,2],[1,7],[1,8],[1,\"-\"],[1,10],[1,11],[1,12],[1,15],[1,21],[3,1],[3,2],[3,7],[3,8],[3,\"-\"],[3,10],[3,11],[3,12],[3,15],[4,1],[4,2],[4,7],[4,8],[4,\"-\"],[4,10],[4,11],[4,12],[4,15],[12,1],[12,2],[12,7],[12,8],[12,\"-\"],[12,10],[12,11],[12,12],[12,15],[\"#\",1],[\"#\",2],[\"#\",7],[\"#\",8],[\"#\",\"-\"],[\"#\",10],[\"#\",11],[\"#\",12],[\"#\",15],[\"-\",1],[\"-\",2],[\"-\",7],[\"-\",8],[\"-\",\"-\"],[\"-\",10],[\"-\",11],[\"-\",12],[\"-\",15],[10,1],[10,2],[10,7],[10,8],[10,10],[10,11],[10,12],[10,\"%\"],[10,15],[\"@\",1],[\"@\",2],[\"@\",7],[\"@\",8],[\"@\",\"-\"],[\"@\",15],[\".\",10],[\".\",11],[\".\",12],[\"+\",10],[\"+\",11],[\"+\",12],[\"/\",\"*\"]],xl=Ho.concat([[1,4],[12,4],[4,4],[3,21],[3,5],[3,16],[11,11],[11,12],[11,2],[11,\"-\"],[22,1],[22,2],[22,11],[22,12],[22,4],[22,\"-\"]]);function Go(e){let t=new Set(e.map(([r,n])=>wr(r)<<16|wr(n)));return function(r,n,i){let o=wr(n,i),s=i.charCodeAt(0);return (s===bl&&n!==1&&n!==2&&n!==15||s===gl?t.has(r<<16|s<<8):t.has(r<<16|o))&&this.emit(\" \",13,true),o}}var yl=Go(Ho),vr=Go(xl);var kl=92;function wl(e,t){if(typeof t==\"function\"){let r=null;e.children.forEach(n=>{r!==null&&t.call(this,r),this.node(n),r=n;});return}e.children.forEach(this.node,this);}function vl(e){Ce(e,(t,r,n)=>{this.token(t,e.slice(r,n));});}function Yo(e){let t=new Map;for(let[r,n]of Object.entries(e.node))typeof(n.generate||n)==\"function\"&&t.set(r,n.generate||n);return function(r,n){let i=\"\",o=0,s={node(c){if(t.has(c.type))t.get(c.type).call(u,c);else throw new Error(\"Unknown node type: \"+c.type)},tokenBefore:vr,token(c,a){o=this.tokenBefore(o,c,a),this.emit(a,c,false),c===9&&a.charCodeAt(0)===kl&&this.emit(`\n`,13,true);},emit(c){i+=c;},result(){return i}};n&&(typeof n.decorator==\"function\"&&(s=n.decorator(s)),n.sourceMap&&(s=Uo(s)),n.mode in Bt&&(s.tokenBefore=Bt[n.mode]));let u={node:c=>s.node(c),children:wl,token:(c,a)=>s.token(c,a),tokenize:vl};return s.node(r),s.result()}}function Ko(e){return {fromPlainObject(t){return e(t,{enter(r){r.children&&!(r.children instanceof V)&&(r.children=new V().fromArray(r.children));}}),t},toPlainObject(t){return e(t,{leave(r){r.children&&r.children instanceof V&&(r.children=r.children.toArray());}}),t}}}var{hasOwnProperty:Sr}=Object.prototype,ut=function(){};function Vo(e){return typeof e==\"function\"?e:ut}function Qo(e,t){return function(r,n,i){r.type===t&&e.call(this,r,n,i);}}function Sl(e,t){let r=t.structure,n=[];for(let i in r){if(Sr.call(r,i)===false)continue;let o=r[i],s={name:i,type:false,nullable:false};Array.isArray(o)||(o=[o]);for(let u of o)u===null?s.nullable=true:typeof u==\"string\"?s.type=\"node\":Array.isArray(u)&&(s.type=\"list\");s.type&&n.push(s);}return n.length?{context:t.walkContext,fields:n}:null}function Cl(e){let t={};for(let r in e.node)if(Sr.call(e.node,r)){let n=e.node[r];if(!n.structure)throw new Error(\"Missed `structure` field in `\"+r+\"` node type definition\");t[r]=Sl(r,n);}return t}function Xo(e,t){let r=e.fields.slice(),n=e.context,i=typeof n==\"string\";return t&&r.reverse(),function(o,s,u,c){let a;i&&(a=s[n],s[n]=o);for(let l of r){let p=o[l.name];if(!l.nullable||p){if(l.type===\"list\"){if(t?p.reduceRight(c,false):p.reduce(c,false))return  true}else if(u(p))return  true}}i&&(s[n]=a);}}function $o({StyleSheet:e,Atrule:t,Rule:r,Block:n,DeclarationList:i}){return {Atrule:{StyleSheet:e,Atrule:t,Rule:r,Block:n},Rule:{StyleSheet:e,Atrule:t,Rule:r,Block:n},Declaration:{StyleSheet:e,Atrule:t,Rule:r,Block:n,DeclarationList:i}}}function Zo(e){let t=Cl(e),r={},n={},i=Symbol(\"break-walk\"),o=Symbol(\"skip-node\");for(let a in t)Sr.call(t,a)&&t[a]!==null&&(r[a]=Xo(t[a],false),n[a]=Xo(t[a],true));let s=$o(r),u=$o(n),c=function(a,l){function p(w,T,he){let z=h.call(j,w,T,he);return z===i?true:z===o?false:!!(g.hasOwnProperty(w.type)&&g[w.type](w,j,p,ee)||d.call(j,w,T,he)===i)}let h=ut,d=ut,g=r,ee=(w,T,he,z)=>w||p(T,he,z),j={break:i,skip:o,root:a,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if(typeof l==\"function\")h=l;else if(l&&(h=Vo(l.enter),d=Vo(l.leave),l.reverse&&(g=n),l.visit)){if(s.hasOwnProperty(l.visit))g=l.reverse?u[l.visit]:s[l.visit];else if(!t.hasOwnProperty(l.visit))throw new Error(\"Bad value `\"+l.visit+\"` for `visit` option (should be: \"+Object.keys(t).sort().join(\", \")+\")\");h=Qo(h,l.visit),d=Qo(d,l.visit);}if(h===ut&&d===ut)throw new Error(\"Neither `enter` nor `leave` walker handler is set or both aren't a function\");p(a);};return c.break=i,c.skip=o,c.find=function(a,l){let p=null;return c(a,function(h,d,g){if(l.call(this,h,d,g))return p=h,i}),p},c.findLast=function(a,l){let p=null;return c(a,{reverse:true,enter(h,d,g){if(l.call(this,h,d,g))return p=h,i}}),p},c.findAll=function(a,l){let p=[];return c(a,function(h,d,g){l.call(this,h,d,g)&&p.push(h);}),p},c}function Tl(e){return e}function Al(e){let{min:t,max:r,comma:n}=e;return t===0&&r===0?n?\"#?\":\"*\":t===0&&r===1?\"?\":t===1&&r===0?n?\"#\":\"+\":t===1&&r===1?\"\":(n?\"#\":\"\")+(t===r?\"{\"+t+\"}\":\"{\"+t+\",\"+(r!==0?r:\"\")+\"}\")}function Ll(e){switch(e.type){case \"Range\":return \" [\"+(e.min===null?\"-\\u221E\":e.min)+\",\"+(e.max===null?\"\\u221E\":e.max)+\"]\";default:throw new Error(\"Unknown node type `\"+e.type+\"`\")}}function El(e,t,r,n){let i=e.combinator===\" \"||n?e.combinator:\" \"+e.combinator+\" \",o=e.terms.map(s=>_t(s,t,r,n)).join(i);return e.explicit||r?(n||o[0]===\",\"?\"[\":\"[ \")+o+(n?\"]\":\" ]\"):o}function _t(e,t,r,n){let i;switch(e.type){case \"Group\":i=El(e,t,r,n)+(e.disallowEmpty?\"!\":\"\");break;case \"Multiplier\":return _t(e.term,t,r,n)+t(Al(e),e);case \"Boolean\":i=\"<boolean-expr[\"+_t(e.term,t,r,n)+\"]>\";break;case \"Type\":i=\"<\"+e.name+(e.opts?t(Ll(e.opts),e.opts):\"\")+\">\";break;case \"Property\":i=\"<'\"+e.name+\"'>\";break;case \"Keyword\":i=e.name;break;case \"AtKeyword\":i=\"@\"+e.name;break;case \"Function\":i=e.name+\"(\";break;case \"String\":case \"Token\":i=e.value;break;case \"Comma\":i=\",\";break;default:throw new Error(\"Unknown node type `\"+e.type+\"`\")}return t(i,e)}function Oe(e,t){let r=Tl,n=false,i=false;return typeof t==\"function\"?r=t:t&&(n=!!t.forceBraces,i=!!t.compact,typeof t.decorate==\"function\"&&(r=t.decorate)),_t(e,r,n,i)}var Jo={offset:0,line:1,column:1};function zl(e,t){let r=e.tokens,n=e.longestMatch,i=n<r.length&&r[n].node||null,o=i!==t?i:null,s=0,u=0,c=0,a=\"\",l,p;for(let h=0;h<r.length;h++){let d=r[h].value;h===n&&(u=d.length,s=a.length),o!==null&&r[h].node===o&&(h<=n?c++:c=0),a+=d;}return n===r.length||c>1?(l=Wt(o||t,\"end\")||pt(Jo,a),p=pt(l)):(l=Wt(o,\"start\")||pt(Wt(t,\"start\")||Jo,a.slice(0,s)),p=Wt(o,\"end\")||pt(l,a.substr(s,u))),{css:a,mismatchOffset:s,mismatchLength:u,start:l,end:p}}function Wt(e,t){let r=e&&e.loc&&e.loc[t];return r?\"line\"in r?pt(r):r:null}function pt({offset:e,line:t,column:r},n){let i={offset:e,line:t,column:r};if(n){let o=n.split(/\\n|\\r\\n?|\\f/);i.offset+=n.length,i.line+=o.length-1,i.column=o.length===1?i.column+n.length:o.pop().length+1;}return i}var Ye=function(e,t){let r=De(\"SyntaxReferenceError\",e+(t?\" `\"+t+\"`\":\"\"));return r.reference=t,r},es=function(e,t,r,n){let i=De(\"SyntaxMatchError\",e),{css:o,mismatchOffset:s,mismatchLength:u,start:c,end:a}=zl(n,r);return i.rawMessage=e,i.syntax=t?Oe(t):\"<generic>\",i.css=o,i.mismatchOffset=s,i.mismatchLength=u,i.message=e+`\n  syntax: `+i.syntax+`\n   value: `+(o||\"<empty string>\")+`\n  --------`+new Array(i.mismatchOffset+1).join(\"-\")+\"^\",Object.assign(i,c),i.loc={source:r&&r.loc&&r.loc.source||\"<unknown>\",start:c,end:a},i};var qt=new Map,Ke=new Map,jt=45,Ut=Pl,Cr=Il;function Ht(e,t){return t=t||0,e.length-t>=2&&e.charCodeAt(t)===jt&&e.charCodeAt(t+1)===jt}function Tr(e,t){if(t=t||0,e.length-t>=3&&e.charCodeAt(t)===jt&&e.charCodeAt(t+1)!==jt){let r=e.indexOf(\"-\",t+2);if(r!==-1)return e.substring(t,r+1)}return \"\"}function Pl(e){if(qt.has(e))return qt.get(e);let t=e.toLowerCase(),r=qt.get(t);if(r===void 0){let n=Ht(t,0),i=n?\"\":Tr(t,0);r=Object.freeze({basename:t.substr(i.length),name:t,prefix:i,vendor:i,custom:n});}return qt.set(e,r),r}function Il(e){if(Ke.has(e))return Ke.get(e);let t=e,r=e[0];r===\"/\"?r=e[1]===\"/\"?\"//\":\"/\":r!==\"_\"&&r!==\"*\"&&r!==\"$\"&&r!==\"#\"&&r!==\"+\"&&r!==\"&\"&&(r=\"\");let n=Ht(t,r.length);if(!n&&(t=t.toLowerCase(),Ke.has(t))){let u=Ke.get(t);return Ke.set(e,u),u}let i=n?\"\":Tr(t,r.length),o=t.substr(0,r.length+i.length),s=Object.freeze({basename:t.substr(o.length),name:t.substr(r.length),hack:r,vendor:i,prefix:o,custom:n});return Ke.set(e,s),s}var Ve=[\"initial\",\"inherit\",\"unset\",\"revert\",\"revert-layer\"];var mt=43,de=45,Ar=110,Qe=true,Nl=false;function Er(e,t){return e!==null&&e.type===9&&e.value.charCodeAt(0)===t}function ht(e,t,r){for(;e!==null&&(e.type===13||e.type===25);)e=r(++t);return t}function Te(e,t,r,n){if(!e)return 0;let i=e.value.charCodeAt(t);if(i===mt||i===de){if(r)return 0;t++;}for(;t<e.value.length;t++)if(!O(e.value.charCodeAt(t)))return 0;return n+1}function Lr(e,t,r){let n=false,i=ht(e,t,r);if(e=r(i),e===null)return t;if(e.type!==10)if(Er(e,mt)||Er(e,de)){if(n=true,i=ht(r(++i),i,r),e=r(i),e===null||e.type!==10)return 0}else return t;if(!n){let o=e.value.charCodeAt(0);if(o!==mt&&o!==de)return 0}return Te(e,n?0:1,n,i)}function zr(e,t){let r=0;if(!e)return 0;if(e.type===10)return Te(e,0,Nl,r);if(e.type===1&&e.value.charCodeAt(0)===de){if(!xe(e.value,1,Ar))return 0;switch(e.value.length){case 2:return Lr(t(++r),r,t);case 3:return e.value.charCodeAt(2)!==de?0:(r=ht(t(++r),r,t),e=t(r),Te(e,0,Qe,r));default:return e.value.charCodeAt(2)!==de?0:Te(e,3,Qe,r)}}else if(e.type===1||Er(e,mt)&&t(r+1).type===1){if(e.type!==1&&(e=t(++r)),e===null||!xe(e.value,0,Ar))return 0;switch(e.value.length){case 1:return Lr(t(++r),r,t);case 2:return e.value.charCodeAt(1)!==de?0:(r=ht(t(++r),r,t),e=t(r),Te(e,0,Qe,r));default:return e.value.charCodeAt(1)!==de?0:Te(e,2,Qe,r)}}else if(e.type===12){let n=e.value.charCodeAt(0),i=n===mt||n===de?1:0,o=i;for(;o<e.value.length&&O(e.value.charCodeAt(o));o++);return o===i||!xe(e.value,o,Ar)?0:o+1===e.value.length?Lr(t(++r),r,t):e.value.charCodeAt(o+1)!==de?0:o+2===e.value.length?(r=ht(t(++r),r,t),e=t(r),Te(e,0,Qe,r)):Te(e,o+2,Qe,r)}return 0}var Ol=43,ts=45,rs=63,Rl=117;function Pr(e,t){return e!==null&&e.type===9&&e.value.charCodeAt(0)===t}function Fl(e,t){return e.value.charCodeAt(0)===t}function dt(e,t,r){let n=0;for(let i=t;i<e.value.length;i++){let o=e.value.charCodeAt(i);if(o===ts&&r&&n!==0)return dt(e,t+n+1,false),6;if(!J(o)||++n>6)return 0}return n}function Gt(e,t,r){if(!e)return 0;for(;Pr(r(t),rs);){if(++e>6)return 0;t++;}return t}function Ir(e,t){let r=0;if(e===null||e.type!==1||!xe(e.value,0,Rl)||(e=t(++r),e===null))return 0;if(Pr(e,Ol))return e=t(++r),e===null?0:e.type===1?Gt(dt(e,0,true),++r,t):Pr(e,rs)?Gt(1,++r,t):0;if(e.type===10){let n=dt(e,1,true);return n===0?0:(e=t(++r),e===null?r:e.type===12||e.type===10?!Fl(e,ts)||!dt(e,1,false)?0:r+1:Gt(n,r,t))}return e.type===12?Gt(dt(e,1,true),++r,t):0}var Ml=[\"calc(\",\"-moz-calc(\",\"-webkit-calc(\"],Dr=new Map([[2,22],[21,22],[19,20],[23,24]]);function ue(e,t){return t<e.length?e.charCodeAt(t):0}function ns(e,t){return ye(e,0,e.length,t)}function is(e,t){for(let r=0;r<t.length;r++)if(ns(e,t[r]))return  true;return  false}function os(e,t){return t!==e.length-2?false:ue(e,t)===92&&O(ue(e,t+1))}function Yt(e,t,r){if(e&&e.type===\"Range\"){let n=Number(r!==void 0&&r!==t.length?t.substr(0,r):t);if(isNaN(n)||e.min!==null&&n<e.min&&typeof e.min!=\"string\"||e.max!==null&&n>e.max&&typeof e.max!=\"string\")return  true}return  false}function Bl(e,t){let r=0,n=[],i=0;e:do{switch(e.type){case 24:case 22:case 20:if(e.type!==r)break e;if(r=n.pop(),n.length===0){i++;break e}break;case 2:case 21:case 19:case 23:n.push(r),r=Dr.get(e.type);break}i++;}while(e=t(i));return i}function ie(e){return function(t,r,n){return t===null?0:t.type===2&&is(t.value,Ml)?Bl(t,r):e(t,r,n)}}function I(e){return function(t){return t===null||t.type!==e?0:1}}function _l(e){if(e===null||e.type!==1)return 0;let t=e.value.toLowerCase();return is(t,Ve)||ns(t,\"default\")?0:1}function ss(e){return e===null||e.type!==1||ue(e.value,0)!==45||ue(e.value,1)!==45?0:1}function Wl(e){return !ss(e)||e.value===\"--\"?0:1}function ql(e){if(e===null||e.type!==4)return 0;let t=e.value.length;if(t!==4&&t!==5&&t!==7&&t!==9)return 0;for(let r=1;r<t;r++)if(!J(ue(e.value,r)))return 0;return 1}function jl(e){return e===null||e.type!==4||!We(ue(e.value,1),ue(e.value,2),ue(e.value,3))?0:1}function Ul(e,t){if(!e)return 0;let r=0,n=[],i=0;e:do{switch(e.type){case 6:case 8:break e;case 24:case 22:case 20:if(e.type!==r)break e;r=n.pop();break;case 17:if(r===0)break e;break;case 9:if(r===0&&e.value===\"!\")break e;break;case 2:case 21:case 19:case 23:n.push(r),r=Dr.get(e.type);break}i++;}while(e=t(i));return i}function Hl(e,t){if(!e)return 0;let r=0,n=[],i=0;e:do{switch(e.type){case 6:case 8:break e;case 24:case 22:case 20:if(e.type!==r)break e;r=n.pop();break;case 2:case 21:case 19:case 23:n.push(r),r=Dr.get(e.type);break}i++;}while(e=t(i));return i}function ve(e){return e&&(e=new Set(e)),function(t,r,n){if(t===null||t.type!==12)return 0;let i=Pe(t.value,0);if(e!==null){let o=t.value.indexOf(\"\\\\\",i),s=o===-1||!os(t.value,o)?t.value.substr(i):t.value.substring(i,o);if(e.has(s.toLowerCase())===false)return 0}return Yt(n,t.value,i)?0:1}}function Gl(e,t,r){return e===null||e.type!==11||Yt(r,e.value,e.value.length-1)?0:1}function as(e){return typeof e!=\"function\"&&(e=function(){return 0}),function(t,r,n){return t!==null&&t.type===10&&Number(t.value)===0?1:e(t,r,n)}}function Yl(e,t,r){if(e===null)return 0;let n=Pe(e.value,0);return !(n===e.value.length)&&!os(e.value,n)||Yt(r,e.value,n)?0:1}function Kl(e,t,r){if(e===null||e.type!==10)return 0;let n=ue(e.value,0)===43||ue(e.value,0)===45?1:0;for(;n<e.value.length;n++)if(!O(ue(e.value,n)))return 0;return Yt(r,e.value,n)?0:1}var Vl={\"ident-token\":I(1),\"function-token\":I(2),\"at-keyword-token\":I(3),\"hash-token\":I(4),\"string-token\":I(5),\"bad-string-token\":I(6),\"url-token\":I(7),\"bad-url-token\":I(8),\"delim-token\":I(9),\"number-token\":I(10),\"percentage-token\":I(11),\"dimension-token\":I(12),\"whitespace-token\":I(13),\"CDO-token\":I(14),\"CDC-token\":I(15),\"colon-token\":I(16),\"semicolon-token\":I(17),\"comma-token\":I(18),\"[-token\":I(19),\"]-token\":I(20),\"(-token\":I(21),\")-token\":I(22),\"{-token\":I(23),\"}-token\":I(24)},Ql={string:I(5),ident:I(1),percentage:ie(Gl),zero:as(),number:ie(Yl),integer:ie(Kl),\"custom-ident\":_l,\"dashed-ident\":ss,\"custom-property-name\":Wl,\"hex-color\":ql,\"id-selector\":jl,\"an-plus-b\":zr,urange:Ir,\"declaration-value\":Ul,\"any-value\":Hl};function Xl(e){let{angle:t,decibel:r,frequency:n,flex:i,length:o,resolution:s,semitones:u,time:c}=e||{};return {dimension:ie(ve(null)),angle:ie(ve(t)),decibel:ie(ve(r)),frequency:ie(ve(n)),flex:ie(ve(i)),length:ie(as(ve(o))),resolution:ie(ve(s)),semitones:ie(ve(u)),time:ie(ve(c))}}function ls(e){return {...Vl,...Ql,...Xl(e)}}var Kt={};f(Kt,{angle:()=>Zl,decibel:()=>nc,flex:()=>rc,frequency:()=>ec,length:()=>$l,resolution:()=>tc,semitones:()=>ic,time:()=>Jl});var $l=[\"cm\",\"mm\",\"q\",\"in\",\"pt\",\"pc\",\"px\",\"em\",\"rem\",\"ex\",\"rex\",\"cap\",\"rcap\",\"ch\",\"rch\",\"ic\",\"ric\",\"lh\",\"rlh\",\"vw\",\"svw\",\"lvw\",\"dvw\",\"vh\",\"svh\",\"lvh\",\"dvh\",\"vi\",\"svi\",\"lvi\",\"dvi\",\"vb\",\"svb\",\"lvb\",\"dvb\",\"vmin\",\"svmin\",\"lvmin\",\"dvmin\",\"vmax\",\"svmax\",\"lvmax\",\"dvmax\",\"cqw\",\"cqh\",\"cqi\",\"cqb\",\"cqmin\",\"cqmax\"],Zl=[\"deg\",\"grad\",\"rad\",\"turn\"],Jl=[\"s\",\"ms\"],ec=[\"hz\",\"khz\"],tc=[\"dpi\",\"dpcm\",\"dppx\",\"x\"],rc=[\"fr\"],nc=[\"db\"],ic=[\"st\"];var ws={};f(ws,{SyntaxError:()=>Vt,generate:()=>Oe,parse:()=>Xe,walk:()=>Zt});function Vt(e,t,r){return Object.assign(De(\"SyntaxError\",e),{input:t,offset:r,rawMessage:e,message:e+`\n  `+t+`\n--`+new Array((r||t.length)+1).join(\"-\")+\"^\"})}var oc=9,sc=10,ac=12,lc=13,cc=32,cs=new Uint8Array(128).map((e,t)=>/[a-zA-Z0-9\\-]/.test(String.fromCharCode(t))?1:0),Qt=class{constructor(t){this.str=t,this.pos=0;}charCodeAt(t){return t<this.str.length?this.str.charCodeAt(t):0}charCode(){return this.charCodeAt(this.pos)}isNameCharCode(t=this.charCode()){return t<128&&cs[t]===1}nextCharCode(){return this.charCodeAt(this.pos+1)}nextNonWsCode(t){return this.charCodeAt(this.findWsEnd(t))}skipWs(){this.pos=this.findWsEnd(this.pos);}findWsEnd(t){for(;t<this.str.length;t++){let r=this.str.charCodeAt(t);if(r!==lc&&r!==sc&&r!==ac&&r!==cc&&r!==oc)break}return t}substringToPos(t){return this.str.substring(this.pos,this.pos=t)}eat(t){this.charCode()!==t&&this.error(\"Expect `\"+String.fromCharCode(t)+\"`\"),this.pos++;}peek(){return this.pos<this.str.length?this.str.charAt(this.pos++):\"\"}error(t){throw new Vt(t,this.str,this.pos)}scanSpaces(){return this.substringToPos(this.findWsEnd(this.pos))}scanWord(){let t=this.pos;for(;t<this.str.length;t++){let r=this.str.charCodeAt(t);if(r>=128||cs[r]===0)break}return this.pos===t&&this.error(\"Expect a keyword\"),this.substringToPos(t)}scanNumber(){let t=this.pos;for(;t<this.str.length;t++){let r=this.str.charCodeAt(t);if(r<48||r>57)break}return this.pos===t&&this.error(\"Expect a number\"),this.substringToPos(t)}scanString(){let t=this.str.indexOf(\"'\",this.pos+1);return t===-1&&(this.pos=this.str.length,this.error(\"Expect an apostrophe\")),this.substringToPos(t+1)}};var uc=9,pc=10,hc=12,mc=13,dc=32,bs=33,Fr=35,us=38,Xt=39,xs=40,fc=41,ys=42,Mr=43,Br=44,ps=45,_r=60,Or=62,Rr=63,gc=64,ft=91,gt=93,$t=123,hs=124,ms=125,ds=8734,fs={\" \":1,\"&&\":2,\"||\":3,\"|\":4};function gs(e){let t=null,r=null;return e.eat($t),e.skipWs(),t=e.scanNumber(e),e.skipWs(),e.charCode()===Br?(e.pos++,e.skipWs(),e.charCode()!==ms&&(r=e.scanNumber(e),e.skipWs())):r=t,e.eat(ms),{min:Number(t),max:r?Number(r):0}}function bc(e){let t=null,r=false;switch(e.charCode()){case ys:e.pos++,t={min:0,max:0};break;case Mr:e.pos++,t={min:1,max:0};break;case Rr:e.pos++,t={min:0,max:1};break;case Fr:e.pos++,r=true,e.charCode()===$t?t=gs(e):e.charCode()===Rr?(e.pos++,t={min:0,max:0}):t={min:1,max:0};break;case $t:t=gs(e);break;default:return null}return {type:\"Multiplier\",comma:r,min:t.min,max:t.max,term:null}}function Ae(e,t){let r=bc(e);return r!==null?(r.term=t,e.charCode()===Fr&&e.charCodeAt(e.pos-1)===Mr?Ae(e,r):r):t}function Nr(e){let t=e.peek();return t===\"\"?null:Ae(e,{type:\"Token\",value:t})}function xc(e){let t;return e.eat(_r),e.eat(Xt),t=e.scanWord(),e.eat(Xt),e.eat(Or),Ae(e,{type:\"Property\",name:t})}function yc(e){let t=null,r=null,n=1;return e.eat(ft),e.charCode()===ps&&(e.peek(),n=-1),n==-1&&e.charCode()===ds?e.peek():(t=n*Number(e.scanNumber(e)),e.isNameCharCode()&&(t+=e.scanWord())),e.skipWs(),e.eat(Br),e.skipWs(),e.charCode()===ds?e.peek():(n=1,e.charCode()===ps&&(e.peek(),n=-1),r=n*Number(e.scanNumber(e)),e.isNameCharCode()&&(r+=e.scanWord())),e.eat(gt),{type:\"Range\",min:t,max:r}}function kc(e){let t,r=null;if(e.eat(_r),t=e.scanWord(),t===\"boolean-expr\"){e.eat(ft);let n=Wr(e,gt);return e.eat(gt),e.eat(Or),Ae(e,{type:\"Boolean\",term:n.terms.length===1?n.terms[0]:n})}return e.charCode()===xs&&e.nextCharCode()===fc&&(e.pos+=2,t+=\"()\"),e.charCodeAt(e.findWsEnd(e.pos))===ft&&(e.skipWs(),r=yc(e)),e.eat(Or),Ae(e,{type:\"Type\",name:t,opts:r})}function wc(e){let t=e.scanWord();return e.charCode()===xs?(e.pos++,{type:\"Function\",name:t}):Ae(e,{type:\"Keyword\",name:t})}function vc(e,t){function r(i,o){return {type:\"Group\",terms:i,combinator:o,disallowEmpty:false,explicit:false}}let n;for(t=Object.keys(t).sort((i,o)=>fs[i]-fs[o]);t.length>0;){n=t.shift();let i=0,o=0;for(;i<e.length;i++){let s=e[i];s.type===\"Combinator\"&&(s.value===n?(o===-1&&(o=i-1),e.splice(i,1),i--):(o!==-1&&i-o>1&&(e.splice(o,i-o,r(e.slice(o,i),n)),i=o+1),o=-1));}o!==-1&&t.length&&e.splice(o,i-o,r(e.slice(o,i),n));}return n}function Wr(e,t){let r=Object.create(null),n=[],i,o=null,s=e.pos;for(;e.charCode()!==t&&(i=Cc(e,t));)i.type!==\"Spaces\"&&(i.type===\"Combinator\"?((o===null||o.type===\"Combinator\")&&(e.pos=s,e.error(\"Unexpected combinator\")),r[i.value]=true):o!==null&&o.type!==\"Combinator\"&&(r[\" \"]=true,n.push({type:\"Combinator\",value:\" \"})),n.push(i),o=i,s=e.pos);return o!==null&&o.type===\"Combinator\"&&(e.pos-=s,e.error(\"Unexpected combinator\")),{type:\"Group\",terms:n,combinator:vc(n,r)||\" \",disallowEmpty:false,explicit:false}}function Sc(e,t){let r;return e.eat(ft),r=Wr(e,t),e.eat(gt),r.explicit=true,e.charCode()===bs&&(e.pos++,r.disallowEmpty=true),r}function Cc(e,t){let r=e.charCode();switch(r){case gt:break;case ft:return Ae(e,Sc(e,t));case _r:return e.nextCharCode()===Xt?xc(e):kc(e);case hs:return {type:\"Combinator\",value:e.substringToPos(e.pos+(e.nextCharCode()===hs?2:1))};case us:return e.pos++,e.eat(us),{type:\"Combinator\",value:\"&&\"};case Br:return e.pos++,{type:\"Comma\"};case Xt:return Ae(e,{type:\"String\",value:e.scanString()});case dc:case uc:case pc:case mc:case hc:return {type:\"Spaces\",value:e.scanSpaces()};case gc:return r=e.nextCharCode(),e.isNameCharCode(r)?(e.pos++,{type:\"AtKeyword\",name:e.scanWord()}):Nr(e);case ys:case Mr:case Rr:case Fr:case bs:break;case $t:if(r=e.nextCharCode(),r<48||r>57)return Nr(e);break;default:return e.isNameCharCode(r)?wc(e):Nr(e)}}function Xe(e){let t=new Qt(e),r=Wr(t);return t.pos!==e.length&&t.error(\"Unexpected input\"),r.terms.length===1&&r.terms[0].type===\"Group\"?r.terms[0]:r}var bt=function(){};function ks(e){return typeof e==\"function\"?e:bt}function Zt(e,t,r){function n(s){switch(i.call(r,s),s.type){case \"Group\":s.terms.forEach(n);break;case \"Multiplier\":case \"Boolean\":n(s.term);break;case \"Type\":case \"Property\":case \"Keyword\":case \"AtKeyword\":case \"Function\":case \"String\":case \"Token\":case \"Comma\":break;default:throw new Error(\"Unknown type: \"+s.type)}o.call(r,s);}let i=bt,o=bt;if(typeof t==\"function\"?i=t:t&&(i=ks(t.enter),o=ks(t.leave)),i===bt&&o===bt)throw new Error(\"Neither `enter` nor `leave` walker handler is set or both aren't a function\");n(e);}var Tc={decorator(e){let t=[],r=null;return {...e,node(n){let i=r;r=n,e.node.call(this,n),r=i;},emit(n,i,o){t.push({type:i,value:n,node:o?null:r});},result(){return t}}}};function Ac(e){let t=[];return Ce(e,(r,n,i)=>t.push({type:r,value:e.slice(n,i),node:null})),t}function vs(e,t){return typeof e==\"string\"?Ac(e):t.generate(e,Tc)}var C={type:\"Match\"},E={type:\"Mismatch\"},Jt={type:\"DisallowEmpty\"},Lc=40,Ec=41;function Q(e,t,r){return t===C&&r===E||e===C&&t===C&&r===C?e:(e.type===\"If\"&&e.else===E&&t===C&&(t=e.then,e=e.match),{type:\"If\",match:e,then:t,else:r})}function Cs(e){return e.length>2&&e.charCodeAt(e.length-2)===Lc&&e.charCodeAt(e.length-1)===Ec}function Ss(e){return e.type===\"Keyword\"||e.type===\"AtKeyword\"||e.type===\"Function\"||e.type===\"Type\"&&Cs(e.name)}function Le(e,t=\" \",r=false){return {type:\"Group\",terms:e,combinator:t,disallowEmpty:false,explicit:r}}function xt(e,t,r=new Set){if(!r.has(e))switch(r.add(e),e.type){case \"If\":e.match=xt(e.match,t,r),e.then=xt(e.then,t,r),e.else=xt(e.else,t,r);break;case \"Type\":return t[e.name]||e}return e}function qr(e,t,r){switch(e){case \" \":{let n=C;for(let i=t.length-1;i>=0;i--){let o=t[i];n=Q(o,n,E);}return n}case \"|\":{let n=E,i=null;for(let o=t.length-1;o>=0;o--){let s=t[o];if(Ss(s)&&(i===null&&o>0&&Ss(t[o-1])&&(i=Object.create(null),n=Q({type:\"Enum\",map:i},C,n)),i!==null)){let u=(Cs(s.name)?s.name.slice(0,-1):s.name).toLowerCase();if(!(u in i)){i[u]=s;continue}}i=null,n=Q(s,C,n);}return n}case \"&&\":{if(t.length>5)return {type:\"MatchOnce\",terms:t,all:true};let n=E;for(let i=t.length-1;i>=0;i--){let o=t[i],s;t.length>1?s=qr(e,t.filter(function(u){return u!==o}),false):s=C,n=Q(o,s,n);}return n}case \"||\":{if(t.length>5)return {type:\"MatchOnce\",terms:t,all:false};let n=r?C:E;for(let i=t.length-1;i>=0;i--){let o=t[i],s;t.length>1?s=qr(e,t.filter(function(u){return u!==o}),true):s=C,n=Q(o,s,n);}return n}}}function zc(e){let t=C,r=$e(e.term);if(e.max===0)r=Q(r,Jt,E),t=Q(r,null,E),t.then=Q(C,C,t),e.comma&&(t.then.else=Q({type:\"Comma\",syntax:e},t,E));else for(let n=e.min||1;n<=e.max;n++)e.comma&&t!==C&&(t=Q({type:\"Comma\",syntax:e},t,E)),t=Q(r,Q(C,C,t),E);if(e.min===0)t=Q(C,C,t);else for(let n=0;n<e.min-1;n++)e.comma&&t!==C&&(t=Q({type:\"Comma\",syntax:e},t,E)),t=Q(r,t,E);return t}function $e(e){if(typeof e==\"function\")return {type:\"Generic\",fn:e};switch(e.type){case \"Group\":{let t=qr(e.combinator,e.terms.map($e),false);return e.disallowEmpty&&(t=Q(t,Jt,E)),t}case \"Multiplier\":return zc(e);case \"Boolean\":{let t=$e(e.term),r=$e(Le([Le([{type:\"Keyword\",name:\"not\"},{type:\"Type\",name:\"!boolean-group\"}]),Le([{type:\"Type\",name:\"!boolean-group\"},Le([{type:\"Multiplier\",comma:false,min:0,max:0,term:Le([{type:\"Keyword\",name:\"and\"},{type:\"Type\",name:\"!boolean-group\"}])},{type:\"Multiplier\",comma:false,min:0,max:0,term:Le([{type:\"Keyword\",name:\"or\"},{type:\"Type\",name:\"!boolean-group\"}])}],\"|\")])],\"|\")),n=$e(Le([{type:\"Type\",name:\"!term\"},Le([{type:\"Token\",value:\"(\"},{type:\"Type\",name:\"!self\"},{type:\"Token\",value:\")\"}]),{type:\"Type\",name:\"general-enclosed\"}],\"|\"));return xt(n,{\"!term\":t,\"!self\":r}),xt(r,{\"!boolean-group\":n}),r}case \"Type\":case \"Property\":return {type:e.type,name:e.name,syntax:e};case \"Keyword\":return {type:e.type,name:e.name.toLowerCase(),syntax:e};case \"AtKeyword\":return {type:e.type,name:\"@\"+e.name.toLowerCase(),syntax:e};case \"Function\":return {type:e.type,name:e.name.toLowerCase()+\"(\",syntax:e};case \"String\":return e.value.length===3?{type:\"Token\",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\\\'/g,\"'\"),syntax:e};case \"Token\":return {type:e.type,value:e.value,syntax:e};case \"Comma\":return {type:e.type,syntax:e};default:throw new Error(\"Unknown node type:\",e.type)}}function yt(e,t){return typeof e==\"string\"&&(e=Xe(e)),{type:\"MatchGraph\",match:$e(e),syntax:t||null,source:e}}var {hasOwnProperty:Ts}=Object.prototype,Pc=0,Ic=1,Ur=2,Ps=3,As=\"Match\",Dc=\"Mismatch\",Nc=\"Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)\",Ls=15e3;function Rc(e){let t=null,r=null,n=e;for(;n!==null;)r=n.prev,n.prev=t,t=n,n=r;return t}function jr(e,t){if(e.length!==t.length)return  false;for(let r=0;r<e.length;r++){let n=t.charCodeAt(r),i=e.charCodeAt(r);if(i>=65&&i<=90&&(i=i|32),i!==n)return  false}return  true}function Fc(e){return e.type!==9?false:e.value!==\"?\"}function Es(e){return e===null?true:e.type===18||e.type===2||e.type===21||e.type===19||e.type===23||Fc(e)}function zs(e){return e===null?true:e.type===22||e.type===20||e.type===24||e.type===9&&e.value===\"/\"}function Mc(e,t,r){function n(){do T++,w=T<e.length?e[T]:null;while(w!==null&&(w.type===13||w.type===25))}function i(oe){let ge=T+oe;return ge<e.length?e[ge]:null}function o(oe,ge){return {nextState:oe,matchStack:z,syntaxStack:p,thenStack:h,tokenIndex:T,prev:ge}}function s(oe){h={nextState:oe,matchStack:z,syntaxStack:p,prev:h};}function u(oe){d=o(oe,d);}function c(){z={type:Ic,syntax:t.syntax,token:w,prev:z},n(),g=null,T>he&&(he=T);}function a(){p={syntax:t.syntax,opts:t.syntax.opts||p!==null&&p.opts||null,prev:p},z={type:Ur,syntax:t.syntax,token:z.token,prev:z};}function l(){z.type===Ur?z=z.prev:z={type:Ps,syntax:p.syntax,token:z.token,prev:z},p=p.prev;}let p=null,h=null,d=null,g=null,ee=0,j=null,w=null,T=-1,he=0,z={type:Pc,syntax:null,token:null,prev:null};for(n();j===null&&++ee<Ls;)switch(t.type){case \"Match\":if(h===null){if(w!==null&&(T!==e.length-1||w.value!==\"\\\\0\"&&w.value!==\"\\\\9\")){t=E;break}j=As;break}if(t=h.nextState,t===Jt)if(h.matchStack===z){t=E;break}else t=C;for(;h.syntaxStack!==p;)l();h=h.prev;break;case \"Mismatch\":if(g!==null&&g!==false)(d===null||T>d.tokenIndex)&&(d=g,g=false);else if(d===null){j=Dc;break}t=d.nextState,h=d.thenStack,p=d.syntaxStack,z=d.matchStack,T=d.tokenIndex,w=T<e.length?e[T]:null,d=d.prev;break;case \"MatchGraph\":t=t.match;break;case \"If\":t.else!==E&&u(t.else),t.then!==C&&s(t.then),t=t.match;break;case \"MatchOnce\":t={type:\"MatchOnceBuffer\",syntax:t,index:0,mask:0};break;case \"MatchOnceBuffer\":{let q=t.syntax.terms;if(t.index===q.length){if(t.mask===0||t.syntax.all){t=E;break}t=C;break}if(t.mask===(1<<q.length)-1){t=C;break}for(;t.index<q.length;t.index++){let U=1<<t.index;if(!(t.mask&U)){u(t),s({type:\"AddMatchOnce\",syntax:t.syntax,mask:t.mask|U}),t=q[t.index++];break}}break}case \"AddMatchOnce\":t={type:\"MatchOnceBuffer\",syntax:t.syntax,index:0,mask:t.mask};break;case \"Enum\":if(w!==null){let q=w.value.toLowerCase();if(q.indexOf(\"\\\\\")!==-1&&(q=q.replace(/\\\\[09].*$/,\"\")),Ts.call(t.map,q)){t=t.map[q];break}}t=E;break;case \"Generic\":{let q=p!==null?p.opts:null,U=T+Math.floor(t.fn(w,i,q));if(!isNaN(U)&&U>T){for(;T<U;)c();t=C;}else t=E;break}case \"Type\":case \"Property\":{let q=t.type===\"Type\"?\"types\":\"properties\",U=Ts.call(r,q)?r[q][t.name]:null;if(!U||!U.match)throw new Error(\"Bad syntax reference: \"+(t.type===\"Type\"?\"<\"+t.name+\">\":\"<'\"+t.name+\"'>\"));if(g!==false&&w!==null&&t.type===\"Type\"&&(t.name===\"custom-ident\"&&w.type===1||t.name===\"length\"&&w.value===\"0\")){g===null&&(g=o(t,d)),t=E;break}a(),t=U.matchRef||U.match;break}case \"Keyword\":{let q=t.name;if(w!==null){let U=w.value;if(U.indexOf(\"\\\\\")!==-1&&(U=U.replace(/\\\\[09].*$/,\"\")),jr(U,q)){c(),t=C;break}}t=E;break}case \"AtKeyword\":case \"Function\":if(w!==null&&jr(w.value,t.name)){c(),t=C;break}t=E;break;case \"Token\":if(w!==null&&w.value===t.value){c(),t=C;break}t=E;break;case \"Comma\":w!==null&&w.type===18?Es(z.token)?t=E:(c(),t=zs(w)?E:C):t=Es(z.token)||zs(w)?C:E;break;case \"String\":let oe=\"\",ge=T;for(;ge<e.length&&oe.length<t.value.length;ge++)oe+=e[ge].value;if(jr(oe,t.value)){for(;T<ge;)c();t=C;}else t=E;break;default:throw new Error(\"Unknown node type: \"+t.type)}switch(j){case null:console.warn(\"[csstree-match] BREAK after \"+Ls+\" iterations\"),j=Nc,z=null;break;case As:for(;p!==null;)l();break;default:z=null;}return {tokens:e,reason:j,iterations:ee,match:z,longestMatch:he}}function Hr(e,t,r){let n=Mc(e,t,r||{});if(n.match===null)return n;let i=n.match,o=n.match={syntax:t.syntax||null,match:[]},s=[o];for(i=Rc(i).prev;i!==null;){switch(i.type){case Ur:o.match.push(o={syntax:i.syntax,match:[]}),s.push(o);break;case Ps:s.pop(),o=s[s.length-1];break;default:o.match.push({syntax:i.syntax||null,token:i.token.value,node:i.token.node});}i=i.prev;}return n}var Yr={};f(Yr,{getTrace:()=>Is,isKeyword:()=>Wc,isProperty:()=>_c,isType:()=>Bc});function Is(e){function t(i){return i===null?false:i.type===\"Type\"||i.type===\"Property\"||i.type===\"Keyword\"}function r(i){if(Array.isArray(i.match)){for(let o=0;o<i.match.length;o++)if(r(i.match[o]))return t(i.syntax)&&n.unshift(i.syntax),true}else if(i.node===e)return n=t(i.syntax)?[i.syntax]:[],true;return  false}let n=null;return this.matched!==null&&r(this.matched),n}function Bc(e,t){return Gr(this,e,r=>r.type===\"Type\"&&r.name===t)}function _c(e,t){return Gr(this,e,r=>r.type===\"Property\"&&r.name===t)}function Wc(e){return Gr(this,e,t=>t.type===\"Keyword\")}function Gr(e,t,r){let n=Is.call(e,t);return n===null?false:n.some(r)}function Ds(e){return \"node\"in e?e.node:Ds(e.match[0])}function Ns(e){return \"node\"in e?e.node:Ns(e.match[e.match.length-1])}function Kr(e,t,r,n,i){function o(u){if(u.syntax!==null&&u.syntax.type===n&&u.syntax.name===i){let c=Ds(u),a=Ns(u);e.syntax.walk(t,function(l,p,h){if(l===c){let d=new V;do{if(d.appendData(p.data),p.data===a)break;p=p.next;}while(p!==null);s.push({parent:h,nodes:d});}});}Array.isArray(u.match)&&u.match.forEach(o);}let s=[];return r.matched!==null&&o(r.matched),s}var{hasOwnProperty:kt}=Object.prototype;function Vr(e){return typeof e==\"number\"&&isFinite(e)&&Math.floor(e)===e&&e>=0}function Os(e){return !!e&&Vr(e.offset)&&Vr(e.line)&&Vr(e.column)}function qc(e,t){return function(n,i){if(!n||n.constructor!==Object)return i(n,\"Type of node should be an Object\");for(let o in n){let s=true;if(kt.call(n,o)!==false){if(o===\"type\")n.type!==e&&i(n,\"Wrong node type `\"+n.type+\"`, expected `\"+e+\"`\");else if(o===\"loc\"){if(n.loc===null)continue;if(n.loc&&n.loc.constructor===Object)if(typeof n.loc.source!=\"string\")o+=\".source\";else if(!Os(n.loc.start))o+=\".start\";else if(!Os(n.loc.end))o+=\".end\";else continue;s=false;}else if(t.hasOwnProperty(o)){s=false;for(let u=0;!s&&u<t[o].length;u++){let c=t[o][u];switch(c){case String:s=typeof n[o]==\"string\";break;case Boolean:s=typeof n[o]==\"boolean\";break;case null:s=n[o]===null;break;default:typeof c==\"string\"?s=n[o]&&n[o].type===c:Array.isArray(c)&&(s=n[o]instanceof V);}}}else i(n,\"Unknown field `\"+o+\"` for \"+e+\" node type\");s||i(n,\"Bad value for `\"+e+\".\"+o+\"`\");}}for(let o in t)kt.call(t,o)&&kt.call(n,o)===false&&i(n,\"Field `\"+e+\".\"+o+\"` is missed\");}}function Rs(e,t){let r=[];for(let n=0;n<e.length;n++){let i=e[n];if(i===String||i===Boolean)r.push(i.name.toLowerCase());else if(i===null)r.push(\"null\");else if(typeof i==\"string\")r.push(i);else if(Array.isArray(i))r.push(\"List<\"+(Rs(i,t)||\"any\")+\">\");else throw new Error(\"Wrong value `\"+i+\"` in `\"+t+\"` structure definition\")}return r.join(\" | \")}function jc(e,t){let r=t.structure,n={type:String,loc:true},i={type:'\"'+e+'\"'};for(let o in r){if(kt.call(r,o)===false)continue;let s=n[o]=Array.isArray(r[o])?r[o].slice():[r[o]];i[o]=Rs(s,e+\".\"+o);}return {docs:i,check:qc(e,n)}}function Fs(e){let t={};if(e.node){for(let r in e.node)if(kt.call(e.node,r)){let n=e.node[r];if(n.structure)t[r]=jc(r,n);else throw new Error(\"Missed `structure` field in `\"+r+\"` node type definition\")}}return t}function Qr(e,t,r){let n={};for(let i in e)e[i].syntax&&(n[i]=r?e[i].syntax:Oe(e[i].syntax,{compact:t}));return n}function Uc(e,t,r){let n={};for(let[i,o]of Object.entries(e))n[i]={prelude:o.prelude&&(r?o.prelude.syntax:Oe(o.prelude.syntax,{compact:t})),descriptors:o.descriptors&&Qr(o.descriptors,t,r)};return n}function Hc(e){for(let t=0;t<e.length;t++)if(e[t].value.toLowerCase()===\"var(\")return  true;return  false}function Gc(e){let t=e.terms[0];return e.explicit===false&&e.terms.length===1&&t.type===\"Multiplier\"&&t.comma===true}function pe(e,t,r){return {matched:e,iterations:r,error:t,...Yr}}function Ze(e,t,r,n){let i=vs(r,e.syntax),o;return Hc(i)?pe(null,new Error(\"Matching for a tree with var() is not supported\")):(n&&(o=Hr(i,e.cssWideKeywordsSyntax,e)),(!n||!o.match)&&(o=Hr(i,t.match,e),!o.match)?pe(null,new es(o.reason,t.syntax,r,o),o.iterations):pe(o.match,null,o.iterations))}var Je=class{constructor(t,r,n){if(this.cssWideKeywords=Ve,this.syntax=r,this.generic=false,this.units={...Kt},this.atrules=Object.create(null),this.properties=Object.create(null),this.types=Object.create(null),this.structure=n||Fs(t),t){if(t.cssWideKeywords&&(this.cssWideKeywords=t.cssWideKeywords),t.units)for(let i of Object.keys(Kt))Array.isArray(t.units[i])&&(this.units[i]=t.units[i]);if(t.types)for(let[i,o]of Object.entries(t.types))this.addType_(i,o);if(t.generic){this.generic=true;for(let[i,o]of Object.entries(ls(this.units)))this.addType_(i,o);}if(t.atrules)for(let[i,o]of Object.entries(t.atrules))this.addAtrule_(i,o);if(t.properties)for(let[i,o]of Object.entries(t.properties))this.addProperty_(i,o);}this.cssWideKeywordsSyntax=yt(this.cssWideKeywords.join(\" |  \"));}checkStructure(t){function r(o,s){i.push({node:o,message:s});}let n=this.structure,i=[];return this.syntax.walk(t,function(o){n.hasOwnProperty(o.type)?n[o.type].check(o,r):r(o,\"Unknown node type `\"+o.type+\"`\");}),i.length?i:false}createDescriptor(t,r,n,i=null){let o={type:r,name:n},s={type:r,name:n,parent:i,serializable:typeof t==\"string\"||t&&typeof t.type==\"string\",syntax:null,match:null,matchRef:null};return typeof t==\"function\"?s.match=yt(t,o):(typeof t==\"string\"?Object.defineProperty(s,\"syntax\",{get(){return Object.defineProperty(s,\"syntax\",{value:Xe(t)}),s.syntax}}):s.syntax=t,Object.defineProperty(s,\"match\",{get(){return Object.defineProperty(s,\"match\",{value:yt(s.syntax,o)}),s.match}}),r===\"Property\"&&Object.defineProperty(s,\"matchRef\",{get(){let u=s.syntax,c=Gc(u)?yt({...u,terms:[u.terms[0].term]},o):null;return Object.defineProperty(s,\"matchRef\",{value:c}),c}})),s}addAtrule_(t,r){r&&(this.atrules[t]={type:\"Atrule\",name:t,prelude:r.prelude?this.createDescriptor(r.prelude,\"AtrulePrelude\",t):null,descriptors:r.descriptors?Object.keys(r.descriptors).reduce((n,i)=>(n[i]=this.createDescriptor(r.descriptors[i],\"AtruleDescriptor\",i,t),n),Object.create(null)):null});}addProperty_(t,r){r&&(this.properties[t]=this.createDescriptor(r,\"Property\",t));}addType_(t,r){r&&(this.types[t]=this.createDescriptor(r,\"Type\",t));}checkAtruleName(t){if(!this.getAtrule(t))return new Ye(\"Unknown at-rule\",\"@\"+t)}checkAtrulePrelude(t,r){let n=this.checkAtruleName(t);if(n)return n;let i=this.getAtrule(t);if(!i.prelude&&r)return new SyntaxError(\"At-rule `@\"+t+\"` should not contain a prelude\");if(i.prelude&&!r&&!Ze(this,i.prelude,\"\",false).matched)return new SyntaxError(\"At-rule `@\"+t+\"` should contain a prelude\")}checkAtruleDescriptorName(t,r){let n=this.checkAtruleName(t);if(n)return n;let i=this.getAtrule(t),o=Ut(r);if(!i.descriptors)return new SyntaxError(\"At-rule `@\"+t+\"` has no known descriptors\");if(!i.descriptors[o.name]&&!i.descriptors[o.basename])return new Ye(\"Unknown at-rule descriptor\",r)}checkPropertyName(t){if(!this.getProperty(t))return new Ye(\"Unknown property\",t)}matchAtrulePrelude(t,r){let n=this.checkAtrulePrelude(t,r);if(n)return pe(null,n);let i=this.getAtrule(t);return i.prelude?Ze(this,i.prelude,r||\"\",false):pe(null,null)}matchAtruleDescriptor(t,r,n){let i=this.checkAtruleDescriptorName(t,r);if(i)return pe(null,i);let o=this.getAtrule(t),s=Ut(r);return Ze(this,o.descriptors[s.name]||o.descriptors[s.basename],n,false)}matchDeclaration(t){return t.type!==\"Declaration\"?pe(null,new Error(\"Not a Declaration node\")):this.matchProperty(t.property,t.value)}matchProperty(t,r){if(Cr(t).custom)return pe(null,new Error(\"Lexer matching doesn't applicable for custom properties\"));let n=this.checkPropertyName(t);return n?pe(null,n):Ze(this,this.getProperty(t),r,true)}matchType(t,r){let n=this.getType(t);return n?Ze(this,n,r,false):pe(null,new Ye(\"Unknown type\",t))}match(t,r){return typeof t!=\"string\"&&(!t||!t.type)?pe(null,new Ye(\"Bad syntax\")):((typeof t==\"string\"||!t.match)&&(t=this.createDescriptor(t,\"Type\",\"anonymous\")),Ze(this,t,r,false))}findValueFragments(t,r,n,i){return Kr(this,r,this.matchProperty(t,r),n,i)}findDeclarationValueFragments(t,r,n){return Kr(this,t.value,this.matchDeclaration(t),r,n)}findAllFragments(t,r,n){let i=[];return this.syntax.walk(t,{visit:\"Declaration\",enter:o=>{i.push.apply(i,this.findDeclarationValueFragments(o,r,n));}}),i}getAtrule(t,r=true){let n=Ut(t);return (n.vendor&&r?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null}getAtrulePrelude(t,r=true){let n=this.getAtrule(t,r);return n&&n.prelude||null}getAtruleDescriptor(t,r){return this.atrules.hasOwnProperty(t)&&this.atrules.declarators&&this.atrules[t].declarators[r]||null}getProperty(t,r=true){let n=Cr(t);return (n.vendor&&r?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null}getType(t){return hasOwnProperty.call(this.types,t)?this.types[t]:null}validate(){function t(c,a){return a?`<${c}>`:`<'${c}'>`}function r(c,a,l,p){if(l.has(a))return l.get(a);l.set(a,false),p.syntax!==null&&Zt(p.syntax,function(h){if(h.type!==\"Type\"&&h.type!==\"Property\")return;let d=h.type===\"Type\"?c.types:c.properties,g=h.type===\"Type\"?i:o;hasOwnProperty.call(d,h.name)?r(c,h.name,g,d[h.name])&&(n.push(`${t(a,l===i)} used broken syntax definition ${t(h.name,h.type===\"Type\")}`),l.set(a,true)):(n.push(`${t(a,l===i)} used missed syntax definition ${t(h.name,h.type===\"Type\")}`),l.set(a,true));},this);}let n=[],i=new Map,o=new Map;for(let c in this.types)r(this,c,i,this.types[c]);for(let c in this.properties)r(this,c,o,this.properties[c]);let s=[...i.keys()].filter(c=>i.get(c)),u=[...o.keys()].filter(c=>o.get(c));return s.length||u.length?{errors:n,types:s,properties:u}:null}dump(t,r){return {generic:this.generic,cssWideKeywords:this.cssWideKeywords,units:this.units,types:Qr(this.types,!r,t),properties:Qr(this.properties,!r,t),atrules:Uc(this.atrules,!r,t)}}toString(){return JSON.stringify(this.dump())}};function Xr(e,t){return typeof t==\"string\"&&/^\\s*\\|/.test(t)?typeof e==\"string\"?e+t:t.replace(/^\\s*\\|\\s*/,\"\"):t||null}function Yc(e,t){let r=Object.create(null);for(let n of Object.keys(e))t.includes(n)&&(r[n]=e[n]);return r}function $r(e,t,r){let n={...e};for(let[i,o]of Object.entries(t))n[i]={...n[i],...r?Yc(o,r):o};return n}function wt(e,t){let r={...e};for(let[n,i]of Object.entries(t))switch(n){case \"generic\":r[n]=!!i;break;case \"cssWideKeywords\":r[n]=e[n]?[...e[n],...i]:i||[];break;case \"units\":r[n]={...e[n]};for(let[o,s]of Object.entries(i))r[n][o]=Array.isArray(s)?s:[];break;case \"atrules\":r[n]={...e[n]};for(let[o,s]of Object.entries(i)){let u=r[n][o]||{},c=r[n][o]={prelude:u.prelude||null,descriptors:{...u.descriptors}};if(s){c.prelude=s.prelude?Xr(c.prelude,s.prelude):c.prelude||null;for(let[a,l]of Object.entries(s.descriptors||{}))c.descriptors[a]=l?Xr(c.descriptors[a],l):null;Object.keys(c.descriptors).length||(c.descriptors=null);}}break;case \"types\":case \"properties\":r[n]={...e[n]};for(let[o,s]of Object.entries(i))r[n][o]=Xr(r[n][o],s);break;case \"parseContext\":r[n]={...e[n],...i};break;case \"scope\":case \"features\":r[n]=$r(e[n],i);break;case \"atrule\":case \"pseudo\":r[n]=$r(e[n],i,[\"parse\"]);break;case \"node\":r[n]=$r(e[n],i,[\"name\",\"structure\",\"parse\",\"generate\",\"walkContext\"]);break}return r}function Ms(e){let t=wo(e),r=Zo(e),n=Yo(e),{fromPlainObject:i,toPlainObject:o}=Ko(r),s={lexer:null,createLexer:u=>new Je(u,s,s.lexer.structure),tokenize:Ce,parse:t,generate:n,walk:r,find:r.find,findLast:r.findLast,findAll:r.findAll,fromPlainObject:i,toPlainObject:o,fork(u){let c=wt({},e);return Ms(typeof u==\"function\"?u(c):wt(c,u))}};return s.lexer=new Je({generic:e.generic,cssWideKeywords:e.cssWideKeywords,units:e.units,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},s),s}var Zr=e=>Ms(wt({},e));var Bs={generic:true,cssWideKeywords:[\"initial\",\"inherit\",\"unset\",\"revert\",\"revert-layer\"],units:{angle:[\"deg\",\"grad\",\"rad\",\"turn\"],decibel:[\"db\"],flex:[\"fr\"],frequency:[\"hz\",\"khz\"],length:[\"cm\",\"mm\",\"q\",\"in\",\"pt\",\"pc\",\"px\",\"em\",\"rem\",\"ex\",\"rex\",\"cap\",\"rcap\",\"ch\",\"rch\",\"ic\",\"ric\",\"lh\",\"rlh\",\"vw\",\"svw\",\"lvw\",\"dvw\",\"vh\",\"svh\",\"lvh\",\"dvh\",\"vi\",\"svi\",\"lvi\",\"dvi\",\"vb\",\"svb\",\"lvb\",\"dvb\",\"vmin\",\"svmin\",\"lvmin\",\"dvmin\",\"vmax\",\"svmax\",\"lvmax\",\"dvmax\",\"cqw\",\"cqh\",\"cqi\",\"cqb\",\"cqmin\",\"cqmax\"],resolution:[\"dpi\",\"dpcm\",\"dppx\",\"x\"],semitones:[\"st\"],time:[\"s\",\"ms\"]},types:{\"abs()\":\"abs( <calc-sum> )\",\"absolute-size\":\"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large\",\"acos()\":\"acos( <calc-sum> )\",\"alpha-value\":\"<number>|<percentage>\",\"an+b\":\"odd|even|<integer>|<n-dimension>|'+'? \\u2020 n|-n|<ndashdigit-dimension>|'+'? \\u2020 <ndashdigit-ident>|<dashndashdigit-ident>|<n-dimension> <signed-integer>|'+'? \\u2020 n <signed-integer>|-n <signed-integer>|<ndash-dimension> <signless-integer>|'+'? \\u2020 n- <signless-integer>|-n- <signless-integer>|<n-dimension> ['+'|'-'] <signless-integer>|'+'? \\u2020 n ['+'|'-'] <signless-integer>|-n ['+'|'-'] <signless-integer>\",\"anchor()\":\"anchor( <anchor-name>?&&<anchor-side> , <length-percentage>? )\",\"anchor-name\":\"<dashed-ident>\",\"anchor-side\":\"inside|outside|top|left|right|bottom|start|end|self-start|self-end|<percentage>|center\",\"anchor-size\":\"width|height|block|inline|self-block|self-inline\",\"anchor-size()\":\"anchor-size( [<anchor-name>||<anchor-size>]? , <length-percentage>? )\",\"angle-percentage\":\"<angle>|<percentage>\",\"angular-color-hint\":\"<angle-percentage>|<zero>\",\"angular-color-stop\":\"<color> <color-stop-angle>?\",\"angular-color-stop-list\":\"<angular-color-stop> , [<angular-color-hint>? , <angular-color-stop>]#?\",\"animateable-feature\":\"scroll-position|contents|<custom-ident>\",\"asin()\":\"asin( <calc-sum> )\",\"atan()\":\"atan( <calc-sum> )\",\"atan2()\":\"atan2( <calc-sum> , <calc-sum> )\",attachment:\"scroll|fixed|local\",\"attr()\":\"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )\",\"attr-matcher\":\"['~'|'|'|'^'|'$'|'*']? '='\",\"attr-modifier\":\"i|s\",\"attribute-selector\":\"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'\",\"auto-repeat\":\"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )\",\"auto-track-list\":\"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?\",axis:\"block|inline|x|y\",\"baseline-position\":\"[first|last]? baseline\",\"basic-shape\":\"<inset()>|<xywh()>|<rect()>|<circle()>|<ellipse()>|<polygon()>|<path()>\",\"basic-shape-rect\":\"<inset()>|<rect()>|<xywh()>\",\"bg-clip\":\"<visual-box>|border-area|text\",\"bg-image\":\"none|<image>\",\"bg-layer\":\"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<visual-box>||<visual-box>\",\"bg-position\":\"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]\",\"bg-size\":\"[<length-percentage>|auto]{1,2}|cover|contain\",\"blend-mode\":\"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity\",\"blur()\":\"blur( <length>? )\",\"brightness()\":\"brightness( [<number>|<percentage>]? )\",\"calc()\":\"calc( <calc-sum> )\",\"calc-constant\":\"e|pi|infinity|-infinity|NaN\",\"calc-product\":\"<calc-value> ['*' <calc-value>|'/' <number>]*\",\"calc-size()\":\"calc-size( <calc-size-basis> , <calc-sum> )\",\"calc-size-basis\":\"<intrinsic-size-keyword>|<calc-size()>|any|<calc-sum>\",\"calc-sum\":\"<calc-product> [['+'|'-'] <calc-product>]*\",\"calc-value\":\"<number>|<dimension>|<percentage>|<calc-constant>|( <calc-sum> )\",\"cf-final-image\":\"<image>|<color>\",\"cf-mixing-image\":\"<percentage>?&&<image>\",\"circle()\":\"circle( <radial-size>? [at <position>]? )\",\"clamp()\":\"clamp( <calc-sum>#{3} )\",\"class-selector\":\"'.' <ident-token>\",\"clip-source\":\"<url>\",color:\"<color-base>|currentColor|<system-color>|<device-cmyk()>|<light-dark()>|<-non-standard-color>\",\"color()\":\"color( <colorspace-params> [/ [<alpha-value>|none]]? )\",\"color-base\":\"<hex-color>|<color-function>|<named-color>|<color-mix()>|transparent\",\"color-function\":\"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hwb()>|<lab()>|<lch()>|<oklab()>|<oklch()>|<color()>\",\"color-interpolation-method\":\"in [<rectangular-color-space>|<polar-color-space> <hue-interpolation-method>?|<custom-color-space>]\",\"color-mix()\":\"color-mix( <color-interpolation-method> , [<color>&&<percentage [0,100]>?]#{2} )\",\"color-stop\":\"<color-stop-length>|<color-stop-angle>\",\"color-stop-angle\":\"[<angle-percentage>|<zero>]{1,2}\",\"color-stop-length\":\"<length-percentage>{1,2}\",\"color-stop-list\":\"<linear-color-stop> , [<linear-color-hint>? , <linear-color-stop>]#?\",\"colorspace-params\":\"[<predefined-rgb-params>|<xyz-params>]\",combinator:\"'>'|'+'|'~'|['|' '|']\",\"common-lig-values\":\"[common-ligatures|no-common-ligatures]\",\"compat-auto\":\"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button\",\"complex-selector\":\"<complex-selector-unit> [<combinator>? <complex-selector-unit>]*\",\"complex-selector-list\":\"<complex-selector>#\",\"composite-style\":\"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor\",\"compositing-operator\":\"add|subtract|intersect|exclude\",\"compound-selector\":\"[<type-selector>? <subclass-selector>*]!\",\"compound-selector-list\":\"<compound-selector>#\",\"conic-gradient()\":\"conic-gradient( [<conic-gradient-syntax>] )\",\"conic-gradient-syntax\":\"[[[from [<angle>|<zero>]]? [at <position>]?]||<color-interpolation-method>]? , <angular-color-stop-list>\",\"container-condition\":\"not <query-in-parens>|<query-in-parens> [[and <query-in-parens>]*|[or <query-in-parens>]*]\",\"container-name\":\"<custom-ident>\",\"container-query\":\"not <query-in-parens>|<query-in-parens> [[and <query-in-parens>]*|[or <query-in-parens>]*]\",\"content-distribution\":\"space-between|space-around|space-evenly|stretch\",\"content-list\":\"[<string>|contents|<image>|<counter>|<quote>|<target>|<leader()>|<attr()>]+\",\"content-position\":\"center|start|end|flex-start|flex-end\",\"content-replacement\":\"<image>\",\"contextual-alt-values\":\"[contextual|no-contextual]\",\"contrast()\":\"contrast( [<number>|<percentage>]? )\",\"coord-box\":\"content-box|padding-box|border-box|fill-box|stroke-box|view-box\",\"cos()\":\"cos( <calc-sum> )\",counter:\"<counter()>|<counters()>\",\"counter()\":\"counter( <counter-name> , <counter-style>? )\",\"counter-name\":\"<custom-ident>\",\"counter-style\":\"<counter-style-name>|symbols( )\",\"counter-style-name\":\"<custom-ident>\",\"counters()\":\"counters( <counter-name> , <string> , <counter-style>? )\",\"cross-fade()\":\"cross-fade( <cf-mixing-image> , <cf-final-image>? )\",\"cubic-bezier()\":\"cubic-bezier( [<number [0,1]> , <number>]#{2} )\",\"cubic-bezier-timing-function\":\"ease|ease-in|ease-out|ease-in-out|<cubic-bezier()>\",\"custom-color-space\":\"<dashed-ident>\",\"custom-params\":\"<dashed-ident> [<number>|<percentage>|none]+\",dasharray:\"[[<length-percentage>|<number>]+]#\",\"dashndashdigit-ident\":\"<ident-token>\",\"deprecated-system-color\":\"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonHighlight|ButtonShadow|CaptionText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText\",\"discretionary-lig-values\":\"[discretionary-ligatures|no-discretionary-ligatures]\",\"display-box\":\"contents|none\",\"display-inside\":\"flow|flow-root|table|flex|grid|ruby\",\"display-internal\":\"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container\",\"display-legacy\":\"inline-block|inline-list-item|inline-table|inline-flex|inline-grid\",\"display-listitem\":\"<display-outside>?&&[flow|flow-root]?&&list-item\",\"display-outside\":\"block|inline|run-in\",\"drop-shadow()\":\"drop-shadow( [<color>?&&<length>{2,3}] )\",\"easing-function\":\"<linear-easing-function>|<cubic-bezier-easing-function>|<step-easing-function>\",\"east-asian-variant-values\":\"[jis78|jis83|jis90|jis04|simplified|traditional]\",\"east-asian-width-values\":\"[full-width|proportional-width]\",\"element()\":\"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )\",\"ellipse()\":\"ellipse( <radial-size>? [at <position>]? )\",\"env()\":\"env( <custom-ident> , <declaration-value>? )\",\"exp()\":\"exp( <calc-sum> )\",\"explicit-track-list\":\"[<line-names>? <track-size>]+ <line-names>?\",\"family-name\":\"<string>|<custom-ident>+\",\"feature-tag-value\":\"<string> [<integer>|on|off]?\",\"feature-type\":\"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation\",\"feature-value-block\":\"<feature-type> '{' <feature-value-declaration-list> '}'\",\"feature-value-block-list\":\"<feature-value-block>+\",\"feature-value-declaration\":\"<custom-ident> : <integer>+ ;\",\"feature-value-declaration-list\":\"<feature-value-declaration>\",\"feature-value-name\":\"<custom-ident>\",\"filter-function\":\"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>\",\"filter-value-list\":\"[<filter-function>|<url>]+\",\"final-bg-layer\":\"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<visual-box>||<visual-box>\",\"fit-content()\":\"fit-content( <length-percentage [0,\\u221E]> )\",\"fixed-breadth\":\"<length-percentage>\",\"fixed-repeat\":\"repeat( [<integer [1,\\u221E]>] , [<line-names>? <fixed-size>]+ <line-names>? )\",\"fixed-size\":\"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )\",\"font-stretch-absolute\":\"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>\",\"font-variant-css21\":\"[normal|small-caps]\",\"font-weight-absolute\":\"normal|bold|<number [1,1000]>\",\"form-control-identifier\":\"select\",\"frequency-percentage\":\"<frequency>|<percentage>\",\"generic-complete\":\"serif|sans-serif|system-ui|cursive|fantasy|math|monospace\",\"general-enclosed\":\"[<function-token> <any-value>? )]|[( <any-value>? )]\",\"generic-family\":\"<generic-script-specific>|<generic-complete>|<generic-incomplete>|<-non-standard-generic-family>\",\"generic-incomplete\":\"ui-serif|ui-sans-serif|ui-monospace|ui-rounded\",\"geometry-box\":\"<shape-box>|fill-box|stroke-box|view-box\",gradient:\"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<repeating-conic-gradient()>|<-legacy-gradient>\",\"grayscale()\":\"grayscale( [<number>|<percentage>]? )\",\"grid-line\":\"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]\",\"historical-lig-values\":\"[historical-ligatures|no-historical-ligatures]\",\"hsl()\":\"hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )|hsl( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"hsla()\":\"hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )|hsla( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",hue:\"<number>|<angle>\",\"hue-interpolation-method\":\"[shorter|longer|increasing|decreasing] hue\",\"hue-rotate()\":\"hue-rotate( [<angle>|<zero>]? )\",\"hwb()\":\"hwb( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"hypot()\":\"hypot( <calc-sum># )\",image:\"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>\",\"image()\":\"image( <image-tags>? [<image-src>? , <color>?]! )\",\"image-set()\":\"image-set( <image-set-option># )\",\"image-set-option\":\"[<image>|<string>] [<resolution>||type( <string> )]\",\"image-src\":\"<url>|<string>\",\"image-tags\":\"ltr|rtl\",\"inflexible-breadth\":\"<length-percentage>|min-content|max-content|auto\",\"inset()\":\"inset( <length-percentage>{1,4} [round <'border-radius'>]? )\",\"invert()\":\"invert( [<number>|<percentage>]? )\",\"keyframe-block\":\"<keyframe-selector># { <declaration-list> }\",\"keyframe-selector\":\"from|to|<percentage [0,100]>|<timeline-range-name> <percentage>\",\"keyframes-name\":\"<custom-ident>|<string>\",\"lab()\":\"lab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"layer()\":\"layer( <layer-name> )\",\"layer-name\":\"<ident> ['.' <ident>]*\",\"lch()\":\"lch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )\",\"leader()\":\"leader( <leader-type> )\",\"leader-type\":\"dotted|solid|space|<string>\",\"length-percentage\":\"<length>|<percentage>\",\"light-dark()\":\"light-dark( <color> , <color> )\",\"line-name-list\":\"[<line-names>|<name-repeat>]+\",\"line-names\":\"'[' <custom-ident>* ']'\",\"line-style\":\"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset\",\"line-width\":\"<length>|thin|medium|thick\",\"linear()\":\"linear( [<number>&&<percentage>{0,2}]# )\",\"linear-color-hint\":\"<length-percentage>\",\"linear-color-stop\":\"<color> <color-stop-length>?\",\"linear-easing-function\":\"linear|<linear()>\",\"linear-gradient()\":\"linear-gradient( [<linear-gradient-syntax>] )\",\"linear-gradient-syntax\":\"[[<angle>|<zero>|to <side-or-corner>]||<color-interpolation-method>]? , <color-stop-list>\",\"log()\":\"log( <calc-sum> , <calc-sum>? )\",\"mask-layer\":\"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>\",\"mask-position\":\"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?\",\"mask-reference\":\"none|<image>|<mask-source>\",\"mask-source\":\"<url>\",\"masking-mode\":\"alpha|luminance|match-source\",\"matrix()\":\"matrix( <number>#{6} )\",\"matrix3d()\":\"matrix3d( <number>#{16} )\",\"max()\":\"max( <calc-sum># )\",\"media-and\":\"<media-in-parens> [and <media-in-parens>]+\",\"media-condition\":\"<media-not>|<media-and>|<media-or>|<media-in-parens>\",\"media-condition-without-or\":\"<media-not>|<media-and>|<media-in-parens>\",\"media-feature\":\"( [<mf-plain>|<mf-boolean>|<mf-range>] )\",\"media-in-parens\":\"( <media-condition> )|<media-feature>|<general-enclosed>\",\"media-not\":\"not <media-in-parens>\",\"media-or\":\"<media-in-parens> [or <media-in-parens>]+\",\"media-query\":\"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?\",\"media-query-list\":\"<media-query>#\",\"media-type\":\"<ident>\",\"mf-boolean\":\"<mf-name>\",\"mf-name\":\"<ident>\",\"mf-plain\":\"<mf-name> : <mf-value>\",\"mf-range\":\"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>\",\"mf-value\":\"<number>|<dimension>|<ident>|<ratio>\",\"min()\":\"min( <calc-sum># )\",\"minmax()\":\"minmax( [<length-percentage>|min-content|max-content|auto] , [<length-percentage>|<flex>|min-content|max-content|auto] )\",\"mod()\":\"mod( <calc-sum> , <calc-sum> )\",\"n-dimension\":\"<dimension-token>\",\"name-repeat\":\"repeat( [<integer [1,\\u221E]>|auto-fill] , <line-names>+ )\",\"named-color\":\"aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen\",\"namespace-prefix\":\"<ident>\",\"ndash-dimension\":\"<dimension-token>\",\"ndashdigit-dimension\":\"<dimension-token>\",\"ndashdigit-ident\":\"<ident-token>\",\"ns-prefix\":\"[<ident-token>|'*']? '|'\",\"number-percentage\":\"<number>|<percentage>\",\"numeric-figure-values\":\"[lining-nums|oldstyle-nums]\",\"numeric-fraction-values\":\"[diagonal-fractions|stacked-fractions]\",\"numeric-spacing-values\":\"[proportional-nums|tabular-nums]\",\"offset-path\":\"<ray()>|<url>|<basic-shape>\",\"oklab()\":\"oklab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"oklch()\":\"oklch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )\",\"opacity()\":\"opacity( [<number>|<percentage>]? )\",\"opacity-value\":\"<number>|<percentage>\",\"outline-line-style\":\"none|dotted|dashed|solid|double|groove|ridge|inset|outset\",\"outline-radius\":\"<length>|<percentage>\",\"overflow-position\":\"unsafe|safe\",\"page-body\":\"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>\",\"page-margin-box\":\"<page-margin-box-type> '{' <declaration-list> '}'\",\"page-margin-box-type\":\"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom\",\"page-selector\":\"<pseudo-page>+|<ident> <pseudo-page>*\",\"page-selector-list\":\"[<page-selector>#]?\",\"page-size\":\"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger\",paint:\"none|<color>|<url> [none|<color>]?|context-fill|context-stroke\",\"paint()\":\"paint( <ident> , <declaration-value>? )\",\"paint-box\":\"<visual-box>|fill-box|stroke-box\",\"palette-identifier\":\"<dashed-ident>\",\"palette-mix()\":\"palette-mix( <color-interpolation-method> , [[normal|light|dark|<palette-identifier>|<palette-mix()>]&&<percentage [0,100]>?]#{2} )\",\"path()\":\"path( <'fill-rule'>? , <string> )\",\"perspective()\":\"perspective( [<length [0,\\u221E]>|none] )\",\"polar-color-space\":\"hsl|hwb|lch|oklch\",\"polygon()\":\"polygon( <'fill-rule'>? , [<length-percentage> <length-percentage>]# )\",position:\"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]\",\"position-area\":\"[[left|center|right|span-left|span-right|x-start|x-end|span-x-start|span-x-end|x-self-start|x-self-end|span-x-self-start|span-x-self-end|span-all]||[top|center|bottom|span-top|span-bottom|y-start|y-end|span-y-start|span-y-end|y-self-start|y-self-end|span-y-self-start|span-y-self-end|span-all]|[block-start|center|block-end|span-block-start|span-block-end|span-all]||[inline-start|center|inline-end|span-inline-start|span-inline-end|span-all]|[self-block-start|center|self-block-end|span-self-block-start|span-self-block-end|span-all]||[self-inline-start|center|self-inline-end|span-self-inline-start|span-self-inline-end|span-all]|[start|center|end|span-start|span-end|span-all]{1,2}|[self-start|center|self-end|span-self-start|span-self-end|span-all]{1,2}]\",\"pow()\":\"pow( <calc-sum> , <calc-sum> )\",\"predefined-rgb\":\"srgb|srgb-linear|display-p3|a98-rgb|prophoto-rgb|rec2020\",\"predefined-rgb-params\":\"<predefined-rgb> [<number>|<percentage>|none]{3}\",\"pseudo-class-selector\":\"':' <ident-token>|':' <function-token> <any-value> ')'\",\"pseudo-element-selector\":\"':' <pseudo-class-selector>|<legacy-pseudo-element-selector>\",\"pseudo-page\":\": [left|right|first|blank]\",\"query-in-parens\":\"( <container-condition> )|( <size-feature> )|style( <style-query> )|<general-enclosed>\",quote:\"open-quote|close-quote|no-open-quote|no-close-quote\",\"radial-extent\":\"closest-corner|closest-side|farthest-corner|farthest-side\",\"radial-gradient()\":\"radial-gradient( [<radial-gradient-syntax>] )\",\"radial-gradient-syntax\":\"[[[<radial-shape>||<radial-size>]? [at <position>]?]||<color-interpolation-method>]? , <color-stop-list>\",\"radial-shape\":\"circle|ellipse\",\"radial-size\":\"<radial-extent>|<length [0,\\u221E]>|<length-percentage [0,\\u221E]>{2}\",ratio:\"<number [0,\\u221E]> [/ <number [0,\\u221E]>]?\",\"ray()\":\"ray( <angle>&&<ray-size>?&&contain?&&[at <position>]? )\",\"ray-size\":\"closest-side|closest-corner|farthest-side|farthest-corner|sides\",\"rect()\":\"rect( [<length-percentage>|auto]{4} [round <'border-radius'>]? )\",\"rectangular-color-space\":\"srgb|srgb-linear|display-p3|a98-rgb|prophoto-rgb|rec2020|lab|oklab|xyz|xyz-d50|xyz-d65\",\"relative-selector\":\"<combinator>? <complex-selector>\",\"relative-selector-list\":\"<relative-selector>#\",\"relative-size\":\"larger|smaller\",\"rem()\":\"rem( <calc-sum> , <calc-sum> )\",\"repeat-style\":\"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}\",\"repeating-conic-gradient()\":\"repeating-conic-gradient( [<conic-gradient-syntax>] )\",\"repeating-linear-gradient()\":\"repeating-linear-gradient( [<linear-gradient-syntax>] )\",\"repeating-radial-gradient()\":\"repeating-radial-gradient( [<radial-gradient-syntax>] )\",\"reversed-counter-name\":\"reversed( <counter-name> )\",\"rgb()\":\"rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )|rgb( [<number>|<percentage>|none]{3} [/ [<alpha-value>|none]]? )\",\"rgba()\":\"rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )|rgba( [<number>|<percentage>|none]{3} [/ [<alpha-value>|none]]? )\",\"rotate()\":\"rotate( [<angle>|<zero>] )\",\"rotate3d()\":\"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )\",\"rotateX()\":\"rotateX( [<angle>|<zero>] )\",\"rotateY()\":\"rotateY( [<angle>|<zero>] )\",\"rotateZ()\":\"rotateZ( [<angle>|<zero>] )\",\"round()\":\"round( <rounding-strategy>? , <calc-sum> , <calc-sum> )\",\"rounding-strategy\":\"nearest|up|down|to-zero\",\"saturate()\":\"saturate( [<number>|<percentage>]? )\",\"scale()\":\"scale( [<number>|<percentage>]#{1,2} )\",\"scale3d()\":\"scale3d( [<number>|<percentage>]#{3} )\",\"scaleX()\":\"scaleX( [<number>|<percentage>] )\",\"scaleY()\":\"scaleY( [<number>|<percentage>] )\",\"scaleZ()\":\"scaleZ( [<number>|<percentage>] )\",\"scope-end\":\"<forgiving-selector-list>\",\"scope-start\":\"<forgiving-selector-list>\",\"scroll()\":\"scroll( [<scroller>||<axis>]? )\",scroller:\"root|nearest|self\",\"scroll-state-feature\":\"<media-query-list>\",\"scroll-state-in-parens\":\"( <scroll-state-query> )|( <scroll-state-feature> )|<general-enclosed>\",\"scroll-state-query\":\"not <scroll-state-in-parens>|<scroll-state-in-parens> [[and <scroll-state-in-parens>]*|[or <scroll-state-in-parens>]*]|<scroll-state-feature>\",\"selector-list\":\"<complex-selector-list>\",\"self-position\":\"center|start|end|self-start|self-end|flex-start|flex-end\",\"sepia()\":\"sepia( [<number>|<percentage>]? )\",shadow:\"inset?&&<length>{2,4}&&<color>?\",\"shadow-t\":\"[<length>{2,3}&&<color>?]\",shape:\"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )\",\"shape-box\":\"<visual-box>|margin-box\",\"side-or-corner\":\"[left|right]||[top|bottom]\",\"sign()\":\"sign( <calc-sum> )\",\"signed-integer\":\"<number-token>\",\"signless-integer\":\"<number-token>\",\"sin()\":\"sin( <calc-sum> )\",\"single-animation\":\"<'animation-duration'>||<easing-function>||<'animation-delay'>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]||<single-animation-timeline>\",\"single-animation-composition\":\"replace|add|accumulate\",\"single-animation-direction\":\"normal|reverse|alternate|alternate-reverse\",\"single-animation-fill-mode\":\"none|forwards|backwards|both\",\"single-animation-iteration-count\":\"infinite|<number>\",\"single-animation-play-state\":\"running|paused\",\"single-animation-timeline\":\"auto|none|<dashed-ident>|<scroll()>|<view()>\",\"single-transition\":\"[none|<single-transition-property>]||<time>||<easing-function>||<time>||<transition-behavior-value>\",\"single-transition-property\":\"all|<custom-ident>\",size:\"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}\",\"size-feature\":\"<mf-plain>|<mf-boolean>|<mf-range>\",\"skew()\":\"skew( [<angle>|<zero>] , [<angle>|<zero>]? )\",\"skewX()\":\"skewX( [<angle>|<zero>] )\",\"skewY()\":\"skewY( [<angle>|<zero>] )\",\"sqrt()\":\"sqrt( <calc-sum> )\",\"step-position\":\"jump-start|jump-end|jump-none|jump-both|start|end\",\"step-easing-function\":\"step-start|step-end|<steps()>\",\"steps()\":\"steps( <integer> , <step-position>? )\",\"style-feature\":\"<declaration>\",\"style-in-parens\":\"( <style-condition> )|( <style-feature> )|<general-enclosed>\",\"style-query\":\"<style-condition>|<style-feature>\",\"subclass-selector\":\"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>\",\"supports-condition\":\"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*\",\"supports-decl\":\"( <declaration> )\",\"supports-feature\":\"<supports-decl>|<supports-selector-fn>\",\"supports-in-parens\":\"( <supports-condition> )|<supports-feature>|<general-enclosed>\",\"supports-selector-fn\":\"selector( <complex-selector> )\",symbol:\"<string>|<image>|<custom-ident>\",\"symbols()\":\"symbols( <symbols-type>? [<string>|<image>]+ )\",\"symbols-type\":\"cyclic|numeric|alphabetic|symbolic|fixed\",\"system-color\":\"AccentColor|AccentColorText|ActiveText|ButtonBorder|ButtonFace|ButtonText|Canvas|CanvasText|Field|FieldText|GrayText|Highlight|HighlightText|LinkText|Mark|MarkText|SelectedItem|SelectedItemText|VisitedText\",\"tan()\":\"tan( <calc-sum> )\",target:\"<target-counter()>|<target-counters()>|<target-text()>\",\"target-counter()\":\"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )\",\"target-counters()\":\"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )\",\"target-text()\":\"target-text( [<string>|<url>] , [content|before|after|first-letter]? )\",\"text-edge\":\"[text|cap|ex|ideographic|ideographic-ink] [text|alphabetic|ideographic|ideographic-ink]?\",\"time-percentage\":\"<time>|<percentage>\",\"timeline-range-name\":\"cover|contain|entry|exit|entry-crossing|exit-crossing\",\"track-breadth\":\"<length-percentage>|<flex>|min-content|max-content|auto\",\"track-list\":\"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?\",\"track-repeat\":\"repeat( [<integer [1,\\u221E]>] , [<line-names>? <track-size>]+ <line-names>? )\",\"track-size\":\"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( <length-percentage> )\",\"transform-function\":\"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>\",\"transform-list\":\"<transform-function>+\",\"transition-behavior-value\":\"normal|allow-discrete\",\"translate()\":\"translate( <length-percentage> , <length-percentage>? )\",\"translate3d()\":\"translate3d( <length-percentage> , <length-percentage> , <length> )\",\"translateX()\":\"translateX( <length-percentage> )\",\"translateY()\":\"translateY( <length-percentage> )\",\"translateZ()\":\"translateZ( <length> )\",\"try-size\":\"most-width|most-height|most-block-size|most-inline-size\",\"try-tactic\":\"flip-block||flip-inline||flip-start\",\"type-or-unit\":\"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%\",\"type-selector\":\"<wq-name>|<ns-prefix>? '*'\",\"var()\":\"var( <custom-property-name> , <declaration-value>? )\",\"view()\":\"view( [<axis>||<'view-timeline-inset'>]? )\",\"viewport-length\":\"auto|<length-percentage>\",\"visual-box\":\"content-box|padding-box|border-box\",\"wq-name\":\"<ns-prefix>? <ident-token>\",\"xywh()\":\"xywh( <length-percentage>{2} <length-percentage [0,\\u221E]>{2} [round <'border-radius'>]? )\",xyz:\"xyz|xyz-d50|xyz-d65\",\"xyz-params\":\"<xyz-space> [<number>|<percentage>|none]{3}\",\"-legacy-gradient\":\"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>\",\"-legacy-linear-gradient\":\"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )\",\"-legacy-repeating-linear-gradient\":\"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )\",\"-legacy-linear-gradient-arguments\":\"[<angle>|<side-or-corner>]? , <color-stop-list>\",\"-legacy-radial-gradient\":\"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )\",\"-legacy-repeating-radial-gradient\":\"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )\",\"-legacy-radial-gradient-arguments\":\"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>\",\"-legacy-radial-gradient-size\":\"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover\",\"-legacy-radial-gradient-shape\":\"circle|ellipse\",\"-non-standard-font\":\"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body\",\"-non-standard-color\":\"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text\",\"-non-standard-image-rendering\":\"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast\",\"-non-standard-overflow\":\"overlay|-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable\",\"-non-standard-size\":\"intrinsic|min-intrinsic|-webkit-fill-available|-webkit-fit-content|-webkit-min-content|-webkit-max-content|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content\",\"-webkit-gradient()\":\"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )\",\"-webkit-gradient-color-stop\":\"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )\",\"-webkit-gradient-point\":\"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]\",\"-webkit-gradient-radius\":\"<length>|<percentage>\",\"-webkit-gradient-type\":\"linear|radial\",\"-webkit-mask-box-repeat\":\"repeat|stretch|round\",\"-ms-filter-function-list\":\"<-ms-filter-function>+\",\"-ms-filter-function\":\"<-ms-filter-function-progid>|<-ms-filter-function-legacy>\",\"-ms-filter-function-progid\":\"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]\",\"-ms-filter-function-legacy\":\"<ident-token>|<function-token> <any-value>? )\",age:\"child|young|old\",\"attr-name\":\"<wq-name>\",\"attr-fallback\":\"<any-value>\",bottom:\"<length>|auto\",\"cubic-bezier-easing-function\":\"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )\",\"generic-voice\":\"[<age>? <gender> <integer>?]\",gender:\"male|female|neutral\",\"generic-script-specific\":\"generic( kai )|generic( fangsong )|generic( nastaliq )\",\"-non-standard-generic-family\":\"-apple-system|BlinkMacSystemFont\",\"intrinsic-size-keyword\":\"min-content|max-content|fit-content\",left:\"<length>|auto\",\"device-cmyk()\":\"<legacy-device-cmyk-syntax>|<modern-device-cmyk-syntax>\",\"legacy-device-cmyk-syntax\":\"device-cmyk( <number>#{4} )\",\"modern-device-cmyk-syntax\":\"device-cmyk( <cmyk-component>{4} [/ [<alpha-value>|none]]? )\",\"cmyk-component\":\"<number>|<percentage>|none\",\"color-space\":\"<rectangular-color-space>|<polar-color-space>|<custom-color-space>\",right:\"<length>|auto\",\"forgiving-selector-list\":\"<complex-real-selector-list>\",\"forgiving-relative-selector-list\":\"<relative-real-selector-list>\",\"complex-real-selector-list\":\"<complex-real-selector>#\",\"simple-selector-list\":\"<simple-selector>#\",\"relative-real-selector-list\":\"<relative-real-selector>#\",\"complex-selector-unit\":\"[<compound-selector>? <pseudo-compound-selector>*]!\",\"complex-real-selector\":\"<compound-selector> [<combinator>? <compound-selector>]*\",\"relative-real-selector\":\"<combinator>? <complex-real-selector>\",\"pseudo-compound-selector\":\"<pseudo-element-selector> <pseudo-class-selector>*\",\"simple-selector\":\"<type-selector>|<subclass-selector>\",\"legacy-pseudo-element-selector\":\"':' [before|after|first-line|first-letter]\",\"svg-length\":\"<percentage>|<length>|<number>\",\"svg-writing-mode\":\"lr-tb|rl-tb|tb-rl|lr|rl|tb\",top:\"<length>|auto\",x:\"<number>\",y:\"<number>\",declaration:\"<ident-token> : <declaration-value>? ['!' important]?\",\"declaration-list\":\"[<declaration>? ';']* <declaration>?\",url:\"url( <string> <url-modifier>* )|<url-token>\",\"url-modifier\":\"<ident>|<function-token> <any-value> )\",\"number-zero-one\":\"<number [0,1]>\",\"number-one-or-greater\":\"<number [1,\\u221E]>\",\"xyz-space\":\"xyz|xyz-d50|xyz-d65\",\"style-condition\":\"not <style-in-parens>|<style-in-parens> [[and <style-in-parens>]*|[or <style-in-parens>]*]\",\"-non-standard-display\":\"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box\",\"inset-area\":\"[[left|center|right|span-left|span-right|x-start|x-end|span-x-start|span-x-end|x-self-start|x-self-end|span-x-self-start|span-x-self-end|span-all]||[top|center|bottom|span-top|span-bottom|y-start|y-end|span-y-start|span-y-end|y-self-start|y-self-end|span-y-self-start|span-y-self-end|span-all]|[block-start|center|block-end|span-block-start|span-block-end|span-all]||[inline-start|center|inline-end|span-inline-start|span-inline-end|span-all]|[self-block-start|self-block-end|span-self-block-start|span-self-block-end|span-all]||[self-inline-start|self-inline-end|span-self-inline-start|span-self-inline-end|span-all]|[start|center|end|span-start|span-end|span-all]{1,2}|[self-start|center|self-end|span-self-start|span-self-end|span-all]{1,2}]\",\"font-variant-css2\":\"normal|small-caps\",\"font-width-css3\":\"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded\",\"system-family-name\":\"caption|icon|menu|message-box|small-caption|status-bar\"},properties:{\"--*\":\"<declaration-value>\",\"-ms-accelerator\":\"false|true\",\"-ms-block-progression\":\"tb|rl|bt|lr\",\"-ms-content-zoom-chaining\":\"none|chained\",\"-ms-content-zoom-limit\":\"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>\",\"-ms-content-zoom-limit-max\":\"<percentage>\",\"-ms-content-zoom-limit-min\":\"<percentage>\",\"-ms-content-zoom-snap\":\"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>\",\"-ms-content-zoom-snap-points\":\"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )\",\"-ms-content-zoom-snap-type\":\"none|proximity|mandatory\",\"-ms-content-zooming\":\"none|zoom\",\"-ms-filter\":\"<string>\",\"-ms-flow-from\":\"[none|<custom-ident>]#\",\"-ms-flow-into\":\"[none|<custom-ident>]#\",\"-ms-grid-columns\":\"none|<track-list>|<auto-track-list>\",\"-ms-grid-rows\":\"none|<track-list>|<auto-track-list>\",\"-ms-high-contrast-adjust\":\"auto|none\",\"-ms-hyphenate-limit-chars\":\"auto|<integer>{1,3}\",\"-ms-hyphenate-limit-lines\":\"no-limit|<integer>\",\"-ms-hyphenate-limit-zone\":\"<percentage>|<length>\",\"-ms-ime-align\":\"auto|after\",\"-ms-overflow-style\":\"auto|none|scrollbar|-ms-autohiding-scrollbar\",\"-ms-scroll-chaining\":\"chained|none\",\"-ms-scroll-limit\":\"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>\",\"-ms-scroll-limit-x-max\":\"auto|<length>\",\"-ms-scroll-limit-x-min\":\"<length>\",\"-ms-scroll-limit-y-max\":\"auto|<length>\",\"-ms-scroll-limit-y-min\":\"<length>\",\"-ms-scroll-rails\":\"none|railed\",\"-ms-scroll-snap-points-x\":\"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )\",\"-ms-scroll-snap-points-y\":\"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )\",\"-ms-scroll-snap-type\":\"none|proximity|mandatory\",\"-ms-scroll-snap-x\":\"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>\",\"-ms-scroll-snap-y\":\"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>\",\"-ms-scroll-translation\":\"none|vertical-to-horizontal\",\"-ms-scrollbar-3dlight-color\":\"<color>\",\"-ms-scrollbar-arrow-color\":\"<color>\",\"-ms-scrollbar-base-color\":\"<color>\",\"-ms-scrollbar-darkshadow-color\":\"<color>\",\"-ms-scrollbar-face-color\":\"<color>\",\"-ms-scrollbar-highlight-color\":\"<color>\",\"-ms-scrollbar-shadow-color\":\"<color>\",\"-ms-scrollbar-track-color\":\"<color>\",\"-ms-text-autospace\":\"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space\",\"-ms-touch-select\":\"grippers|none\",\"-ms-user-select\":\"none|element|text\",\"-ms-wrap-flow\":\"auto|both|start|end|maximum|clear\",\"-ms-wrap-margin\":\"<length>\",\"-ms-wrap-through\":\"wrap|none\",\"-moz-appearance\":\"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized\",\"-moz-binding\":\"<url>|none\",\"-moz-border-bottom-colors\":\"<color>+|none\",\"-moz-border-left-colors\":\"<color>+|none\",\"-moz-border-right-colors\":\"<color>+|none\",\"-moz-border-top-colors\":\"<color>+|none\",\"-moz-context-properties\":\"none|[fill|fill-opacity|stroke|stroke-opacity]#\",\"-moz-float-edge\":\"border-box|content-box|margin-box|padding-box\",\"-moz-force-broken-image-icon\":\"0|1\",\"-moz-image-region\":\"<shape>|auto\",\"-moz-orient\":\"inline|block|horizontal|vertical\",\"-moz-outline-radius\":\"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?\",\"-moz-outline-radius-bottomleft\":\"<outline-radius>\",\"-moz-outline-radius-bottomright\":\"<outline-radius>\",\"-moz-outline-radius-topleft\":\"<outline-radius>\",\"-moz-outline-radius-topright\":\"<outline-radius>\",\"-moz-stack-sizing\":\"ignore|stretch-to-fit\",\"-moz-text-blink\":\"none|blink\",\"-moz-user-focus\":\"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none\",\"-moz-user-input\":\"auto|none|enabled|disabled\",\"-moz-user-modify\":\"read-only|read-write|write-only\",\"-moz-window-dragging\":\"drag|no-drag\",\"-moz-window-shadow\":\"default|menu|tooltip|sheet|none\",\"-webkit-appearance\":\"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button\",\"-webkit-border-before\":\"<'border-width'>||<'border-style'>||<color>\",\"-webkit-border-before-color\":\"<color>\",\"-webkit-border-before-style\":\"<'border-style'>\",\"-webkit-border-before-width\":\"<'border-width'>\",\"-webkit-box-reflect\":\"[above|below|right|left]? <length>? <image>?\",\"-webkit-line-clamp\":\"none|<integer>\",\"-webkit-mask\":\"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<visual-box>|border|padding|content|text]||[<visual-box>|border|padding|content]]#\",\"-webkit-mask-attachment\":\"<attachment>#\",\"-webkit-mask-clip\":\"[<coord-box>|no-clip|border|padding|content|text]#\",\"-webkit-mask-composite\":\"<composite-style>#\",\"-webkit-mask-image\":\"<mask-reference>#\",\"-webkit-mask-origin\":\"[<coord-box>|border|padding|content]#\",\"-webkit-mask-position\":\"<position>#\",\"-webkit-mask-position-x\":\"[<length-percentage>|left|center|right]#\",\"-webkit-mask-position-y\":\"[<length-percentage>|top|center|bottom]#\",\"-webkit-mask-repeat\":\"<repeat-style>#\",\"-webkit-mask-repeat-x\":\"repeat|no-repeat|space|round\",\"-webkit-mask-repeat-y\":\"repeat|no-repeat|space|round\",\"-webkit-mask-size\":\"<bg-size>#\",\"-webkit-overflow-scrolling\":\"auto|touch\",\"-webkit-tap-highlight-color\":\"<color>\",\"-webkit-text-fill-color\":\"<color>\",\"-webkit-text-stroke\":\"<length>||<color>\",\"-webkit-text-stroke-color\":\"<color>\",\"-webkit-text-stroke-width\":\"<length>\",\"-webkit-touch-callout\":\"default|none\",\"-webkit-user-modify\":\"read-only|read-write|read-write-plaintext-only\",\"-webkit-user-select\":\"auto|none|text|all\",\"accent-color\":\"auto|<color>\",\"align-content\":\"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>\",\"align-items\":\"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]\",\"align-self\":\"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>\",\"align-tracks\":\"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#\",\"alignment-baseline\":\"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical\",all:\"initial|inherit|unset|revert|revert-layer\",\"anchor-name\":\"none|<dashed-ident>#\",\"anchor-scope\":\"none|all|<dashed-ident>#\",animation:\"<single-animation>#\",\"animation-composition\":\"<single-animation-composition>#\",\"animation-delay\":\"<time>#\",\"animation-direction\":\"<single-animation-direction>#\",\"animation-duration\":\"<time>#\",\"animation-fill-mode\":\"<single-animation-fill-mode>#\",\"animation-iteration-count\":\"<single-animation-iteration-count>#\",\"animation-name\":\"[none|<keyframes-name>]#\",\"animation-play-state\":\"<single-animation-play-state>#\",\"animation-range\":\"[<'animation-range-start'> <'animation-range-end'>?]#\",\"animation-range-end\":\"[normal|<length-percentage>|<timeline-range-name> <length-percentage>?]#\",\"animation-range-start\":\"[normal|<length-percentage>|<timeline-range-name> <length-percentage>?]#\",\"animation-timeline\":\"<single-animation-timeline>#\",\"animation-timing-function\":\"<easing-function>#\",appearance:\"none|auto|textfield|menulist-button|<compat-auto>\",\"aspect-ratio\":\"auto||<ratio>\",\"backdrop-filter\":\"none|<filter-value-list>\",\"backface-visibility\":\"visible|hidden\",background:\"[<bg-layer> ,]* <final-bg-layer>\",\"background-attachment\":\"<attachment>#\",\"background-blend-mode\":\"<blend-mode>#\",\"background-clip\":\"<bg-clip>#\",\"background-color\":\"<color>\",\"background-image\":\"<bg-image>#\",\"background-origin\":\"<visual-box>#\",\"background-position\":\"<bg-position>#\",\"background-position-x\":\"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#\",\"background-position-y\":\"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#\",\"background-repeat\":\"<repeat-style>#\",\"background-size\":\"<bg-size>#\",\"baseline-shift\":\"baseline|sub|super|<svg-length>\",\"block-size\":\"<'width'>\",border:\"<line-width>||<line-style>||<color>\",\"border-block\":\"<'border-block-start'>\",\"border-block-color\":\"<'border-top-color'>{1,2}\",\"border-block-end\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-block-end-color\":\"<'border-top-color'>\",\"border-block-end-style\":\"<'border-top-style'>\",\"border-block-end-width\":\"<'border-top-width'>\",\"border-block-start\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-block-start-color\":\"<'border-top-color'>\",\"border-block-start-style\":\"<'border-top-style'>\",\"border-block-start-width\":\"<'border-top-width'>\",\"border-block-style\":\"<'border-top-style'>{1,2}\",\"border-block-width\":\"<'border-top-width'>{1,2}\",\"border-bottom\":\"<line-width>||<line-style>||<color>\",\"border-bottom-color\":\"<'border-top-color'>\",\"border-bottom-left-radius\":\"<length-percentage>{1,2}\",\"border-bottom-right-radius\":\"<length-percentage>{1,2}\",\"border-bottom-style\":\"<line-style>\",\"border-bottom-width\":\"<line-width>\",\"border-collapse\":\"collapse|separate\",\"border-color\":\"<color>{1,4}\",\"border-end-end-radius\":\"<'border-top-left-radius'>\",\"border-end-start-radius\":\"<'border-top-left-radius'>\",\"border-image\":\"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>\",\"border-image-outset\":\"[<length>|<number>]{1,4}\",\"border-image-repeat\":\"[stretch|repeat|round|space]{1,2}\",\"border-image-slice\":\"<number-percentage>{1,4}&&fill?\",\"border-image-source\":\"none|<image>\",\"border-image-width\":\"[<length-percentage>|<number>|auto]{1,4}\",\"border-inline\":\"<'border-block-start'>\",\"border-inline-color\":\"<'border-top-color'>{1,2}\",\"border-inline-end\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-inline-end-color\":\"<'border-top-color'>\",\"border-inline-end-style\":\"<'border-top-style'>\",\"border-inline-end-width\":\"<'border-top-width'>\",\"border-inline-start\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-inline-start-color\":\"<'border-top-color'>\",\"border-inline-start-style\":\"<'border-top-style'>\",\"border-inline-start-width\":\"<'border-top-width'>\",\"border-inline-style\":\"<'border-top-style'>{1,2}\",\"border-inline-width\":\"<'border-top-width'>{1,2}\",\"border-left\":\"<line-width>||<line-style>||<color>\",\"border-left-color\":\"<color>\",\"border-left-style\":\"<line-style>\",\"border-left-width\":\"<line-width>\",\"border-radius\":\"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?\",\"border-right\":\"<line-width>||<line-style>||<color>\",\"border-right-color\":\"<color>\",\"border-right-style\":\"<line-style>\",\"border-right-width\":\"<line-width>\",\"border-spacing\":\"<length> <length>?\",\"border-start-end-radius\":\"<'border-top-left-radius'>\",\"border-start-start-radius\":\"<'border-top-left-radius'>\",\"border-style\":\"<line-style>{1,4}\",\"border-top\":\"<line-width>||<line-style>||<color>\",\"border-top-color\":\"<color>\",\"border-top-left-radius\":\"<length-percentage>{1,2}\",\"border-top-right-radius\":\"<length-percentage>{1,2}\",\"border-top-style\":\"<line-style>\",\"border-top-width\":\"<line-width>\",\"border-width\":\"<line-width>{1,4}\",bottom:\"<length>|<percentage>|auto\",\"box-align\":\"start|center|end|baseline|stretch\",\"box-decoration-break\":\"slice|clone\",\"box-direction\":\"normal|reverse|inherit\",\"box-flex\":\"<number>\",\"box-flex-group\":\"<integer>\",\"box-lines\":\"single|multiple\",\"box-ordinal-group\":\"<integer>\",\"box-orient\":\"horizontal|vertical|inline-axis|block-axis|inherit\",\"box-pack\":\"start|center|end|justify\",\"box-shadow\":\"none|<shadow>#\",\"box-sizing\":\"content-box|border-box\",\"break-after\":\"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region\",\"break-before\":\"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region\",\"break-inside\":\"auto|avoid|avoid-page|avoid-column|avoid-region\",\"caption-side\":\"top|bottom\",caret:\"<'caret-color'>||<'caret-shape'>\",\"caret-color\":\"auto|<color>\",\"caret-shape\":\"auto|bar|block|underscore\",clear:\"none|left|right|both|inline-start|inline-end\",clip:\"<shape>|auto\",\"clip-path\":\"<clip-source>|[<basic-shape>||<geometry-box>]|none\",\"clip-rule\":\"nonzero|evenodd\",color:\"<color>\",\"color-interpolation-filters\":\"auto|sRGB|linearRGB\",\"color-scheme\":\"normal|[light|dark|<custom-ident>]+&&only?\",\"column-count\":\"<integer>|auto\",\"column-fill\":\"auto|balance\",\"column-gap\":\"normal|<length-percentage>\",\"column-rule\":\"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>\",\"column-rule-color\":\"<color>\",\"column-rule-style\":\"<'border-style'>\",\"column-rule-width\":\"<'border-width'>\",\"column-span\":\"none|all\",\"column-width\":\"<length>|auto\",columns:\"<'column-width'>||<'column-count'>\",contain:\"none|strict|content|[[size||inline-size]||layout||style||paint]\",\"contain-intrinsic-block-size\":\"auto? [none|<length>]\",\"contain-intrinsic-height\":\"auto? [none|<length>]\",\"contain-intrinsic-inline-size\":\"auto? [none|<length>]\",\"contain-intrinsic-size\":\"[auto? [none|<length>]]{1,2}\",\"contain-intrinsic-width\":\"auto? [none|<length>]\",container:\"<'container-name'> [/ <'container-type'>]?\",\"container-name\":\"none|<custom-ident>+\",\"container-type\":\"normal|[[size|inline-size]||scroll-state]\",content:\"normal|none|[<content-replacement>|<content-list>] [/ [<string>|<counter>]+]?\",\"content-visibility\":\"visible|auto|hidden\",\"counter-increment\":\"[<counter-name> <integer>?]+|none\",\"counter-reset\":\"[<counter-name> <integer>?|<reversed-counter-name> <integer>?]+|none\",\"counter-set\":\"[<counter-name> <integer>?]+|none\",cursor:\"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]\",cx:\"<length>|<percentage>\",cy:\"<length>|<percentage>\",d:\"none|path( <string> )\",direction:\"ltr|rtl\",display:\"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>\",\"dominant-baseline\":\"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge\",\"empty-cells\":\"show|hide\",\"field-sizing\":\"content|fixed\",fill:\"<paint>\",\"fill-opacity\":\"<number-zero-one>\",\"fill-rule\":\"nonzero|evenodd\",filter:\"none|<filter-value-list>|<-ms-filter-function-list>\",flex:\"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]\",\"flex-basis\":\"content|<'width'>\",\"flex-direction\":\"row|row-reverse|column|column-reverse\",\"flex-flow\":\"<'flex-direction'>||<'flex-wrap'>\",\"flex-grow\":\"<number>\",\"flex-shrink\":\"<number>\",\"flex-wrap\":\"nowrap|wrap|wrap-reverse\",float:\"left|right|none|inline-start|inline-end\",\"flood-color\":\"<color>\",\"flood-opacity\":\"<'opacity'>\",font:\"[[<'font-style'>||<font-variant-css2>||<'font-weight'>||<font-width-css3>]? <'font-size'> [/ <'line-height'>]? <'font-family'>#]|<system-family-name>|<-non-standard-font>\",\"font-family\":\"[<family-name>|<generic-family>]#\",\"font-feature-settings\":\"normal|<feature-tag-value>#\",\"font-kerning\":\"auto|normal|none\",\"font-language-override\":\"normal|<string>\",\"font-optical-sizing\":\"auto|none\",\"font-palette\":\"normal|light|dark|<palette-identifier>|<palette-mix()>\",\"font-size\":\"<absolute-size>|<relative-size>|<length-percentage [0,\\u221E]>|math\",\"font-size-adjust\":\"none|[ex-height|cap-height|ch-width|ic-width|ic-height]? [from-font|<number>]\",\"font-smooth\":\"auto|never|always|<absolute-size>|<length>\",\"font-stretch\":\"<font-stretch-absolute>\",\"font-style\":\"normal|italic|oblique <angle>?\",\"font-synthesis\":\"none|[weight||style||small-caps||position]\",\"font-synthesis-position\":\"auto|none\",\"font-synthesis-small-caps\":\"auto|none\",\"font-synthesis-style\":\"auto|none\",\"font-synthesis-weight\":\"auto|none\",\"font-variant\":\"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]\",\"font-variant-alternates\":\"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]\",\"font-variant-caps\":\"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps\",\"font-variant-east-asian\":\"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]\",\"font-variant-emoji\":\"normal|text|emoji|unicode\",\"font-variant-ligatures\":\"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]\",\"font-variant-numeric\":\"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]\",\"font-variant-position\":\"normal|sub|super\",\"font-variation-settings\":\"normal|[<string> <number>]#\",\"font-weight\":\"<font-weight-absolute>|bolder|lighter\",\"forced-color-adjust\":\"auto|none|preserve-parent-color\",gap:\"<'row-gap'> <'column-gap'>?\",grid:\"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>\",\"grid-area\":\"<grid-line> [/ <grid-line>]{0,3}\",\"grid-auto-columns\":\"<track-size>+\",\"grid-auto-flow\":\"[row|column]||dense\",\"grid-auto-rows\":\"<track-size>+\",\"grid-column\":\"<grid-line> [/ <grid-line>]?\",\"grid-column-end\":\"<grid-line>\",\"grid-column-gap\":\"<length-percentage>\",\"grid-column-start\":\"<grid-line>\",\"grid-gap\":\"<'grid-row-gap'> <'grid-column-gap'>?\",\"grid-row\":\"<grid-line> [/ <grid-line>]?\",\"grid-row-end\":\"<grid-line>\",\"grid-row-gap\":\"<length-percentage>\",\"grid-row-start\":\"<grid-line>\",\"grid-template\":\"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?\",\"grid-template-areas\":\"none|<string>+\",\"grid-template-columns\":\"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?\",\"grid-template-rows\":\"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?\",\"hanging-punctuation\":\"none|[first||[force-end|allow-end]||last]\",height:\"auto|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"hyphenate-character\":\"auto|<string>\",\"hyphenate-limit-chars\":\"[auto|<integer>]{1,3}\",hyphens:\"none|manual|auto\",\"image-orientation\":\"from-image|<angle>|[<angle>? flip]\",\"image-rendering\":\"auto|crisp-edges|pixelated|smooth|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>\",\"image-resolution\":\"[from-image||<resolution>]&&snap?\",\"ime-mode\":\"auto|normal|active|inactive|disabled\",\"initial-letter\":\"normal|[<number> <integer>?]\",\"initial-letter-align\":\"[auto|alphabetic|hanging|ideographic]\",\"inline-size\":\"<'width'>\",inset:\"<'top'>{1,4}\",\"inset-block\":\"<'top'>{1,2}\",\"inset-block-end\":\"<'top'>\",\"inset-block-start\":\"<'top'>\",\"inset-inline\":\"<'top'>{1,2}\",\"inset-inline-end\":\"<'top'>\",\"inset-inline-start\":\"<'top'>\",\"interpolate-size\":\"numeric-only|allow-keywords\",isolation:\"auto|isolate\",\"justify-content\":\"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]\",\"justify-items\":\"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]\",\"justify-self\":\"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]\",\"justify-tracks\":\"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#\",left:\"<length>|<percentage>|auto\",\"letter-spacing\":\"normal|<length-percentage>\",\"lighting-color\":\"<color>\",\"line-break\":\"auto|loose|normal|strict|anywhere\",\"line-clamp\":\"none|<integer>\",\"line-height\":\"normal|<number>|<length>|<percentage>\",\"line-height-step\":\"<length>\",\"list-style\":\"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>\",\"list-style-image\":\"<image>|none\",\"list-style-position\":\"inside|outside\",\"list-style-type\":\"<counter-style>|<string>|none\",margin:\"<'margin-top'>{1,4}\",\"margin-block\":\"<'margin-top'>{1,2}\",\"margin-block-end\":\"<'margin-top'>\",\"margin-block-start\":\"<'margin-top'>\",\"margin-bottom\":\"<length-percentage>|auto\",\"margin-inline\":\"<'margin-top'>{1,2}\",\"margin-inline-end\":\"<'margin-top'>\",\"margin-inline-start\":\"<'margin-top'>\",\"margin-left\":\"<length-percentage>|auto\",\"margin-right\":\"<length-percentage>|auto\",\"margin-top\":\"<length-percentage>|auto\",\"margin-trim\":\"none|in-flow|all\",marker:\"none|<url>\",\"marker-end\":\"none|<url>\",\"marker-mid\":\"none|<url>\",\"marker-start\":\"none|<url>\",mask:\"<mask-layer>#\",\"mask-border\":\"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>\",\"mask-border-mode\":\"luminance|alpha\",\"mask-border-outset\":\"[<length>|<number>]{1,4}\",\"mask-border-repeat\":\"[stretch|repeat|round|space]{1,2}\",\"mask-border-slice\":\"<number-percentage>{1,4} fill?\",\"mask-border-source\":\"none|<image>\",\"mask-border-width\":\"[<length-percentage>|<number>|auto]{1,4}\",\"mask-clip\":\"[<coord-box>|no-clip]#\",\"mask-composite\":\"<compositing-operator>#\",\"mask-image\":\"<mask-reference>#\",\"mask-mode\":\"<masking-mode>#\",\"mask-origin\":\"<coord-box>#\",\"mask-position\":\"<position>#\",\"mask-repeat\":\"<repeat-style>#\",\"mask-size\":\"<bg-size>#\",\"mask-type\":\"luminance|alpha\",\"masonry-auto-flow\":\"[pack|next]||[definite-first|ordered]\",\"math-depth\":\"auto-add|add( <integer> )|<integer>\",\"math-shift\":\"normal|compact\",\"math-style\":\"normal|compact\",\"max-block-size\":\"<'max-width'>\",\"max-height\":\"none|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"max-inline-size\":\"<'max-width'>\",\"max-lines\":\"none|<integer>\",\"max-width\":\"none|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"min-block-size\":\"<'min-width'>\",\"min-height\":\"auto|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"min-inline-size\":\"<'min-width'>\",\"min-width\":\"auto|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"mix-blend-mode\":\"<blend-mode>|plus-lighter\",\"object-fit\":\"fill|contain|cover|none|scale-down\",\"object-position\":\"<position>\",\"object-view-box\":\"none|<basic-shape-rect>\",offset:\"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?\",\"offset-anchor\":\"auto|<position>\",\"offset-distance\":\"<length-percentage>\",\"offset-path\":\"none|<offset-path>||<coord-box>\",\"offset-position\":\"normal|auto|<position>\",\"offset-rotate\":\"[auto|reverse]||<angle>\",opacity:\"<opacity-value>\",order:\"<integer>\",orphans:\"<integer>\",outline:\"<'outline-width'>||<'outline-style'>||<'outline-color'>\",\"outline-color\":\"auto|<color>\",\"outline-offset\":\"<length>\",\"outline-style\":\"auto|<outline-line-style>\",\"outline-width\":\"<line-width>\",overflow:\"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>\",\"overflow-anchor\":\"auto|none\",\"overflow-block\":\"visible|hidden|clip|scroll|auto\",\"overflow-clip-box\":\"padding-box|content-box\",\"overflow-clip-margin\":\"<visual-box>||<length [0,\\u221E]>\",\"overflow-inline\":\"visible|hidden|clip|scroll|auto\",\"overflow-wrap\":\"normal|break-word|anywhere\",\"overflow-x\":\"visible|hidden|clip|scroll|auto|<-non-standard-overflow>\",\"overflow-y\":\"visible|hidden|clip|scroll|auto|<-non-standard-overflow>\",overlay:\"none|auto\",\"overscroll-behavior\":\"[contain|none|auto]{1,2}\",\"overscroll-behavior-block\":\"contain|none|auto\",\"overscroll-behavior-inline\":\"contain|none|auto\",\"overscroll-behavior-x\":\"contain|none|auto\",\"overscroll-behavior-y\":\"contain|none|auto\",padding:\"<'padding-top'>{1,4}\",\"padding-block\":\"<'padding-top'>{1,2}\",\"padding-block-end\":\"<'padding-top'>\",\"padding-block-start\":\"<'padding-top'>\",\"padding-bottom\":\"<length-percentage [0,\\u221E]>\",\"padding-inline\":\"<'padding-top'>{1,2}\",\"padding-inline-end\":\"<'padding-top'>\",\"padding-inline-start\":\"<'padding-top'>\",\"padding-left\":\"<length-percentage [0,\\u221E]>\",\"padding-right\":\"<length-percentage [0,\\u221E]>\",\"padding-top\":\"<length-percentage [0,\\u221E]>\",page:\"auto|<custom-ident>\",\"page-break-after\":\"auto|always|avoid|left|right|recto|verso\",\"page-break-before\":\"auto|always|avoid|left|right|recto|verso\",\"page-break-inside\":\"auto|avoid\",\"paint-order\":\"normal|[fill||stroke||markers]\",perspective:\"none|<length>\",\"perspective-origin\":\"<position>\",\"place-content\":\"<'align-content'> <'justify-content'>?\",\"place-items\":\"<'align-items'> <'justify-items'>?\",\"place-self\":\"<'align-self'> <'justify-self'>?\",\"pointer-events\":\"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit\",position:\"static|relative|absolute|sticky|fixed|-webkit-sticky\",\"position-anchor\":\"auto|<anchor-name>\",\"position-area\":\"none|<position-area>\",\"position-try\":\"<'position-try-order'>? <'position-try-fallbacks'>\",\"position-try-fallbacks\":\"none|[[<dashed-ident>||<try-tactic>]|<'position-area'>]#\",\"position-try-order\":\"normal|<try-size>\",\"position-visibility\":\"always|[anchors-valid||anchors-visible||no-overflow]\",\"print-color-adjust\":\"economy|exact\",quotes:\"none|auto|[<string> <string>]+\",r:\"<length>|<percentage>\",resize:\"none|both|horizontal|vertical|block|inline\",right:\"<length>|<percentage>|auto\",rotate:\"none|<angle>|[x|y|z|<number>{3}]&&<angle>\",\"row-gap\":\"normal|<length-percentage>\",\"ruby-align\":\"start|center|space-between|space-around\",\"ruby-merge\":\"separate|collapse|auto\",\"ruby-position\":\"[alternate||[over|under]]|inter-character\",rx:\"<length>|<percentage>\",ry:\"<length>|<percentage>\",scale:\"none|[<number>|<percentage>]{1,3}\",\"scroll-behavior\":\"auto|smooth\",\"scroll-initial-target\":\"none|nearest\",\"scroll-margin\":\"<length>{1,4}\",\"scroll-margin-block\":\"<length>{1,2}\",\"scroll-margin-block-end\":\"<length>\",\"scroll-margin-block-start\":\"<length>\",\"scroll-margin-bottom\":\"<length>\",\"scroll-margin-inline\":\"<length>{1,2}\",\"scroll-margin-inline-end\":\"<length>\",\"scroll-margin-inline-start\":\"<length>\",\"scroll-margin-left\":\"<length>\",\"scroll-margin-right\":\"<length>\",\"scroll-margin-top\":\"<length>\",\"scroll-padding\":\"[auto|<length-percentage>]{1,4}\",\"scroll-padding-block\":\"[auto|<length-percentage>]{1,2}\",\"scroll-padding-block-end\":\"auto|<length-percentage>\",\"scroll-padding-block-start\":\"auto|<length-percentage>\",\"scroll-padding-bottom\":\"auto|<length-percentage>\",\"scroll-padding-inline\":\"[auto|<length-percentage>]{1,2}\",\"scroll-padding-inline-end\":\"auto|<length-percentage>\",\"scroll-padding-inline-start\":\"auto|<length-percentage>\",\"scroll-padding-left\":\"auto|<length-percentage>\",\"scroll-padding-right\":\"auto|<length-percentage>\",\"scroll-padding-top\":\"auto|<length-percentage>\",\"scroll-snap-align\":\"[none|start|end|center]{1,2}\",\"scroll-snap-coordinate\":\"none|<position>#\",\"scroll-snap-destination\":\"<position>\",\"scroll-snap-points-x\":\"none|repeat( <length-percentage> )\",\"scroll-snap-points-y\":\"none|repeat( <length-percentage> )\",\"scroll-snap-stop\":\"normal|always\",\"scroll-snap-type\":\"none|[x|y|block|inline|both] [mandatory|proximity]?\",\"scroll-snap-type-x\":\"none|mandatory|proximity\",\"scroll-snap-type-y\":\"none|mandatory|proximity\",\"scroll-timeline\":\"[<'scroll-timeline-name'> <'scroll-timeline-axis'>?]#\",\"scroll-timeline-axis\":\"[block|inline|x|y]#\",\"scroll-timeline-name\":\"[none|<dashed-ident>]#\",\"scrollbar-color\":\"auto|<color>{2}\",\"scrollbar-gutter\":\"auto|stable&&both-edges?\",\"scrollbar-width\":\"auto|thin|none\",\"shape-image-threshold\":\"<opacity-value>\",\"shape-margin\":\"<length-percentage>\",\"shape-outside\":\"none|[<shape-box>||<basic-shape>]|<image>\",\"shape-rendering\":\"auto|optimizeSpeed|crispEdges|geometricPrecision\",\"speak-as\":\"normal|spell-out||digits||[literal-punctuation|no-punctuation]\",\"stop-color\":\"<'color'>\",\"stop-opacity\":\"<'opacity'>\",stroke:\"<paint>\",\"stroke-dasharray\":\"none|[<svg-length>+]#\",\"stroke-dashoffset\":\"<svg-length>\",\"stroke-linecap\":\"butt|round|square\",\"stroke-linejoin\":\"miter|round|bevel\",\"stroke-miterlimit\":\"<number-one-or-greater>\",\"stroke-opacity\":\"<'opacity'>\",\"stroke-width\":\"<svg-length>\",\"tab-size\":\"<integer>|<length>\",\"table-layout\":\"auto|fixed\",\"text-align\":\"start|end|left|right|center|justify|match-parent\",\"text-align-last\":\"auto|start|end|left|right|center|justify\",\"text-anchor\":\"start|middle|end\",\"text-box\":\"normal|<'text-box-trim'>||<'text-box-edge'>\",\"text-box-edge\":\"auto|<text-edge>\",\"text-box-trim\":\"none|trim-start|trim-end|trim-both\",\"text-combine-upright\":\"none|all|[digits <integer>?]\",\"text-decoration\":\"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>\",\"text-decoration-color\":\"<color>\",\"text-decoration-line\":\"none|[underline||overline||line-through||blink]|spelling-error|grammar-error\",\"text-decoration-skip\":\"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]\",\"text-decoration-skip-ink\":\"auto|all|none\",\"text-decoration-style\":\"solid|double|dotted|dashed|wavy\",\"text-decoration-thickness\":\"auto|from-font|<length>|<percentage>\",\"text-emphasis\":\"<'text-emphasis-style'>||<'text-emphasis-color'>\",\"text-emphasis-color\":\"<color>\",\"text-emphasis-position\":\"auto|[over|under]&&[right|left]?\",\"text-emphasis-style\":\"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>\",\"text-indent\":\"<length-percentage>&&hanging?&&each-line?\",\"text-justify\":\"auto|inter-character|inter-word|none\",\"text-orientation\":\"mixed|upright|sideways\",\"text-overflow\":\"[clip|ellipsis|<string>]{1,2}\",\"text-rendering\":\"auto|optimizeSpeed|optimizeLegibility|geometricPrecision\",\"text-shadow\":\"none|<shadow-t>#\",\"text-size-adjust\":\"none|auto|<percentage>\",\"text-spacing-trim\":\"space-all|normal|space-first|trim-start\",\"text-transform\":\"none|[capitalize|uppercase|lowercase]||full-width||full-size-kana|math-auto\",\"text-underline-offset\":\"auto|<length>|<percentage>\",\"text-underline-position\":\"auto|from-font|[under||[left|right]]\",\"text-wrap\":\"<'text-wrap-mode'>||<'text-wrap-style'>\",\"text-wrap-mode\":\"wrap|nowrap\",\"text-wrap-style\":\"auto|balance|stable|pretty\",\"timeline-scope\":\"none|<dashed-ident>#\",top:\"<length>|<percentage>|auto\",\"touch-action\":\"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation\",transform:\"none|<transform-list>\",\"transform-box\":\"content-box|border-box|fill-box|stroke-box|view-box\",\"transform-origin\":\"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?\",\"transform-style\":\"flat|preserve-3d\",transition:\"<single-transition>#\",\"transition-behavior\":\"<transition-behavior-value>#\",\"transition-delay\":\"<time>#\",\"transition-duration\":\"<time>#\",\"transition-property\":\"none|<single-transition-property>#\",\"transition-timing-function\":\"<easing-function>#\",translate:\"none|<length-percentage> [<length-percentage> <length>?]?\",\"unicode-bidi\":\"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext\",\"user-select\":\"auto|text|none|all\",\"vector-effect\":\"none|non-scaling-stroke|non-scaling-size|non-rotation|fixed-position\",\"vertical-align\":\"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>\",\"view-timeline\":\"[<'view-timeline-name'> [<'view-timeline-axis'>||<'view-timeline-inset'>]?]#\",\"view-timeline-axis\":\"[block|inline|x|y]#\",\"view-timeline-inset\":\"[[auto|<length-percentage>]{1,2}]#\",\"view-timeline-name\":\"[none|<dashed-ident>]#\",\"view-transition-class\":\"none|<custom-ident>+\",\"view-transition-name\":\"none|<custom-ident>\",visibility:\"visible|hidden|collapse\",\"white-space\":\"normal|pre|pre-wrap|pre-line|<'white-space-collapse'>||<'text-wrap-mode'>\",\"white-space-collapse\":\"collapse|preserve|preserve-breaks|preserve-spaces|break-spaces\",widows:\"<integer>\",width:\"auto|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"will-change\":\"auto|<animateable-feature>#\",\"word-break\":\"normal|break-all|keep-all|break-word|auto-phrase\",\"word-spacing\":\"normal|<length>\",\"word-wrap\":\"normal|break-word\",\"writing-mode\":\"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>\",x:\"<length>|<percentage>\",y:\"<length>|<percentage>\",\"z-index\":\"auto|<integer>\",zoom:\"normal|reset|<number [0,\\u221E]>||<percentage [0,\\u221E]>\",\"-moz-background-clip\":\"padding|border\",\"-moz-border-radius-bottomleft\":\"<'border-bottom-left-radius'>\",\"-moz-border-radius-bottomright\":\"<'border-bottom-right-radius'>\",\"-moz-border-radius-topleft\":\"<'border-top-left-radius'>\",\"-moz-border-radius-topright\":\"<'border-bottom-right-radius'>\",\"-moz-control-character-visibility\":\"visible|hidden\",\"-moz-osx-font-smoothing\":\"auto|grayscale\",\"-moz-user-select\":\"none|text|all|-moz-none\",\"-ms-flex-align\":\"start|end|center|baseline|stretch\",\"-ms-flex-item-align\":\"auto|start|end|center|baseline|stretch\",\"-ms-flex-line-pack\":\"start|end|center|justify|distribute|stretch\",\"-ms-flex-negative\":\"<'flex-shrink'>\",\"-ms-flex-pack\":\"start|end|center|justify|distribute\",\"-ms-flex-order\":\"<integer>\",\"-ms-flex-positive\":\"<'flex-grow'>\",\"-ms-flex-preferred-size\":\"<'flex-basis'>\",\"-ms-interpolation-mode\":\"nearest-neighbor|bicubic\",\"-ms-grid-column-align\":\"start|end|center|stretch\",\"-ms-grid-row-align\":\"start|end|center|stretch\",\"-ms-hyphenate-limit-last\":\"none|always|column|page|spread\",\"-webkit-background-clip\":\"[<visual-box>|border|padding|content|text]#\",\"-webkit-column-break-after\":\"always|auto|avoid\",\"-webkit-column-break-before\":\"always|auto|avoid\",\"-webkit-column-break-inside\":\"always|auto|avoid\",\"-webkit-font-smoothing\":\"auto|none|antialiased|subpixel-antialiased\",\"-webkit-mask-box-image\":\"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?\",\"-webkit-print-color-adjust\":\"economy|exact\",\"-webkit-text-security\":\"none|circle|disc|square\",\"-webkit-user-drag\":\"none|element|auto\",behavior:\"<url>+\",cue:\"<'cue-before'> <'cue-after'>?\",\"cue-after\":\"<url> <decibel>?|none\",\"cue-before\":\"<url> <decibel>?|none\",\"glyph-orientation-horizontal\":\"<angle>\",\"glyph-orientation-vertical\":\"<angle>\",kerning:\"auto|<svg-length>\",pause:\"<'pause-before'> <'pause-after'>?\",\"pause-after\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"pause-before\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"position-try-options\":\"<'position-try-fallbacks'>\",rest:\"<'rest-before'> <'rest-after'>?\",\"rest-after\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"rest-before\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",speak:\"auto|never|always\",\"voice-balance\":\"<number>|left|center|right|leftwards|rightwards\",\"voice-duration\":\"auto|<time>\",\"voice-family\":\"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve\",\"voice-pitch\":\"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]\",\"voice-range\":\"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]\",\"voice-rate\":\"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>\",\"voice-stress\":\"normal|strong|moderate|none|reduced\",\"voice-volume\":\"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]\",\"white-space-trim\":\"none|discard-before||discard-after||discard-inner\"},atrules:{charset:{prelude:\"<string>\",descriptors:null},\"counter-style\":{prelude:\"<counter-style-name>\",descriptors:{\"additive-symbols\":\"[<integer>&&<symbol>]#\",fallback:\"<counter-style-name>\",negative:\"<symbol> <symbol>?\",pad:\"<integer>&&<symbol>\",prefix:\"<symbol>\",range:\"[[<integer>|infinite]{2}]#|auto\",\"speak-as\":\"auto|bullets|numbers|words|spell-out|<counter-style-name>\",suffix:\"<symbol>\",symbols:\"<symbol>+\",system:\"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]\"}},container:{prelude:\"[<container-name>]? <container-condition>\",descriptors:null},document:{prelude:\"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#\",descriptors:null},\"font-face\":{prelude:null,descriptors:{\"ascent-override\":\"normal|<percentage>\",\"descent-override\":\"normal|<percentage>\",\"font-display\":\"auto|block|swap|fallback|optional\",\"font-family\":\"<family-name>\",\"font-feature-settings\":\"normal|<feature-tag-value>#\",\"font-stretch\":\"<font-stretch-absolute>{1,2}\",\"font-style\":\"normal|italic|oblique <angle>{0,2}\",\"font-variation-settings\":\"normal|[<string> <number>]#\",\"font-weight\":\"<font-weight-absolute>{1,2}\",\"line-gap-override\":\"normal|<percentage>\",\"size-adjust\":\"<percentage>\",src:\"[<url> [format( <string># )]?|local( <family-name> )]#\",\"unicode-range\":\"<unicode-range-token>#\"}},\"font-feature-values\":{prelude:\"<family-name>#\",descriptors:null},\"font-palette-values\":{prelude:\"<dashed-ident>\",descriptors:{\"base-palette\":\"light|dark|<integer [0,\\u221E]>\",\"font-family\":\"<family-name>#\",\"override-colors\":\"[<integer [0,\\u221E]> <color>]#\"}},import:{prelude:\"[<string>|<url>] [layer|layer( <layer-name> )]? [supports( [<supports-condition>|<declaration>] )]? <media-query-list>?\",descriptors:null},keyframes:{prelude:\"<keyframes-name>\",descriptors:null},layer:{prelude:\"[<layer-name>#|<layer-name>?]\",descriptors:null},media:{prelude:\"<media-query-list>\",descriptors:null},namespace:{prelude:\"<namespace-prefix>? [<string>|<url>]\",descriptors:null},page:{prelude:\"<page-selector-list>\",descriptors:{bleed:\"auto|<length>\",marks:\"none|[crop||cross]\",\"page-orientation\":\"upright|rotate-left|rotate-right\",size:\"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]\"}},\"position-try\":{prelude:\"<dashed-ident>\",descriptors:{top:\"<'top'>\",left:\"<'left'>\",bottom:\"<'bottom'>\",right:\"<'right'>\",\"inset-block-start\":\"<'inset-block-start'>\",\"inset-block-end\":\"<'inset-block-end'>\",\"inset-inline-start\":\"<'inset-inline-start'>\",\"inset-inline-end\":\"<'inset-inline-end'>\",\"inset-block\":\"<'inset-block'>\",\"inset-inline\":\"<'inset-inline'>\",inset:\"<'inset'>\",\"margin-top\":\"<'margin-top'>\",\"margin-left\":\"<'margin-left'>\",\"margin-bottom\":\"<'margin-bottom'>\",\"margin-right\":\"<'margin-right'>\",\"margin-block-start\":\"<'margin-block-start'>\",\"margin-block-end\":\"<'margin-block-end'>\",\"margin-inline-start\":\"<'margin-inline-start'>\",\"margin-inline-end\":\"<'margin-inline-end'>\",margin:\"<'margin'>\",\"margin-block\":\"<'margin-block'>\",\"margin-inline\":\"<'margin-inline'>\",width:\"<'width'>\",height:\"<'height'>\",\"min-width\":\"<'min-width'>\",\"min-height\":\"<'min-height'>\",\"max-width\":\"<'max-width'>\",\"max-height\":\"<'max-height'>\",\"block-size\":\"<'block-size'>\",\"inline-size\":\"<'inline-size'>\",\"min-block-size\":\"<'min-block-size'>\",\"min-inline-size\":\"<'min-inline-size'>\",\"max-block-size\":\"<'max-block-size'>\",\"max-inline-size\":\"<'max-inline-size'>\",\"align-self\":\"<'align-self'>|anchor-center\",\"justify-self\":\"<'justify-self'>|anchor-center\"}},property:{prelude:\"<custom-property-name>\",descriptors:{inherits:\"true|false\",\"initial-value\":\"<declaration-value>?\",syntax:\"<string>\"}},scope:{prelude:\"[( <scope-start> )]? [to ( <scope-end> )]?\",descriptors:null},\"starting-style\":{prelude:null,descriptors:null},supports:{prelude:\"<supports-condition>\",descriptors:null},\"view-transition\":{prelude:null,descriptors:{navigation:\"auto|none\",types:\"none|<custom-ident>+\"}},nest:{prelude:\"<complex-selector-list>\",descriptors:null}}};var Ct={};f(Ct,{AnPlusB:()=>tn,Atrule:()=>nn,AtrulePrelude:()=>sn,AttributeSelector:()=>cn,Block:()=>pn,Brackets:()=>mn,CDC:()=>fn,CDO:()=>bn,ClassSelector:()=>yn,Combinator:()=>wn,Comment:()=>Sn,Condition:()=>Tn,Declaration:()=>Ln,DeclarationList:()=>Pn,Dimension:()=>Dn,Feature:()=>On,FeatureFunction:()=>Fn,FeatureRange:()=>_n,Function:()=>qn,GeneralEnclosed:()=>Un,Hash:()=>Gn,IdSelector:()=>Qn,Identifier:()=>Kn,Layer:()=>$n,LayerList:()=>Jn,MediaQuery:()=>ti,MediaQueryList:()=>ni,NestingSelector:()=>oi,Nth:()=>ai,Number:()=>ci,Operator:()=>pi,Parentheses:()=>mi,Percentage:()=>fi,PseudoClassSelector:()=>bi,PseudoElementSelector:()=>yi,Ratio:()=>wi,Raw:()=>Si,Rule:()=>Ti,Scope:()=>Li,Selector:()=>zi,SelectorList:()=>Ii,String:()=>Fi,StyleSheet:()=>Bi,SupportsDeclaration:()=>Wi,TypeSelector:()=>Ui,UnicodeRange:()=>Yi,Url:()=>Zi,Value:()=>eo,WhiteSpace:()=>ro});var tn={};f(tn,{generate:()=>Xc,name:()=>Vc,parse:()=>en,structure:()=>Qc});var fe=43,re=45,er=110,Re=true,Kc=false;function tr(e,t){let r=this.tokenStart+e,n=this.charCodeAt(r);for((n===fe||n===re)&&(t&&this.error(\"Number sign is not allowed\"),r++);r<this.tokenEnd;r++)O(this.charCodeAt(r))||this.error(\"Integer is expected\",r);}function et(e){return tr.call(this,0,e)}function Ee(e,t){if(!this.cmpChar(this.tokenStart+e,t)){let r=\"\";switch(t){case er:r=\"N is expected\";break;case re:r=\"HyphenMinus is expected\";break}this.error(r,this.tokenStart+e);}}function Jr(){let e=0,t=0,r=this.tokenType;for(;r===13||r===25;)r=this.lookupType(++e);if(r!==10)if(this.isDelim(fe,e)||this.isDelim(re,e)){t=this.isDelim(fe,e)?fe:re;do r=this.lookupType(++e);while(r===13||r===25);r!==10&&(this.skip(e),et.call(this,Re));}else return null;return e>0&&this.skip(e),t===0&&(r=this.charCodeAt(this.tokenStart),r!==fe&&r!==re&&this.error(\"Number sign is expected\")),et.call(this,t!==0),t===re?\"-\"+this.consume(10):this.consume(10)}var Vc=\"AnPlusB\",Qc={a:[String,null],b:[String,null]};function en(){let e=this.tokenStart,t=null,r=null;if(this.tokenType===10)et.call(this,Kc),r=this.consume(10);else if(this.tokenType===1&&this.cmpChar(this.tokenStart,re))switch(t=\"-1\",Ee.call(this,1,er),this.tokenEnd-this.tokenStart){case 2:this.next(),r=Jr.call(this);break;case 3:Ee.call(this,2,re),this.next(),this.skipSC(),et.call(this,Re),r=\"-\"+this.consume(10);break;default:Ee.call(this,2,re),tr.call(this,3,Re),this.next(),r=this.substrToCursor(e+2);}else if(this.tokenType===1||this.isDelim(fe)&&this.lookupType(1)===1){let n=0;switch(t=\"1\",this.isDelim(fe)&&(n=1,this.next()),Ee.call(this,0,er),this.tokenEnd-this.tokenStart){case 1:this.next(),r=Jr.call(this);break;case 2:Ee.call(this,1,re),this.next(),this.skipSC(),et.call(this,Re),r=\"-\"+this.consume(10);break;default:Ee.call(this,1,re),tr.call(this,2,Re),this.next(),r=this.substrToCursor(e+n+1);}}else if(this.tokenType===12){let n=this.charCodeAt(this.tokenStart),i=n===fe||n===re,o=this.tokenStart+i;for(;o<this.tokenEnd&&O(this.charCodeAt(o));o++);o===this.tokenStart+i&&this.error(\"Integer is expected\",this.tokenStart+i),Ee.call(this,o-this.tokenStart,er),t=this.substring(e,o),o+1===this.tokenEnd?(this.next(),r=Jr.call(this)):(Ee.call(this,o-this.tokenStart+1,re),o+2===this.tokenEnd?(this.next(),this.skipSC(),et.call(this,Re),r=\"-\"+this.consume(10)):(tr.call(this,o-this.tokenStart+2,Re),this.next(),r=this.substrToCursor(o+1)));}else this.error();return t!==null&&t.charCodeAt(0)===fe&&(t=t.substr(1)),r!==null&&r.charCodeAt(0)===fe&&(r=r.substr(1)),{type:\"AnPlusB\",loc:this.getLocation(e,this.tokenStart),a:t,b:r}}function Xc(e){if(e.a){let t=e.a===\"+1\"&&\"n\"||e.a===\"1\"&&\"n\"||e.a===\"-1\"&&\"-n\"||e.a+\"n\";if(e.b){let r=e.b[0]===\"-\"||e.b[0]===\"+\"?e.b:\"+\"+e.b;this.tokenize(t+r);}else this.tokenize(t);}else this.tokenize(e.b);}var nn={};f(nn,{generate:()=>tu,name:()=>Zc,parse:()=>rn,structure:()=>eu,walkContext:()=>Jc});function _s(){return this.Raw(this.consumeUntilLeftCurlyBracketOrSemicolon,true)}function $c(){for(let e=1,t;t=this.lookupType(e);e++){if(t===24)return  true;if(t===23||t===3)return  false}return  false}var Zc=\"Atrule\",Jc=\"atrule\",eu={name:String,prelude:[\"AtrulePrelude\",\"Raw\",null],block:[\"Block\",null]};function rn(e=false){let t=this.tokenStart,r,n,i=null,o=null;switch(this.eat(3),r=this.substrToCursor(t+1),n=r.toLowerCase(),this.skipSC(),this.eof===false&&this.tokenType!==23&&this.tokenType!==17&&(this.parseAtrulePrelude?i=this.parseWithFallback(this.AtrulePrelude.bind(this,r,e),_s):i=_s.call(this,this.tokenIndex),this.skipSC()),this.tokenType){case 17:this.next();break;case 23:hasOwnProperty.call(this.atrule,n)&&typeof this.atrule[n].block==\"function\"?o=this.atrule[n].block.call(this,e):o=this.Block($c.call(this));break}return {type:\"Atrule\",loc:this.getLocation(t,this.tokenStart),name:r,prelude:i,block:o}}function tu(e){this.token(3,\"@\"+e.name),e.prelude!==null&&this.node(e.prelude),e.block?this.node(e.block):this.token(17,\";\");}var sn={};f(sn,{generate:()=>ou,name:()=>ru,parse:()=>on,structure:()=>iu,walkContext:()=>nu});var ru=\"AtrulePrelude\",nu=\"atrulePrelude\",iu={children:[[]]};function on(e){let t=null;return e!==null&&(e=e.toLowerCase()),this.skipSC(),hasOwnProperty.call(this.atrule,e)&&typeof this.atrule[e].prelude==\"function\"?t=this.atrule[e].prelude.call(this):t=this.readSequence(this.scope.AtrulePrelude),this.skipSC(),this.eof!==true&&this.tokenType!==23&&this.tokenType!==17&&this.error(\"Semicolon or block is expected\"),{type:\"AtrulePrelude\",loc:this.getLocationFromList(t),children:t}}function ou(e){this.children(e);}var cn={};f(cn,{generate:()=>mu,name:()=>pu,parse:()=>ln,structure:()=>hu});var su=36,Ws=42,rr=61,au=94,an=124,lu=126;function cu(){this.eof&&this.error(\"Unexpected end of input\");let e=this.tokenStart,t=false;return this.isDelim(Ws)?(t=true,this.next()):this.isDelim(an)||this.eat(1),this.isDelim(an)?this.charCodeAt(this.tokenStart+1)!==rr?(this.next(),this.eat(1)):t&&this.error(\"Identifier is expected\",this.tokenEnd):t&&this.error(\"Vertical line is expected\"),{type:\"Identifier\",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e)}}function uu(){let e=this.tokenStart,t=this.charCodeAt(e);return t!==rr&&t!==lu&&t!==au&&t!==su&&t!==Ws&&t!==an&&this.error(\"Attribute selector (=, ~=, ^=, $=, *=, |=) is expected\"),this.next(),t!==rr&&(this.isDelim(rr)||this.error(\"Equal sign is expected\"),this.next()),this.substrToCursor(e)}var pu=\"AttributeSelector\",hu={name:\"Identifier\",matcher:[String,null],value:[\"String\",\"Identifier\",null],flags:[String,null]};function ln(){let e=this.tokenStart,t,r=null,n=null,i=null;return this.eat(19),this.skipSC(),t=cu.call(this),this.skipSC(),this.tokenType!==20&&(this.tokenType!==1&&(r=uu.call(this),this.skipSC(),n=this.tokenType===5?this.String():this.Identifier(),this.skipSC()),this.tokenType===1&&(i=this.consume(1),this.skipSC())),this.eat(20),{type:\"AttributeSelector\",loc:this.getLocation(e,this.tokenStart),name:t,matcher:r,value:n,flags:i}}function mu(e){this.token(9,\"[\"),this.node(e.name),e.matcher!==null&&(this.tokenize(e.matcher),this.node(e.value)),e.flags!==null&&this.token(1,e.flags),this.token(9,\"]\");}var pn={};f(pn,{generate:()=>yu,name:()=>gu,parse:()=>un,structure:()=>xu,walkContext:()=>bu});var du=38;function Us(){return this.Raw(null,true)}function qs(){return this.parseWithFallback(this.Rule,Us)}function js(){return this.Raw(this.consumeUntilSemicolonIncluded,true)}function fu(){if(this.tokenType===17)return js.call(this,this.tokenIndex);let e=this.parseWithFallback(this.Declaration,js);return this.tokenType===17&&this.next(),e}var gu=\"Block\",bu=\"block\",xu={children:[[\"Atrule\",\"Rule\",\"Declaration\"]]};function un(e){let t=e?fu:qs,r=this.tokenStart,n=this.createList();this.eat(23);e:for(;!this.eof;)switch(this.tokenType){case 24:break e;case 13:case 25:this.next();break;case 3:n.push(this.parseWithFallback(this.Atrule.bind(this,e),Us));break;default:e&&this.isDelim(du)?n.push(qs.call(this)):n.push(t.call(this));}return this.eof||this.eat(24),{type:\"Block\",loc:this.getLocation(r,this.tokenStart),children:n}}function yu(e){this.token(23,\"{\"),this.children(e,t=>{t.type===\"Declaration\"&&this.token(17,\";\");}),this.token(24,\"}\");}var mn={};f(mn,{generate:()=>vu,name:()=>ku,parse:()=>hn,structure:()=>wu});var ku=\"Brackets\",wu={children:[[]]};function hn(e,t){let r=this.tokenStart,n=null;return this.eat(19),n=e.call(this,t),this.eof||this.eat(20),{type:\"Brackets\",loc:this.getLocation(r,this.tokenStart),children:n}}function vu(e){this.token(9,\"[\"),this.children(e),this.token(9,\"]\");}var fn={};f(fn,{generate:()=>Tu,name:()=>Su,parse:()=>dn,structure:()=>Cu});var Su=\"CDC\",Cu=[];function dn(){let e=this.tokenStart;return this.eat(15),{type:\"CDC\",loc:this.getLocation(e,this.tokenStart)}}function Tu(){this.token(15,\"-->\");}var bn={};f(bn,{generate:()=>Eu,name:()=>Au,parse:()=>gn,structure:()=>Lu});var Au=\"CDO\",Lu=[];function gn(){let e=this.tokenStart;return this.eat(14),{type:\"CDO\",loc:this.getLocation(e,this.tokenStart)}}function Eu(){this.token(14,\"<!--\");}var yn={};f(yn,{generate:()=>Du,name:()=>Pu,parse:()=>xn,structure:()=>Iu});var zu=46,Pu=\"ClassSelector\",Iu={name:String};function xn(){return this.eatDelim(zu),{type:\"ClassSelector\",loc:this.getLocation(this.tokenStart-1,this.tokenEnd),name:this.consume(1)}}function Du(e){this.token(9,\".\"),this.token(1,e.name);}var wn={};f(wn,{generate:()=>Bu,name:()=>Fu,parse:()=>kn,structure:()=>Mu});var Nu=43,Hs=47,Ou=62,Ru=126,Fu=\"Combinator\",Mu={name:String};function kn(){let e=this.tokenStart,t;switch(this.tokenType){case 13:t=\" \";break;case 9:switch(this.charCodeAt(this.tokenStart)){case Ou:case Nu:case Ru:this.next();break;case Hs:this.next(),this.eatIdent(\"deep\"),this.eatDelim(Hs);break;default:this.error(\"Combinator is expected\");}t=this.substrToCursor(e);break}return {type:\"Combinator\",loc:this.getLocation(e,this.tokenStart),name:t}}function Bu(e){this.tokenize(e.name);}var Sn={};f(Sn,{generate:()=>Uu,name:()=>qu,parse:()=>vn,structure:()=>ju});var _u=42,Wu=47,qu=\"Comment\",ju={value:String};function vn(){let e=this.tokenStart,t=this.tokenEnd;return this.eat(25),t-e+2>=2&&this.charCodeAt(t-2)===_u&&this.charCodeAt(t-1)===Wu&&(t-=2),{type:\"Comment\",loc:this.getLocation(e,this.tokenStart),value:this.substring(e+2,t)}}function Uu(e){this.token(25,\"/*\"+e.value+\"*/\");}var Tn={};f(Tn,{generate:()=>Vu,name:()=>Gu,parse:()=>Cn,structure:()=>Yu});var Hu=new Set([16,22,0]),Gu=\"Condition\",Yu={kind:String,children:[[\"Identifier\",\"Feature\",\"FeatureFunction\",\"FeatureRange\",\"SupportsDeclaration\"]]};function Gs(e){return this.lookupTypeNonSC(1)===1&&Hu.has(this.lookupTypeNonSC(2))?this.Feature(e):this.FeatureRange(e)}var Ku={media:Gs,container:Gs,supports(){return this.SupportsDeclaration()}};function Cn(e=\"media\"){let t=this.createList();e:for(;!this.eof;)switch(this.tokenType){case 25:case 13:this.next();continue;case 1:t.push(this.Identifier());break;case 21:{let r=this.parseWithFallback(()=>Ku[e].call(this,e),()=>null);r||(r=this.parseWithFallback(()=>{this.eat(21);let n=this.Condition(e);return this.eat(22),n},()=>this.GeneralEnclosed(e))),t.push(r);break}case 2:{let r=this.parseWithFallback(()=>this.FeatureFunction(e),()=>null);r||(r=this.GeneralEnclosed(e)),t.push(r);break}default:break e}return t.isEmpty&&this.error(\"Condition is expected\"),{type:\"Condition\",loc:this.getLocationFromList(t),kind:e,children:t}}function Vu(e){e.children.forEach(t=>{t.type===\"Condition\"?(this.token(21,\"(\"),this.node(t),this.token(22,\")\")):this.node(t);});}var Ln={};f(Ln,{generate:()=>sp,name:()=>np,parse:()=>An,structure:()=>op,walkContext:()=>ip});var Ks=33,Qu=35,Xu=36,$u=38,Zu=42,Ju=43,Ys=47;function ep(){return this.Raw(this.consumeUntilExclamationMarkOrSemicolon,true)}function tp(){return this.Raw(this.consumeUntilExclamationMarkOrSemicolon,false)}function rp(){let e=this.tokenIndex,t=this.Value();return t.type!==\"Raw\"&&this.eof===false&&this.tokenType!==17&&this.isDelim(Ks)===false&&this.isBalanceEdge(e)===false&&this.error(),t}var np=\"Declaration\",ip=\"declaration\",op={important:[Boolean,String],property:String,value:[\"Value\",\"Raw\"]};function An(){let e=this.tokenStart,t=this.tokenIndex,r=ap.call(this),n=Ht(r),i=n?this.parseCustomProperty:this.parseValue,o=n?tp:ep,s=false,u;this.skipSC(),this.eat(16);let c=this.tokenIndex;if(n||this.skipSC(),i?u=this.parseWithFallback(rp,o):u=o.call(this,this.tokenIndex),n&&u.type===\"Value\"&&u.children.isEmpty){for(let a=c-this.tokenIndex;a<=0;a++)if(this.lookupType(a)===13){u.children.appendData({type:\"WhiteSpace\",loc:null,value:\" \"});break}}return this.isDelim(Ks)&&(s=lp.call(this),this.skipSC()),this.eof===false&&this.tokenType!==17&&this.isBalanceEdge(t)===false&&this.error(),{type:\"Declaration\",loc:this.getLocation(e,this.tokenStart),important:s,property:r,value:u}}function sp(e){this.token(1,e.property),this.token(16,\":\"),this.node(e.value),e.important&&(this.token(9,\"!\"),this.token(1,e.important===true?\"important\":e.important));}function ap(){let e=this.tokenStart;if(this.tokenType===9)switch(this.charCodeAt(this.tokenStart)){case Zu:case Xu:case Ju:case Qu:case $u:this.next();break;case Ys:this.next(),this.isDelim(Ys)&&this.next();break}return this.tokenType===4?this.eat(4):this.eat(1),this.substrToCursor(e)}function lp(){this.eat(9),this.skipSC();let e=this.consume(1);return e===\"important\"?true:e}var Pn={};f(Pn,{generate:()=>hp,name:()=>up,parse:()=>zn,structure:()=>pp});var cp=38;function En(){return this.Raw(this.consumeUntilSemicolonIncluded,true)}var up=\"DeclarationList\",pp={children:[[\"Declaration\",\"Atrule\",\"Rule\"]]};function zn(){let e=this.createList();for(;!this.eof;)switch(this.tokenType){case 13:case 25:case 17:this.next();break;case 3:e.push(this.parseWithFallback(this.Atrule.bind(this,true),En));break;default:this.isDelim(cp)?e.push(this.parseWithFallback(this.Rule,En)):e.push(this.parseWithFallback(this.Declaration,En));}return {type:\"DeclarationList\",loc:this.getLocationFromList(e),children:e}}function hp(e){this.children(e,t=>{t.type===\"Declaration\"&&this.token(17,\";\");});}var Dn={};f(Dn,{generate:()=>fp,name:()=>mp,parse:()=>In,structure:()=>dp});var mp=\"Dimension\",dp={value:String,unit:String};function In(){let e=this.tokenStart,t=this.consumeNumber(12);return {type:\"Dimension\",loc:this.getLocation(e,this.tokenStart),value:t,unit:this.substring(e+t.length,this.tokenStart)}}function fp(e){this.token(12,e.value+e.unit);}var On={};f(On,{generate:()=>yp,name:()=>bp,parse:()=>Nn,structure:()=>xp});var gp=47,bp=\"Feature\",xp={kind:String,name:String,value:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\",null]};function Nn(e){let t=this.tokenStart,r,n=null;if(this.eat(21),this.skipSC(),r=this.consume(1),this.skipSC(),this.tokenType!==22){switch(this.eat(16),this.skipSC(),this.tokenType){case 10:this.lookupNonWSType(1)===9?n=this.Ratio():n=this.Number();break;case 12:n=this.Dimension();break;case 1:n=this.Identifier();break;case 2:n=this.parseWithFallback(()=>{let i=this.Function(this.readSequence,this.scope.Value);return this.skipSC(),this.isDelim(gp)&&this.error(),i},()=>this.Ratio());break;default:this.error(\"Number, dimension, ratio or identifier is expected\");}this.skipSC();}return this.eof||this.eat(22),{type:\"Feature\",loc:this.getLocation(t,this.tokenStart),kind:e,name:r,value:n}}function yp(e){this.token(21,\"(\"),this.token(1,e.name),e.value!==null&&(this.token(16,\":\"),this.node(e.value)),this.token(22,\")\");}var Fn={};f(Fn,{generate:()=>Sp,name:()=>kp,parse:()=>Rn,structure:()=>wp});var kp=\"FeatureFunction\",wp={kind:String,feature:String,value:[\"Declaration\",\"Selector\"]};function vp(e,t){let n=(this.features[e]||{})[t];return typeof n!=\"function\"&&this.error(`Unknown feature ${t}()`),n}function Rn(e=\"unknown\"){let t=this.tokenStart,r=this.consumeFunctionName(),n=vp.call(this,e,r.toLowerCase());this.skipSC();let i=this.parseWithFallback(()=>{let o=this.tokenIndex,s=n.call(this);return this.eof===false&&this.isBalanceEdge(o)===false&&this.error(),s},()=>this.Raw(null,false));return this.eof||this.eat(22),{type:\"FeatureFunction\",loc:this.getLocation(t,this.tokenStart),kind:e,feature:r,value:i}}function Sp(e){this.token(2,e.feature+\"(\"),this.node(e.value),this.token(22,\")\");}var _n={};f(_n,{generate:()=>Ep,name:()=>Ap,parse:()=>Bn,structure:()=>Lp});var Vs=47,Cp=60,Qs=61,Tp=62,Ap=\"FeatureRange\",Lp={kind:String,left:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\"],leftComparison:String,middle:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\"],rightComparison:[String,null],right:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\",null]};function Mn(){switch(this.skipSC(),this.tokenType){case 10:return this.isDelim(Vs,this.lookupOffsetNonSC(1))?this.Ratio():this.Number();case 12:return this.Dimension();case 1:return this.Identifier();case 2:return this.parseWithFallback(()=>{let e=this.Function(this.readSequence,this.scope.Value);return this.skipSC(),this.isDelim(Vs)&&this.error(),e},()=>this.Ratio());default:this.error(\"Number, dimension, ratio or identifier is expected\");}}function Xs(e){if(this.skipSC(),this.isDelim(Cp)||this.isDelim(Tp)){let t=this.source[this.tokenStart];return this.next(),this.isDelim(Qs)?(this.next(),t+\"=\"):t}if(this.isDelim(Qs))return \"=\";this.error(`Expected ${e?'\":\", ':\"\"}\"<\", \">\", \"=\" or \")\"`);}function Bn(e=\"unknown\"){let t=this.tokenStart;this.skipSC(),this.eat(21);let r=Mn.call(this),n=Xs.call(this,r.type===\"Identifier\"),i=Mn.call(this),o=null,s=null;return this.lookupNonWSType(0)!==22&&(o=Xs.call(this),s=Mn.call(this)),this.skipSC(),this.eat(22),{type:\"FeatureRange\",loc:this.getLocation(t,this.tokenStart),kind:e,left:r,leftComparison:n,middle:i,rightComparison:o,right:s}}function Ep(e){this.token(21,\"(\"),this.node(e.left),this.tokenize(e.leftComparison),this.node(e.middle),e.right&&(this.tokenize(e.rightComparison),this.node(e.right)),this.token(22,\")\");}var qn={};f(qn,{generate:()=>Dp,name:()=>zp,parse:()=>Wn,structure:()=>Ip,walkContext:()=>Pp});var zp=\"Function\",Pp=\"function\",Ip={name:String,children:[[]]};function Wn(e,t){let r=this.tokenStart,n=this.consumeFunctionName(),i=n.toLowerCase(),o;return o=t.hasOwnProperty(i)?t[i].call(this,t):e.call(this,t),this.eof||this.eat(22),{type:\"Function\",loc:this.getLocation(r,this.tokenStart),name:n,children:o}}function Dp(e){this.token(2,e.name+\"(\"),this.children(e),this.token(22,\")\");}var Un={};f(Un,{generate:()=>Rp,name:()=>Np,parse:()=>jn,structure:()=>Op});var Np=\"GeneralEnclosed\",Op={kind:String,function:[String,null],children:[[]]};function jn(e){let t=this.tokenStart,r=null;this.tokenType===2?r=this.consumeFunctionName():this.eat(21);let n=this.parseWithFallback(()=>{let i=this.tokenIndex,o=this.readSequence(this.scope.Value);return this.eof===false&&this.isBalanceEdge(i)===false&&this.error(),o},()=>this.createSingleNodeList(this.Raw(null,false)));return this.eof||this.eat(22),{type:\"GeneralEnclosed\",loc:this.getLocation(t,this.tokenStart),kind:e,function:r,children:n}}function Rp(e){e.function?this.token(2,e.function+\"(\"):this.token(21,\"(\"),this.children(e),this.token(22,\")\");}var Gn={};f(Gn,{generate:()=>_p,name:()=>Mp,parse:()=>Hn,structure:()=>Bp,xxx:()=>Fp});var Fp=\"XXX\",Mp=\"Hash\",Bp={value:String};function Hn(){let e=this.tokenStart;return this.eat(4),{type:\"Hash\",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e+1)}}function _p(e){this.token(4,\"#\"+e.value);}var Kn={};f(Kn,{generate:()=>jp,name:()=>Wp,parse:()=>Yn,structure:()=>qp});var Wp=\"Identifier\",qp={name:String};function Yn(){return {type:\"Identifier\",loc:this.getLocation(this.tokenStart,this.tokenEnd),name:this.consume(1)}}function jp(e){this.token(1,e.name);}var Qn={};f(Qn,{generate:()=>Gp,name:()=>Up,parse:()=>Vn,structure:()=>Hp});var Up=\"IdSelector\",Hp={name:String};function Vn(){let e=this.tokenStart;return this.eat(4),{type:\"IdSelector\",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e+1)}}function Gp(e){this.token(9,\"#\"+e.name);}var $n={};f($n,{generate:()=>Qp,name:()=>Kp,parse:()=>Xn,structure:()=>Vp});var Yp=46,Kp=\"Layer\",Vp={name:String};function Xn(){let e=this.tokenStart,t=this.consume(1);for(;this.isDelim(Yp);)this.eat(9),t+=\".\"+this.consume(1);return {type:\"Layer\",loc:this.getLocation(e,this.tokenStart),name:t}}function Qp(e){this.tokenize(e.name);}var Jn={};f(Jn,{generate:()=>Zp,name:()=>Xp,parse:()=>Zn,structure:()=>$p});var Xp=\"LayerList\",$p={children:[[\"Layer\"]]};function Zn(){let e=this.createList();for(this.skipSC();!this.eof&&(e.push(this.Layer()),this.lookupTypeNonSC(0)===18);)this.skipSC(),this.next(),this.skipSC();return {type:\"LayerList\",loc:this.getLocationFromList(e),children:e}}function Zp(e){this.children(e,()=>this.token(18,\",\"));}var ti={};f(ti,{generate:()=>th,name:()=>Jp,parse:()=>ei,structure:()=>eh});var Jp=\"MediaQuery\",eh={modifier:[String,null],mediaType:[String,null],condition:[\"Condition\",null]};function ei(){let e=this.tokenStart,t=null,r=null,n=null;if(this.skipSC(),this.tokenType===1&&this.lookupTypeNonSC(1)!==21){let i=this.consume(1),o=i.toLowerCase();switch(o===\"not\"||o===\"only\"?(this.skipSC(),t=o,r=this.consume(1)):r=i,this.lookupTypeNonSC(0)){case 1:{this.skipSC(),this.eatIdent(\"and\"),n=this.Condition(\"media\");break}case 23:case 17:case 18:case 0:break;default:this.error(\"Identifier or parenthesis is expected\");}}else switch(this.tokenType){case 1:case 21:case 2:{n=this.Condition(\"media\");break}case 23:case 17:case 0:break;default:this.error(\"Identifier or parenthesis is expected\");}return {type:\"MediaQuery\",loc:this.getLocation(e,this.tokenStart),modifier:t,mediaType:r,condition:n}}function th(e){e.mediaType?(e.modifier&&this.token(1,e.modifier),this.token(1,e.mediaType),e.condition&&(this.token(1,\"and\"),this.node(e.condition))):e.condition&&this.node(e.condition);}var ni={};f(ni,{generate:()=>ih,name:()=>rh,parse:()=>ri,structure:()=>nh});var rh=\"MediaQueryList\",nh={children:[[\"MediaQuery\"]]};function ri(){let e=this.createList();for(this.skipSC();!this.eof&&(e.push(this.MediaQuery()),this.tokenType===18);)this.next();return {type:\"MediaQueryList\",loc:this.getLocationFromList(e),children:e}}function ih(e){this.children(e,()=>this.token(18,\",\"));}var oi={};f(oi,{generate:()=>lh,name:()=>sh,parse:()=>ii,structure:()=>ah});var oh=38,sh=\"NestingSelector\",ah={};function ii(){let e=this.tokenStart;return this.eatDelim(oh),{type:\"NestingSelector\",loc:this.getLocation(e,this.tokenStart)}}function lh(){this.token(9,\"&\");}var ai={};f(ai,{generate:()=>ph,name:()=>ch,parse:()=>si,structure:()=>uh});var ch=\"Nth\",uh={nth:[\"AnPlusB\",\"Identifier\"],selector:[\"SelectorList\",null]};function si(){this.skipSC();let e=this.tokenStart,t=e,r=null,n;return this.lookupValue(0,\"odd\")||this.lookupValue(0,\"even\")?n=this.Identifier():n=this.AnPlusB(),t=this.tokenStart,this.skipSC(),this.lookupValue(0,\"of\")&&(this.next(),r=this.SelectorList(),t=this.tokenStart),{type:\"Nth\",loc:this.getLocation(e,t),nth:n,selector:r}}function ph(e){this.node(e.nth),e.selector!==null&&(this.token(1,\"of\"),this.node(e.selector));}var ci={};f(ci,{generate:()=>dh,name:()=>hh,parse:()=>li,structure:()=>mh});var hh=\"Number\",mh={value:String};function li(){return {type:\"Number\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consume(10)}}function dh(e){this.token(10,e.value);}var pi={};f(pi,{generate:()=>bh,name:()=>fh,parse:()=>ui,structure:()=>gh});var fh=\"Operator\",gh={value:String};function ui(){let e=this.tokenStart;return this.next(),{type:\"Operator\",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e)}}function bh(e){this.tokenize(e.value);}var mi={};f(mi,{generate:()=>kh,name:()=>xh,parse:()=>hi,structure:()=>yh});var xh=\"Parentheses\",yh={children:[[]]};function hi(e,t){let r=this.tokenStart,n=null;return this.eat(21),n=e.call(this,t),this.eof||this.eat(22),{type:\"Parentheses\",loc:this.getLocation(r,this.tokenStart),children:n}}function kh(e){this.token(21,\"(\"),this.children(e),this.token(22,\")\");}var fi={};f(fi,{generate:()=>Sh,name:()=>wh,parse:()=>di,structure:()=>vh});var wh=\"Percentage\",vh={value:String};function di(){return {type:\"Percentage\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consumeNumber(11)}}function Sh(e){this.token(11,e.value+\"%\");}var bi={};f(bi,{generate:()=>Lh,name:()=>Ch,parse:()=>gi,structure:()=>Ah,walkContext:()=>Th});var Ch=\"PseudoClassSelector\",Th=\"function\",Ah={name:String,children:[[\"Raw\"],null]};function gi(){let e=this.tokenStart,t=null,r,n;return this.eat(16),this.tokenType===2?(r=this.consumeFunctionName(),n=r.toLowerCase(),this.lookupNonWSType(0)==22?t=this.createList():hasOwnProperty.call(this.pseudo,n)?(this.skipSC(),t=this.pseudo[n].call(this),this.skipSC()):(t=this.createList(),t.push(this.Raw(null,false))),this.eat(22)):r=this.consume(1),{type:\"PseudoClassSelector\",loc:this.getLocation(e,this.tokenStart),name:r,children:t}}function Lh(e){this.token(16,\":\"),e.children===null?this.token(1,e.name):(this.token(2,e.name+\"(\"),this.children(e),this.token(22,\")\"));}var yi={};f(yi,{generate:()=>Ih,name:()=>Eh,parse:()=>xi,structure:()=>Ph,walkContext:()=>zh});var Eh=\"PseudoElementSelector\",zh=\"function\",Ph={name:String,children:[[\"Raw\"],null]};function xi(){let e=this.tokenStart,t=null,r,n;return this.eat(16),this.eat(16),this.tokenType===2?(r=this.consumeFunctionName(),n=r.toLowerCase(),this.lookupNonWSType(0)==22?t=this.createList():hasOwnProperty.call(this.pseudo,n)?(this.skipSC(),t=this.pseudo[n].call(this),this.skipSC()):(t=this.createList(),t.push(this.Raw(null,false))),this.eat(22)):r=this.consume(1),{type:\"PseudoElementSelector\",loc:this.getLocation(e,this.tokenStart),name:r,children:t}}function Ih(e){this.token(16,\":\"),this.token(16,\":\"),e.children===null?this.token(1,e.name):(this.token(2,e.name+\"(\"),this.children(e),this.token(22,\")\"));}var wi={};f(wi,{generate:()=>Oh,name:()=>Dh,parse:()=>ki,structure:()=>Nh});var $s=47;function Zs(){switch(this.skipSC(),this.tokenType){case 10:return this.Number();case 2:return this.Function(this.readSequence,this.scope.Value);default:this.error(\"Number of function is expected\");}}var Dh=\"Ratio\",Nh={left:[\"Number\",\"Function\"],right:[\"Number\",\"Function\",null]};function ki(){let e=this.tokenStart,t=Zs.call(this),r=null;return this.skipSC(),this.isDelim($s)&&(this.eatDelim($s),r=Zs.call(this)),{type:\"Ratio\",loc:this.getLocation(e,this.tokenStart),left:t,right:r}}function Oh(e){this.node(e.left),this.token(9,\"/\"),e.right?this.node(e.right):this.node(10,1);}var Si={};f(Si,{generate:()=>Bh,name:()=>Fh,parse:()=>vi,structure:()=>Mh});function Rh(){return this.tokenIndex>0&&this.lookupType(-1)===13?this.tokenIndex>1?this.getTokenStart(this.tokenIndex-1):this.firstCharOffset:this.tokenStart}var Fh=\"Raw\",Mh={value:String};function vi(e,t){let r=this.getTokenStart(this.tokenIndex),n;return this.skipUntilBalanced(this.tokenIndex,e||this.consumeUntilBalanceEnd),t&&this.tokenStart>r?n=Rh.call(this):n=this.tokenStart,{type:\"Raw\",loc:this.getLocation(r,n),value:this.substring(r,n)}}function Bh(e){this.tokenize(e.value);}var Ti={};f(Ti,{generate:()=>Uh,name:()=>Wh,parse:()=>Ci,structure:()=>jh,walkContext:()=>qh});function Js(){return this.Raw(this.consumeUntilLeftCurlyBracket,true)}function _h(){let e=this.SelectorList();return e.type!==\"Raw\"&&this.eof===false&&this.tokenType!==23&&this.error(),e}var Wh=\"Rule\",qh=\"rule\",jh={prelude:[\"SelectorList\",\"Raw\"],block:[\"Block\"]};function Ci(){let e=this.tokenIndex,t=this.tokenStart,r,n;return this.parseRulePrelude?r=this.parseWithFallback(_h,Js):r=Js.call(this,e),n=this.Block(true),{type:\"Rule\",loc:this.getLocation(t,this.tokenStart),prelude:r,block:n}}function Uh(e){this.node(e.prelude),this.node(e.block);}var Li={};f(Li,{generate:()=>Yh,name:()=>Hh,parse:()=>Ai,structure:()=>Gh});var Hh=\"Scope\",Gh={root:[\"SelectorList\",\"Raw\",null],limit:[\"SelectorList\",\"Raw\",null]};function Ai(){let e=null,t=null;this.skipSC();let r=this.tokenStart;return this.tokenType===21&&(this.next(),this.skipSC(),e=this.parseWithFallback(this.SelectorList,()=>this.Raw(false,true)),this.skipSC(),this.eat(22)),this.lookupNonWSType(0)===1&&(this.skipSC(),this.eatIdent(\"to\"),this.skipSC(),this.eat(21),this.skipSC(),t=this.parseWithFallback(this.SelectorList,()=>this.Raw(false,true)),this.skipSC(),this.eat(22)),{type:\"Scope\",loc:this.getLocation(r,this.tokenStart),root:e,limit:t}}function Yh(e){e.root&&(this.token(21,\"(\"),this.node(e.root),this.token(22,\")\")),e.limit&&(this.token(1,\"to\"),this.token(21,\"(\"),this.node(e.limit),this.token(22,\")\"));}var zi={};f(zi,{generate:()=>Qh,name:()=>Kh,parse:()=>Ei,structure:()=>Vh});var Kh=\"Selector\",Vh={children:[[\"TypeSelector\",\"IdSelector\",\"ClassSelector\",\"AttributeSelector\",\"PseudoClassSelector\",\"PseudoElementSelector\",\"Combinator\"]]};function Ei(){let e=this.readSequence(this.scope.Selector);return this.getFirstListNode(e)===null&&this.error(\"Selector is expected\"),{type:\"Selector\",loc:this.getLocationFromList(e),children:e}}function Qh(e){this.children(e);}var Ii={};f(Ii,{generate:()=>Jh,name:()=>Xh,parse:()=>Pi,structure:()=>Zh,walkContext:()=>$h});var Xh=\"SelectorList\",$h=\"selector\",Zh={children:[[\"Selector\",\"Raw\"]]};function Pi(){let e=this.createList();for(;!this.eof;){if(e.push(this.Selector()),this.tokenType===18){this.next();continue}break}return {type:\"SelectorList\",loc:this.getLocationFromList(e),children:e}}function Jh(e){this.children(e,()=>this.token(18,\",\"));}var Fi={};f(Fi,{generate:()=>rm,name:()=>em,parse:()=>Ri,structure:()=>tm});var Oi={};f(Oi,{decode:()=>vt,encode:()=>Ni});var Di=92,ea=34,ta=39;function vt(e){let t=e.length,r=e.charCodeAt(0),n=r===ea||r===ta?1:0,i=n===1&&t>1&&e.charCodeAt(t-1)===r?t-2:t-1,o=\"\";for(let s=n;s<=i;s++){let u=e.charCodeAt(s);if(u===Di){if(s===i){s!==t-1&&(o=e.substr(s+1));break}if(u=e.charCodeAt(++s),K(Di,u)){let c=s-1,a=se(e,c);s=a-1,o+=je(e.substring(c+1,a));}else u===13&&e.charCodeAt(s+1)===10&&s++;}else o+=e[s];}return o}function Ni(e,t){let r=t?\"'\":'\"',n=t?ta:ea,i=\"\",o=false;for(let s=0;s<e.length;s++){let u=e.charCodeAt(s);if(u===0){i+=\"\\uFFFD\";continue}if(u<=31||u===127){i+=\"\\\\\"+u.toString(16),o=true;continue}u===n||u===Di?(i+=\"\\\\\"+e.charAt(s),o=false):(o&&(J(u)||me(u))&&(i+=\" \"),i+=e.charAt(s),o=false);}return r+i+r}var em=\"String\",tm={value:String};function Ri(){return {type:\"String\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:vt(this.consume(5))}}function rm(e){this.token(5,Ni(e.value));}var Bi={};f(Bi,{generate:()=>am,name:()=>im,parse:()=>Mi,structure:()=>sm,walkContext:()=>om});var nm=33;function ra(){return this.Raw(null,false)}var im=\"StyleSheet\",om=\"stylesheet\",sm={children:[[\"Comment\",\"CDO\",\"CDC\",\"Atrule\",\"Rule\",\"Raw\"]]};function Mi(){let e=this.tokenStart,t=this.createList(),r;for(;!this.eof;){switch(this.tokenType){case 13:this.next();continue;case 25:if(this.charCodeAt(this.tokenStart+2)!==nm){this.next();continue}r=this.Comment();break;case 14:r=this.CDO();break;case 15:r=this.CDC();break;case 3:r=this.parseWithFallback(this.Atrule,ra);break;default:r=this.parseWithFallback(this.Rule,ra);}t.push(r);}return {type:\"StyleSheet\",loc:this.getLocation(e,this.tokenStart),children:t}}function am(e){this.children(e);}var Wi={};f(Wi,{generate:()=>um,name:()=>lm,parse:()=>_i,structure:()=>cm});var lm=\"SupportsDeclaration\",cm={declaration:\"Declaration\"};function _i(){let e=this.tokenStart;this.eat(21),this.skipSC();let t=this.Declaration();return this.eof||this.eat(22),{type:\"SupportsDeclaration\",loc:this.getLocation(e,this.tokenStart),declaration:t}}function um(e){this.token(21,\"(\"),this.node(e.declaration),this.token(22,\")\");}var Ui={};f(Ui,{generate:()=>dm,name:()=>hm,parse:()=>ji,structure:()=>mm});var pm=42,na=124;function qi(){this.tokenType!==1&&this.isDelim(pm)===false&&this.error(\"Identifier or asterisk is expected\"),this.next();}var hm=\"TypeSelector\",mm={name:String};function ji(){let e=this.tokenStart;return this.isDelim(na)?(this.next(),qi.call(this)):(qi.call(this),this.isDelim(na)&&(this.next(),qi.call(this))),{type:\"TypeSelector\",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e)}}function dm(e){this.tokenize(e.name);}var Yi={};f(Yi,{generate:()=>ym,name:()=>bm,parse:()=>Gi,structure:()=>xm});var ia=43,oa=45,Hi=63;function St(e,t){let r=0;for(let n=this.tokenStart+e;n<this.tokenEnd;n++){let i=this.charCodeAt(n);if(i===oa&&t&&r!==0)return St.call(this,e+r+1,false),-1;J(i)||this.error(t&&r!==0?\"Hyphen minus\"+(r<6?\" or hex digit\":\"\")+\" is expected\":r<6?\"Hex digit is expected\":\"Unexpected input\",n),++r>6&&this.error(\"Too many hex digits\",n);}return this.next(),r}function nr(e){let t=0;for(;this.isDelim(Hi);)++t>e&&this.error(\"Too many question marks\"),this.next();}function fm(e){this.charCodeAt(this.tokenStart)!==e&&this.error((e===ia?\"Plus sign\":\"Hyphen minus\")+\" is expected\");}function gm(){let e=0;switch(this.tokenType){case 10:if(e=St.call(this,1,true),this.isDelim(Hi)){nr.call(this,6-e);break}if(this.tokenType===12||this.tokenType===10){fm.call(this,oa),St.call(this,1,false);break}break;case 12:e=St.call(this,1,true),e>0&&nr.call(this,6-e);break;default:if(this.eatDelim(ia),this.tokenType===1){e=St.call(this,0,true),e>0&&nr.call(this,6-e);break}if(this.isDelim(Hi)){this.next(),nr.call(this,5);break}this.error(\"Hex digit or question mark is expected\");}}var bm=\"UnicodeRange\",xm={value:String};function Gi(){let e=this.tokenStart;return this.eatIdent(\"u\"),gm.call(this),{type:\"UnicodeRange\",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e)}}function ym(e){this.tokenize(e.value);}var Zi={};f(Zi,{generate:()=>Am,name:()=>Cm,parse:()=>$i,structure:()=>Tm});var Xi={};f(Xi,{decode:()=>Vi,encode:()=>Qi});var km=32,Ki=92,wm=34,vm=39,Sm=40,sa=41;function Vi(e){let t=e.length,r=4,n=e.charCodeAt(t-1)===sa?t-2:t-1,i=\"\";for(;r<n&&me(e.charCodeAt(r));)r++;for(;r<n&&me(e.charCodeAt(n));)n--;for(let o=r;o<=n;o++){let s=e.charCodeAt(o);if(s===Ki){if(o===n){o!==t-1&&(i=e.substr(o+1));break}if(s=e.charCodeAt(++o),K(Ki,s)){let u=o-1,c=se(e,u);o=c-1,i+=je(e.substring(u+1,c));}else s===13&&e.charCodeAt(o+1)===10&&o++;}else i+=e[o];}return i}function Qi(e){let t=\"\",r=false;for(let n=0;n<e.length;n++){let i=e.charCodeAt(n);if(i===0){t+=\"\\uFFFD\";continue}if(i<=31||i===127){t+=\"\\\\\"+i.toString(16),r=true;continue}i===km||i===Ki||i===wm||i===vm||i===Sm||i===sa?(t+=\"\\\\\"+e.charAt(n),r=false):(r&&J(i)&&(t+=\" \"),t+=e.charAt(n),r=false);}return \"url(\"+t+\")\"}var Cm=\"Url\",Tm={value:String};function $i(){let e=this.tokenStart,t;switch(this.tokenType){case 7:t=Vi(this.consume(7));break;case 2:this.cmpStr(this.tokenStart,this.tokenEnd,\"url(\")||this.error(\"Function name must be `url`\"),this.eat(2),this.skipSC(),t=vt(this.consume(5)),this.skipSC(),this.eof||this.eat(22);break;default:this.error(\"Url or Function is expected\");}return {type:\"Url\",loc:this.getLocation(e,this.tokenStart),value:t}}function Am(e){this.token(7,Qi(e.value));}var eo={};f(eo,{generate:()=>zm,name:()=>Lm,parse:()=>Ji,structure:()=>Em});var Lm=\"Value\",Em={children:[[]]};function Ji(){let e=this.tokenStart,t=this.readSequence(this.scope.Value);return {type:\"Value\",loc:this.getLocation(e,this.tokenStart),children:t}}function zm(e){this.children(e);}var ro={};f(ro,{generate:()=>Nm,name:()=>Im,parse:()=>to,structure:()=>Dm});var Pm=Object.freeze({type:\"WhiteSpace\",loc:null,value:\" \"}),Im=\"WhiteSpace\",Dm={value:String};function to(){return this.eat(13),Pm}function Nm(e){this.token(13,e.value);}var aa={generic:true,cssWideKeywords:Ve,...Bs,node:Ct};var no={};f(no,{AtrulePrelude:()=>ca,Selector:()=>pa,Value:()=>fa});var Om=35,Rm=42,la=43,Fm=45,Mm=47,Bm=117;function Tt(e){switch(this.tokenType){case 4:return this.Hash();case 18:return this.Operator();case 21:return this.Parentheses(this.readSequence,e.recognizer);case 19:return this.Brackets(this.readSequence,e.recognizer);case 5:return this.String();case 12:return this.Dimension();case 11:return this.Percentage();case 10:return this.Number();case 2:return this.cmpStr(this.tokenStart,this.tokenEnd,\"url(\")?this.Url():this.Function(this.readSequence,e.recognizer);case 7:return this.Url();case 1:return this.cmpChar(this.tokenStart,Bm)&&this.cmpChar(this.tokenStart+1,la)?this.UnicodeRange():this.Identifier();case 9:{let t=this.charCodeAt(this.tokenStart);if(t===Mm||t===Rm||t===la||t===Fm)return this.Operator();t===Om&&this.error(\"Hex or identifier is expected\",this.tokenStart+1);break}}}var ca={getNode:Tt};var _m=35,Wm=38,qm=42,jm=43,Um=47,ua=46,Hm=62,Gm=124,Ym=126;function Km(e,t){t.last!==null&&t.last.type!==\"Combinator\"&&e!==null&&e.type!==\"Combinator\"&&t.push({type:\"Combinator\",loc:null,name:\" \"});}function Vm(){switch(this.tokenType){case 19:return this.AttributeSelector();case 4:return this.IdSelector();case 16:return this.lookupType(1)===16?this.PseudoElementSelector():this.PseudoClassSelector();case 1:return this.TypeSelector();case 10:case 11:return this.Percentage();case 12:this.charCodeAt(this.tokenStart)===ua&&this.error(\"Identifier is expected\",this.tokenStart+1);break;case 9:{switch(this.charCodeAt(this.tokenStart)){case jm:case Hm:case Ym:case Um:return this.Combinator();case ua:return this.ClassSelector();case qm:case Gm:return this.TypeSelector();case _m:return this.IdSelector();case Wm:return this.NestingSelector()}break}}}var pa={onWhiteSpace:Km,getNode:Vm};function ha(){return this.createSingleNodeList(this.Raw(null,false))}function ma(){let e=this.createList();if(this.skipSC(),e.push(this.Identifier()),this.skipSC(),this.tokenType===18){e.push(this.Operator());let t=this.tokenIndex,r=this.parseCustomProperty?this.Value(null):this.Raw(this.consumeUntilExclamationMarkOrSemicolon,false);if(r.type===\"Value\"&&r.children.isEmpty){for(let n=t-this.tokenIndex;n<=0;n++)if(this.lookupType(n)===13){r.children.appendData({type:\"WhiteSpace\",loc:null,value:\" \"});break}}e.push(r);}return e}function da(e){return e!==null&&e.type===\"Operator\"&&(e.value[e.value.length-1]===\"-\"||e.value[e.value.length-1]===\"+\")}var fa={getNode:Tt,onWhiteSpace(e,t){da(e)&&(e.value=\" \"+e.value),da(t.last)&&(t.last.value+=\" \");},expression:ha,var:ma};var Qm=new Set([\"none\",\"and\",\"not\",\"or\"]),ga={parse:{prelude(){let e=this.createList();if(this.tokenType===1){let t=this.substring(this.tokenStart,this.tokenEnd);Qm.has(t.toLowerCase())||e.push(this.Identifier());}return e.push(this.Condition(\"container\")),e},block(e=false){return this.Block(e)}}};var ba={parse:{prelude:null,block(){return this.Block(true)}}};function io(e,t){return this.parseWithFallback(()=>{try{return e.call(this)}finally{this.skipSC(),this.lookupNonWSType(0)!==22&&this.error();}},t||(()=>this.Raw(null,true)))}var xa={layer(){this.skipSC();let e=this.createList(),t=io.call(this,this.Layer);return (t.type!==\"Raw\"||t.value!==\"\")&&e.push(t),e},supports(){this.skipSC();let e=this.createList(),t=io.call(this,this.Declaration,()=>io.call(this,()=>this.Condition(\"supports\")));return (t.type!==\"Raw\"||t.value!==\"\")&&e.push(t),e}},ya={parse:{prelude(){let e=this.createList();switch(this.tokenType){case 5:e.push(this.String());break;case 7:case 2:e.push(this.Url());break;default:this.error(\"String or url() is expected\");}return this.skipSC(),this.tokenType===1&&this.cmpStr(this.tokenStart,this.tokenEnd,\"layer\")?e.push(this.Identifier()):this.tokenType===2&&this.cmpStr(this.tokenStart,this.tokenEnd,\"layer(\")&&e.push(this.Function(null,xa)),this.skipSC(),this.tokenType===2&&this.cmpStr(this.tokenStart,this.tokenEnd,\"supports(\")&&e.push(this.Function(null,xa)),(this.lookupNonWSType(0)===1||this.lookupNonWSType(0)===21)&&e.push(this.MediaQueryList()),e},block:null}};var ka={parse:{prelude(){return this.createSingleNodeList(this.LayerList())},block(){return this.Block(false)}}};var wa={parse:{prelude(){return this.createSingleNodeList(this.MediaQueryList())},block(e=false){return this.Block(e)}}};var va={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(true)}}};var Sa={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(true)}}};var Ca={parse:{prelude(){return this.createSingleNodeList(this.Scope())},block(e=false){return this.Block(e)}}};var Ta={parse:{prelude:null,block(e=false){return this.Block(e)}}};var Aa={parse:{prelude(){return this.createSingleNodeList(this.Condition(\"supports\"))},block(e=false){return this.Block(e)}}};var La={container:ga,\"font-face\":ba,import:ya,layer:ka,media:wa,nest:va,page:Sa,scope:Ca,\"starting-style\":Ta,supports:Aa};function Ea(){let e=this.createList();this.skipSC();e:for(;!this.eof;){switch(this.tokenType){case 1:e.push(this.Identifier());break;case 5:e.push(this.String());break;case 18:e.push(this.Operator());break;case 22:break e;default:this.error(\"Identifier, string or comma is expected\");}this.skipSC();}return e}var Fe={parse(){return this.createSingleNodeList(this.SelectorList())}},oo={parse(){return this.createSingleNodeList(this.Selector())}},Xm={parse(){return this.createSingleNodeList(this.Identifier())}},$m={parse:Ea},ir={parse(){return this.createSingleNodeList(this.Nth())}},za={dir:Xm,has:Fe,lang:$m,matches:Fe,is:Fe,\"-moz-any\":Fe,\"-webkit-any\":Fe,where:Fe,not:Fe,\"nth-child\":ir,\"nth-last-child\":ir,\"nth-last-of-type\":ir,\"nth-of-type\":ir,slotted:oo,host:oo,\"host-context\":oo};var so={};f(so,{AnPlusB:()=>en,Atrule:()=>rn,AtrulePrelude:()=>on,AttributeSelector:()=>ln,Block:()=>un,Brackets:()=>hn,CDC:()=>dn,CDO:()=>gn,ClassSelector:()=>xn,Combinator:()=>kn,Comment:()=>vn,Condition:()=>Cn,Declaration:()=>An,DeclarationList:()=>zn,Dimension:()=>In,Feature:()=>Nn,FeatureFunction:()=>Rn,FeatureRange:()=>Bn,Function:()=>Wn,GeneralEnclosed:()=>jn,Hash:()=>Hn,IdSelector:()=>Vn,Identifier:()=>Yn,Layer:()=>Xn,LayerList:()=>Zn,MediaQuery:()=>ei,MediaQueryList:()=>ri,NestingSelector:()=>ii,Nth:()=>si,Number:()=>li,Operator:()=>ui,Parentheses:()=>hi,Percentage:()=>di,PseudoClassSelector:()=>gi,PseudoElementSelector:()=>xi,Ratio:()=>ki,Raw:()=>vi,Rule:()=>Ci,Scope:()=>Ai,Selector:()=>Ei,SelectorList:()=>Pi,String:()=>Ri,StyleSheet:()=>Mi,SupportsDeclaration:()=>_i,TypeSelector:()=>ji,UnicodeRange:()=>Gi,Url:()=>$i,Value:()=>Ji,WhiteSpace:()=>to});var Pa={parseContext:{default:\"StyleSheet\",stylesheet:\"StyleSheet\",atrule:\"Atrule\",atrulePrelude(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:\"MediaQueryList\",mediaQuery:\"MediaQuery\",condition(e){return this.Condition(e.kind)},rule:\"Rule\",selectorList:\"SelectorList\",selector:\"Selector\",block(){return this.Block(true)},declarationList:\"DeclarationList\",declaration:\"Declaration\",value:\"Value\"},features:{supports:{selector(){return this.Selector()}},container:{style(){return this.Declaration()}}},scope:no,atrule:La,pseudo:za,node:so};var Ia={node:Ct};var Da=Zr({...aa,...Pa,...Ia});var Oa={};f(Oa,{decode:()=>Zm,encode:()=>Jm});var Na=92;function Zm(e){let t=e.length-1,r=\"\";for(let n=0;n<e.length;n++){let i=e.charCodeAt(n);if(i===Na){if(n===t)break;if(i=e.charCodeAt(++n),K(Na,i)){let o=n-1,s=se(e,o);n=s-1,r+=je(e.substring(o+1,s));}else i===13&&e.charCodeAt(n+1)===10&&n++;}else r+=e[n];}return r}function Jm(e){let t=\"\";if(e.length===1&&e.charCodeAt(0)===45)return \"\\\\-\";for(let r=0;r<e.length;r++){let n=e.charCodeAt(r);if(n===0){t+=\"\\uFFFD\";continue}if(n<=31||n===127||n>=48&&n<=57&&(r===0||r===1&&e.charCodeAt(0)===45)){t+=\"\\\\\"+n.toString(16)+\" \";continue}_e(n)?t+=e.charAt(r):t+=\"\\\\\"+e.charAt(r);}return t}var{tokenize:$b,parse:Zb,generate:Jb,lexer:ex,createLexer:tx,walk:rx,find:nx,findLast:ix,findAll:ox,toPlainObject:sx,fromPlainObject:ax,fork:lx}=Da;\n\n\t// deno-lint-ignore-file no-control-regex\n\n\n\t// 1. Let input be the value passed to this algorithm.\n\tfunction parse$2(input) {\n\n\t\t// UTILITY FUNCTIONS\n\n\t\t// Manual is faster than RegEx\n\t\t// http://bjorn.tipling.com/state-and-regular-expressions-in-javascript\n\t\t// http://jsperf.com/whitespace-character/5\n\t\tfunction isSpace(c) {\n\t\t\treturn (c === \"\\u0020\" || // space\n\t\t\t\tc === \"\\u0009\" || // horizontal tab\n\t\t\t\tc === \"\\u000A\" || // new line\n\t\t\t\tc === \"\\u000C\" || // form feed\n\t\t\t\tc === \"\\u000D\");  // carriage return\n\t\t}\n\n\t\tfunction collectCharacters(regEx) {\n\t\t\tlet chars;\n\t\t\tconst match = regEx.exec(input.substring(pos));\n\t\t\tif (match) {\n\t\t\t\tchars = match[0];\n\t\t\t\tpos += chars.length;\n\t\t\t\treturn chars;\n\t\t\t}\n\t\t}\n\n\t\tconst inputLength = input.length;\n\n\t\t// (Don\"t use \\s, to avoid matching non-breaking space)\n\t\t/* eslint-disable no-control-regex */\n\t\tconst regexLeadingSpaces = /^[ \\t\\n\\r\\u000c]+/;\n\t\tconst regexLeadingCommasOrSpaces = /^[, \\t\\n\\r\\u000c]+/;\n\t\tconst regexLeadingNotSpaces = /^[^ \\t\\n\\r\\u000c]+/;\n\t\tconst regexTrailingCommas = /[,]+$/;\n\t\tconst regexNonNegativeInteger = /^\\d+$/;\n\t\t/* eslint-enable no-control-regex */\n\n\t\t// ( Positive or negative or unsigned integers or decimals, without or without exponents.\n\t\t// Must include at least one digit.\n\t\t// According to spec tests any decimal point must be followed by a digit.\n\t\t// No leading plus sign is allowed.)\n\t\t// https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number\n\t\tconst regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;\n\n\t\tlet url, descriptors, currentDescriptor, state, c,\n\t\t\t// 2. Let position be a pointer into input, initially pointing at the start\n\t\t\t//    of the string.\n\t\t\tpos = 0;\n\t\t// 3. Let candidates be an initially empty source set.\n\t\tconst candidates = [];\n\n\t\t// 4. Splitting loop: Collect a sequence of characters that are space\n\t\t//    characters or U+002C COMMA characters. If any U+002C COMMA characters\n\t\t//    were collected, that is a parse error.\t\t\n\t\twhile (true) {\n\t\t\tcollectCharacters(regexLeadingCommasOrSpaces);\n\n\t\t\t// 5. If position is past the end of input, return candidates and abort these steps.\n\t\t\tif (pos >= inputLength) {\n\t\t\t\treturn candidates; // (we\"re done, this is the sole return path)\n\t\t\t}\n\n\t\t\t// 6. Collect a sequence of characters that are not space characters,\n\t\t\t//    and let that be url.\n\t\t\turl = collectCharacters(regexLeadingNotSpaces);\n\n\t\t\t// 7. Let descriptors be a new empty list.\n\t\t\tdescriptors = [];\n\n\t\t\t// 8. If url ends with a U+002C COMMA character (,), follow these substeps:\n\t\t\t//\t\t(1). Remove all trailing U+002C COMMA characters from url. If this removed\n\t\t\t//         more than one character, that is a parse error.\n\t\t\tif (url.slice(-1) === \",\") {\n\t\t\t\turl = url.replace(regexTrailingCommas, \"\");\n\t\t\t\t// (Jump ahead to step 9 to skip tokenization and just push the candidate).\n\t\t\t\tparseDescriptors();\n\n\t\t\t\t//\tOtherwise, follow these substeps:\n\t\t\t} else {\n\t\t\t\ttokenize();\n\t\t\t} // (close else of step 8)\n\n\t\t\t// 16. Return to the step labeled splitting loop.\n\t\t} // (Close of big while loop.)\n\n\t\t/**\n\t\t * Tokenizes descriptor properties prior to parsing\n\t\t * Returns undefined.\n\t\t */\n\t\tfunction tokenize() {\n\n\t\t\t// 8.1. Descriptor tokeniser: Skip whitespace\n\t\t\tcollectCharacters(regexLeadingSpaces);\n\n\t\t\t// 8.2. Let current descriptor be the empty string.\n\t\t\tcurrentDescriptor = \"\";\n\n\t\t\t// 8.3. Let state be in descriptor.\n\t\t\tstate = \"in descriptor\";\n\n\t\t\twhile (true) {\n\n\t\t\t\t// 8.4. Let c be the character at position.\n\t\t\t\tc = input.charAt(pos);\n\n\t\t\t\t//  Do the following depending on the value of state.\n\t\t\t\t//  For the purpose of this step, \"EOF\" is a special character representing\n\t\t\t\t//  that position is past the end of input.\n\n\t\t\t\t// In descriptor\n\t\t\t\tif (state === \"in descriptor\") {\n\t\t\t\t\t// Do the following, depending on the value of c:\n\n\t\t\t\t\t// Space character\n\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t// descriptors and let current descriptor be the empty string.\n\t\t\t\t\t// Set state to after descriptor.\n\t\t\t\t\tif (isSpace(c)) {\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t\tcurrentDescriptor = \"\";\n\t\t\t\t\t\t\tstate = \"after descriptor\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// U+002C COMMA (,)\n\t\t\t\t\t\t// Advance position to the next character in input. If current descriptor\n\t\t\t\t\t\t// is not empty, append current descriptor to descriptors. Jump to the step\n\t\t\t\t\t\t// labeled descriptor parser.\n\t\t\t\t\t} else if (c === \",\") {\n\t\t\t\t\t\tpos += 1;\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// U+0028 LEFT PARENTHESIS (()\n\t\t\t\t\t\t// Append c to current descriptor. Set state to in parens.\n\t\t\t\t\t} else if (c === \"\\u0028\") {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t\tstate = \"in parens\";\n\n\t\t\t\t\t\t// EOF\n\t\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t\t// descriptors. Jump to the step labeled descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t}\n\t\t\t\t\t// (end \"in descriptor\"\n\n\t\t\t\t\t// In parens\n\t\t\t\t} else if (state === \"in parens\") {\n\n\t\t\t\t\t// U+0029 RIGHT PARENTHESIS ())\n\t\t\t\t\t// Append c to current descriptor. Set state to in descriptor.\n\t\t\t\t\tif (c === \")\") {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t\tstate = \"in descriptor\";\n\n\t\t\t\t\t\t// EOF\n\t\t\t\t\t\t// Append current descriptor to descriptors. Jump to the step labeled\n\t\t\t\t\t\t// descriptor parser.\n\t\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\t}\n\n\t\t\t\t\t// After descriptor\n\t\t\t\t} else if (state === \"after descriptor\") {\n\n\t\t\t\t\t// Do the following, depending on the value of c:\n\t\t\t\t\t// Space character: Stay in this state.\n\t\t\t\t\tif (isSpace(c)) ; else if (c === \"\") {\n\t\t\t\t\t\tparseDescriptors();\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t// Anything else\n\t\t\t\t\t\t// Set state to in descriptor. Set position to the previous character in input.\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstate = \"in descriptor\";\n\t\t\t\t\t\tpos -= 1;\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Advance position to the next character in input.\n\t\t\t\tpos += 1;\n\n\t\t\t\t// Repeat this step.\n\t\t\t} // (close while true loop)\n\t\t}\n\n\t\t/**\n\t\t * Adds descriptor properties to a candidate, pushes to the candidates array\n\t\t * @return undefined\n\t\t */\n\t\t// Declared outside of the while loop so that it\"s only created once.\n\t\tfunction parseDescriptors() {\n\n\t\t\t// 9. Descriptor parser: Let error be no.\n\t\t\tlet pError = false,\n\n\t\t\t\t// 10. Let width be absent.\n\t\t\t\t// 11. Let density be absent.\n\t\t\t\t// 12. Let future-compat-h be absent. (We\"re implementing it now as h)\n\t\t\t\tw, d, h, i,\n\t\t\t\tdesc, lastChar, value, intVal, floatVal;\n\t\t\tconst candidate = {};\n\n\t\t\t// 13. For each descriptor in descriptors, run the appropriate set of steps\n\t\t\t// from the following list:\n\t\t\tfor (i = 0; i < descriptors.length; i++) {\n\t\t\t\tdesc = descriptors[i];\n\n\t\t\t\tlastChar = desc[desc.length - 1];\n\t\t\t\tvalue = desc.substring(0, desc.length - 1);\n\t\t\t\tintVal = parseInt(value, 10);\n\t\t\t\tfloatVal = parseFloat(value);\n\n\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t// a U+0077 LATIN SMALL LETTER W character\n\t\t\t\tif (regexNonNegativeInteger.test(value) && (lastChar === \"w\")) {\n\n\t\t\t\t\t// If width and density are not both absent, then let error be yes.\n\t\t\t\t\tif (w || d) { pError = true; }\n\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t\t// If the result is zero, let error be yes.\n\t\t\t\t\t// Otherwise, let width be the result.\n\t\t\t\t\tif (intVal === 0) { pError = true; } else { w = intVal; }\n\n\t\t\t\t\t// If the descriptor consists of a valid floating-point number followed by\n\t\t\t\t\t// a U+0078 LATIN SMALL LETTER X character\n\t\t\t\t} else if (regexFloatingPoint.test(value) && (lastChar === \"x\")) {\n\n\t\t\t\t\t// If width, density and future-compat-h are not all absent, then let error\n\t\t\t\t\t// be yes.\n\t\t\t\t\tif (w || d || h) { pError = true; }\n\n\t\t\t\t\t// Apply the rules for parsing floating-point number values to the descriptor.\n\t\t\t\t\t// If the result is less than zero, let error be yes. Otherwise, let density\n\t\t\t\t\t// be the result.\n\t\t\t\t\tif (floatVal < 0) { pError = true; } else { d = floatVal; }\n\n\t\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t\t// a U+0068 LATIN SMALL LETTER H character\n\t\t\t\t} else if (regexNonNegativeInteger.test(value) && (lastChar === \"h\")) {\n\n\t\t\t\t\t// If height and density are not both absent, then let error be yes.\n\t\t\t\t\tif (h || d) { pError = true; }\n\n\t\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t\t// If the result is zero, let error be yes. Otherwise, let future-compat-h\n\t\t\t\t\t// be the result.\n\t\t\t\t\tif (intVal === 0) { pError = true; } else { h = intVal; }\n\n\t\t\t\t\t// Anything else, Let error be yes.\n\t\t\t\t} else { pError = true; }\n\t\t\t} // (close step 13 for loop)\n\n\t\t\t// 15. If error is still no, then append a new image source to candidates whose\n\t\t\t// URL is url, associated with a width width if not absent and a pixel\n\t\t\t// density density if not absent. Otherwise, there is a parse error.\n\t\t\tif (!pError) {\n\t\t\t\tcandidate.url = url;\n\t\t\t\tif (w) { candidate.w = w; }\n\t\t\t\tif (d) { candidate.d = d; }\n\t\t\t\tif (h) { candidate.h = h; }\n\t\t\t\tcandidates.push(candidate);\n\t\t\t} else if (console && console.log) {  // eslint-disable-line no-console\n\t\t\t\tconsole.log(\"Invalid srcset descriptor found in \\\"\" + input + \"\\\" at \\\"\" + desc + \"\\\".\"); // eslint-disable-line no-console\n\t\t\t}\n\t\t} // (close parseDescriptors fn)\n\n\t}\n\n\tfunction serialize(srcset) {\n\t\treturn srcset.map(function (candidate) {\n\t\t\tlet descriptor = \"\";\n\t\t\tif (candidate.w) {\n\t\t\t\tdescriptor += candidate.w + \"w\";\n\t\t\t}\n\t\t\tif (candidate.h) {\n\t\t\t\tdescriptor += candidate.h + \"h\";\n\t\t\t}\n\t\t\tif (candidate.d) {\n\t\t\t\tdescriptor += candidate.d + \"x\";\n\t\t\t}\n\t\t\treturn candidate.url + (descriptor ? \" \" + descriptor : \"\");\n\t\t}).join(\", \");\n\t}\n\n\t/* global URL */\n\n\n\tconst BASE64_ENCODING$1 = \"base64\";\n\tconst HREF_ATTRIBUTE = \"href\";\n\tconst SRC_ATTRIBUTE = \"src\";\n\tconst TITLE_ATTRIBUTE = \"title\";\n\tconst SRCSET_ATTRIBUTE = \"srcset\";\n\tconst SRCDOC_ATTRIBUTE = \"srcdoc\";\n\tconst CONTENT_ATTRIBUTE$1 = \"content\";\n\tconst STYLE_ATTRIBUTE = \"style\";\n\tconst MEDIA_ATTRIBUTE = \"media\";\n\tconst BACKGROUND_ATTRIBUTE = \"background\";\n\tconst REL_ATTRIBUTE = \"rel\";\n\tconst DATA_ATTRIBUTE = \"data\";\n\tconst TYPE_ATTRIBUTE = \"type\";\n\tconst PING_ATTRIBUTE = \"ping\";\n\tconst HTTP_EQUIV_ATTRIBUTE$1 = \"http-equiv\";\n\tconst INTEGRITY_ATTRIBUTE = \"integrity\";\n\tconst CHARSET_ATTRIBUTE$1 = \"charset\";\n\tconst SHADOWMODE_ATTRIBUTE = \"shadowmode\";\n\tconst SHADOWROOTMODE_ATTRIBUTE = \"shadowrootmode\";\n\tconst SIZES_ATTRIBUTE = \"sizes\";\n\tconst STYLESHEET_CONTENT_TYPE = \"text/css\";\n\tconst CID_PROTOCOL = \"cid:\";\n\tconst DATA_PROTOCOL = \"data:\";\n\tconst HTTP_PROTOCOL = \"http:\";\n\tconst HTTPS_PROTOCOL = \"https:\";\n\tconst URN_PROTOCOL = \"urn:\";\n\tconst AT_RULE$1 = \"Atrule\";\n\tconst IMPORT_RULE = \"import\";\n\tconst URL_FUNCTION = \"Url\";\n\tconst STYLESHEET_CONTEXT = \"stylesheet\";\n\tconst DECLARATION_LIST_CONTEXT = \"declarationList\";\n\tconst BASE_TAG = \"BASE\";\n\tconst LINK_TAG = \"LINK\";\n\tconst STYLE_TAG = \"STYLE\";\n\tconst IMG_TAG = \"IMG\";\n\tconst AUDIO_TAG = \"AUDIO\";\n\tconst VIDEO_TAG = \"VIDEO\";\n\tconst SOURCE_TAG = \"SOURCE\";\n\tconst SCRIPT_TAG = \"SCRIPT\";\n\tconst BODY_TAG = \"BODY\";\n\tconst TABLE_TAG = \"TABLE\";\n\tconst TD_TAG = \"TD\";\n\tconst TH_TAG = \"TH\";\n\tconst INPUT_TAG = \"INPUT\";\n\tconst IFRAME_TAG = \"IFRAME\";\n\tconst FRAME_TAG = \"FRAME\";\n\tconst EMBED_TAG = \"EMBED\";\n\tconst OBJECT_TAG = \"OBJECT\";\n\tconst A_TAG = \"A\";\n\tconst AREA_TAG = \"AREA\";\n\tconst META_TAG$1 = \"META\";\n\tconst TEMPLATE_TAG = \"TEMPLATE\";\n\tconst HEAD_TAG = \"HEAD\";\n\tconst TITLE_TAG = \"TITLE\";\n\tconst ORIGINAL_URL_FUNCTION_NAME = \"--mhtml-to-html-url\";\n\tconst ORIGINAL_URL_ATTRIBUTE_PREFIX = \"data-original-\";\n\tconst CONTENT_TYPE_HEADER$1 = \"Content-Type\";\n\tconst REL_ATTRIBUTE_STYLESHEET = \"stylesheet\";\n\tconst REL_ATTRIBUTE_ICON = \"icon\";\n\tconst REL_ATTRIBUTE_CANONICAL = \"canonical\";\n\tconst REL_ATTRIBUTE_ALTERNATE = \"alternate\";\n\tconst HTTP_EQUIV_ATTRIBUTE_REFRESH = \"refresh\";\n\tconst HTTP_EQUIV_ATTRIBUTE_CSP = \"content-security-policy\";\n\tconst TYPE_ATTRIBUTE_IMAGE = \"image\";\n\tconst REL_REMOVED_VALUES_REGEXP = /(preconnect|prerender|dns-prefetch|preload|prefetch|manifest|modulepreload)/gi;\n\tconst URN_ERROR_REGEXP = /^urn:[^:]+:(.+)$/;\n\tconst APPLICATION_OCTET_STREAM_CONTENT_TYPE = \"application/octet-stream\";\n\tconst JSON_LD_CONTENT_TYPE = \"application/ld+json\";\n\tconst TEXT_HTML_CONTENT_TYPE = \"text/html\";\n\tconst UTF8_CHARSET$1 = \"utf-8\";\n\tconst INDEX_PAGE_NOT_FOUND_ERROR = \"Index page not found\";\n\tconst CID_REGEXP = /^<.+>$/;\n\tconst CONTENT_TYPE_SEPARATOR = \";\";\n\tconst DATA_URI_PAYLOAD_SEPARATOR = \",\";\n\tconst EMPTY_STRING = \"\";\n\tconst ORIGINAL_URL_FUNCTION_REGEXP = /url\\(--mhtml-to-html-url\\\\\\(\\\\\"(.*?)\\\\\"\\\\\\)\\\\ /g;\n\tconst ORIGINAL_URL_COMMENT = \"/* original URL: $1 */ url(\";\n\tconst DEFAULT_CSP = \"default-src 'none'; connect-src 'self' data:; font-src 'self' data:; img-src 'self' data:; style-src 'self' 'unsafe-inline' data:; frame-src 'self' data:; media-src 'self' data:; object-src 'self' data:; \";\n\tconst JS_ENABLED_CSP = \"script-src 'self' 'unsafe-inline' data:;\";\n\tconst JS_DISABLED_CSP = \"script-src 'none';\";\n\tconst CSS_FUNCTION_PARENTHESIS_START = \"(\";\n\tconst CSS_FUNCTION_PARENTHESIS_END = \") \";\n\tconst SUBJECT_HEADER = \"Subject\";\n\tconst DATE_HEADER = \"Date\";\n\tconst FROM_HEADER = \"From\";\n\tconst JSON_LD_PAGE_INFO = {\n\t    \"@context\": \"https://schema.org\",\n\t    \"@type\": \"WebPage\",\n\t    \"additionalProperty\": {\n\t        \"@type\": \"PropertyValue\",\n\t        \"name\": \"savedBy\"\n\t    }\n\t};\n\n\tasync function fetchAndConvert(mhtml, config, failedResources = []) {\n\t    if (config.fetchMissingResources) {\n\t        let { fetch } = config;\n\t        let missingResources = [];\n\t        if (!fetch) {\n\t            fetch = globalThis.fetch;\n\t        }\n\t        missingResources = convert$1(mhtml, config);\n\t        missingResources = missingResources.filter(resource => !failedResources.includes(resource.id));\n\t        if (missingResources.length) {\n\t            await Promise.all(missingResources.map(async resource => {\n\t                const { id, transferEncoding } = resource;\n\t                let url = id;\n\t                const urnErrorMatch = url.match(URN_ERROR_REGEXP);\n\t                if (urnErrorMatch) {\n\t                    url = urnErrorMatch[1];\n\t                }\n\t                try {\n\t                    const response = await fetch(url);\n\t                    if (response.ok) {\n\t                        resource.contentType = response.headers.get(CONTENT_TYPE_HEADER$1) || APPLICATION_OCTET_STREAM_CONTENT_TYPE;\n\t                        if (transferEncoding === BASE64_ENCODING$1) {\n\t                            const bytes = await response.bytes();\n\t                            resource.data = decodeBinary(bytes);\n\t                        } else {\n\t                            resource.data = await response.text();\n\t                        }\n\t                        mhtml.resources[id] = resource;\n\t                    } else if (!failedResources.includes(id)) {\n\t                        failedResources.push(id);\n\t                    }\n\t                    // eslint-disable-next-line no-unused-vars\n\t                } catch (_) {\n\t                    if (!failedResources.includes(id)) {\n\t                        failedResources.push(id);\n\t                    }\n\t                }\n\t            }));\n\t            return fetchAndConvert(mhtml, config, failedResources);\n\t        } else {\n\t            return convert$1(mhtml, { ...config, fetchMissingResources: false });\n\t        }\n\t    } else {\n\t        return convert$1(mhtml, config);\n\t    }\n\t}\n\n\tfunction convert$1({ headers, frames, resources, unfoundResources = new Set(), index, id }, { DOMParser, enableScripts, fetchMissingResources } = { DOMParser: globalThis.DOMParser }) {\n\t    let resource = resources[index];\n\t    if (!resource) {\n\t        throw new Error(INDEX_PAGE_NOT_FOUND_ERROR);\n\t    }\n\t    let base = resource.id;\n\t    if (resource.transferEncoding === BASE64_ENCODING$1) {\n\t        resource.transferEncoding = undefined;\n\t        resource.data = decodeBase64(resource.data, getCharset(resource.contentType));\n\t    }\n\t    const contentType = resource.contentType.split(CONTENT_TYPE_SEPARATOR)[0];\n\t    const dom = parseDOM(resource.data, contentType, DOMParser);\n\t    const document = dom.document;\n\t    let nodes = [document];\n\t    const baseElement = document.getElementsByTagName(BASE_TAG)[0];\n\t    if (baseElement) {\n\t        const href = baseElement.getAttribute(HREF_ATTRIBUTE);\n\t        if (href) {\n\t            base = resolvePath(href, base);\n\t        }\n\t        baseElement.remove();\n\t    }\n\t    if (!fetchMissingResources) {\n\t        resource.used = true;\n\t    }\n\t    nodes = [document];\n\t    let canonicalLinkElement;\n\t    const stylesheets = {};\n\t    const missingResources = [];\n\t    const removedNodes = [];\n\t    const favicons = [];\n\t    let title;\n\t    while (nodes.length) {\n\t        const childNode = nodes.shift();\n\t        if (childNode.childNodes) {\n\t            for (const child of childNode.childNodes) {\n\t                let href, src;\n\t                if (child.getAttribute) {\n\t                    href = child.getAttribute(HREF_ATTRIBUTE);\n\t                    if (href) {\n\t                        href = resolvePath(href, base);\n\t                    }\n\t                    src = child.getAttribute(SRC_ATTRIBUTE);\n\t                    if (src) {\n\t                        src = resolvePath(src, base);\n\t                    }\n\t                    const style = child.getAttribute(STYLE_ATTRIBUTE);\n\t                    if (style) {\n\t                        const declarations = replaceStylesheetUrls(resources, base, { data: style }, { context: DECLARATION_LIST_CONTEXT }, stylesheets, fetchMissingResources && missingResources, unfoundResources);\n\t                        if (!fetchMissingResources) {\n\t                            child.setAttribute(STYLE_ATTRIBUTE, declarations);\n\t                        }\n\t                    }\n\t                    const integrity = child.getAttribute(INTEGRITY_ATTRIBUTE);\n\t                    if (integrity) {\n\t                        child.removeAttribute(INTEGRITY_ATTRIBUTE);\n\t                    }\n\t                }\n\t                if (!enableScripts && child.removeAttribute) {\n\t                    EVENT_HANDLER_ATTRIBUTES.forEach(attribute => child.removeAttribute(attribute));\n\t                }\n\t                if (child.tagName && child.tagName.toUpperCase() === LINK_TAG && href) {\n\t                    let rel = child.getAttribute(REL_ATTRIBUTE);\n\t                    if (rel) {\n\t                        rel = rel.toLowerCase();\n\t                        if (rel === REL_ATTRIBUTE_STYLESHEET) {\n\t                            resource = getResource(resources, href, child.getAttribute(HREF_ATTRIBUTE));\n\t                            if (resource) {\n\t                                let base = resource.id;\n\t                                if (base.startsWith(CID_PROTOCOL)) {\n\t                                    if (index.match(CID_REGEXP)) {\n\t                                        base = id;\n\t                                    } else {\n\t                                        base = index;\n\t                                    }\n\t                                }\n\t                                const stylesheet = replaceStylesheetUrls(resources, base, resource, { context: STYLESHEET_CONTEXT }, stylesheets, fetchMissingResources && missingResources, unfoundResources);\n\t                                if (!fetchMissingResources) {\n\t                                    const styleElement = document.createElement(STYLE_TAG);\n\t                                    styleElement.type = STYLESHEET_CONTENT_TYPE;\n\t                                    const media = child.getAttribute(MEDIA_ATTRIBUTE);\n\t                                    if (media) {\n\t                                        styleElement.setAttribute(MEDIA_ATTRIBUTE, media);\n\t                                    }\n\t                                    resource.used = true;\n\t                                    resource.data = stylesheet;\n\t                                    if (!href.startsWith(DATA_PROTOCOL)) {\n\t                                        styleElement.setAttribute(ORIGINAL_URL_ATTRIBUTE_PREFIX + HREF_ATTRIBUTE, href);\n\t                                    }\n\t                                    styleElement.appendChild(document.createTextNode(resource.data));\n\t                                    child.replaceWith(styleElement);\n\t                                }\n\t                            } else if (fetchMissingResources) {\n\t                                addMissingResource(missingResources, href);\n\t                            } else {\n\t                                unfoundResources.add(href);\n\t                                setAttribute(child, HREF_ATTRIBUTE, href);\n\t                            }\n\t                            if (!fetchMissingResources) {\n\t                                const title = child.getAttribute(TITLE_ATTRIBUTE);\n\t                                if (title && rel.includes(REL_ATTRIBUTE_ALTERNATE)) {\n\t                                    removedNodes.push(child);\n\t                                }\n\t                            }\n\t                        } else if (rel.includes(REL_ATTRIBUTE_ICON)) {\n\t                            resource = getResource(resources, href, child.getAttribute(HREF_ATTRIBUTE));\n\t                            const media = child.getAttribute(MEDIA_ATTRIBUTE);\n\t                            const type = child.getAttribute(TYPE_ATTRIBUTE);\n\t                            const sizes = child.getAttribute(SIZES_ATTRIBUTE);\n\t                            if (resource) {\n\t                                if (!fetchMissingResources) {\n\t                                    resource.used = true;\n\t                                    const resourceURI = getResourceURI(resource);\n\t                                    setAttribute(child, HREF_ATTRIBUTE, resourceURI);\n\t                                    favicons.push({ href: resourceURI, media, type, sizes, originalHref: href });\n\t                                }\n\t                            } else if (fetchMissingResources) {\n\t                                addMissingResource(missingResources, href, BASE64_ENCODING$1);\n\t                            } else {\n\t                                unfoundResources.add(href);\n\t                                setAttribute(child, HREF_ATTRIBUTE, href);\n\t                                favicons.push({ href, media, type, sizes });\n\t                            }\n\t                        } else if (rel == REL_ATTRIBUTE_CANONICAL && !fetchMissingResources) {\n\t                            canonicalLinkElement = child;\n\t                        }\n\t                        if (!fetchMissingResources) {\n\t                            const relValue = rel\n\t                                .replace(REL_REMOVED_VALUES_REGEXP, EMPTY_STRING)\n\t                                .trim();\n\t                            if (relValue.length) {\n\t                                child.setAttribute(REL_ATTRIBUTE, relValue);\n\t                            } else {\n\t                                removedNodes.push(child);\n\t                            }\n\t                        }\n\t                    }\n\t                } else if (child.tagName && child.tagName.toUpperCase() === STYLE_TAG) {\n\t                    const style = replaceStylesheetUrls(resources, base, { data: child.textContent }, { context: STYLESHEET_CONTEXT }, stylesheets, fetchMissingResources && missingResources, unfoundResources);\n\t                    if (!fetchMissingResources) {\n\t                        const styleElement = document.createElement(STYLE_TAG);\n\t                        styleElement.type = STYLESHEET_CONTENT_TYPE;\n\t                        const media = child.getAttribute(MEDIA_ATTRIBUTE);\n\t                        if (media) {\n\t                            styleElement.setAttribute(MEDIA_ATTRIBUTE, media);\n\t                        }\n\t                        styleElement.appendChild(document.createTextNode(style));\n\t                        child.replaceWith(styleElement);\n\t                    }\n\t                } else if (child.tagName && child.tagName.toUpperCase() === IMG_TAG || child.tagName && child.tagName.toUpperCase() === AUDIO_TAG || child.tagName && child.tagName.toUpperCase() === VIDEO_TAG || child.tagName && child.tagName.toUpperCase() === SOURCE_TAG || child.tagName && child.tagName.toUpperCase() === SCRIPT_TAG) {\n\t                    if (src) {\n\t                        resource = getResource(resources, src, child.getAttribute(SRC_ATTRIBUTE));\n\t                        if (resource) {\n\t                            if (!fetchMissingResources) {\n\t                                resource.used = true;\n\t                                setAttribute(child, SRC_ATTRIBUTE, getResourceURI(resource));\n\t                            }\n\t                        } else if (fetchMissingResources) {\n\t                            addMissingResource(missingResources, src, BASE64_ENCODING$1);\n\t                        } else {\n\t                            unfoundResources.add(src);\n\t                            setAttribute(child, SRC_ATTRIBUTE, src);\n\t                        }\n\t                    }\n\t                    if (child.tagName && child.tagName.toUpperCase() === IMG_TAG || child.tagName && child.tagName.toUpperCase() === SOURCE_TAG) {\n\t                        const srcset = child.getAttribute(SRCSET_ATTRIBUTE);\n\t                        if (srcset) {\n\t                            const srcsetData = parse$2(srcset).map(data => {\n\t                                const src = resolvePath(data.url, base);\n\t                                const resource = getResource(resources, src, data.url);\n\t                                if (resource) {\n\t                                    if (!fetchMissingResources) {\n\t                                        resource.used = true;\n\t                                        data.url = getResourceURI(resource);\n\t                                    }\n\t                                } else if (fetchMissingResources) {\n\t                                    addMissingResource(missingResources, src, BASE64_ENCODING$1);\n\t                                } else {\n\t                                    unfoundResources.add(src);\n\t                                    data.url = src;\n\t                                }\n\t                                return data;\n\t                            });\n\t                            if (!fetchMissingResources) {\n\t                                setAttribute(child, SRCSET_ATTRIBUTE, serialize(srcsetData));\n\t                            }\n\t                        }\n\t                    } else if (child.tagName && child.tagName.toUpperCase() === SCRIPT_TAG && !fetchMissingResources) {\n\t                        let type = child.getAttribute(TYPE_ATTRIBUTE);\n\t                        if (type) {\n\t                            type = type.toLowerCase();\n\t                        }\n\t                        if (!enableScripts && (!type || type !== JSON_LD_CONTENT_TYPE)) {\n\t                            removedNodes.push(child);\n\t                        }\n\t                    }\n\t                } else if (child.tagName && child.tagName.toUpperCase() === BODY_TAG || child.tagName && child.tagName.toUpperCase() === TABLE_TAG || child.tagName && child.tagName.toUpperCase() === TD_TAG || child.tagName && child.tagName.toUpperCase() === TH_TAG) {\n\t                    let background = child.getAttribute(BACKGROUND_ATTRIBUTE);\n\t                    if (background && !background.startsWith(DATA_PROTOCOL)) {\n\t                        background = resolvePath(background, base);\n\t                        resource = getResource(resources, background, child.getAttribute(BACKGROUND_ATTRIBUTE));\n\t                        if (resource) {\n\t                            if (!fetchMissingResources) {\n\t                                resource.used = true;\n\t                                setAttribute(child, BACKGROUND_ATTRIBUTE, getResourceURI(resource));\n\t                            }\n\t                        } else if (fetchMissingResources) {\n\t                            addMissingResource(missingResources, background, BASE64_ENCODING$1);\n\t                        } else {\n\t                            unfoundResources.add(background);\n\t                            setAttribute(child, BACKGROUND_ATTRIBUTE, background);\n\t                        }\n\t                    }\n\t                } else if (child.tagName && child.tagName.toUpperCase() === INPUT_TAG) {\n\t                    const type = child.getAttribute(TYPE_ATTRIBUTE);\n\t                    if (type && type.toLowerCase() === TYPE_ATTRIBUTE_IMAGE && src) {\n\t                        resource = getResource(resources, src, child.getAttribute(SRC_ATTRIBUTE));\n\t                        if (resource) {\n\t                            if (!fetchMissingResources) {\n\t                                resource.used = true;\n\t                                setAttribute(child, SRC_ATTRIBUTE, getResourceURI(resource));\n\t                            }\n\t                        } else if (fetchMissingResources) {\n\t                            addMissingResource(missingResources, src, BASE64_ENCODING$1);\n\t                        } else {\n\t                            unfoundResources.add(src);\n\t                            setAttribute(child, SRC_ATTRIBUTE, src);\n\t                        }\n\t                    }\n\t                } else if (child.tagName && child.tagName.toUpperCase() === IFRAME_TAG || child.tagName && child.tagName.toUpperCase() === FRAME_TAG || child.tagName && child.tagName.toUpperCase() === EMBED_TAG || child.tagName && child.tagName.toUpperCase() === OBJECT_TAG) {\n\t                    let id, attribute;\n\t                    if (child.tagName && child.tagName.toUpperCase() === OBJECT_TAG) {\n\t                        attribute = DATA_ATTRIBUTE;\n\t                        src = child.getAttribute(DATA_ATTRIBUTE);\n\t                        if (src) {\n\t                            src = resolvePath(src, base);\n\t                        }\n\t                    } else {\n\t                        attribute = SRC_ATTRIBUTE;\n\t                    }\n\t                    if (src) {\n\t                        if (src.startsWith(CID_PROTOCOL)) {\n\t                            id = `<${src.split(CID_PROTOCOL)[1]}>`;\n\t                            resource = frames[id];\n\t                        } else {\n\t                            id = src;\n\t                            resource = getResource(resources, src, child.getAttribute(attribute));\n\t                        }\n\t                        if (resource) {\n\t                            if (child.tagName && child.tagName.toUpperCase() === EMBED_TAG || child.tagName && child.tagName.toUpperCase() === OBJECT_TAG) {\n\t                                if (!fetchMissingResources) {\n\t                                    resource.used = true;\n\t                                    setAttribute(child, attribute, getResourceURI(resource));\n\t                                }\n\t                            } else {\n\t                                const result = convert$1({\n\t                                    resources: Object.assign({}, resources, { [id]: resource }),\n\t                                    unfoundResources,\n\t                                    frames: frames,\n\t                                    index: id,\n\t                                    id: resource.id\n\t                                }, { DOMParser, enableScripts, fetchMissingResources });\n\t                                if (fetchMissingResources) {\n\t                                    for (const missingResource of result) {\n\t                                        if (!missingResources.find(resource => resource.id === missingResource.id)) {\n\t                                            missingResources.push(missingResource);\n\t                                        }\n\t                                    }\n\t                                } else {\n\t                                    resource.used = true;\n\t                                    if (child.tagName && child.tagName.toUpperCase() === IFRAME_TAG) {\n\t                                        setAttribute(child, SRC_ATTRIBUTE);\n\t                                        child.removeAttribute(SRC_ATTRIBUTE);\n\t                                        child.setAttribute(SRCDOC_ATTRIBUTE, result.data);\n\t                                    } else {\n\t                                        setAttribute(child, attribute, DATA_PROTOCOL + TEXT_HTML_CONTENT_TYPE + DATA_URI_PAYLOAD_SEPARATOR + encodeURIComponent(result.data));\n\t                                    }\n\t                                }\n\t                            }\n\t                        } else if (fetchMissingResources) {\n\t                            addMissingResource(missingResources, src);\n\t                        } else {\n\t                            unfoundResources.add(src);\n\t                            setAttribute(child, attribute, src);\n\t                        }\n\t                    }\n\t                } else if ((child.tagName && child.tagName.toUpperCase() === A_TAG || child.tagName && child.tagName.toUpperCase() === AREA_TAG) && !fetchMissingResources) {\n\t                    if (href) {\n\t                        try {\n\t                            const url = new URL(child.getAttribute(HREF_ATTRIBUTE), base);\n\t                            const hash = url.hash;\n\t                            url.hash = EMPTY_STRING;\n\t                            if (url == base && hash) {\n\t                                child.setAttribute(HREF_ATTRIBUTE, hash);\n\t                            } else {\n\t                                child.setAttribute(HREF_ATTRIBUTE, href);\n\t                            }\n\t                            // eslint-disable-next-line no-unused-vars\n\t                        } catch (_) {\n\t                            child.setAttribute(HREF_ATTRIBUTE, href);\n\t                        }\n\t                    }\n\t                    child.removeAttribute(PING_ATTRIBUTE);\n\t                } else if (child.tagName && child.tagName.toUpperCase() === META_TAG$1 && !fetchMissingResources) {\n\t                    let httpEquiv = child.getAttribute(HTTP_EQUIV_ATTRIBUTE$1);\n\t                    if (httpEquiv) {\n\t                        httpEquiv = httpEquiv.toLowerCase();\n\t                        if (httpEquiv === HTTP_EQUIV_ATTRIBUTE_REFRESH || httpEquiv === HTTP_EQUIV_ATTRIBUTE_CSP) {\n\t                            removedNodes.push(child);\n\t                        }\n\t                    }\n\t                } else if (child.tagName && child.tagName.toUpperCase() === TEMPLATE_TAG && !fetchMissingResources) {\n\t                    const shadowModeAttribute = child.getAttribute(SHADOWMODE_ATTRIBUTE);\n\t                    if (shadowModeAttribute) {\n\t                        child.removeAttribute(SHADOWMODE_ATTRIBUTE);\n\t                        child.setAttribute(SHADOWROOTMODE_ATTRIBUTE, shadowModeAttribute);\n\t                    }\n\t                    if (child.content) {\n\t                        child.content.childNodes.forEach(node => nodes.push(node));\n\t                    }\n\t                } else if (child.tagName && child.tagName.toUpperCase() === TITLE_TAG && !fetchMissingResources && childNode.tagName && childNode.tagName.toUpperCase() === HEAD_TAG && title === undefined && child.textContent) {\n\t                    title = child.textContent;\n\t                }\n\t                nodes.push(child);\n\t            }\n\t        }\n\t    }\n\t    if (fetchMissingResources) {\n\t        return missingResources;\n\t    } else {\n\t        removedNodes.forEach(node => node.remove());\n\t        if (!canonicalLinkElement) {\n\t            const linkElement = document.createElement(LINK_TAG);\n\t            linkElement.setAttribute(REL_ATTRIBUTE, REL_ATTRIBUTE_CANONICAL);\n\t            linkElement.setAttribute(HREF_ATTRIBUTE, index);\n\t            document.head.appendChild(linkElement);\n\t        }\n\t        let metaElement = document.createElement(META_TAG$1);\n\t        metaElement.setAttribute(HTTP_EQUIV_ATTRIBUTE$1, HTTP_EQUIV_ATTRIBUTE_CSP);\n\t        let csp = DEFAULT_CSP;\n\t        if (enableScripts) {\n\t            csp += JS_ENABLED_CSP;\n\t        } else {\n\t            csp += JS_DISABLED_CSP;\n\t        }\n\t        metaElement.setAttribute(CONTENT_ATTRIBUTE$1, csp);\n\t        if (document.head.firstChild) {\n\t            document.head.prepend(metaElement);\n\t        } else {\n\t            document.head.appendChild(metaElement);\n\t        }\n\t        metaElement.setAttribute(CONTENT_ATTRIBUTE$1, csp);\n\t        metaElement = document.createElement(META_TAG$1);\n\t        metaElement.setAttribute(CHARSET_ATTRIBUTE$1, UTF8_CHARSET$1);\n\t        document.head.prepend(metaElement);\n\t        if (headers) {\n\t            const pageInfoElement = document.createElement(SCRIPT_TAG);\n\t            pageInfoElement.setAttribute(TYPE_ATTRIBUTE, JSON_LD_CONTENT_TYPE);\n\t            pageInfoElement.appendChild(document.createTextNode(JSON.stringify(getPageInfo(headers, index), null, 2)));\n\t            if (document.head.firstChild) {\n\t                document.head.firstChild.after(pageInfoElement);\n\t            } else {\n\t                document.head.appendChild(pageInfoElement);\n\t            }\n\t        }\n\t        if (unfoundResources.size) {\n\t            unfoundResources.forEach(id => {\n\t                if (!id.startsWith(DATA_PROTOCOL)) {\n\t                    resources[id] = { id, notFound: true, used: true };\n\t                }\n\t            });\n\t        }\n\t        return {\n\t            title,\n\t            favicons,\n\t            data: dom.serialize()\n\t        };\n\t    }\n\t}\n\n\tfunction setAttribute(element, attribute, newValue) {\n\t    const value = element.getAttribute(attribute);\n\t    if (value && !value.startsWith(DATA_PROTOCOL) && value !== newValue) {\n\t        element.setAttribute(ORIGINAL_URL_ATTRIBUTE_PREFIX + attribute, value);\n\t    }\n\t    if (newValue !== undefined) {\n\t        element.setAttribute(attribute, newValue);\n\t    }\n\t}\n\n\tfunction replaceStylesheetUrls(resources, base, resource, options = {}, stylesheets, missingResources, unfoundResources) {\n\t    let ast;\n\t    if (resource.id !== undefined) {\n\t        if (stylesheets[resource.id]) {\n\t            return stylesheets[resource.id].data;\n\t        } else {\n\t            stylesheets[resource.id] = {};\n\t        }\n\t    }\n\t    try {\n\t        ast = Zb(resource.data, options);\n\t        // eslint-disable-next-line no-unused-vars\n\t    } catch (_) {\n\t        // ignored\n\t    }\n\t    if (ast) {\n\t        rx(ast, node => {\n\t            if (node.type === URL_FUNCTION) {\n\t                const path = node.value;\n\t                if (!path.startsWith(DATA_PROTOCOL) && !path.startsWith(ORIGINAL_URL_FUNCTION_NAME)) {\n\t                    const id = resolvePath(path, base);\n\t                    const resource = getResource(resources, id, path);\n\t                    if (resource) {\n\t                        if (!missingResources) {\n\t                            resource.used = true;\n\t                            if (isStylesheet(resource.contentType)) {\n\t                                resource.data = replaceStylesheetUrls(resources, resource.id, resource, { context: STYLESHEET_CONTEXT }, stylesheets, missingResources, unfoundResources);\n\t                            }\n\t                            node.value = getOriginalUrlFunction(id, getResourceURI(resource));\n\t                        }\n\t                    } else if (missingResources) {\n\t                        addMissingResource(missingResources, id, BASE64_ENCODING$1);\n\t                    } else {\n\t                        unfoundResources.add(id);\n\t                        node.value = getOriginalUrlFunction(id);\n\t                    }\n\t                }\n\t            } else if (node.type === AT_RULE$1 && node.name.toLowerCase() === IMPORT_RULE) {\n\t                const path = node.prelude.children.first.value;\n\t                if (!path.startsWith(DATA_PROTOCOL) && !path.startsWith(ORIGINAL_URL_FUNCTION_NAME)) {\n\t                    const id = resolvePath(path, base);\n\t                    const resource = getResource(resources, id, path);\n\t                    if (resource) {\n\t                        resource.data = replaceStylesheetUrls(resources, resource.id, resource, { context: STYLESHEET_CONTEXT }, stylesheets, missingResources, unfoundResources);\n\t                        if (!missingResources) {\n\t                            resource.used = true;\n\t                            node.prelude.children.first.value = getOriginalUrlFunction(id, getResourceURI(resource));\n\t                        }\n\t                    } else if (missingResources) {\n\t                        addMissingResource(missingResources, id);\n\t                    } else {\n\t                        unfoundResources.add(id);\n\t                        node.prelude.children.first.value = getOriginalUrlFunction(id);\n\t                    }\n\t                }\n\t            }\n\t        });\n\t        try {\n\t            const result = Jb(ast);\n\t            if (resource.id !== undefined) {\n\t                stylesheets[resource.id].data = result;\n\t            }\n\t            return result.replace(ORIGINAL_URL_FUNCTION_REGEXP, ORIGINAL_URL_COMMENT);\n\t            // eslint-disable-next-line no-unused-vars\n\t        } catch (_) {\n\t            return resource.data;\n\t        }\n\t    } else {\n\t        return resource.data;\n\t    }\n\t}\n\n\tfunction getResource(resources, id, rawId) {\n\t    let resource = resources[id];\n\t    if (!resource) {\n\t        resource = resources[rawId];\n\t    }\n\t    return resource;\n\t}\n\n\tfunction addMissingResource(missingResources, id, transferEncoding) {\n\t    if ((id.startsWith(HTTP_PROTOCOL) || id.startsWith(HTTPS_PROTOCOL) || id.startsWith(URN_PROTOCOL)) && !missingResources.find(resource => resource.id === id)) {\n\t        missingResources.push({ id, transferEncoding });\n\t    }\n\t}\n\n\tfunction getOriginalUrlFunction(id, resourceURI = id) {\n\t    return ORIGINAL_URL_FUNCTION_NAME + CSS_FUNCTION_PARENTHESIS_START + JSON.stringify(id) + CSS_FUNCTION_PARENTHESIS_END + resourceURI;\n\t}\n\n\tfunction getPageInfo(headers, index) {\n\t    return {\n\t        ...JSON_LD_PAGE_INFO,\n\t        url: index,\n\t        name: decodeMimeHeader(headers[SUBJECT_HEADER]),\n\t        dateCreated: headers[DATE_HEADER],\n\t        additionalProperty: {\n\t            ...JSON_LD_PAGE_INFO.additionalProperty,\n\t            value: decodeMimeHeader(headers[FROM_HEADER])\n\t        }\n\t    };\n\t}\n\n\tconst MHTML_HEADERS = 0;\n\tconst MTHML_CONTENT = 1;\n\tconst MHTML_DATA = 2;\n\tconst MHTML_END = 3;\n\tconst STRING_TYPE = \"string\";\n\tconst HEADER_SEPARATOR = \":\";\n\tconst QUOTED_PRINTABLE_ENCODING = \"quoted-printable\";\n\tconst BINARY_ENCODING = \"binary\";\n\tconst CONTENT_TYPE_HEADER = \"content-type\";\n\tconst CONTENT_TRANSFER_ENCODING_HEADER = \"content-transfer-encoding\";\n\tconst CONTENT_ID_HEADER = \"content-id\";\n\tconst CONTENT_LOCATION_HEADER = \"content-location\";\n\tconst BASE64_ENCODING = \"base64\";\n\tconst UTF8_CHARSET = \"utf-8\";\n\tconst META_TAG = \"META\";\n\tconst CONTENT_ATTRIBUTE = \"content\";\n\tconst CHARSET_ATTRIBUTE = \"charset\";\n\tconst HTTP_EQUIV_ATTRIBUTE = \"http-equiv\";\n\tconst AT_RULE = \"Atrule\";\n\tconst CHARSET_IDENTIFIER = \"charset\";\n\tconst RANDOM_ID_PREFIX = \"_\";\n\n\tfunction parse$1(mhtml, { DOMParser } = { DOMParser: globalThis.DOMParser }, context = { resources: {}, frames: {} }) {\n\t    // deno-lint-ignore valid-typeof\n\t    if (typeof mhtml === STRING_TYPE) {\n\t        mhtml = encodeString(mhtml);\n\t    }\n\t    const headers = {};\n\t    const { resources, frames } = context;\n\t    let resource, transferEncoding, boundary, headerKey;\n\t    let content = {};\n\t    let state = MHTML_HEADERS;\n\t    let indexMhtml = 0;\n\t    let indexStartEmbeddedMhtml;\n\t    while (state !== MHTML_END && indexMhtml < mhtml.length - 1) {\n\t        let next;\n\t        if (state === MHTML_HEADERS) {\n\t            next = getLine();\n\t            if (!isLineFeed(next)) {\n\t                splitHeaders(next, headers);\n\t            } else {\n\t                if (headers[CONTENT_TYPE_HEADER]) {\n\t                    boundary = getBoundary(headers[CONTENT_TYPE_HEADER]);\n\t                }\n\t                if (boundary) {\n\t                    while (indexOf(next, boundary) === -1 && indexMhtml < mhtml.length - 1) {\n\t                        next = getLine();\n\t                    }\n\t                } else {\n\t                    const previousIndex = indexMhtml;\n\t                    next = getLine(transferEncoding);\n\t                    if (!boundary && startsWithBoundary(next)) {\n\t                        boundary = decodeString(next);\n\t                    } else {\n\t                        indexMhtml = previousIndex;\n\t                    }\n\t                }\n\t                content = {};\n\t                state = MTHML_CONTENT;\n\t            }\n\t        } else if (state === MTHML_CONTENT) {\n\t            if (boundary) {\n\t                if (indexStartEmbeddedMhtml === undefined) {\n\t                    indexStartEmbeddedMhtml = indexMhtml;\n\t                }\n\t                next = getLine();\n\t                if (!isLineFeed(next)) {\n\t                    splitHeaders(next, content);\n\t                } else {\n\t                    initResource(content);\n\t                    if (!resource.contentType || !isMultipartAlternative(resource.contentType)) {\n\t                        indexStartEmbeddedMhtml = undefined;\n\t                    }\n\t                    state = MHTML_DATA;\n\t                }\n\t            } else {\n\t                initResource(headers);\n\t                state = MHTML_DATA;\n\t            }\n\t        } else if (state === MHTML_DATA) {\n\t            const indexEndData = parseResourceData();\n\t            if (indexStartEmbeddedMhtml !== undefined && indexEndData !== undefined) {\n\t                resource.used = true;\n\t                context.index = convertEmbeddedMhtml(indexEndData);\n\t            } else {\n\t                processResource();\n\t            }\n\t            state = (indexMhtml >= mhtml.length - 1 ? MHTML_END : MTHML_CONTENT);\n\t        }\n\t    }\n\t    return { headers, frames, resources, index: context.index };\n\n\t    function getLine(transferEncoding) {\n\t        const indexStart = indexMhtml;\n\t        while (!isLineFeed([mhtml[indexMhtml]]) && indexMhtml++ < mhtml.length - 1);\n\t        indexMhtml++;\n\t        const line = mhtml.slice(indexStart, indexMhtml);\n\t        return transferEncoding === QUOTED_PRINTABLE_ENCODING ? decodeQuotedPrintable(line) : line;\n\t    }\n\n\t    function splitHeaders(line, obj) {\n\t        const lineString = decodeString(line);\n\t        const indexColumn = lineString.indexOf(HEADER_SEPARATOR);\n\t        if (indexColumn > -1) {\n\t            headerKey = lineString.substring(0, indexColumn).trim().toLowerCase();\n\t            obj[headerKey] = lineString.substring(indexColumn + 1, lineString.length).trim();\n\t        } else {\n\t            obj[headerKey] += lineString.trim();\n\t        }\n\t    }\n\n\t    function initResource(resourceData) {\n\t        transferEncoding = resourceData[CONTENT_TRANSFER_ENCODING_HEADER];\n\t        const contentType = resourceData[CONTENT_TYPE_HEADER];\n\t        const contentId = resourceData[CONTENT_ID_HEADER];\n\t        let id = resourceData[CONTENT_LOCATION_HEADER];\n\t        if (transferEncoding) {\n\t            transferEncoding = transferEncoding.toLowerCase();\n\t        }\n\t        resource = {\n\t            transferEncoding,\n\t            contentType,\n\t            data: [],\n\t            id\n\t        };\n\t        if (id === undefined) {\n\t            if (contentId !== undefined) {\n\t                id = contentId;\n\t            } else {\n\t                do {\n\t                    id = RANDOM_ID_PREFIX + Math.random().toString(36).substring(2);\n\t                } while (resources[id]);\n\t            }\n\t            resource.id = id;\n\t        }\n\t        if (context.index === undefined && isDocument(contentType)) {\n\t            context.index = id;\n\t        }\n\t        if (contentId !== undefined) {\n\t            frames[contentId] = resource;\n\t        }\n\t        if (!resources[id]) {\n\t            resources[id] = resource;\n\t        }\n\t        content = {};\n\t    }\n\n\t    function parseResourceData() {\n\t        let next = getLine(transferEncoding);\n\t        let indexEndData, boundaryFound;\n\t        while (!boundaryFound && indexMhtml < mhtml.length - 1) {\n\t            indexEndData = indexMhtml;\n\t            const indexBoundary = indexOf(next, boundary);\n\t            if (indexBoundary !== -1) {\n\t                indexEndData = indexEndData - next.length + indexBoundary - 2;\n\t                if (indexBoundary > 2) {\n\t                    next = next.slice(0, indexBoundary - 2);\n\t                } else {\n\t                    next = [];\n\t                }\n\t                boundaryFound = true;\n\t            }\n\t            if (resource.transferEncoding === QUOTED_PRINTABLE_ENCODING) {\n\t                if (resource.data.length > 2 && resource.data[resource.data.length - 3] === 0x3D && endsWithCRLF(next)) {\n\t                    resource.data.splice(resource.data.length - 3, 3);\n\t                } else if (resource.data.length > 1 && resource.data[resource.data.length - 2] === 0x3D && endsWithLF(next)) {\n\t                    resource.data.splice(resource.data.length - 2, 2);\n\t                }\n\t            } else if (resource.transferEncoding === BASE64_ENCODING) {\n\t                if (endsWithCRLF(next)) {\n\t                    next = next.slice(0, next.length - 2);\n\t                } else if (endsWithLF(next)) {\n\t                    next = next.slice(0, next.length - 1);\n\t                }\n\t            }\n\t            resource.data.splice(resource.data.length, 0, ...next);\n\t            if (!boundaryFound) {\n\t                next = getLine(transferEncoding);\n\t            }\n\t        }\n\t        if (!boundaryFound && boundary) {\n\t            indexEndData = indexMhtml;\n\t        }\n\t        return indexEndData;\n\t    }\n\n\t    function convertEmbeddedMhtml(indexEnd) {\n\t        const context = { resources, frames };\n\t        if (endsWithCRLF(mhtml)) {\n\t            indexEnd -= 2;\n\t        } else if (endsWithLF(mhtml)) {\n\t            indexEnd--;\n\t        }\n\t        parse$1(mhtml.slice(indexStartEmbeddedMhtml, indexEnd), { DOMParser }, context);\n\t        return context.index;\n\t    }\n\n\t    function processResource() {\n\t        resource.data = resource.rawData = new Uint8Array(resource.data);\n\t        const charset = resource.contentType ? getCharset(resource.contentType) : undefined;\n\t        if (resource.transferEncoding === BINARY_ENCODING && (!resource.contentType || !isText(resource.contentType))) {\n\t            resource.transferEncoding = BASE64_ENCODING;\n\t            resource.data = decodeBinary(resource.data);\n\t        } else {\n\t            resource.data = decodeString(resource.data, charset);\n\t        }\n\t        if (resource.contentType) {\n\t            resource.contentType = replaceCharset(resource.contentType, UTF8_CHARSET);\n\t            if (isStylesheet(resource.contentType)) {\n\t                processStylesheetCharset(charset);\n\t            } else if (isDocument(resource.contentType)) {\n\t                processDocumentCharset(charset);\n\t            }\n\t        }\n\t        delete resource.rawData;\n\t    }\n\n\t    function processStylesheetCharset(charset) {\n\t        try {\n\t            let ast = Zb(resource.data);\n\t            if (ast.children.first && ast.children.first.type === AT_RULE && ast.children.first.name.toLowerCase() === CHARSET_IDENTIFIER) {\n\t                const charsetNode = ast.children.first;\n\t                const cssCharset = charsetNode.prelude.children.first.value.toLowerCase();\n\t                if (cssCharset !== UTF8_CHARSET && cssCharset !== charset) {\n\t                    resource.data = decodeString(resource.rawData, cssCharset);\n\t                    ast = Zb(resource.data);\n\t                }\n\t                ast.children.remove(ast.children.head);\n\t                resource.data = Jb(ast);\n\t            }\n\t            // eslint-disable-next-line no-unused-vars\n\t        } catch (_) {\n\t            // ignored\n\t        }\n\t    }\n\n\t    function processDocumentCharset(charset) {\n\t        const contentType = resource.contentType.split(\";\")[0];\n\t        let dom = parseDOM(resource.data, contentType, DOMParser);\n\t        let charserMetaElement = getMetaCharsetElement(dom.document.documentElement);\n\t        if (charserMetaElement) {\n\t            let htmlCharset = charserMetaElement.getAttribute(CHARSET_ATTRIBUTE);\n\t            if (htmlCharset) {\n\t                htmlCharset = htmlCharset.toLowerCase();\n\t                if (htmlCharset !== UTF8_CHARSET && htmlCharset !== charset) {\n\t                    resource.data = decodeString(resource.rawData, charset);\n\t                    dom = parseDOM(resource.data, contentType, DOMParser);\n\t                    charserMetaElement = getMetaCharsetElement(dom.document.documentElement);\n\t                }\n\t            }\n\t            if (charserMetaElement) {\n\t                charserMetaElement.remove();\n\t            }\n\t            resource.data = dom.serialize();\n\t        }\n\t        let metaElement = getMetaContentTypeElement(dom.document);\n\t        if (metaElement) {\n\t            const contentType = metaElement.getAttribute(CONTENT_ATTRIBUTE);\n\t            const htmlCharset = getCharset(contentType);\n\t            if (htmlCharset && htmlCharset !== UTF8_CHARSET && htmlCharset !== charset) {\n\t                resource.data = decodeString(resource.rawData, htmlCharset);\n\t                dom = parseDOM(resource.data, contentType, DOMParser);\n\t                metaElement = getMetaContentTypeElement(dom.document.documentElement);\n\t            }\n\t            if (metaElement) {\n\t                metaElement.remove();\n\t            }\n\t            resource.data = dom.serialize();\n\t        }\n\t    }\n\t}\n\n\tfunction getMetaCharsetElement(document) {\n\t    const metaElements = document.getElementsByTagName(META_TAG);\n\t    return Array.from(metaElements).find(metaElement => metaElement.getAttribute(CHARSET_ATTRIBUTE));\n\t}\n\n\tfunction getMetaContentTypeElement(document) {\n\t    const metaElements = document.getElementsByTagName(META_TAG);\n\t    return Array.from(metaElements).find(metaElement => metaElement.getAttribute(HTTP_EQUIV_ATTRIBUTE)\n\t        && metaElement.getAttribute(HTTP_EQUIV_ATTRIBUTE).toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase());\n\t}\n\n\t/// <reference types=\"./mod.d.ts\" />\n\n\n\tfunction convert(mhtml, config = {}) {\n\t    if (config.DOMParser === undefined && globalThis.DOMParser) {\n\t        config.DOMParser = globalThis.DOMParser;\n\t    }\n\t    if ((typeof mhtml === \"string\") || mhtml instanceof Uint8Array) {\n\t        mhtml = parse(mhtml, config);\n\t    }\n\t    return fetchAndConvert(mhtml, config);\n\t}\n\n\tfunction parse(data, config = {}) {\n\t    if (config.DOMParser === undefined && globalThis.DOMParser) {\n\t        config.DOMParser = globalThis.DOMParser;\n\t    }\n\t    return parse$1(data, config);\n\t}\n\n\t/*\n\t * Copyright 2010-2020 Gildas Lormeau\n\t * contact : gildas.lormeau <at> gmail.com\n\t * \n\t * This file is part of SingleFile.\n\t *\n\t *   The code in this file is free software: you can redistribute it and/or \n\t *   modify it under the terms of the GNU Affero General Public License \n\t *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n\t *   of the License, or (at your option) any later version.\n\t * \n\t *   The code in this file is distributed in the hope that it will be useful, \n\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n\t *   General Public License for more details.\n\t *\n\t *   As additional permission under GNU AGPL version 3 section 7, you may \n\t *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n\t *   AGPL normally required by section 4, provided you include this license \n\t *   notice and a URL through which recipients can access the Corresponding \n\t *   Source.\n\t */\n\n\n\t(globalThis => {\n\n\t\tconst singlefile = globalThis.singlefile;\n\n\t\tconst FORBIDDEN_TAG_NAMES = [\"a\", \"area\", \"audio\", \"base\", \"br\", \"col\", \"command\", \"embed\", \"hr\", \"img\", \"iframe\", \"input\", \"keygen\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"video\", \"wbr\"];\n\t\tconst BUTTON_ANCHOR_URL = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TtaIVETuIOASsThZERRylikWwUNoKrTqYXPohNGlIUlwcBdeCgx+LVQcXZ10dXAVB8APEydFJ0UVK/F9SaBHjwXE/3t173L0DhFqJqWbbOKBqlpGMRcVMdkUMvKIbfQCG0SExU4+nFtLwHF/38PH1LsKzvM/9OXqUnMkAn0g8y3TDIl4nnt60dM77xCFWlBTic+Ixgy5I/Mh12eU3zgWHBZ4ZMtLJOeIQsVhoYbmFWdFQiaeIw4qqUb6QcVnhvMVZLVVY4578hcGctpziOs0hxLCIOBIQIaOCDZRgIUKrRoqJJO1HPfyDjj9BLplcG2DkmEcZKiTHD/4Hv7s185MTblIwCrS/2PbHCBDYBepV2/4+tu36CeB/Bq60pr9cA2Y+Sa82tfAR0LsNXFw3NXkPuNwBBp50yZAcyU9TyOeB9zP6pizQfwt0rbq9NfZx+gCkqaulG+DgEBgtUPaax7s7W3v790yjvx825XKP2aKCdAAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+QLEQA4M3Y7LzIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAACVBMVEUAAAAAAACKioqjwG1pAAAAAXRSTlMAQObYZgAAAAFiS0dEAmYLfGQAAABkSURBVBjThc47CsNADIThWfD0bnSfbdIroP/+V0mhsN5gTNToK0YPaSvnF9B9wGykG54j/2GF1/hauE4E1AOuNxrBdA5KUXIqdiCnqC1zIZ2mFJQzKJ3wesOhcwDM4+fo7cOuD9C4HTQ9HAAQAAAAAElFTkSuQmCC\";\n\t\tconst BUTTON_CLOSE_URL = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TtaIVETuIOASsThZERRylikWwUNoKrTqYXPohNGlIUlwcBdeCgx+LVQcXZ10dXAVB8APEydFJ0UVK/F9SaBHjwXE/3t173L0DhFqJqWbbOKBqlpGMRcVMdkUMvKIbfQCG0SExU4+nFtLwHF/38PH1LsKzvM/9OXqUnMkAn0g8y3TDIl4nnt60dM77xCFWlBTic+Ixgy5I/Mh12eU3zgWHBZ4ZMtLJOeIQsVhoYbmFWdFQiaeIw4qqUb6QcVnhvMVZLVVY4578hcGctpziOs0hxLCIOBIQIaOCDZRgIUKrRoqJJO1HPfyDjj9BLplcG2DkmEcZKiTHD/4Hv7s185MTblIwCrS/2PbHCBDYBepV2/4+tu36CeB/Bq60pr9cA2Y+Sa82tfAR0LsNXFw3NXkPuNwBBp50yZAcyU9TyOeB9zP6pizQfwt0rbq9NfZx+gCkqaulG+DgEBgtUPaax7s7W3v790yjvx825XKP2aKCdAAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+QLEQA6Na1u6IUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAACVBMVEUAAAAAAACKioqjwG1pAAAAAXRSTlMAQObYZgAAAAFiS0dEAmYLfGQAAABlSURBVBhXTc/BEUQhCAPQ58ES6McSPED/rfwDI7vOMCoJIeGd6CvFgZXiwk47Ia5VUKdrVXcb39kfqxqmTg+I2xJ2tqhVTaGaQjTl7/GgIc/4CL4Vs3RsjLFndcxPnAn4iww8A3yQjRZjti1t6AAAAABJRU5ErkJggg==\";\n\t\tconst SHADOWROOT_ATTRIBUTE_NAME = \"shadowrootmode\";\n\t\tconst SCRIPT_TEMPLATE_SHADOW_ROOT = \"data-template-shadow-root\";\n\t\tconst SCRIPT_OPTIONS = \"data-single-file-options\";\n\t\tconst NOTE_TAGNAME = \"single-file-note\";\n\t\tconst NOTE_CLASS = \"note\";\n\t\tconst NOTE_MASK_CLASS = \"note-mask\";\n\t\tconst NOTE_HIDDEN_CLASS = \"note-hidden\";\n\t\tconst NOTE_ANCHORED_CLASS = \"note-anchored\";\n\t\tconst NOTE_SELECTED_CLASS = \"note-selected\";\n\t\tconst NOTE_MOVING_CLASS = \"note-moving\";\n\t\tconst NOTE_MASK_MOVING_CLASS = \"note-mask-moving\";\n\t\tconst PAGE_MASK_CLASS = \"page-mask\";\n\t\tconst MASK_CLASS = \"single-file-mask\";\n\t\tconst PAGE_MASK_CONTAINER_CLASS = \"single-file-page-mask\";\n\t\tconst HIGHLIGHT_CLASS = \"single-file-highlight\";\n\t\tconst HIGHLIGHTS_STYLESHEET_CLASS = \"single-file-highlights-stylesheet\";\n\t\tconst REMOVED_CONTENT_CLASS = \"single-file-removed\";\n\t\tconst HIGHLIGHT_HIDDEN_CLASS = \"single-file-highlight-hidden\";\n\t\tconst PAGE_MASK_ACTIVE_CLASS = \"page-mask-active\";\n\t\tconst CUT_HOVER_CLASS = \"single-file-cut-hover\";\n\t\tconst CUT_OUTER_HOVER_CLASS = \"single-file-cut-outer-hover\";\n\t\tconst CUT_SELECTED_CLASS = \"single-file-cut-selected\";\n\t\tconst CUT_OUTER_SELECTED_CLASS = \"single-file-cut-outer-selected\";\n\t\tconst CUT_MODE_CLASS = \"single-file-cut-mode\";\n\t\tconst NOTE_INITIAL_POSITION_X = 20;\n\t\tconst NOTE_INITIAL_POSITION_Y = 20;\n\t\tconst NOTE_INITIAL_WIDTH = 150;\n\t\tconst NOTE_INITIAL_HEIGHT = 150;\n\t\tconst NOTE_HEADER_HEIGHT = 25;\n\t\tconst DISABLED_NOSCRIPT_ATTRIBUTE_NAME = \"data-single-file-disabled-noscript\";\n\t\tconst COMMENT_HEADER = \"Page saved with SingleFile\";\n\t\tconst COMMENT_HEADER_LEGACY = \"Archive processed by SingleFile\";\n\n\t\tlet NOTES_WEB_STYLESHEET, MASK_WEB_STYLESHEET, HIGHLIGHTS_WEB_STYLESHEET;\n\t\tlet selectedNote, anchorElement, maskNoteElement, maskPageElement, highlightSelectionMode, removeHighlightMode, resizingNoteMode, movingNoteMode, highlightColor, collapseNoteTimeout, cuttingOuterMode, cuttingMode, cuttingTouchTarget, cuttingPath, cuttingPathIndex, previousContent;\n\t\tlet removedElements = [], removedElementIndex = 0, pageResources, pageUrl, pageCompressContent, includeInfobar, openInfobar, infobarPositionAbsolute, infobarPositionTop, infobarPositionBottom, infobarPositionLeft, infobarPositionRight;\n\n\t\tglobalThis.zip = singlefile.helper.zip;\n\t\tinitEventListeners();\n\t\tnew MutationObserver(initEventListeners).observe(document, { childList: true });\n\n\t\tfunction initEventListeners() {\n\t\t\twindow.onmessage = async event => {\n\t\t\t\tconst message = JSON.parse(event.data);\n\t\t\t\tif (message.method == \"init\") {\n\t\t\t\t\tawait init(message);\n\t\t\t\t}\n\t\t\t\tif (message.method == \"addNote\") {\n\t\t\t\t\taddNote(message);\n\t\t\t\t}\n\t\t\t\tif (message.method == \"displayNotes\") {\n\t\t\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(noteElement => noteElement.shadowRoot.querySelector(\".\" + NOTE_CLASS).classList.remove(NOTE_HIDDEN_CLASS));\n\t\t\t\t}\n\t\t\t\tif (message.method == \"hideNotes\") {\n\t\t\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(noteElement => noteElement.shadowRoot.querySelector(\".\" + NOTE_CLASS).classList.add(NOTE_HIDDEN_CLASS));\n\t\t\t\t}\n\t\t\t\tif (message.method == \"enableHighlight\") {\n\t\t\t\t\tif (highlightColor) {\n\t\t\t\t\t\tdocument.documentElement.classList.remove(highlightColor + \"-mode\");\n\t\t\t\t\t}\n\t\t\t\t\thighlightColor = message.color;\n\t\t\t\t\thighlightSelectionMode = true;\n\t\t\t\t\tdocument.documentElement.classList.add(message.color + \"-mode\");\n\t\t\t\t}\n\t\t\t\tif (message.method == \"disableHighlight\") {\n\t\t\t\t\tdisableHighlight();\n\t\t\t\t\thighlightSelectionMode = false;\n\t\t\t\t}\n\t\t\t\tif (message.method == \"displayHighlights\") {\n\t\t\t\t\tdocument.querySelectorAll(\".\" + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.remove(HIGHLIGHT_HIDDEN_CLASS));\n\t\t\t\t}\n\t\t\t\tif (message.method == \"hideHighlights\") {\n\t\t\t\t\tdocument.querySelectorAll(\".\" + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.add(HIGHLIGHT_HIDDEN_CLASS));\n\t\t\t\t}\n\t\t\t\tif (message.method == \"enableRemoveHighlights\") {\n\t\t\t\t\tremoveHighlightMode = true;\n\t\t\t\t\tdocument.documentElement.classList.add(\"single-file-remove-highlights-mode\");\n\t\t\t\t}\n\t\t\t\tif (message.method == \"disableRemoveHighlights\") {\n\t\t\t\t\tremoveHighlightMode = false;\n\t\t\t\t\tdocument.documentElement.classList.remove(\"single-file-remove-highlights-mode\");\n\t\t\t\t}\n\t\t\t\tif (message.method == \"enableEditPage\") {\n\t\t\t\t\tdocument.body.contentEditable = true;\n\t\t\t\t\tonUpdate(false);\n\t\t\t\t}\n\t\t\t\tif (message.method == \"formatPage\") {\n\t\t\t\t\tformatPage(!message.applySystemTheme, message.contentWidth);\n\t\t\t\t}\n\t\t\t\tif (message.method == \"cancelFormatPage\") {\n\t\t\t\t\tcancelFormatPage();\n\t\t\t\t}\n\t\t\t\tif (message.method == \"disableEditPage\") {\n\t\t\t\t\tdocument.body.contentEditable = false;\n\t\t\t\t}\n\t\t\t\tif (message.method == \"enableCutInnerPage\") {\n\t\t\t\t\tcuttingMode = true;\n\t\t\t\t\tdocument.documentElement.classList.add(CUT_MODE_CLASS);\n\t\t\t\t}\n\t\t\t\tif (message.method == \"enableCutOuterPage\") {\n\t\t\t\t\tcuttingOuterMode = true;\n\t\t\t\t\tdocument.documentElement.classList.add(CUT_MODE_CLASS);\n\t\t\t\t}\n\t\t\t\tif (message.method == \"disableCutInnerPage\" || message.method == \"disableCutOuterPage\") {\n\t\t\t\t\tif (message.method == \"disableCutInnerPage\") {\n\t\t\t\t\t\tcuttingMode = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcuttingOuterMode = false;\n\t\t\t\t\t}\n\t\t\t\t\tdocument.documentElement.classList.remove(CUT_MODE_CLASS);\n\t\t\t\t\tresetSelectedElements();\n\t\t\t\t\tif (cuttingPath) {\n\t\t\t\t\t\tunhighlightCutElement();\n\t\t\t\t\t\tcuttingPath = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (message.method == \"undoCutPage\") {\n\t\t\t\t\tundoCutPage();\n\t\t\t\t}\n\t\t\t\tif (message.method == \"undoAllCutPage\") {\n\t\t\t\t\twhile (removedElementIndex) {\n\t\t\t\t\t\tremovedElements[removedElementIndex - 1].forEach(element => element.classList.remove(REMOVED_CONTENT_CLASS));\n\t\t\t\t\t\tremovedElementIndex--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (message.method == \"redoCutPage\") {\n\t\t\t\t\tredoCutPage();\n\t\t\t\t}\n\t\t\t\tif (message.method == \"getContent\") {\n\t\t\t\t\tonUpdate(true);\n\t\t\t\t\tincludeInfobar = message.includeInfobar;\n\t\t\t\t\topenInfobar = message.openInfobar;\n\t\t\t\t\tinfobarPositionAbsolute = message.infobarPositionAbsolute;\n\t\t\t\t\tinfobarPositionTop = message.infobarPositionTop;\n\t\t\t\t\tinfobarPositionBottom = message.infobarPositionBottom;\n\t\t\t\t\tinfobarPositionLeft = message.infobarPositionLeft;\n\t\t\t\t\tinfobarPositionRight = message.infobarPositionRight;\n\t\t\t\t\tlet content = getContent(message.compressHTML, message.updatedResources);\n\t\t\t\t\tlet filename;\n\t\t\t\t\tconst pageOptions = loadOptionsFromPage(document);\n\t\t\t\t\tif (pageOptions) {\n\t\t\t\t\t\tpageOptions.backgroundSave = message.backgroundSave;\n\t\t\t\t\t\tpageOptions.saveDate = new Date(pageOptions.saveDate);\n\t\t\t\t\t\tpageOptions.visitDate = new Date(pageOptions.visitDate);\n\t\t\t\t\t\tfilename = await singlefile.helper.formatFilename(content, document, pageOptions);\n\t\t\t\t\t}\n\t\t\t\t\tif (message.sharePage) {\n\t\t\t\t\t\tsetLabels(message.labels);\n\t\t\t\t\t}\n\t\t\t\t\tif (pageCompressContent) {\n\t\t\t\t\t\tconst viewport = document.head.querySelector(\"meta[name=viewport]\");\n\t\t\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\t\t\tmethod: \"setContent\",\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\tfilename,\n\t\t\t\t\t\t\ttitle: document.title,\n\t\t\t\t\t\t\tdoctype: singlefile.helper.getDoctypeString(document),\n\t\t\t\t\t\t\turl: pageUrl,\n\t\t\t\t\t\t\tviewport: viewport ? viewport.content : null,\n\t\t\t\t\t\t\tcompressContent: true,\n\t\t\t\t\t\t\tforegroundSave: message.foregroundSave,\n\t\t\t\t\t\t\tsharePage: message.sharePage,\n\t\t\t\t\t\t\tdocumentHeight: document.documentElement.offsetHeight\n\t\t\t\t\t\t}), \"*\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (message.foregroundSave || message.sharePage) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait downloadPageForeground({\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tfilename: filename || message.filename,\n\t\t\t\t\t\t\t\t\tmimeType: \"text/html\"\n\t\t\t\t\t\t\t\t}, { sharePage: message.sharePage });\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tconsole.log(error); // eslint-disable-line no-console\n\t\t\t\t\t\t\t\twindow.parent.postMessage(JSON.stringify({ method: \"onError\", error: error.message }), \"*\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\t\t\t\tmethod: \"setContent\",\n\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\tfilename,\n\t\t\t\t\t\t\t\ttitle: document.title,\n\t\t\t\t\t\t\t\turl: pageUrl\n\t\t\t\t\t\t\t}), \"*\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (message.method == \"printPage\") {\n\t\t\t\t\tprintPage();\n\t\t\t\t}\n\t\t\t\tif (message.method == \"importMht\") {\n\t\t\t\t\tlet { content, filename } = message;\n\t\t\t\t\tconst { data } = await convert(content, { DOMParser: globalThis.DOMParser });\n\t\t\t\t\tcontent = data;\n\t\t\t\t\tawait init({ content }, { filename, reset: true, isMHTML: true });\n\t\t\t\t}\n\t\t\t\tif (message.method == \"displayInfobar\") {\n\t\t\t\t\tsinglefile.helper.displayIcon(document, true, {\n\t\t\t\t\t\topenInfobar: message.openInfobar,\n\t\t\t\t\t\tinfobarPositionAbsolute: message.infobarPositionAbsolute,\n\t\t\t\t\t\tinfobarPositionTop: message.infobarPositionTop,\n\t\t\t\t\t\tinfobarPositionBottom: message.infobarPositionBottom,\n\t\t\t\t\t\tinfobarPositionLeft: message.infobarPositionLeft,\n\t\t\t\t\t\tinfobarPositionRight: message.infobarPositionRight\n\t\t\t\t\t});\n\t\t\t\t\tconst infobarDoc = document.implementation.createHTMLDocument();\n\t\t\t\t\tinfobarDoc.body.appendChild(document.querySelector(singlefile.helper.INFOBAR_TAGNAME));\n\t\t\t\t\tserializeShadowRoots(infobarDoc.body);\n\t\t\t\t\tconst content = singlefile.helper.serialize(infobarDoc, true);\n\t\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\t\tmethod: \"displayInfobar\",\n\t\t\t\t\t\tcontent\n\t\t\t\t\t}), \"*\");\n\t\t\t\t}\n\t\t\t\tif (message.method == \"download\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait downloadPageForeground({\n\t\t\t\t\t\t\tcontent: message.content,\n\t\t\t\t\t\t\tfilename: message.filename,\n\t\t\t\t\t\t\tmimeType: message.mimeType\n\t\t\t\t\t\t}, { sharePage: message.sharePage });\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.log(error); // eslint-disable-line no-console\n\t\t\t\t\t\twindow.parent.postMessage(JSON.stringify({ method: \"onError\", error: error.message }), \"*\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\twindow.onresize = reflowNotes;\n\t\t\tdocument.ondragover = event => event.preventDefault();\n\t\t\tdocument.ondrop = async event => {\n\t\t\t\tif (event.dataTransfer.files && event.dataTransfer.files[0]) {\n\t\t\t\t\tconst file = event.dataTransfer.files[0];\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tlet content = new TextDecoder().decode(await file.arrayBuffer());\n\t\t\t\t\tconst compressContent = /<html[^>]* data-sfz[^>]*>/i.test(content);\n\t\t\t\t\tif (compressContent) {\n\t\t\t\t\t\tawait init({ content: file, compressContent }, { filename: file.name });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst isMHTML = /\\.mhtml?$|\\.mht$/i.test(file.name);\n\t\t\t\t\t\tlet filename = file.name || \"Untitled.html\";\n\t\t\t\t\t\tfilename = filename.replace(/(\\.mhtml|\\.mht)$/i, \".html\");\n\t\t\t\t\t\tif (!filename.endsWith(\".html\")) {\n\t\t\t\t\t\t\tfilename += \".html\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isMHTML) {\n\t\t\t\t\t\t\tconst { data } = await convert(content, { DOMParser: globalThis.DOMParser });\n\t\t\t\t\t\t\tcontent = data;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait init({ content }, { filename, isMHTML });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tasync function init({ content, password, compressContent }, { filename, reset, isMHTML } = {}) {\n\t\t\tawait initConstants();\n\t\t\tif (compressContent) {\n\t\t\t\tconst zipOptions = {\n\t\t\t\t\tuseWebWorkers: false\n\t\t\t\t};\n\t\t\t\tconst { docContent, origDocContent, resources, url } = await singlefile.helper.extract(content, {\n\t\t\t\t\tpassword,\n\t\t\t\t\tprompt,\n\t\t\t\t\tzipOptions\n\t\t\t\t});\n\t\t\t\tpageResources = resources;\n\t\t\t\tpageUrl = url;\n\t\t\t\tpageCompressContent = true;\n\t\t\t\tconst contentDocument = (new DOMParser()).parseFromString(docContent, \"text/html\");\n\t\t\t\tif (detectSavedPage(contentDocument)) {\n\t\t\t\t\tconst { saveUrl } = singlefile.helper.extractInfobarData(contentDocument);\n\t\t\t\t\tpageUrl = saveUrl;\n\t\t\t\t\tawait singlefile.helper.display(document, docContent, { disableFramePointerEvents: true });\n\t\t\t\t\tsinglefile.helper.fixInvalidNesting(document);\n\t\t\t\t\tconst infobarElement = document.querySelector(singlefile.helper.INFOBAR_TAGNAME);\n\t\t\t\t\tif (infobarElement) {\n\t\t\t\t\t\tinfobarElement.remove();\n\t\t\t\t\t}\n\t\t\t\t\tawait initPage();\n\t\t\t\t\tlet icon;\n\t\t\t\t\tconst origContentDocument = (new DOMParser()).parseFromString(origDocContent, \"text/html\");\n\t\t\t\t\tconst iconElement = origContentDocument.querySelector(\"link[rel*=icon]\");\n\t\t\t\t\tif (iconElement) {\n\t\t\t\t\t\tconst iconResource = resources.find(resource => resource.filename == iconElement.getAttribute(\"href\"));\n\t\t\t\t\t\tif (iconResource && iconResource.content) {\n\t\t\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\t\t\treader.readAsDataURL(await (await fetch(iconResource.content)).blob());\n\t\t\t\t\t\t\ticon = await new Promise((resolve, reject) => {\n\t\t\t\t\t\t\t\treader.addEventListener(\"load\", () => resolve(reader.result), false);\n\t\t\t\t\t\t\t\treader.addEventListener(\"error\", reject, false);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ticon = iconElement.href;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\t\tmethod: \"onInit\",\n\t\t\t\t\t\ttitle: document.title,\n\t\t\t\t\t\ticon,\n\t\t\t\t\t\tfilename,\n\t\t\t\t\t\treset,\n\t\t\t\t\t\tformatPageEnabled: isProbablyReaderable(document)\n\t\t\t\t\t}), \"*\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst contentDocument = (new DOMParser()).parseFromString(content, \"text/html\");\n\t\t\t\tif (detectSavedPage(contentDocument) || isMHTML) {\n\t\t\t\t\tif (!isMHTML) {\n\t\t\t\t\t\tconst { saveUrl } = singlefile.helper.extractInfobarData(contentDocument);\n\t\t\t\t\t\tpageUrl = saveUrl;\n\t\t\t\t\t}\n\t\t\t\t\tif (contentDocument.doctype) {\n\t\t\t\t\t\tif (document.doctype) {\n\t\t\t\t\t\t\tdocument.replaceChild(contentDocument.doctype, document.doctype);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdocument.insertBefore(contentDocument.doctype, document.documentElement);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (document.doctype) {\n\t\t\t\t\t\tdocument.doctype.remove();\n\t\t\t\t\t}\n\t\t\t\t\tconst infobarElement = contentDocument.querySelector(singlefile.helper.INFOBAR_TAGNAME);\n\t\t\t\t\tif (infobarElement) {\n\t\t\t\t\t\tinfobarElement.remove();\n\t\t\t\t\t}\n\t\t\t\t\tcontentDocument.querySelectorAll(\"noscript\").forEach(element => {\n\t\t\t\t\t\telement.setAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME, element.innerHTML);\n\t\t\t\t\t\telement.textContent = \"\";\n\t\t\t\t\t});\n\t\t\t\t\tcontentDocument.querySelectorAll(\"iframe\").forEach(element => {\n\t\t\t\t\t\tconst pointerEvents = \"pointer-events\";\n\t\t\t\t\t\telement.style.setProperty(\"-sf-\" + pointerEvents, element.style.getPropertyValue(pointerEvents), element.style.getPropertyPriority(pointerEvents));\n\t\t\t\t\t\telement.style.setProperty(pointerEvents, \"none\", \"important\");\n\t\t\t\t\t});\n\t\t\t\t\tdocument.replaceChild(contentDocument.documentElement, document.documentElement);\n\t\t\t\t\tsinglefile.helper.fixInvalidNesting(document);\n\t\t\t\t\tdocument.querySelectorAll(\"[data-single-file-note-refs]\").forEach(noteRefElement => noteRefElement.dataset.singleFileNoteRefs = noteRefElement.dataset.singleFileNoteRefs.replace(/,/g, \" \"));\n\t\t\t\t\tdeserializeShadowRoots(document);\n\t\t\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => attachNoteListeners(containerElement, true));\n\t\t\t\t\tinsertHighlightStylesheet(document);\n\t\t\t\t\tmaskPageElement = getMaskElement(PAGE_MASK_CLASS, PAGE_MASK_CONTAINER_CLASS);\n\t\t\t\t\tmaskNoteElement = getMaskElement(NOTE_MASK_CLASS);\n\t\t\t\t\tdocument.documentElement.onmousedown = onMouseDown;\n\t\t\t\t\tdocument.documentElement.onmouseup = document.documentElement.ontouchend = onMouseUp;\n\t\t\t\t\tdocument.documentElement.onmouseover = onMouseOver;\n\t\t\t\t\tdocument.documentElement.onmouseout = onMouseOut;\n\t\t\t\t\tdocument.documentElement.onkeydown = onKeyDown;\n\t\t\t\t\tdocument.documentElement.ontouchstart = document.documentElement.ontouchmove = onTouchMove;\n\t\t\t\t\twindow.onclick = event => event.preventDefault();\n\t\t\t\t\tconst iconElement = document.querySelector(\"link[rel*=icon]\");\n\t\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\t\tmethod: \"onInit\",\n\t\t\t\t\t\ttitle: document.title,\n\t\t\t\t\t\ticon: iconElement && iconElement.href,\n\t\t\t\t\t\tfilename,\n\t\t\t\t\t\treset,\n\t\t\t\t\t\tformatPageEnabled: isProbablyReaderable(document)\n\t\t\t\t\t}), \"*\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction loadOptionsFromPage(doc) {\n\t\t\tconst optionsElement = doc.body.querySelector(\"script[type=\\\"application/json\\\"][\" + SCRIPT_OPTIONS + \"]\");\n\t\t\tif (optionsElement) {\n\t\t\t\treturn JSON.parse(optionsElement.textContent);\n\t\t\t}\n\t\t}\n\n\t\tasync function initPage() {\n\t\t\tdocument.querySelectorAll(\"iframe\").forEach(element => {\n\t\t\t\tconst pointerEvents = \"pointer-events\";\n\t\t\t\telement.style.setProperty(\"-sf-\" + pointerEvents, element.style.getPropertyValue(pointerEvents), element.style.getPropertyPriority(pointerEvents));\n\t\t\t\telement.style.setProperty(pointerEvents, \"none\", \"important\");\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"[data-single-file-note-refs]\").forEach(noteRefElement => noteRefElement.dataset.singleFileNoteRefs = noteRefElement.dataset.singleFileNoteRefs.replace(/,/g, \" \"));\n\t\t\tdeserializeShadowRoots(document);\n\t\t\treflowNotes();\n\t\t\tawait waitResourcesLoad();\n\t\t\treflowNotes();\n\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => attachNoteListeners(containerElement, true));\n\t\t\tinsertHighlightStylesheet(document);\n\t\t\tmaskPageElement = getMaskElement(PAGE_MASK_CLASS, PAGE_MASK_CONTAINER_CLASS);\n\t\t\tmaskNoteElement = getMaskElement(NOTE_MASK_CLASS);\n\t\t\tdocument.documentElement.onmousedown = onMouseDown;\n\t\t\tdocument.documentElement.onmouseup = document.documentElement.ontouchend = onMouseUp;\n\t\t\tdocument.documentElement.onmouseover = onMouseOver;\n\t\t\tdocument.documentElement.onmouseout = onMouseOut;\n\t\t\tdocument.documentElement.onkeydown = onKeyDown;\n\t\t\tdocument.documentElement.ontouchstart = document.documentElement.ontouchmove = onTouchMove;\n\t\t\twindow.onclick = event => event.preventDefault();\n\t\t}\n\n\t\tasync function initConstants() {\n\t\t\t[NOTES_WEB_STYLESHEET, MASK_WEB_STYLESHEET, HIGHLIGHTS_WEB_STYLESHEET] = await Promise.all([\n\t\t\t\tminifyText(await ((await fetch(\"../pages/editor-note-web.css\")).text())),\n\t\t\t\tminifyText(await ((await fetch(\"../pages/editor-mask-web.css\")).text())),\n\t\t\t\tminifyText(await ((await fetch(\"../pages/editor-frame-web.css\")).text()))\n\t\t\t]);\n\t\t}\n\n\t\tfunction addNote({ color }) {\n\t\t\tconst containerElement = document.createElement(NOTE_TAGNAME);\n\t\t\tconst noteElement = document.createElement(\"div\");\n\t\t\tconst headerElement = document.createElement(\"header\");\n\t\t\tconst blockquoteElement = document.createElement(\"blockquote\");\n\t\t\tconst mainElement = document.createElement(\"textarea\");\n\t\t\tconst resizeElement = document.createElement(\"div\");\n\t\t\tconst removeNoteElement = document.createElement(\"img\");\n\t\t\tconst anchorIconElement = document.createElement(\"img\");\n\t\t\tconst noteShadow = containerElement.attachShadow({ mode: \"open\" });\n\t\t\theaderElement.appendChild(anchorIconElement);\n\t\t\theaderElement.appendChild(removeNoteElement);\n\t\t\tblockquoteElement.appendChild(mainElement);\n\t\t\tnoteElement.appendChild(headerElement);\n\t\t\tnoteElement.appendChild(blockquoteElement);\n\t\t\tnoteElement.appendChild(resizeElement);\n\t\t\tnoteShadow.appendChild(getStyleElement(NOTES_WEB_STYLESHEET));\n\t\t\tnoteShadow.appendChild(noteElement);\n\t\t\tconst notesElements = Array.from(document.querySelectorAll(NOTE_TAGNAME));\n\t\t\tconst noteId = Math.max.call(Math, 0, ...notesElements.map(noteElement => Number(noteElement.dataset.noteId))) + 1;\n\t\t\tblockquoteElement.cite = \"https://www.w3.org/TR/annotation-model/#selector(type=CssSelector,value=[data-single-file-note-refs~=\\\"\" + noteId + \"\\\"])\";\n\t\t\tnoteElement.classList.add(NOTE_CLASS);\n\t\t\tnoteElement.classList.add(NOTE_ANCHORED_CLASS);\n\t\t\tnoteElement.classList.add(color);\n\t\t\tnoteElement.dataset.color = color;\n\t\t\tmainElement.dir = \"auto\";\n\t\t\tconst boundingRectDocument = document.documentElement.getBoundingClientRect();\n\t\t\tlet positionX = NOTE_INITIAL_WIDTH + NOTE_INITIAL_POSITION_X - 1 - boundingRectDocument.x;\n\t\t\tlet positionY = NOTE_INITIAL_HEIGHT + NOTE_INITIAL_POSITION_Y - 1 - boundingRectDocument.y;\n\t\t\twhile (Array.from(document.elementsFromPoint(positionX - window.scrollX, positionY - window.scrollY)).find(element => element.tagName.toLowerCase() == NOTE_TAGNAME)) {\n\t\t\t\tpositionX += NOTE_INITIAL_POSITION_X;\n\t\t\t\tpositionY += NOTE_INITIAL_POSITION_Y;\n\t\t\t}\n\t\t\tnoteElement.style.setProperty(\"left\", (positionX - NOTE_INITIAL_WIDTH - 1) + \"px\");\n\t\t\tnoteElement.style.setProperty(\"top\", (positionY - NOTE_INITIAL_HEIGHT - 1) + \"px\");\n\t\t\tresizeElement.className = \"note-resize\";\n\t\t\tresizeElement.ondragstart = event => event.preventDefault();\n\t\t\tremoveNoteElement.className = \"note-remove\";\n\t\t\tremoveNoteElement.src = BUTTON_CLOSE_URL;\n\t\t\tremoveNoteElement.ondragstart = event => event.preventDefault();\n\t\t\tanchorIconElement.className = \"note-anchor\";\n\t\t\tanchorIconElement.src = BUTTON_ANCHOR_URL;\n\t\t\tanchorIconElement.ondragstart = event => event.preventDefault();\n\t\t\tcontainerElement.dataset.noteId = noteId;\n\t\t\taddNoteRef(document.documentElement, noteId);\n\t\t\tattachNoteListeners(containerElement, true);\n\t\t\tdocument.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);\n\t\t\tnoteElement.classList.add(NOTE_SELECTED_CLASS);\n\t\t\tselectedNote = noteElement;\n\t\t\tonUpdate(false);\n\t\t}\n\n\t\tfunction attachNoteListeners(containerElement, editable = false) {\n\t\t\tconst SELECT_PX_THRESHOLD = 4;\n\t\t\tconst COLLAPSING_NOTE_DELAY = 750;\n\t\t\tconst noteShadow = containerElement.shadowRoot;\n\t\t\tconst noteElement = noteShadow.childNodes[1];\n\t\t\tconst headerElement = noteShadow.querySelector(\"header\");\n\t\t\tconst mainElement = noteShadow.querySelector(\"textarea\");\n\t\t\tconst noteId = containerElement.dataset.noteId;\n\t\t\tconst resizeElement = noteShadow.querySelector(\".note-resize\");\n\t\t\tconst anchorIconElement = noteShadow.querySelector(\".note-anchor\");\n\t\t\tconst removeNoteElement = noteShadow.querySelector(\".note-remove\");\n\t\t\tmainElement.readOnly = !editable;\n\t\t\tif (!editable) {\n\t\t\t\tanchorIconElement.style.setProperty(\"display\", \"none\", \"important\");\n\t\t\t} else {\n\t\t\t\tanchorIconElement.style.removeProperty(\"display\");\n\t\t\t}\n\t\t\theaderElement.ontouchstart = headerElement.onmousedown = event => {\n\t\t\t\tif (event.target == headerElement) {\n\t\t\t\t\tcollapseNoteTimeout = setTimeout(() => {\n\t\t\t\t\t\tnoteElement.classList.toggle(\"note-collapsed\");\n\t\t\t\t\t\thideMaskNote();\n\t\t\t\t\t}, COLLAPSING_NOTE_DELAY);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst position = getPosition(event);\n\t\t\t\t\tconst clientX = position.clientX;\n\t\t\t\t\tconst clientY = position.clientY;\n\t\t\t\t\tconst boundingRect = noteElement.getBoundingClientRect();\n\t\t\t\t\tconst deltaX = clientX - boundingRect.left;\n\t\t\t\t\tconst deltaY = clientY - boundingRect.top;\n\t\t\t\t\tmaskPageElement.classList.add(PAGE_MASK_ACTIVE_CLASS);\n\t\t\t\t\tdocument.documentElement.style.setProperty(\"user-select\", \"none\", \"important\");\n\t\t\t\t\tanchorElement = getAnchorElement(containerElement);\n\t\t\t\t\tdisplayMaskNote();\n\t\t\t\t\tselectNote(noteElement);\n\t\t\t\t\tmoveNote(event, deltaX, deltaY);\n\t\t\t\t\tmovingNoteMode = { event, deltaX, deltaY };\n\t\t\t\t\tdocument.documentElement.ontouchmove = document.documentElement.onmousemove = event => {\n\t\t\t\t\t\tclearTimeout(collapseNoteTimeout);\n\t\t\t\t\t\tif (!movingNoteMode) {\n\t\t\t\t\t\t\tmovingNoteMode = { deltaX, deltaY };\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmovingNoteMode.event = event;\n\t\t\t\t\t\tmoveNote(event, deltaX, deltaY);\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t\tresizeElement.ontouchstart = resizeElement.onmousedown = event => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tresizingNoteMode = true;\n\t\t\t\tselectNote(noteElement);\n\t\t\t\tmaskPageElement.classList.add(PAGE_MASK_ACTIVE_CLASS);\n\t\t\t\tdocument.documentElement.style.setProperty(\"user-select\", \"none\", \"important\");\n\t\t\t\tdocument.documentElement.ontouchmove = document.documentElement.onmousemove = event => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tconst { clientX, clientY } = getPosition(event);\n\t\t\t\t\tconst boundingRectNote = noteElement.getBoundingClientRect();\n\t\t\t\t\tnoteElement.style.width = clientX - boundingRectNote.left + \"px\";\n\t\t\t\t\tnoteElement.style.height = clientY - boundingRectNote.top + \"px\";\n\t\t\t\t};\n\t\t\t};\n\t\t\tanchorIconElement.ontouchend = anchorIconElement.onclick = event => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tnoteElement.classList.toggle(NOTE_ANCHORED_CLASS);\n\t\t\t\tif (!noteElement.classList.contains(NOTE_ANCHORED_CLASS)) {\n\t\t\t\t\tdeleteNoteRef(containerElement, noteId);\n\t\t\t\t\taddNoteRef(document.documentElement, noteId);\n\t\t\t\t}\n\t\t\t\tonUpdate(false);\n\t\t\t};\n\t\t\tremoveNoteElement.ontouchend = removeNoteElement.onclick = event => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tdeleteNoteRef(containerElement, noteId);\n\t\t\t\tcontainerElement.remove();\n\t\t\t};\n\t\t\tnoteElement.onmousedown = () => {\n\t\t\t\tselectNote(noteElement);\n\t\t\t};\n\n\t\t\tfunction moveNote(event, deltaX, deltaY) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst { clientX, clientY } = getPosition(event);\n\t\t\t\tnoteElement.classList.add(NOTE_MOVING_CLASS);\n\t\t\t\tif (editable) {\n\t\t\t\t\tif (noteElement.classList.contains(NOTE_ANCHORED_CLASS)) {\n\t\t\t\t\t\tdeleteNoteRef(containerElement, noteId);\n\t\t\t\t\t\tanchorElement = getTarget(clientX, clientY) || document.documentElement;\n\t\t\t\t\t\taddNoteRef(anchorElement, noteId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tanchorElement = document.documentElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdocument.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);\n\t\t\t\tnoteElement.style.setProperty(\"left\", (clientX - deltaX) + \"px\");\n\t\t\t\tnoteElement.style.setProperty(\"top\", (clientY - deltaY) + \"px\");\n\t\t\t\tnoteElement.style.setProperty(\"position\", \"fixed\");\n\t\t\t\tdisplayMaskNote();\n\t\t\t}\n\n\t\t\tfunction displayMaskNote() {\n\t\t\t\tif (anchorElement == document.documentElement || anchorElement == document.documentElement) {\n\t\t\t\t\thideMaskNote();\n\t\t\t\t} else {\n\t\t\t\t\tconst boundingRectAnchor = anchorElement.getBoundingClientRect();\n\t\t\t\t\tmaskNoteElement.classList.add(NOTE_MASK_MOVING_CLASS);\n\t\t\t\t\tif (selectedNote) {\n\t\t\t\t\t\tmaskNoteElement.classList.add(selectedNote.dataset.color);\n\t\t\t\t\t}\n\t\t\t\t\tmaskNoteElement.style.setProperty(\"top\", (boundingRectAnchor.y - 3) + \"px\");\n\t\t\t\t\tmaskNoteElement.style.setProperty(\"left\", (boundingRectAnchor.x - 3) + \"px\");\n\t\t\t\t\tmaskNoteElement.style.setProperty(\"width\", (boundingRectAnchor.width + 3) + \"px\");\n\t\t\t\t\tmaskNoteElement.style.setProperty(\"height\", (boundingRectAnchor.height + 3) + \"px\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction hideMaskNote() {\n\t\t\t\tmaskNoteElement.classList.remove(NOTE_MASK_MOVING_CLASS);\n\t\t\t\tif (selectedNote) {\n\t\t\t\t\tmaskNoteElement.classList.remove(selectedNote.dataset.color);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction selectNote(noteElement) {\n\t\t\t\tif (selectedNote) {\n\t\t\t\t\tselectedNote.classList.remove(NOTE_SELECTED_CLASS);\n\t\t\t\t\tmaskNoteElement.classList.remove(selectedNote.dataset.color);\n\t\t\t\t}\n\t\t\t\tnoteElement.classList.add(NOTE_SELECTED_CLASS);\n\t\t\t\tnoteElement.classList.add(noteElement.dataset.color);\n\t\t\t\tselectedNote = noteElement;\n\t\t\t}\n\n\t\t\tfunction getTarget(clientX, clientY) {\n\t\t\t\tconst targets = Array.from(document.elementsFromPoint(clientX, clientY)).filter(element => element.matches(\"html *:not(\" + NOTE_TAGNAME + \"):not(.\" + MASK_CLASS + \")\"));\n\t\t\t\tif (!targets.includes(document.documentElement)) {\n\t\t\t\t\ttargets.push(document.documentElement);\n\t\t\t\t}\n\t\t\t\tlet newTarget, target = targets[0], boundingRect = target.getBoundingClientRect();\n\t\t\t\tnewTarget = determineTargetElement(\"floor\", target, clientX - boundingRect.left, getMatchedParents(target, \"left\"));\n\t\t\t\tif (newTarget == target) {\n\t\t\t\t\tnewTarget = determineTargetElement(\"ceil\", target, boundingRect.left + boundingRect.width - clientX, getMatchedParents(target, \"right\"));\n\t\t\t\t}\n\t\t\t\tif (newTarget == target) {\n\t\t\t\t\tnewTarget = determineTargetElement(\"floor\", target, clientY - boundingRect.top, getMatchedParents(target, \"top\"));\n\t\t\t\t}\n\t\t\t\tif (newTarget == target) {\n\t\t\t\t\tnewTarget = determineTargetElement(\"ceil\", target, boundingRect.top + boundingRect.height - clientY, getMatchedParents(target, \"bottom\"));\n\t\t\t\t}\n\t\t\t\ttarget = newTarget;\n\t\t\t\twhile (boundingRect = target && target.getBoundingClientRect(), boundingRect && boundingRect.width <= SELECT_PX_THRESHOLD && boundingRect.height <= SELECT_PX_THRESHOLD) {\n\t\t\t\t\ttarget = target.parentElement;\n\t\t\t\t}\n\t\t\t\treturn target;\n\t\t\t}\n\n\t\t\tfunction getMatchedParents(target, property) {\n\t\t\t\tlet element = target, matchedParent, parents = [];\n\t\t\t\tdo {\n\t\t\t\t\tconst boundingRect = element.getBoundingClientRect();\n\t\t\t\t\tif (element.parentElement && !element.parentElement.tagName.toLowerCase() != NOTE_TAGNAME && !element.classList.contains(MASK_CLASS)) {\n\t\t\t\t\t\tconst parentBoundingRect = element.parentElement.getBoundingClientRect();\n\t\t\t\t\t\tmatchedParent = Math.abs(parentBoundingRect[property] - boundingRect[property]) <= SELECT_PX_THRESHOLD;\n\t\t\t\t\t\tif (matchedParent) {\n\t\t\t\t\t\t\tif (element.parentElement.clientWidth > SELECT_PX_THRESHOLD && element.parentElement.clientHeight > SELECT_PX_THRESHOLD &&\n\t\t\t\t\t\t\t\t((element.parentElement.clientWidth - element.clientWidth > SELECT_PX_THRESHOLD) || (element.parentElement.clientHeight - element.clientHeight > SELECT_PX_THRESHOLD))) {\n\t\t\t\t\t\t\t\tparents.push(element.parentElement);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telement = element.parentElement;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmatchedParent = false;\n\t\t\t\t\t}\n\t\t\t\t} while (matchedParent && element);\n\t\t\t\treturn parents;\n\t\t\t}\n\n\t\t\tfunction determineTargetElement(roundingMethod, target, widthDistance, parents) {\n\t\t\t\tif (Math[roundingMethod](widthDistance / SELECT_PX_THRESHOLD) <= parents.length) {\n\t\t\t\t\ttarget = parents[parents.length - Math[roundingMethod](widthDistance / SELECT_PX_THRESHOLD) - 1];\n\t\t\t\t}\n\t\t\t\treturn target;\n\t\t\t}\n\t\t}\n\n\t\tfunction onMouseDown(event) {\n\t\t\tif ((cuttingMode || cuttingOuterMode) && cuttingPath) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t\tfunction onMouseUp(event) {\n\t\t\tif (highlightSelectionMode) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\thighlightSelection();\n\t\t\t\tonUpdate(false);\n\t\t\t}\n\t\t\tif (removeHighlightMode) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tlet element = event.target, done;\n\t\t\t\twhile (element && !done) {\n\t\t\t\t\tif (element.classList.contains(HIGHLIGHT_CLASS)) {\n\t\t\t\t\t\tdocument.querySelectorAll(\".\" + HIGHLIGHT_CLASS + \"[data-singlefile-highlight-id=\" + JSON.stringify(element.dataset.singlefileHighlightId) + \"]\").forEach(highlightedElement => {\n\t\t\t\t\t\t\tresetHighlightedElement(highlightedElement);\n\t\t\t\t\t\t\tonUpdate(false);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdone = true;\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (resizingNoteMode) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tresizingNoteMode = false;\n\t\t\t\tdocument.documentElement.style.removeProperty(\"user-select\");\n\t\t\t\tmaskPageElement.classList.remove(PAGE_MASK_ACTIVE_CLASS);\n\t\t\t\tdocument.documentElement.ontouchmove = onTouchMove;\n\t\t\t\tdocument.documentElement.onmousemove = null;\n\t\t\t\tonUpdate(false);\n\t\t\t}\n\t\t\tif (movingNoteMode) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tanchorNote(movingNoteMode.event || event, selectedNote, movingNoteMode.deltaX, movingNoteMode.deltaY);\n\t\t\t\tmovingNoteMode = null;\n\t\t\t\tdocument.documentElement.ontouchmove = onTouchMove;\n\t\t\t\tdocument.documentElement.onmousemove = null;\n\t\t\t\tonUpdate(false);\n\t\t\t}\n\t\t\tif ((cuttingMode || cuttingOuterMode) && cuttingPath) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\tconst element = cuttingPath[cuttingPathIndex];\n\t\t\t\t\telement.classList.toggle(cuttingMode ? CUT_SELECTED_CLASS : CUT_OUTER_SELECTED_CLASS);\n\t\t\t\t} else {\n\t\t\t\t\tvalidateCutElement(event.shiftKey);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (collapseNoteTimeout) {\n\t\t\t\tclearTimeout(collapseNoteTimeout);\n\t\t\t\tcollapseNoteTimeout = null;\n\t\t\t}\n\t\t}\n\n\t\tfunction onMouseOver(event) {\n\t\t\tif (cuttingMode || cuttingOuterMode) {\n\t\t\t\tconst target = event.target;\n\t\t\t\tif (target.classList) {\n\t\t\t\t\tlet ancestorFound;\n\t\t\t\t\tdocument.querySelectorAll(\".\" + (cuttingMode ? CUT_SELECTED_CLASS : CUT_OUTER_SELECTED_CLASS)).forEach(element => {\n\t\t\t\t\t\tif (element == target || isAncestor(element, target) || isAncestor(target, element)) {\n\t\t\t\t\t\t\tancestorFound = element;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif (ancestorFound) {\n\t\t\t\t\t\tcuttingPath = [ancestorFound];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcuttingPath = getParents(event.target);\n\t\t\t\t\t}\n\t\t\t\t\tcuttingPathIndex = 0;\n\t\t\t\t\thighlightCutElement();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onMouseOut() {\n\t\t\tif (cuttingMode || cuttingOuterMode) {\n\t\t\t\tif (cuttingPath) {\n\t\t\t\t\tunhighlightCutElement();\n\t\t\t\t\tcuttingPath = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onTouchMove(event) {\n\t\t\tif (cuttingMode || cuttingOuterMode) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst { clientX, clientY } = getPosition(event);\n\t\t\t\tconst target = document.elementFromPoint(clientX, clientY);\n\t\t\t\tif (cuttingTouchTarget != target) {\n\t\t\t\t\tonMouseOut();\n\t\t\t\t\tif (target) {\n\t\t\t\t\t\tcuttingTouchTarget = target;\n\t\t\t\t\t\tonMouseOver({ target });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onKeyDown(event) {\n\t\t\tif (cuttingMode || cuttingOuterMode) {\n\t\t\t\tif (event.code == \"Tab\") {\n\t\t\t\t\tif (cuttingPath) {\n\t\t\t\t\t\tconst delta = event.shiftKey ? -1 : 1;\n\t\t\t\t\t\tlet element = cuttingPath[cuttingPathIndex];\n\t\t\t\t\t\tlet nextElement = cuttingPath[cuttingPathIndex + delta];\n\t\t\t\t\t\tif (nextElement) {\n\t\t\t\t\t\t\tlet pathIndex = cuttingPathIndex + delta;\n\t\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\t\tnextElement &&\n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t(delta == 1 &&\n\t\t\t\t\t\t\t\t\t\telement.getBoundingClientRect().width >= nextElement.getBoundingClientRect().width &&\n\t\t\t\t\t\t\t\t\t\telement.getBoundingClientRect().height >= nextElement.getBoundingClientRect().height) ||\n\t\t\t\t\t\t\t\t\t(delta == -1 &&\n\t\t\t\t\t\t\t\t\t\telement.getBoundingClientRect().width <= nextElement.getBoundingClientRect().width &&\n\t\t\t\t\t\t\t\t\t\telement.getBoundingClientRect().height <= nextElement.getBoundingClientRect().height))) {\n\t\t\t\t\t\t\t\tpathIndex += delta;\n\t\t\t\t\t\t\t\tnextElement = cuttingPath[pathIndex];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (nextElement && nextElement.classList && nextElement != document.body && nextElement != document.documentElement) {\n\t\t\t\t\t\t\t\tunhighlightCutElement();\n\t\t\t\t\t\t\t\tcuttingPathIndex = pathIndex;\n\t\t\t\t\t\t\t\thighlightCutElement();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tif (event.code == \"Space\") {\n\t\t\t\t\tif (cuttingPath) {\n\t\t\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\t\t\tconst element = cuttingPath[cuttingPathIndex];\n\t\t\t\t\t\t\telement.classList.add(cuttingMode ? CUT_SELECTED_CLASS : CUT_OUTER_SELECTED_CLASS);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalidateCutElement(event.shiftKey);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (event.code == \"Escape\") {\n\t\t\t\t\tresetSelectedElements();\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tif (event.key.toLowerCase() == \"z\" && event.ctrlKey) {\n\t\t\t\t\tif (event.shiftKey) {\n\t\t\t\t\t\tredoCutPage();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tundoCutPage();\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.key.toLowerCase() == \"s\" && event.ctrlKey) {\n\t\t\t\twindow.parent.postMessage(JSON.stringify({ \"method\": \"savePage\" }), \"*\");\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\tif (event.key.toLowerCase() == \"p\" && event.ctrlKey) {\n\t\t\t\tprintPage();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t\tfunction printPage() {\n\t\t\tunhighlightCutElement();\n\t\t\tresetSelectedElements();\n\t\t\twindow.print();\n\t\t}\n\n\t\tfunction highlightCutElement() {\n\t\t\tconst element = cuttingPath[cuttingPathIndex];\n\t\t\telement.classList.add(cuttingMode ? CUT_HOVER_CLASS : CUT_OUTER_HOVER_CLASS);\n\t\t}\n\n\t\tfunction unhighlightCutElement() {\n\t\t\tif (cuttingPath) {\n\t\t\t\tconst element = cuttingPath[cuttingPathIndex];\n\t\t\t\telement.classList.remove(CUT_HOVER_CLASS);\n\t\t\t\telement.classList.remove(CUT_OUTER_HOVER_CLASS);\n\t\t\t}\n\t\t}\n\n\t\tfunction disableHighlight(doc = document) {\n\t\t\tif (highlightColor) {\n\t\t\t\tdoc.documentElement.classList.remove(highlightColor + \"-mode\");\n\t\t\t}\n\t\t}\n\n\t\tfunction undoCutPage() {\n\t\t\tif (removedElementIndex) {\n\t\t\t\tremovedElements[removedElementIndex - 1].forEach(element => element.classList.remove(REMOVED_CONTENT_CLASS));\n\t\t\t\tremovedElementIndex--;\n\t\t\t}\n\t\t}\n\n\t\tfunction redoCutPage() {\n\t\t\tif (removedElementIndex < removedElements.length) {\n\t\t\t\tremovedElements[removedElementIndex].forEach(element => element.classList.add(REMOVED_CONTENT_CLASS));\n\t\t\t\tremovedElementIndex++;\n\t\t\t}\n\t\t}\n\n\t\tfunction validateCutElement(invert) {\n\t\t\tconst selectedElement = cuttingPath[cuttingPathIndex];\n\t\t\tif ((cuttingMode && !invert) || (cuttingOuterMode && invert)) {\n\t\t\t\tif (document.documentElement != selectedElement && selectedElement.tagName.toLowerCase() != NOTE_TAGNAME) {\n\t\t\t\t\tconst elementsRemoved = [selectedElement].concat(...document.querySelectorAll(\".\" + CUT_SELECTED_CLASS + \",.\" + CUT_SELECTED_CLASS + \" *,.\" + CUT_HOVER_CLASS + \" *\"));\n\t\t\t\t\tresetSelectedElements();\n\t\t\t\t\tif (elementsRemoved.length) {\n\t\t\t\t\t\telementsRemoved.forEach(element => {\n\t\t\t\t\t\t\tunhighlightCutElement();\n\t\t\t\t\t\t\tif (element.tagName.toLowerCase() == NOTE_TAGNAME) {\n\t\t\t\t\t\t\t\tresetAnchorNote(element);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\telement.classList.add(REMOVED_CONTENT_CLASS);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tremovedElements[removedElementIndex] = elementsRemoved;\n\t\t\t\t\t\tremovedElementIndex++;\n\t\t\t\t\t\tremovedElements.length = removedElementIndex;\n\t\t\t\t\t\tonUpdate(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (document.documentElement != selectedElement && selectedElement.tagName.toLowerCase() != NOTE_TAGNAME) {\n\t\t\t\t\tconst elements = [];\n\t\t\t\t\tconst searchSelector = \"*:not(style):not(meta):not(.\" + REMOVED_CONTENT_CLASS + \")\";\n\t\t\t\t\tconst elementsKept = [selectedElement].concat(...document.querySelectorAll(\".\" + CUT_OUTER_SELECTED_CLASS));\n\t\t\t\t\tdocument.body.querySelectorAll(searchSelector).forEach(element => {\n\t\t\t\t\t\tlet removed = true;\n\t\t\t\t\t\telementsKept.forEach(elementKept => removed = removed && (elementKept != element && !isAncestor(elementKept, element) && !isAncestor(element, elementKept)));\n\t\t\t\t\t\tif (removed) {\n\t\t\t\t\t\t\tif (element.tagName.toLowerCase() == NOTE_TAGNAME) {\n\t\t\t\t\t\t\t\tresetAnchorNote(element);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\telementsKept.forEach(elementKept => {\n\t\t\t\t\t\tunhighlightCutElement();\n\t\t\t\t\t\tconst elementKeptRect = elementKept.getBoundingClientRect();\n\t\t\t\t\t\telementKept.querySelectorAll(searchSelector).forEach(descendant => {\n\t\t\t\t\t\t\tconst descendantRect = descendant.getBoundingClientRect();\n\t\t\t\t\t\t\tif (descendantRect.width && descendantRect.height && (\n\t\t\t\t\t\t\t\tdescendantRect.left + descendantRect.width < elementKeptRect.left ||\n\t\t\t\t\t\t\t\tdescendantRect.right > elementKeptRect.right + elementKeptRect.width ||\n\t\t\t\t\t\t\t\tdescendantRect.top + descendantRect.height < elementKeptRect.top ||\n\t\t\t\t\t\t\t\tdescendantRect.bottom > elementKeptRect.bottom + elementKeptRect.height\n\t\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\t\telements.push(descendant);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\tresetSelectedElements();\n\t\t\t\t\tif (elements.length) {\n\t\t\t\t\t\telements.forEach(element => element.classList.add(REMOVED_CONTENT_CLASS));\n\t\t\t\t\t\tremovedElements[removedElementIndex] = elements;\n\t\t\t\t\t\tremovedElementIndex++;\n\t\t\t\t\t\tremovedElements.length = removedElementIndex;\n\t\t\t\t\t\tonUpdate(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction resetSelectedElements(doc = document) {\n\t\t\tdoc.querySelectorAll(\".\" + CUT_OUTER_SELECTED_CLASS + \",.\" + CUT_SELECTED_CLASS).forEach(element => {\n\t\t\t\telement.classList.remove(CUT_OUTER_SELECTED_CLASS);\n\t\t\t\telement.classList.remove(CUT_SELECTED_CLASS);\n\t\t\t});\n\t\t}\n\n\t\tfunction anchorNote(event, noteElement, deltaX, deltaY) {\n\t\t\tevent.preventDefault();\n\t\t\tconst { clientX, clientY } = getPosition(event);\n\t\t\tdocument.documentElement.style.removeProperty(\"user-select\");\n\t\t\tnoteElement.classList.remove(NOTE_MOVING_CLASS);\n\t\t\tmaskNoteElement.classList.remove(NOTE_MASK_MOVING_CLASS);\n\t\t\tmaskPageElement.classList.remove(PAGE_MASK_ACTIVE_CLASS);\n\t\t\tmaskNoteElement.classList.remove(noteElement.dataset.color);\n\t\t\tconst headerElement = noteElement.querySelector(\"header\");\n\t\t\theaderElement.ontouchmove = document.documentElement.onmousemove = null;\n\t\t\tlet currentElement = anchorElement;\n\t\t\tlet positionedElement;\n\t\t\twhile (currentElement.parentElement && !positionedElement) {\n\t\t\t\tif (!FORBIDDEN_TAG_NAMES.includes(currentElement.tagName.toLowerCase())) {\n\t\t\t\t\tconst currentElementStyle = getComputedStyle(currentElement);\n\t\t\t\t\tif (currentElementStyle.position != \"static\") {\n\t\t\t\t\t\tpositionedElement = currentElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcurrentElement = currentElement.parentElement;\n\t\t\t}\n\t\t\tif (!positionedElement) {\n\t\t\t\tpositionedElement = document.documentElement;\n\t\t\t}\n\t\t\tconst containerElement = noteElement.getRootNode().host;\n\t\t\tif (positionedElement == document.documentElement) {\n\t\t\t\tconst firstMaskElement = document.querySelector(\".\" + MASK_CLASS);\n\t\t\t\tfirstMaskElement.parentElement.insertBefore(containerElement, firstMaskElement);\n\t\t\t} else {\n\t\t\t\tpositionedElement.appendChild(containerElement);\n\t\t\t}\n\t\t\tconst boundingRectPositionedElement = positionedElement.getBoundingClientRect();\n\t\t\tconst stylePositionedElement = window.getComputedStyle(positionedElement);\n\t\t\tconst borderX = parseInt(stylePositionedElement.getPropertyValue(\"border-left-width\"));\n\t\t\tconst borderY = parseInt(stylePositionedElement.getPropertyValue(\"border-top-width\"));\n\t\t\tnoteElement.style.setProperty(\"position\", \"absolute\");\n\t\t\tnoteElement.style.setProperty(\"left\", (clientX - boundingRectPositionedElement.x - deltaX - borderX) + \"px\");\n\t\t\tnoteElement.style.setProperty(\"top\", (clientY - boundingRectPositionedElement.y - deltaY - borderY) + \"px\");\n\t\t}\n\n\t\tfunction resetAnchorNote(containerElement) {\n\t\t\tconst noteId = containerElement.dataset.noteId;\n\t\t\tconst noteElement = containerElement.shadowRoot.childNodes[1];\n\t\t\tnoteElement.classList.remove(NOTE_ANCHORED_CLASS);\n\t\t\tdeleteNoteRef(containerElement, noteId);\n\t\t\taddNoteRef(document.documentElement, noteId);\n\t\t\tdocument.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);\n\t\t}\n\n\t\tfunction getPosition(event) {\n\t\t\tif (event.touches && event.touches.length) {\n\t\t\t\tconst touch = event.touches[0];\n\t\t\t\treturn touch;\n\t\t\t} else {\n\t\t\t\treturn event;\n\t\t\t}\n\t\t}\n\n\t\tfunction highlightSelection() {\n\t\t\tlet highlightId = 0;\n\t\t\tdocument.querySelectorAll(\".\" + HIGHLIGHT_CLASS).forEach(highlightedElement => highlightId = Math.max(highlightId, highlightedElement.dataset.singlefileHighlightId));\n\t\t\thighlightId++;\n\t\t\tconst selection = window.getSelection();\n\t\t\tconst highlightedNodes = new Set();\n\t\t\tfor (let indexRange = 0; indexRange < selection.rangeCount; indexRange++) {\n\t\t\t\tconst range = selection.getRangeAt(indexRange);\n\t\t\t\tif (!range.collapsed) {\n\t\t\t\t\tif (range.commonAncestorContainer.nodeType == range.commonAncestorContainer.TEXT_NODE) {\n\t\t\t\t\t\tlet contentText = range.startContainer.splitText(range.startOffset);\n\t\t\t\t\t\tcontentText = contentText.splitText(range.endOffset);\n\t\t\t\t\t\taddHighLightedNode(contentText.previousSibling);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst treeWalker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT);\n\t\t\t\t\t\tlet highlightNodes;\n\t\t\t\t\t\twhile (treeWalker.nextNode()) {\n\t\t\t\t\t\t\tif (highlightNodes && !treeWalker.currentNode.contains(range.endContainer)) {\n\t\t\t\t\t\t\t\taddHighLightedNode(treeWalker.currentNode);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (treeWalker.currentNode == range.startContainer) {\n\t\t\t\t\t\t\t\tif (range.startContainer.nodeType == range.startContainer.TEXT_NODE) {\n\t\t\t\t\t\t\t\t\tconst contentText = range.startContainer.splitText(range.startOffset);\n\t\t\t\t\t\t\t\t\ttreeWalker.nextNode();\n\t\t\t\t\t\t\t\t\taddHighLightedNode(contentText);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\taddHighLightedNode(range.startContainer.childNodes[range.startOffset]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\thighlightNodes = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (treeWalker.currentNode == range.endContainer) {\n\t\t\t\t\t\t\t\tif (range.endContainer.nodeType == range.endContainer.TEXT_NODE) {\n\t\t\t\t\t\t\t\t\tconst contentText = range.endContainer.splitText(range.endOffset);\n\t\t\t\t\t\t\t\t\ttreeWalker.nextNode();\n\t\t\t\t\t\t\t\t\taddHighLightedNode(contentText.previousSibling);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\taddHighLightedNode(range.endContainer.childNodes[range.endOffset]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\thighlightNodes = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\trange.collapse();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\thighlightedNodes.forEach(node => highlightNode(node));\n\n\t\t\tfunction addHighLightedNode(node) {\n\t\t\t\tif (node && node.textContent.trim()) {\n\t\t\t\t\tif (node.nodeType == node.TEXT_NODE && node.parentElement.childNodes.length == 1 && node.parentElement.classList.contains(HIGHLIGHT_CLASS)) {\n\t\t\t\t\t\thighlightedNodes.add(node.parentElement);\n\t\t\t\t\t} else {\n\t\t\t\t\t\thighlightedNodes.add(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction highlightNode(node) {\n\t\t\t\tif (node.nodeType == node.ELEMENT_NODE) {\n\t\t\t\t\tresetHighlightedElement(node);\n\t\t\t\t\tnode.classList.add(HIGHLIGHT_CLASS);\n\t\t\t\t\tnode.classList.add(highlightColor);\n\t\t\t\t\tnode.dataset.singlefileHighlightId = highlightId;\n\t\t\t\t} else if (node.parentElement) {\n\t\t\t\t\thighlightTextNode(node);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction highlightTextNode(node) {\n\t\t\t\tconst spanElement = document.createElement(\"span\");\n\t\t\t\tspanElement.classList.add(HIGHLIGHT_CLASS);\n\t\t\t\tspanElement.classList.add(highlightColor);\n\t\t\t\tspanElement.textContent = node.textContent;\n\t\t\t\tspanElement.dataset.singlefileHighlightId = highlightId;\n\t\t\t\tnode.parentNode.replaceChild(spanElement, node);\n\t\t\t\treturn spanElement;\n\t\t\t}\n\t\t}\n\n\t\tfunction getParents(element) {\n\t\t\tconst path = [];\n\t\t\twhile (element) {\n\t\t\t\tpath.push(element);\n\t\t\t\telement = element.parentElement;\n\t\t\t}\n\t\t\treturn path;\n\t\t}\n\n\t\tfunction formatPage(applySystemTheme, contentWidth) {\n\t\t\tif (pageCompressContent) {\n\t\t\t\tserializeShadowRoots(document);\n\t\t\t\tpreviousContent = document.documentElement.cloneNode(true);\n\t\t\t\tdeserializeShadowRoots(document);\n\t\t\t} else {\n\t\t\t\tpreviousContent = getContent(false, []);\n\t\t\t}\n\t\t\tconst shadowRoots = {};\n\t\t\tconst classesToPreserve = [\"single-file-highlight\", \"single-file-highlight-yellow\", \"single-file-highlight-green\", \"single-file-highlight-pink\", \"single-file-highlight-blue\"];\n\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => {\n\t\t\t\tshadowRoots[containerElement.dataset.noteId] = containerElement.shadowRoot;\n\t\t\t\tconst className = \"singlefile-note-id-\" + containerElement.dataset.noteId;\n\t\t\t\tcontainerElement.classList.add(className);\n\t\t\t\tclassesToPreserve.push(className);\n\t\t\t});\n\t\t\tconst optionsElement = document.querySelector(\"script[type=\\\"application/json\\\"][\" + SCRIPT_OPTIONS + \"]\");\n\t\t\tconst article = new Readability(document, { classesToPreserve }).parse();\n\t\t\tconst articleMetadata = Object.assign({}, article);\n\t\t\tdelete articleMetadata.content;\n\t\t\tdelete articleMetadata.textContent;\n\t\t\tfor (const key in articleMetadata) {\n\t\t\t\tif (articleMetadata[key] == null) {\n\t\t\t\t\tdelete articleMetadata[key];\n\t\t\t\t}\n\t\t\t}\n\t\t\tremovedElements = [];\n\t\t\tremovedElementIndex = 0;\n\t\t\tdocument.body.innerHTML = \"\";\n\t\t\tconst domParser = new DOMParser();\n\t\t\tconst doc = domParser.parseFromString(article.content, \"text/html\");\n\t\t\tconst contentEditable = document.body.contentEditable;\n\t\t\tdocument.documentElement.replaceChild(doc.body, document.body);\n\t\t\tif (optionsElement) {\n\t\t\t\tdocument.body.appendChild(optionsElement);\n\t\t\t}\n\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => {\n\t\t\t\tconst noteId = (Array.from(containerElement.classList).find(className => /singlefile-note-id-\\d+/.test(className))).split(\"singlefile-note-id-\")[1];\n\t\t\t\tcontainerElement.classList.remove(\"singlefile-note-id-\" + noteId);\n\t\t\t\tcontainerElement.dataset.noteId = noteId;\n\t\t\t\tif (!containerElement.shadowRoot) {\n\t\t\t\t\tcontainerElement.attachShadow({ mode: \"open\" });\n\t\t\t\t\tcontainerElement.shadowRoot.appendChild(shadowRoots[noteId]);\n\t\t\t\t}\n\t\t\t});\n\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => shadowRoots[containerElement.dataset.noteId].childNodes.forEach(node => containerElement.shadowRoot.appendChild(node)));\n\t\t\tdocument.body.contentEditable = contentEditable;\n\t\t\tdocument.head.querySelectorAll(\"style\").forEach(styleElement => styleElement.remove());\n\t\t\tconst styleElement = document.createElement(\"style\");\n\t\t\tstyleElement.textContent = getStyleFormattedPage(contentWidth);\n\t\t\tdocument.head.appendChild(styleElement);\n\t\t\tdocument.body.classList.add(\"moz-reader-content\");\n\t\t\tdocument.body.classList.add(\"content-width6\");\n\t\t\tdocument.body.classList.add(\"reader-show-element\");\n\t\t\tdocument.body.classList.add(\"sans-serif\");\n\t\t\tdocument.body.classList.add(\"container\");\n\t\t\tdocument.body.classList.add(\"line-height4\");\n\t\t\tconst prefersColorSchemeDark = matchMedia(\"(prefers-color-scheme: dark)\");\n\t\t\tif (applySystemTheme && prefersColorSchemeDark && prefersColorSchemeDark.matches) {\n\t\t\t\tdocument.body.classList.add(\"dark\");\n\t\t\t}\n\t\t\tdocument.body.style.setProperty(\"display\", \"block\");\n\t\t\tdocument.body.style.setProperty(\"padding\", \"24px\");\n\t\t\tconst titleElement = document.createElement(\"h1\");\n\t\t\ttitleElement.classList.add(\"reader-title\");\n\t\t\ttitleElement.textContent = article.title;\n\t\t\tdocument.body.insertBefore(titleElement, document.body.firstChild);\n\t\t\tconst existingMetaDataElement = document.querySelector(\"script[id=singlefile-readability-metadata]\");\n\t\t\tif (existingMetaDataElement) {\n\t\t\t\texistingMetaDataElement.remove();\n\t\t\t}\n\t\t\tconst metaDataElement = document.createElement(\"script\");\n\t\t\tmetaDataElement.type = \"application/json\";\n\t\t\tmetaDataElement.id = \"singlefile-readability-metadata\";\n\t\t\tmetaDataElement.textContent = JSON.stringify(articleMetadata, null, 2);\n\t\t\tdocument.head.appendChild(metaDataElement);\n\t\t\tdocument.querySelectorAll(\"a[href]\").forEach(element => {\n\t\t\t\tconst href = element.getAttribute(\"href\").trim();\n\t\t\t\tif (href.startsWith(document.baseURI + \"#\")) {\n\t\t\t\t\telement.setAttribute(\"href\", href.substring(document.baseURI.length));\n\t\t\t\t}\n\t\t\t});\n\t\t\tinsertHighlightStylesheet(document);\n\t\t\tmaskPageElement = getMaskElement(PAGE_MASK_CLASS, PAGE_MASK_CONTAINER_CLASS);\n\t\t\tmaskNoteElement = getMaskElement(NOTE_MASK_CLASS);\n\t\t\treflowNotes();\n\t\t\tonUpdate(false);\n\t\t}\n\n\t\tasync function cancelFormatPage() {\n\t\t\tif (previousContent) {\n\t\t\t\tconst contentEditable = document.body.contentEditable;\n\t\t\t\tif (pageCompressContent) {\n\t\t\t\t\tdocument.replaceChild(previousContent, document.documentElement);\n\t\t\t\t\tdeserializeShadowRoots(document);\n\t\t\t\t\tawait initPage();\n\t\t\t\t} else {\n\t\t\t\t\tawait init({ content: previousContent }, { reset: true });\n\t\t\t\t}\n\t\t\t\tdocument.body.contentEditable = contentEditable;\n\t\t\t\tonUpdate(false);\n\t\t\t\tpreviousContent = null;\n\t\t\t}\n\t\t}\n\n\t\tfunction insertHighlightStylesheet(doc) {\n\t\t\tif (!doc.querySelector(\".\" + HIGHLIGHTS_STYLESHEET_CLASS)) {\n\t\t\t\tconst styleheetHighlights = getStyleElement(HIGHLIGHTS_WEB_STYLESHEET);\n\t\t\t\tstyleheetHighlights.classList.add(HIGHLIGHTS_STYLESHEET_CLASS);\n\t\t\t\tdoc.documentElement.appendChild(styleheetHighlights);\n\t\t\t}\n\t\t}\n\n\t\tfunction getContent(compressHTML, updatedResources) {\n\t\t\tunhighlightCutElement();\n\t\t\tserializeShadowRoots(document);\n\t\t\tsinglefile.helper.markInvalidNesting(document);\n\t\t\tconst doc = document.cloneNode(true);\n\t\t\tdisableHighlight(doc);\n\t\t\tresetSelectedElements(doc);\n\t\t\tdeserializeShadowRoots(doc);\n\t\t\tdeserializeShadowRoots(document);\n\t\t\tdoc.documentElement.classList.remove(CUT_MODE_CLASS);\n\t\t\tdoc.querySelectorAll(\"[\" + DISABLED_NOSCRIPT_ATTRIBUTE_NAME + \"]\").forEach(element => {\n\t\t\t\telement.textContent = element.getAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME);\n\t\t\t\telement.removeAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME);\n\t\t\t});\n\t\t\tdoc.querySelectorAll(\".\" + MASK_CLASS + \", \" + singlefile.helper.INFOBAR_TAGNAME + \", .\" + REMOVED_CONTENT_CLASS).forEach(element => element.remove());\n\t\t\tif (includeInfobar) {\n\t\t\t\tconst options = singlefile.helper.extractInfobarData(doc);\n\t\t\t\toptions.openInfobar = openInfobar;\n\t\t\t\toptions.infobarPositionAbsolute = infobarPositionAbsolute;\n\t\t\t\toptions.infobarPositionTop = infobarPositionTop;\n\t\t\t\toptions.infobarPositionRight = infobarPositionRight;\n\t\t\t\toptions.infobarPositionBottom = infobarPositionBottom;\n\t\t\t\toptions.infobarPositionLeft = infobarPositionLeft;\n\t\t\t\tsinglefile.helper.appendInfobar(doc, options);\n\t\t\t}\n\t\t\tdoc.querySelectorAll(\".\" + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.remove(HIGHLIGHT_HIDDEN_CLASS));\n\t\t\tdoc.querySelectorAll(`template[${SHADOWROOT_ATTRIBUTE_NAME}]`).forEach(templateElement => {\n\t\t\t\tconst noteElement = templateElement.querySelector(\".\" + NOTE_CLASS);\n\t\t\t\tif (noteElement) {\n\t\t\t\t\tnoteElement.classList.remove(NOTE_HIDDEN_CLASS);\n\t\t\t\t}\n\t\t\t\tconst mainElement = templateElement.querySelector(\"textarea\");\n\t\t\t\tif (mainElement) {\n\t\t\t\t\tmainElement.textContent = mainElement.value;\n\t\t\t\t}\n\t\t\t});\n\t\t\tdoc.querySelectorAll(\"iframe\").forEach(element => {\n\t\t\t\tconst pointerEvents = \"pointer-events\";\n\t\t\t\telement.style.setProperty(pointerEvents, element.style.getPropertyValue(\"-sf-\" + pointerEvents), element.style.getPropertyPriority(\"-sf-\" + pointerEvents));\n\t\t\t\telement.style.removeProperty(\"-sf-\" + pointerEvents);\n\t\t\t});\n\t\t\tdoc.body.removeAttribute(\"contentEditable\");\n\t\t\tconst newResources = Object.keys(updatedResources).filter(url => updatedResources[url].type == \"stylesheet\").map(url => updatedResources[url]);\n\t\t\tnewResources.forEach(resource => {\n\t\t\t\tconst element = doc.createElement(\"style\");\n\t\t\t\tdoc.body.appendChild(element);\n\t\t\t\telement.textContent = resource.content;\n\t\t\t});\n\t\t\tif (pageCompressContent) {\n\t\t\t\tconst pageFilename = pageResources\n\t\t\t\t\t.filter(resource => resource.filename.endsWith(\"index.html\"))\n\t\t\t\t\t.sort((resourceLeft, resourceRight) => resourceLeft.filename.length - resourceRight.filename.length)[0].filename;\n\t\t\t\tconst resources = pageResources.filter(resource => resource.parentResources.includes(pageFilename));\n\t\t\t\tdoc.querySelectorAll(\"[src]\").forEach(element => resources.forEach(resource => {\n\t\t\t\t\tif (element.src == resource.content) {\n\t\t\t\t\t\telement.src = resource.name;\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t\tlet content = singlefile.helper.serialize(doc, compressHTML);\n\t\t\t\tresources.sort((resourceLeft, resourceRight) => resourceRight.content.length - resourceLeft.content.length);\n\t\t\t\tresources.forEach(resource => content = content.replaceAll(resource.content, resource.name));\n\t\t\t\treturn content + \"<script \" + SCRIPT_TEMPLATE_SHADOW_ROOT + \">\" + getEmbedScript() + \"</script>\";\n\t\t\t} else {\n\t\t\t\treturn singlefile.helper.serialize(doc, compressHTML) + \"<script \" + SCRIPT_TEMPLATE_SHADOW_ROOT + \">\" + getEmbedScript() + \"</script>\";\n\t\t\t}\n\t\t}\n\n\t\tfunction onUpdate(saved) {\n\t\t\twindow.parent.postMessage(JSON.stringify({ \"method\": \"onUpdate\", saved }), \"*\");\n\t\t}\n\n\t\tfunction waitResourcesLoad() {\n\t\t\treturn new Promise(resolve => {\n\t\t\t\tlet counterMutations = 0;\n\t\t\t\tconst done = () => {\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\t\t\t\tlet timeoutInit = setTimeout(done, 100);\n\t\t\t\tconst observer = new MutationObserver(() => {\n\t\t\t\t\tif (counterMutations < 20) {\n\t\t\t\t\t\tcounterMutations++;\n\t\t\t\t\t\tclearTimeout(timeoutInit);\n\t\t\t\t\t\ttimeoutInit = setTimeout(done, 100);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tobserver.observe(document, { subtree: true, childList: true, attributes: true });\n\t\t\t});\n\t\t}\n\n\t\tfunction reflowNotes() {\n\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => {\n\t\t\t\tconst noteElement = containerElement.shadowRoot.querySelector(\".\" + NOTE_CLASS);\n\t\t\t\tconst noteBoundingRect = noteElement.getBoundingClientRect();\n\t\t\t\tconst anchorElement = getAnchorElement(containerElement);\n\t\t\t\tconst anchorBoundingRect = anchorElement.getBoundingClientRect();\n\t\t\t\tconst maxX = anchorBoundingRect.x + Math.max(0, anchorBoundingRect.width - noteBoundingRect.width);\n\t\t\t\tconst minX = anchorBoundingRect.x;\n\t\t\t\tconst maxY = anchorBoundingRect.y + Math.max(0, anchorBoundingRect.height - NOTE_HEADER_HEIGHT);\n\t\t\t\tconst minY = anchorBoundingRect.y;\n\t\t\t\tlet left = parseInt(noteElement.style.getPropertyValue(\"left\"));\n\t\t\t\tlet top = parseInt(noteElement.style.getPropertyValue(\"top\"));\n\t\t\t\tif (noteBoundingRect.x > maxX) {\n\t\t\t\t\tleft -= noteBoundingRect.x - maxX;\n\t\t\t\t}\n\t\t\t\tif (noteBoundingRect.x < minX) {\n\t\t\t\t\tleft += minX - noteBoundingRect.x;\n\t\t\t\t}\n\t\t\t\tif (noteBoundingRect.y > maxY) {\n\t\t\t\t\ttop -= noteBoundingRect.y - maxY;\n\t\t\t\t}\n\t\t\t\tif (noteBoundingRect.y < minY) {\n\t\t\t\t\ttop += minY - noteBoundingRect.y;\n\t\t\t\t}\n\t\t\t\tnoteElement.style.setProperty(\"position\", \"absolute\");\n\t\t\t\tnoteElement.style.setProperty(\"left\", left + \"px\");\n\t\t\t\tnoteElement.style.setProperty(\"top\", top + \"px\");\n\t\t\t});\n\t\t}\n\n\t\tfunction resetHighlightedElement(element) {\n\t\t\telement.classList.remove(HIGHLIGHT_CLASS);\n\t\t\telement.classList.remove(\"single-file-highlight-yellow\");\n\t\t\telement.classList.remove(\"single-file-highlight-pink\");\n\t\t\telement.classList.remove(\"single-file-highlight-blue\");\n\t\t\telement.classList.remove(\"single-file-highlight-green\");\n\t\t\tdelete element.dataset.singlefileHighlightId;\n\t\t}\n\n\t\tfunction serializeShadowRoots(node) {\n\t\t\tnode.querySelectorAll(\"*\").forEach(element => {\n\t\t\t\tconst shadowRoot = getShadowRoot(element);\n\t\t\t\tif (shadowRoot) {\n\t\t\t\t\tserializeShadowRoots(shadowRoot);\n\t\t\t\t\tconst templateElement = document.createElement(\"template\");\n\t\t\t\t\ttemplateElement.setAttribute(SHADOWROOT_ATTRIBUTE_NAME, \"open\");\n\t\t\t\t\tArray.from(shadowRoot.childNodes).forEach(childNode => templateElement.appendChild(childNode));\n\t\t\t\t\telement.appendChild(templateElement);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction deserializeShadowRoots(node) {\n\t\t\tnode.querySelectorAll(`template[${SHADOWROOT_ATTRIBUTE_NAME}]`).forEach(element => {\n\t\t\t\tif (element.parentElement) {\n\t\t\t\t\tlet shadowRoot = getShadowRoot(element.parentElement);\n\t\t\t\t\tif (shadowRoot) {\n\t\t\t\t\t\tArray.from(element.childNodes).forEach(node => shadowRoot.appendChild(node));\n\t\t\t\t\t\telement.remove();\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tshadowRoot = element.parentElement.attachShadow({ mode: \"open\" });\n\t\t\t\t\t\t\tconst contentDocument = (new DOMParser()).parseFromString(element.innerHTML, \"text/html\");\n\t\t\t\t\t\t\tArray.from(contentDocument.head.childNodes).forEach(node => shadowRoot.appendChild(node));\n\t\t\t\t\t\t\tArray.from(contentDocument.body.childNodes).forEach(node => shadowRoot.appendChild(node));\n\t\t\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t// ignored\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (shadowRoot) {\n\t\t\t\t\t\tdeserializeShadowRoots(shadowRoot);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction getMaskElement(className, containerClassName) {\n\t\t\tlet maskElement = document.documentElement.querySelector(\".\" + className);\n\t\t\tif (!maskElement) {\n\t\t\t\tmaskElement = document.createElement(\"div\");\n\t\t\t\tconst maskContainerElement = document.createElement(\"div\");\n\t\t\t\tif (containerClassName) {\n\t\t\t\t\tmaskContainerElement.classList.add(containerClassName);\n\t\t\t\t}\n\t\t\t\tmaskContainerElement.classList.add(MASK_CLASS);\n\t\t\t\tconst firstNote = document.querySelector(NOTE_TAGNAME);\n\t\t\t\tif (firstNote && firstNote.parentElement == document.documentElement) {\n\t\t\t\t\tdocument.documentElement.insertBefore(maskContainerElement, firstNote);\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.appendChild(maskContainerElement);\n\t\t\t\t}\n\t\t\t\tmaskElement.classList.add(className);\n\t\t\t\tconst maskShadow = maskContainerElement.attachShadow({ mode: \"open\" });\n\t\t\t\tmaskShadow.appendChild(getStyleElement(MASK_WEB_STYLESHEET));\n\t\t\t\tmaskShadow.appendChild(maskElement);\n\t\t\t\treturn maskElement;\n\t\t\t}\n\t\t}\n\n\t\tfunction getStyleFormattedPage(contentWidth) {\n\t\t\treturn `\n\t/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this file,\n * You can obtain one at http://mozilla.org/MPL/2.0/. */\n\n/* Avoid adding ID selector rules in this style sheet, since they could\n * inadvertently match elements in the article content. */\n\n:root {\n  --grey-90-a10: rgba(12, 12, 13, 0.1);\n  --grey-90-a20: rgba(12, 12, 13, 0.2);\n  --grey-90-a30: rgba(12, 12, 13, 0.3);\n  --grey-90-a80: rgba(12, 12, 13, 0.8);\n  --grey-30: #d7d7db;\n  --blue-40: #45a1ff;\n  --blue-40-a30: rgba(69, 161, 255, 0.3);\n  --blue-60: #0060df;\n  --body-padding: 64px;\n  --font-size: 12;\n  --content-width: ${contentWidth}em;\n  --line-height: 1.6em;\n}\n\nbody {\n  --main-background: #fff;\n  --main-foreground: #333;\n  --font-color: #000000;\n  --primary-color: #0B83FF;\n  --toolbar-border: var(--grey-90-a20);\n  --toolbar-transparent-border: transparent;\n  --toolbar-box-shadow: var(--grey-90-a10);\n  --toolbar-button-background: transparent;\n  --toolbar-button-background-hover: var(--grey-90-a10);\n  --toolbar-button-foreground-hover: var(--font-color);\n  --toolbar-button-background-active: var(--grey-90-a20);\n  --toolbar-button-foreground-active: var(--primary-color);\n  --toolbar-button-border: transparent;\n  --toolbar-button-border-hover: transparent;\n  --toolbar-button-border-active: transparent;\n  --tooltip-background: var(--grey-90-a80);\n  --tooltip-foreground: white;\n  --tooltip-border: transparent;\n  --popup-background: white;\n  --popup-border: rgba(0, 0, 0, 0.12);\n  --opaque-popup-border: #e0e0e0;\n  --popup-line: var(--grey-30);\n  --popup-shadow: rgba(49, 49, 49, 0.3);\n  --popup-button-background: #edecf0;\n  --popup-button-background-hover: hsla(0,0%,70%,.4);\n  --popup-button-foreground-hover: var(--font-color);\n  --popup-button-background-active: hsla(240,5%,5%,.15);\n  --selected-background: var(--blue-40-a30);\n  --selected-border: var(--blue-40);\n  --font-value-border: var(--grey-30);\n  --icon-fill: #3b3b3c;\n  --icon-disabled-fill: #8080807F;\n  --link-foreground: var(--blue-60);\n  --link-selected-foreground: #333;\n  --visited-link-foreground: #b5007f;\n  /* light colours */\n}\n\nbody.sepia {\n  --main-background: #f4ecd8;\n  --main-foreground: #5b4636;\n  --toolbar-border: #5b4636;\n}\n\nbody.dark {\n  --main-background: rgb(28, 27, 34);\n  --main-foreground: #eee;\n  --font-color: #fff;\n  --toolbar-border: #4a4a4b;\n  --toolbar-box-shadow: black;\n  --toolbar-button-background-hover: var(--grey-90-a30);\n  --toolbar-button-background-active: var(--grey-90-a80);\n  --tooltip-background: black;\n  --tooltip-foreground: white;\n  --popup-background: rgb(66,65,77);\n  --opaque-popup-border: #434146;\n  --popup-line: rgb(82, 82, 94);\n  --popup-button-background: #5c5c61;\n  --popup-button-background-active: hsla(0,0%,70%,.6);\n  --selected-background: #3E6D9A;\n  --font-value-border: #656468;\n  --icon-fill: #fff;\n  --icon-disabled-fill: #ffffff66;\n  --link-foreground: #45a1ff;\n  --link-selected-foreground: #fff;\n  --visited-link-foreground: #e675fd;\n  /* dark colours */\n}\n\nbody.hcm {\n  --main-background: Canvas;\n  --main-foreground: CanvasText;\n  --font-color: CanvasText;\n  --primary-color: SelectedItem;\n  --toolbar-border: CanvasText;\n   /* We need a true transparent but in HCM this would compute to an actual color,\n      so select the page's background color instead: */\n  --toolbar-transparent-border: Canvas;\n  --toolbar-box-shadow: Canvas;\n  --toolbar-button-background: ButtonFace;\n  --toolbar-button-background-hover: ButtonText;\n  --toolbar-button-foreground-hover: ButtonFace;\n  --toolbar-button-background-active: SelectedItem;\n  --toolbar-button-foreground-active: SelectedItemText;\n  --toolbar-button-border: ButtonText;\n  --toolbar-button-border-hover: ButtonText;\n  --toolbar-button-border-active: ButtonText;\n  --tooltip-background: Canvas;\n  --tooltip-foreground: CanvasText;\n  --tooltip-border: CanvasText;\n  --popup-background: Canvas;\n  --popup-border: CanvasText;\n  --opaque-popup-border: CanvasText;\n  --popup-line: CanvasText;\n  --popup-button-background: ButtonFace;\n  --popup-button-background-hover: ButtonText;\n  --popup-button-foreground-hover: ButtonFace;\n  --popup-button-background-active: ButtonText;\n  --selected-background: Canvas;\n  --selected-border: SelectedItem;\n  --font-value-border: CanvasText;\n  --icon-fill: ButtonText;\n  --icon-disabled-fill: GrayText;\n  --link-foreground: LinkText;\n  --link-selected-foreground: ActiveText;\n  --visited-link-foreground: VisitedText;\n}\n\nbody {\n  margin: 0;\n  padding: var(--body-padding);\n  background-color: var(--main-background);\n  color: var(--main-foreground);\n}\n\nbody.loaded {\n  transition: color 0.4s, background-color 0.4s;\n}\n\nbody.dark *::-moz-selection {\n  background-color: var(--selected-background);\n}\n\na::-moz-selection {\n  color: var(--link-selected-foreground);\n}\n\nbody.sans-serif,\nbody.sans-serif .remove-button {\n  font-family: Helvetica, Arial, sans-serif;\n}\n\nbody.serif,\nbody.serif .remove-button {\n  font-family: Georgia, \"Times New Roman\", serif;\n}\n\n/* Override some controls and content styles based on color scheme */\n\nbody.light > .container > .header > .domain {\n  border-bottom-color: #333333 !important;\n}\n\nbody.sepia > .container > .header > .domain {\n  border-bottom-color: #5b4636 !important;\n}\n\nbody.dark > .container > .header > .domain {\n  border-bottom-color: #eeeeee !important;\n}\n\nbody.light blockquote {\n  border-inline-start: 2px solid #333333 !important;\n}\n\nbody.sepia blockquote {\n  border-inline-start: 2px solid #5b4636 !important;\n}\n\nbody.dark blockquote {\n  border-inline-start: 2px solid #eeeeee !important;\n}\n\n.light-button {\n  color: #333333;\n  background-color: #ffffff;\n}\n\n.dark-button {\n  color: #eeeeee;\n  background-color: #1c1b22;\n}\n\n.sepia-button {\n  color: #5b4636;\n  background-color: #f4ecd8;\n}\n\n.auto-button {\n  text-align: center;\n}\n\n@media (prefers-color-scheme: dark) {\n  .auto-button {\n    background-color: #1c1b22;\n    color: #eeeeee;\n  }\n}\n\n@media not (prefers-color-scheme: dark) {\n  .auto-button {\n    background-color: #ffffff;\n    color: #333333;\n  }\n}\n\n/* Loading/error message */\n\n.reader-message {\n  margin-top: 40px;\n  display: none;\n  text-align: center;\n  width: 100%;\n  font-size: 0.9em;\n}\n\n/* Detector element to see if we're at the top of the doc or not. */\n.top-anchor {\n  position: absolute;\n  top: 0;\n  width: 0;\n  height: 5px;\n  pointer-events: none;\n}\n\n/* Header */\n\n.header {\n  text-align: start;\n  display: none;\n}\n\n.domain {\n  font-size: 0.9em;\n  line-height: 1.48em;\n  padding-bottom: 4px;\n  font-family: Helvetica, Arial, sans-serif;\n  text-decoration: none;\n  border-bottom: 1px solid;\n  color: var(--link-foreground);\n}\n\n.header > h1 {\n  font-size: 1.6em;\n  line-height: 1.25em;\n  width: 100%;\n  margin: 30px 0;\n  padding: 0;\n}\n\n.header > .credits {\n  font-size: 0.9em;\n  line-height: 1.48em;\n  margin: 0 0 10px;\n  padding: 0;\n  font-style: italic;\n}\n\n.header > .meta-data {\n  font-size: 0.65em;\n  margin: 0 0 15px;\n}\n\n.reader-estimated-time {\n  text-align: match-parent;\n}\n\n/* Controls toolbar */\n\n.toolbar-container {\n  position: sticky;\n  z-index: 2;\n  top: 32px;\n  height: 0; /* take up no space, so body is at the top. */\n\n  /* As a stick container, we're positioned relative to the body. Move us to\n   * the edge of the viewport using margins, and take the width of\n   * the body padding into account for calculating our width.\n   */\n  margin-inline-start: calc(-1 * var(--body-padding));\n  width: max(var(--body-padding), calc((100% - var(--content-width)) / 2 + var(--body-padding)));\n  font-size: var(--font-size); /* Needed to ensure 'em' units match, is reset for .reader-controls */\n}\n\n.toolbar {\n  padding-block: 16px;\n  border: 1px solid var(--toolbar-border);\n  border-radius: 6px;\n  box-shadow: 0 2px 8px var(--toolbar-box-shadow);\n\n  width: 32px; /* basic width, without padding/border */\n\n  /* padding should be 16px, except if there's not enough space for that, in\n   * which case use half the available space for padding (=25% on each side).\n   * The 34px here is the width + borders. We use a variable because we need\n   * to know this size for the margin calculation.\n   */\n  --inline-padding: min(16px, calc(25% - 0.25 * 34px));\n  padding-inline: var(--inline-padding);\n\n  /* Keep a maximum of 96px distance to the body, but center once the margin\n   * gets too small. We need to set the start margin, however...\n   * To center, we'd want 50% of the container, but we'd subtract half our\n   * own width (16px) and half the border (1px) and the inline padding.\n   * When the other margin would be 96px, we want 100% - 96px - the complete\n   * width of the actual toolbar (34px + 2 * padding)\n   */\n  margin-inline-start: max(calc(50% - 17px - var(--inline-padding)), calc(100% - 96px - 34px - 2 * var(--inline-padding)));\n\n  font-family: Helvetica, Arial, sans-serif;\n  list-style: none;\n  user-select: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .toolbar {\n    transition-property: border-color, box-shadow;\n    transition-duration: 250ms;\n  }\n\n  .toolbar .toolbar-button {\n    transition-property: opacity;\n    transition-duration: 250ms;\n  }\n\n  .toolbar-container.scrolled .toolbar:not(:hover, :focus-within) {\n    border-color: var(--toolbar-transparent-border);\n    box-shadow: 0 2px 8px transparent;\n  }\n\n  .toolbar-container.scrolled .toolbar:not(:hover, :focus-within) .toolbar-button {\n    opacity: 0.6;\n  }\n\n  .toolbar-container.transition-location {\n    transition-duration: 250ms;\n    transition-property: width;\n  }\n}\n\n.toolbar-container.overlaps .toolbar-button {\n  opacity: 0.1;\n}\n\n.dropdown-open .toolbar {\n  border-color: var(--toolbar-transparent-border);\n  box-shadow: 0 2px 8px transparent;\n}\n\n.reader-controls {\n  /* We use 'em's above this node to get it to the right size. However,\n   * the UI inside the toolbar should use a fixed, smaller size. */\n  font-size: 11px;\n}\n\nbutton {\n  -moz-context-properties: fill;\n  color: var(--font-color);\n  fill: var(--icon-fill);\n}\n\nbutton:disabled {\n  fill: var(--icon-disabled-fill);\n}\n\n.toolbar button::-moz-focus-inner {\n  border: 0;\n}\n\n.toolbar-button {\n  position: relative;\n  width: 32px;\n  height: 32px;\n  padding: 0;\n  border: 1px solid var(--toolbar-button-border);\n  border-radius: 4px;\n  margin: 4px 0;\n  background-color: var(--toolbar-button-background);\n  background-size: 16px 16px;\n  background-position: center;\n  background-repeat: no-repeat;\n}\n\n.toolbar-button:hover,\n.toolbar-button:focus-visible {\n  background-color: var(--toolbar-button-background-hover);\n  border-color: var(--toolbar-button-border-hover);\n  fill: var(--toolbar-button-foreground-hover);\n}\n\n.open .toolbar-button,\n.toolbar-button:hover:active {\n  background-color: var(--toolbar-button-background-active);\n  border-color: var(--toolbar-button-border-active);\n  color: var(--toolbar-button-foreground-active);\n  fill: var(--toolbar-button-foreground-active);\n}\n\n.hover-label {\n  position: absolute;\n  top: 4px;\n  inset-inline-start: 36px;\n  line-height: 16px;\n  white-space: pre; /* make sure we don't wrap */\n  background-color: var(--tooltip-background);\n  color: var(--tooltip-foreground);\n  padding: 4px 8px;\n  border: 1px solid var(--tooltip-border);\n  border-radius: 2px;\n  visibility: hidden;\n  pointer-events: none;\n  /* Put above .dropdown .dropdown-popup, which has z-index: 1000. */\n  z-index: 1001;\n}\n\n/* Show the hover tooltip on non-dropdown buttons. */\n.toolbar-button:not(.dropdown-toggle):hover > .hover-label,\n.toolbar-button:not(.dropdown-toggle):focus-visible > .hover-label,\n/* Show the hover tooltip for dropdown buttons unless its dropdown is open. */\n:not(.open) > li > .dropdown-toggle:hover > .hover-label,\n:not(.open) > li > .dropdown-toggle:focus-visible > .hover-label {\n  visibility: visible;\n}\n\n.dropdown {\n  text-align: center;\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  position: relative;\n}\n\n.dropdown li {\n  margin: 0;\n  padding: 0;\n}\n\n/* Popup */\n\n.dropdown .dropdown-popup {\n  text-align: start;\n  position: absolute;\n  inset-inline-start: 40px;\n  z-index: 1000;\n  background-color: var(--popup-background);\n  visibility: hidden;\n  border-radius: 4px;\n  border: 1px solid var(--popup-border);\n  box-shadow: 0 0 10px 0 var(--popup-shadow);\n  top: 0;\n}\n\n.open > .dropdown-popup {\n  visibility: visible;\n}\n\n.dropdown-arrow {\n  position: absolute;\n  height: 24px;\n  width: 16px;\n  inset-inline-start: -16px;\n  background-image: url(\"chrome://global/skin/reader/RM-Type-Controls-Arrow.svg\");\n  display: block;\n  -moz-context-properties: fill, stroke;\n  fill: var(--popup-background);\n  stroke: var(--opaque-popup-border);\n  pointer-events: none;\n}\n\n.dropdown-arrow:dir(rtl) {\n  transform: scaleX(-1);\n}\n\n/* Align the style dropdown arrow (narrate does its own) */\n.style-dropdown .dropdown-arrow {\n  top: 7px;\n}\n\n/* Font style popup */\n\n.radio-button {\n  /* We visually hide these, but we keep them around so they can be focused\n   * and changed by interacting with them via the label, or the keyboard, or\n   * assistive technology.\n   */\n  opacity: 0;\n  pointer-events: none;\n  position: absolute;\n}\n\n.radiorow,\n.buttonrow {\n  display: flex;\n  align-content: center;\n  justify-content: center;\n}\n\n.content-width-value,\n.font-size-value,\n.line-height-value {\n  box-sizing: border-box;\n  width: 36px;\n  height: 20px;\n  line-height: 20px;\n  display: flex;\n  justify-content: center;\n  align-content: center;\n  margin: auto;\n  border-radius: 10px;\n  border: 1px solid var(--font-value-border);\n  background-color: var(--popup-button-background);\n}\n\n.buttonrow > button {\n  border: 0;\n  height: 60px;\n  width: 90px;\n  background-color: transparent;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n\n.buttonrow > button:enabled:hover,\n.buttonrow > button:enabled:focus-visible {\n  background-color: var(--popup-button-background-hover);\n  color: var(--popup-button-foreground-hover);\n  fill: var(--popup-button-foreground-hover);\n}\n\n.buttonrow > button:enabled:hover:active {\n  background-color: var(--popup-button-background-active);\n}\n\n.radiorow:not(:last-child),\n.buttonrow:not(:last-child) {\n  border-bottom: 1px solid var(--popup-line);\n}\n\nbody.hcm .buttonrow.line-height-buttons {\n  /* On HCM the .color-scheme-buttons row is hidden, so remove the border from the row above it */\n  border-bottom: none;\n}\n\n.radiorow > label {\n  position: relative;\n  box-sizing: border-box;\n  border-radius: 2px;\n  border: 2px solid var(--popup-border);\n}\n\n.radiorow > label[checked] {\n  border-color: var(--selected-border);\n}\n\n/* For the hover style, we draw a line under the item by means of a\n * pseudo-element. Because these items are variable height, and\n * because their contents are variable height, position it absolutely,\n * and give it a width of 100% (the content width) + 4px for the 2 * 2px\n * border width.\n */\n.radiorow > input[type=radio]:focus-visible + label::after,\n.radiorow > label:hover::after {\n  content: \"\";\n  display: block;\n  border-bottom: 2px solid var(--selected-border);\n  width: calc(100% + 4px);\n  position: absolute;\n  /* to skip the 2 * 2px border + 2px spacing. */\n  bottom: -6px;\n  /* Match the start of the 2px border of the element: */\n  inset-inline-start: -2px;\n}\n\n.font-type-buttons > label {\n  height: 64px;\n  width: 105px;\n  /* Slightly more space between these items. */\n  margin: 10px;\n  /* Center the Sans-serif / Serif labels */\n  text-align: center;\n  background-size: 63px 39px;\n  background-repeat: no-repeat;\n  background-position: center 18px;\n  background-color: var(--popup-button-background);\n  fill: currentColor;\n  -moz-context-properties: fill;\n  /* This mostly matches baselines, but because of differences in font\n   * baselines between serif and sans-serif, this isn't always enough. */\n  line-height: 1;\n  padding-top: 2px;\n}\n\n.font-type-buttons > label[checked] {\n  background-color: var(--selected-background);\n}\n\n.sans-serif-button {\n  font-family: Helvetica, Arial, sans-serif;\n  background-image: url(\"chrome://global/skin/reader/RM-Sans-Serif.svg\");\n}\n\n/* Tweak padding to match the baseline on mac */\n:root[platform=macosx] .sans-serif-button {\n  padding-top: 3px;\n}\n\n.serif-button {\n  font-family: Georgia, \"Times New Roman\", serif;\n  background-image: url(\"chrome://global/skin/reader/RM-Serif.svg\");\n}\n\nbody.hcm .color-scheme-buttons {\n  /* Disallow selecting themes when HCM is on. */\n  display: none;\n}\n\n.color-scheme-buttons > label {\n  padding: 12px;\n  height: 34px;\n  font-size: 12px;\n  /* Center the labels horizontally as well as vertically */\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  /* We want 10px between items, but there's no margin collapsing in flexbox. */\n  margin: 10px 5px;\n}\n\n.color-scheme-buttons > input:first-child + label {\n  margin-inline-start: 10px;\n}\n\n.color-scheme-buttons > label:last-child {\n  margin-inline-end: 10px;\n}\n\n/* Toolbar icons */\n\n.close-button {\n  background-image: url(\"chrome://global/skin/icons/close.svg\");\n}\n\n.style-button {\n  background-image: url(\"chrome://global/skin/reader/RM-Type-Controls-24x24.svg\");\n}\n\n.minus-button {\n  background-size: 18px 18px;\n  background-image: url(\"chrome://global/skin/reader/RM-Minus-24x24.svg\");\n}\n\n.plus-button {\n  background-size: 18px 18px;\n  background-image: url(\"chrome://global/skin/reader/RM-Plus-24x24.svg\");\n}\n\n.content-width-minus-button {\n  background-size: 42px 16px;\n  background-image: url(\"chrome://global/skin/reader/RM-Content-Width-Minus-42x16.svg\");\n}\n\n.content-width-plus-button {\n  background-size: 44px 16px;\n  background-image: url(\"chrome://global/skin/reader/RM-Content-Width-Plus-44x16.svg\");\n}\n\n.line-height-minus-button {\n  background-size: 34px 14px;\n  background-image: url(\"chrome://global/skin/reader/RM-Line-Height-Minus-38x14.svg\");\n}\n\n.line-height-plus-button {\n  background-size: 34px 24px;\n  background-image: url(\"chrome://global/skin/reader/RM-Line-Height-Plus-38x24.svg\");\n}\n\n/* Mirror the line height buttons if the article is RTL. */\n.reader-controls[articledir=\"rtl\"] .line-height-minus-button,\n.reader-controls[articledir=\"rtl\"] .line-height-plus-button {\n  transform: scaleX(-1);\n}\n\n@media print {\n  .toolbar {\n    display: none !important;\n  }\n}\n\n/* Article content */\n\n/* Note that any class names from the original article that we want to match on\n * must be added to CLASSES_TO_PRESERVE in ReaderMode.jsm, so that\n * Readability.js doesn't strip them out */\n\n.container {\n  margin: 0 auto;\n  font-size: var(--font-size);\n  max-width: var(--content-width);\n  line-height: var(--line-height);\n}\n\npre {\n  font-family: inherit;\n}\n\n.moz-reader-content {\n  display: none;\n  font-size: 1em;\n}\n\n@media print {\n  .moz-reader-content p,\n  .moz-reader-content code,\n  .moz-reader-content pre,\n  .moz-reader-content blockquote,\n  .moz-reader-content ul,\n  .moz-reader-content ol,\n  .moz-reader-content li,\n  .moz-reader-content figure,\n  .moz-reader-content .wp-caption {\n    margin: 0 0 10px !important;\n    padding: 0 !important;\n  }\n}\n\n.moz-reader-content h1,\n.moz-reader-content h2,\n.moz-reader-content h3 {\n  font-weight: bold;\n}\n\n.moz-reader-content h1 {\n  font-size: 1.6em;\n  line-height: 1.25em;\n}\n\n.moz-reader-content h2 {\n  font-size: 1.2em;\n  line-height: 1.51em;\n}\n\n.moz-reader-content h3 {\n  font-size: 1em;\n  line-height: 1.66em;\n}\n\n.moz-reader-content a:link {\n  text-decoration: underline;\n  font-weight: normal;\n}\n\n.moz-reader-content a:link,\n.moz-reader-content a:link:hover,\n.moz-reader-content a:link:active {\n  color: var(--link-foreground);\n}\n\n.moz-reader-content a:visited {\n  color: var(--visited-link-foreground);\n}\n\n.moz-reader-content * {\n  max-width: 100%;\n  height: auto;\n}\n\n.moz-reader-content p,\n.moz-reader-content p,\n.moz-reader-content code,\n.moz-reader-content pre,\n.moz-reader-content blockquote,\n.moz-reader-content ul,\n.moz-reader-content ol,\n.moz-reader-content li,\n.moz-reader-content figure,\n.moz-reader-content .wp-caption {\n  margin: -10px -10px 20px;\n  padding: 10px;\n  border-radius: 5px;\n}\n\n.moz-reader-content li {\n  margin-bottom: 0;\n}\n\n.moz-reader-content li > ul,\n.moz-reader-content li > ol {\n  margin-bottom: -10px;\n}\n\n.moz-reader-content p > img:only-child,\n.moz-reader-content p > a:only-child > img:only-child,\n.moz-reader-content .wp-caption img,\n.moz-reader-content figure img {\n  display: block;\n}\n\n.moz-reader-content img[moz-reader-center] {\n  margin-inline: auto;\n}\n\n.moz-reader-content .caption,\n.moz-reader-content .wp-caption-text\n.moz-reader-content figcaption {\n  font-size: 0.9em;\n  line-height: 1.48em;\n  font-style: italic;\n}\n\n.moz-reader-content pre {\n  white-space: pre-wrap;\n}\n\n.moz-reader-content blockquote {\n  padding: 0;\n  padding-inline-start: 16px;\n}\n\n.moz-reader-content ul,\n.moz-reader-content ol {\n  padding: 0;\n}\n\n.moz-reader-content ul {\n  padding-inline-start: 30px;\n  list-style: disc;\n}\n\n.moz-reader-content ol {\n  padding-inline-start: 30px;\n}\n\ntable,\nth,\ntd {\n  border: 1px solid currentColor;\n  border-collapse: collapse;\n  padding: 6px;\n  vertical-align: top;\n}\n\ntable {\n  margin: 5px;\n}\n\n/* Visually hide (but don't display: none) screen reader elements */\n.moz-reader-content .visually-hidden,\n.moz-reader-content .visuallyhidden,\n.moz-reader-content .sr-only {\n  display: inline-block;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  border-width: 0;\n}\n\n/* Hide elements with common \"hidden\" class names */\n.moz-reader-content .hidden,\n.moz-reader-content .invisible {\n  display: none;\n}\n\n/* Enforce wordpress and similar emoji/smileys aren't sized to be full-width,\n * see bug 1399616 for context. */\n.moz-reader-content img.wp-smiley,\n.moz-reader-content img.emoji {\n  display: inline-block;\n  border-width: 0;\n  /* height: auto is implied from '.moz-reader-content *' rule. */\n  width: 1em;\n  margin: 0 .07em;\n  padding: 0;\n}\n\n.reader-show-element {\n  display: initial;\n}\n\n/* Provide extra spacing for images that may be aided with accompanying element such as <figcaption> */\n.moz-reader-block-img:not(:last-child) {\n  margin-block-end: 12px;\n}\n\n.moz-reader-wide-table {\n  overflow-x: auto;\n  display: block;\n}\n\npre code {\n  background-color: var(--main-background);\n  border: 1px solid var(--font-color);\n  display: block;\n  overflow: auto;\n}`;\n\t\t}\n\n\t\tfunction getEmbedScript() {\n\t\t\treturn minifyText(`(() => {\n\t\t\tdocument.currentScript.remove();\n\t\t\tconst processNode = node => {\n\t\t\t\tnode.querySelectorAll(\"template[${SHADOWROOT_ATTRIBUTE_NAME}]\").forEach(element=>{\n\t\t\t\t\tlet shadowRoot = getShadowRoot(element.parentElement);\n\t\t\t\t\tif (!shadowRoot) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tshadowRoot = element.parentElement.attachShadow({mode:element.getAttribute(\"${SHADOWROOT_ATTRIBUTE_NAME}\")});\n\t\t\t\t\t\t\tshadowRoot.innerHTML = element.innerHTML;\n\t\t\t\t\t\t\telement.remove();\n\t\t\t\t\t\t} catch (error) {}\t\t\t\t\t\t\n\t\t\t\t\t\tif (shadowRoot) {\n\t\t\t\t\t\t\tprocessNode(shadowRoot);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t})\n\t\t\t};\n\t\t\tconst FORBIDDEN_TAG_NAMES = ${JSON.stringify(FORBIDDEN_TAG_NAMES)};\n\t\t\tconst NOTE_TAGNAME = ${JSON.stringify(NOTE_TAGNAME)};\n\t\t\tconst NOTE_CLASS = ${JSON.stringify(NOTE_CLASS)};\n\t\t\tconst NOTE_ANCHORED_CLASS = ${JSON.stringify(NOTE_ANCHORED_CLASS)};\n\t\t\tconst NOTE_SELECTED_CLASS = ${JSON.stringify(NOTE_SELECTED_CLASS)};\n\t\t\tconst NOTE_MOVING_CLASS = ${JSON.stringify(NOTE_MOVING_CLASS)};\n\t\t\tconst NOTE_MASK_MOVING_CLASS = ${JSON.stringify(NOTE_MASK_MOVING_CLASS)};\n\t\t\tconst MASK_CLASS = ${JSON.stringify(MASK_CLASS)};\n\t\t\tconst HIGHLIGHT_CLASS = ${JSON.stringify(HIGHLIGHT_CLASS)};\n\t\t\tconst NOTES_WEB_STYLESHEET = ${JSON.stringify(NOTES_WEB_STYLESHEET)};\n\t\t\tconst MASK_WEB_STYLESHEET = ${JSON.stringify(MASK_WEB_STYLESHEET)};\n\t\t\tconst NOTE_HEADER_HEIGHT = ${JSON.stringify(NOTE_HEADER_HEIGHT)};\n\t\t\tconst PAGE_MASK_ACTIVE_CLASS = ${JSON.stringify(PAGE_MASK_ACTIVE_CLASS)};\n\t\t\tconst REMOVED_CONTENT_CLASS = ${JSON.stringify(REMOVED_CONTENT_CLASS)};\n\t\t\tconst NESTING_TRACK_ID_ATTRIBUTE_NAME = ${JSON.stringify(singlefile.helper.NESTING_TRACK_ID_ATTRIBUTE_NAME)};\n\t\t\tconst reflowNotes = ${minifyText(reflowNotes.toString())};\t\t\t\n\t\t\tconst addNoteRef = ${minifyText(addNoteRef.toString())};\n\t\t\tconst deleteNoteRef = ${minifyText(deleteNoteRef.toString())};\n\t\t\tconst getNoteRefs = ${minifyText(getNoteRefs.toString())};\n\t\t\tconst setNoteRefs = ${minifyText(setNoteRefs.toString())};\n\t\t\tconst getAnchorElement = ${minifyText(getAnchorElement.toString())};\n\t\t\tconst getMaskElement = ${minifyText(getMaskElement.toString())};\n\t\t\tconst getStyleElement = ${minifyText(getStyleElement.toString())};\n\t\t\tconst attachNoteListeners = ${minifyText(attachNoteListeners.toString())};\n\t\t\tconst anchorNote = ${minifyText(anchorNote.toString())};\n\t\t\tconst getPosition = ${minifyText(getPosition.toString())};\n\t\t\tconst onMouseUp = ${minifyText(onMouseUp.toString())};\n\t\t\tconst getShadowRoot = ${minifyText(getShadowRoot.toString())};\n\t\t\tconst waitResourcesLoad = ${minifyText(waitResourcesLoad.toString())};\n\t\t\tconst maskNoteElement = getMaskElement(${JSON.stringify(NOTE_MASK_CLASS)});\n\t\t\tconst maskPageElement = getMaskElement(${JSON.stringify(PAGE_MASK_CLASS)}, ${JSON.stringify(PAGE_MASK_CONTAINER_CLASS)});\n\t\t\tlet selectedNote, highlightSelectionMode, removeHighlightMode, resizingNoteMode, movingNoteMode, collapseNoteTimeout, cuttingMode, cuttingOuterMode;\n\t\t\twindow.onresize = reflowNotes;\n\t\t\twindow.onUpdate = () => {};\n\t\t\tdocument.documentElement.onmouseup = document.documentElement.ontouchend = onMouseUp;\n\t\t\tprocessNode(document);\n\t\t\treflowNotes();\n\t\t\tdocument.querySelectorAll(${JSON.stringify(NOTE_TAGNAME)}).forEach(noteElement => attachNoteListeners(noteElement));\n\t\t\tif (document.documentElement.dataset && document.documentElement.dataset.sfz !== undefined) {\n\t\t\t\twaitResourcesLoad().then(reflowNotes);\n\t\t\t}\n\t\t\tconst trackIds = {};\n\t\t\tdocument.querySelectorAll(\"[\" + NESTING_TRACK_ID_ATTRIBUTE_NAME + \"]\").forEach(element => trackIds[element.getAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME)] = element);\n\t\t\tObject.keys(trackIds).forEach(id => {\n\t\t\t\tconst element = trackIds[id];\n\t\t\t\tconst idParts = id.split(\".\");\n\t\t\t\tif (idParts.length > 1) {\n\t\t\t\t\tconst parentId = idParts.slice(0, -1).join(\".\");\n\t\t\t\t\tconst expectedParent = trackIds[parentId];\n\t\t\t\t\tif (expectedParent && element.parentElement !== expectedParent) {\n\t\t\t\t\t\texpectedParent.appendChild(element);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"[\" + NESTING_TRACK_ID_ATTRIBUTE_NAME + \"]\").forEach(element => element.removeAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME));\n\t\t})()`);\n\t\t}\n\n\t\tfunction getStyleElement(stylesheet) {\n\t\t\tconst linkElement = document.createElement(\"style\");\n\t\t\tlinkElement.textContent = stylesheet;\n\t\t\treturn linkElement;\n\t\t}\n\n\t\tfunction getAnchorElement(containerElement) {\n\t\t\treturn document.querySelector(\"[data-single-file-note-refs~=\\\"\" + containerElement.dataset.noteId + \"\\\"]\") || document.documentElement;\n\t\t}\n\n\t\tfunction addNoteRef(anchorElement, noteId) {\n\t\t\tconst noteRefs = getNoteRefs(anchorElement);\n\t\t\tnoteRefs.push(noteId);\n\t\t\tsetNoteRefs(anchorElement, noteRefs);\n\t\t}\n\n\t\tfunction deleteNoteRef(containerElement, noteId) {\n\t\t\tconst anchorElement = getAnchorElement(containerElement);\n\t\t\tconst noteRefs = getNoteRefs(anchorElement).filter(noteRefs => noteRefs != noteId);\n\t\t\tif (noteRefs.length) {\n\t\t\t\tsetNoteRefs(anchorElement, noteRefs);\n\t\t\t} else {\n\t\t\t\tdelete anchorElement.dataset.singleFileNoteRefs;\n\t\t\t}\n\t\t}\n\n\t\tfunction getNoteRefs(anchorElement) {\n\t\t\treturn anchorElement.dataset.singleFileNoteRefs ? anchorElement.dataset.singleFileNoteRefs.split(\" \") : [];\n\t\t}\n\n\t\tfunction setNoteRefs(anchorElement, noteRefs) {\n\t\t\tanchorElement.dataset.singleFileNoteRefs = noteRefs.join(\" \");\n\t\t}\n\n\t\tfunction minifyText(text) {\n\t\t\treturn text.replace(/[\\n\\t\\s]+/g, \" \");\n\t\t}\n\n\t\tfunction isAncestor(element, otherElement) {\n\t\t\treturn otherElement.parentElement && (element == otherElement.parentElement || isAncestor(element, otherElement.parentElement));\n\t\t}\n\n\t\tfunction getShadowRoot(element) {\n\t\t\tconst chrome = window.chrome;\n\t\t\tif (element.openOrClosedShadowRoot) {\n\t\t\t\treturn element.openOrClosedShadowRoot;\n\t\t\t} else if (chrome && chrome.dom && chrome.dom.openOrClosedShadowRoot) {\n\t\t\t\ttry {\n\t\t\t\t\treturn chrome.dom.openOrClosedShadowRoot(element);\n\t\t\t\t\t/* eslint-disable-next-line no-unused-vars */\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn element.shadowRoot;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn element.shadowRoot;\n\t\t\t}\n\t\t}\n\n\t\tfunction detectSavedPage(document) {\n\t\t\tconst firstDocumentChild = document.documentElement.firstChild;\n\t\t\treturn firstDocumentChild.nodeType == Node.COMMENT_NODE &&\n\t\t\t\t(firstDocumentChild.textContent.includes(COMMENT_HEADER) || firstDocumentChild.textContent.includes(COMMENT_HEADER_LEGACY));\n\t\t}\n\n\t})(typeof globalThis == \"object\" ? globalThis : window);\n\n})();\n"
  },
  {
    "path": "lib/single-file-extension-frames.js",
    "content": "!function(){\"use strict\";const r=window.fetch.bind(window);let e=new Map;browser.runtime.onMessage.addListener(a=>\"singlefile.fetchFrame\"==a.method&&window.frameId&&window.frameId==a.frameId?async function(e){try{const a=await r(e.url,{cache:\"force-cache\",headers:e.headers,referrerPolicy:\"strict-origin-when-cross-origin\"});return{status:a.status,headers:[...a.headers],array:Array.from(new Uint8Array(await a.arrayBuffer()))}}catch(r){return{error:r&&(r.message||r.toString())}}}(a):\"singlefile.fetchResponse\"==a.method?async function(r){const a=e.get(r.requestId);a&&(r.error?(a.reject(new Error(r.error)),e.delete(r.requestId)):(r.truncated&&(a.array?a.array=a.array.concat(r.array):(a.array=r.array,e.set(r.requestId,a)),r.finished&&(r.array=a.array)),r.truncated&&!r.finished||(a.resolve({status:r.status,headers:{get:e=>r.headers&&r.headers[e]},arrayBuffer:async()=>new Uint8Array(r.array).buffer}),e.delete(r.requestId))));return{}}(a):void 0)}();\n"
  },
  {
    "path": "lib/single-file-extension-offscreen-document.js",
    "content": "!function(){\"use strict\";\"undefined\"==typeof globalThis&&(window.globalThis=window),(()=>{const e=globalThis.chrome;globalThis.__defineGetter__(\"browser\",()=>({action:{onClicked:{addListener:t=>e.action.onClicked.addListener(t)},setBadgeText:t=>e.action.setBadgeText(t),setBadgeBackgroundColor:t=>e.action.setBadgeBackgroundColor(t),setTitle:t=>e.action.setTitle(t),setIcon:t=>e.action.setIcon(t)},bookmarks:{get:t=>e.bookmarks.get(t),onCreated:{addListener:t=>e.bookmarks.onCreated.addListener(t),removeListener:t=>e.bookmarks.onCreated.removeListener(t)},onChanged:{addListener:t=>e.bookmarks.onChanged.addListener(t),removeListener:t=>e.bookmarks.onChanged.removeListener(t)},onMoved:{addListener:t=>e.bookmarks.onMoved.addListener(t),removeListener:t=>e.bookmarks.onMoved.removeListener(t)},update:(t,n)=>e.bookmarks.update(t,n)},commands:{onCommand:{addListener:t=>e.commands.onCommand.addListener(t)}},downloads:{download:t=>e.downloads.download(t),onChanged:{addListener:t=>e.downloads.onChanged.addListener(t),removeListener:t=>e.downloads.onChanged.removeListener(t)},search:t=>e.downloads.search(t)},i18n:{getUILanguage:()=>e.i18n.getUILanguage(),getMessage:(t,n)=>e.i18n.getMessage(t,n)},identity:{getRedirectURL:()=>e.identity.getRedirectURL(),getAuthToken:t=>e.identity.getAuthToken(t),launchWebAuthFlow:t=>e.identity.launchWebAuthFlow(t),removeCachedAuthToken:t=>e.identity.removeCachedAuthToken(t)},contextMenus:{onClicked:{addListener:t=>e.contextMenus.onClicked.addListener(t)},create:t=>e.contextMenus.create(t),update:(t,n)=>e.contextMenus.update(t,n),removeAll:()=>e.contextMenus.removeAll()},permissions:{request:t=>e.permissions.request(t),remove:t=>e.permissions.remove(t)},runtime:{id:e.runtime.id,sendNativeMessage:(t,n)=>new Promise((a,r)=>{e.runtime.sendNativeMessage(t,n,t=>{e.runtime.lastError?r(e.runtime.lastError):a(t)})}),getManifest:()=>e.runtime.getManifest(),onMessage:{addListener:t=>e.runtime.onMessage.addListener((e,n,a)=>{const r=t(e,n);if(r&&\"function\"==typeof r.then)return r.then(e=>{if(void 0!==e)try{a(e)}catch(e){}}),!0}),removeListener:t=>e.runtime.onMessage.removeListener(t)},onMessageExternal:{addListener:t=>e.runtime.onMessageExternal.addListener((e,n,a)=>{const r=t(e,n);if(r&&\"function\"==typeof r.then)return r.then(e=>{if(void 0!==e)try{a(e)}catch(e){}}),!0})},sendMessage:t=>new Promise((n,a)=>{e.runtime.sendMessage(t,t=>{e.runtime.lastError?a(e.runtime.lastError):n(t)}),e.runtime.lastError&&a(e.runtime.lastError)}),getURL:t=>e.runtime.getURL(t),getContexts:t=>e.runtime.getContexts(t),get lastError(){return e.runtime.lastError}},scripting:{executeScript:t=>e.scripting.executeScript(t)},storage:{local:{set:t=>e.storage.local.set(t),get:t=>e.storage.local.get(t),clear:()=>e.storage.local.clear(),remove:t=>e.storage.local.remove(t)},sync:{set:t=>e.storage.sync.set(t),get:t=>e.storage.sync.get(t),clear:()=>e.storage.sync.clear(),remove:t=>e.storage.sync.remove(t)}},tabs:{onCreated:{addListener:t=>e.tabs.onCreated.addListener(t)},onActivated:{addListener:t=>e.tabs.onActivated.addListener(t)},onUpdated:{addListener:t=>e.tabs.onUpdated.addListener(t),removeListener:t=>e.tabs.onUpdated.removeListener(t)},onRemoved:{addListener:t=>e.tabs.onRemoved.addListener(t),removeListener:t=>e.tabs.onRemoved.removeListener(t)},onReplaced:{addListener:t=>e.tabs.onReplaced.addListener(t),removeListener:t=>e.tabs.onReplaced.removeListener(t)},captureVisibleTab:(t,n)=>e.tabs.captureVisibleTab(t,n),sendMessage:(t,n,a={})=>new Promise((r,o)=>{e.tabs.sendMessage(t,n,a,t=>{e.runtime.lastError?o(e.runtime.lastError):r(t)}),e.runtime.lastError&&o(e.runtime.lastError)}),query:t=>e.tabs.query(t),create:t=>e.tabs.create(t),get:t=>e.tabs.get(t),remove:t=>e.tabs.remove(t),update:(t,n)=>e.tabs.update(t,n)},devtools:{inspectedWindow:{onResourceContentCommitted:{addListener:t=>e.devtools.inspectedWindow.onResourceContentCommitted.addListener(t)},get tabId(){return e.devtools.inspectedWindow.tabId}}},offscreen:{createDocument:t=>e.offscreen.createDocument(t)},declarativeNetRequest:{updateSessionRules:t=>e.declarativeNetRequest.updateSessionRules(t)}}))})();const e=[0],t=Symbol(),n=new TextEncoder,a=new TextDecoder,r=new Array(256);let o=0;function s(t,n,a,s){if(void 0===s){if(o++,!(r.length-o>=e.length))throw new Error(\"Reached maximum number of custom types\");r[r.length-o]={serialize:t,parse:n,test:a}}else r[s]={serialize:t,parse:n,test:a}}async function i(e,t){const n=r.findIndex(({test:n}={})=>n&&n(t,e));e.addObject(t),await e.append(new Uint8Array([n]));const a=r[n].serialize;a&&await a(e,t),0!=n&&U(t)&&(await async function(e,t){const n=Object.getOwnPropertySymbols(t),a=n.map(e=>[e,t[e]]);await c(e,a)}(e,t),await async function(e,t){if(ArrayBuffer.isView(t))await i(e,0);else{let n=Object.entries(t);R(t)&&(n=n.filter(([e])=>!j(Number(e)))),await i(e,n.length);for(const[t,a]of n)await u(e,t),await i(e,a)}}(e,t))}async function c(e,n){await i(e,n.length);const a=Object.keys(n).filter(e=>j(Number(e))).map(e=>Number(e));let r=0,o=a[r];for(const[s,c]of n.entries())o==s?(o=a[++r],await i(e,c)):await i(e,t)}async function u(e,t){const a=n.encode(t);await i(e,a.length),await e.append(a)}async function f(e,t){await i(e,t.length),await e.append(\"Uint8Array\"==t.constructor.name?t:new Uint8Array(t.buffer))}async function d(e,t){const n=new Uint8Array(new Float64Array([t]).buffer);await e.append(n)}async function w(e,t){const n=new Uint8Array([Number(t)]);await e.append(n)}s(async function(e,t){const n=e.objects.indexOf(t);await i(e,n)},async function(e){const t=await b(e);return new l(t,e)},function(e,t){return U(e)&&t.objects.includes(e)},0),s(null,function(){return{}},U),s(c,h,R),s(u,p,function(e){return\"string\"==typeof e}),s(f,async function(e){const t=await b(e),n=await e.consume(8*t);return new Float64Array(n.buffer)},function(e){return\"Float64Array\"==e.constructor.name}),s(f,async function(e){const t=await b(e),n=await e.consume(4*t);return new Float32Array(n.buffer)},function(e){return\"Float32Array\"==e.constructor.name}),s(f,async function(e){const t=await b(e),n=await e.consume(4*t);return new Uint32Array(n.buffer)},function(e){return\"Uint32Array\"==e.constructor.name}),s(f,async function(e){const t=await b(e),n=await e.consume(4*t);return new Int32Array(n.buffer)},function(e){return\"Int32Array\"==e.constructor.name}),s(f,async function(e){const t=await b(e),n=await e.consume(2*t);return new Uint16Array(n.buffer)},function(e){return\"Uint16Array\"==e.constructor.name}),s(f,async function(e){const t=await b(e),n=await e.consume(2*t);return new Int16Array(n.buffer)},function(e){return\"Int16Array\"==e.constructor.name}),s(f,async function(e){const t=await b(e),n=await e.consume(t);return new Uint8ClampedArray(n.buffer)},function(e){return\"Uint8ClampedArray\"==e.constructor.name}),s(f,async function(e){const t=await b(e);return await e.consume(t)},function(e){return\"Uint8Array\"==e.constructor.name}),s(f,async function(e){const t=await b(e),n=await e.consume(t);return new Int8Array(n.buffer)},function(e){return\"Int8Array\"==e.constructor.name}),s(async function(e,t){await i(e,t.byteLength),await e.append(new Uint8Array(t))},async function(e){const t=await b(e);return(await e.consume(t)).buffer},function(e){return\"ArrayBuffer\"==e.constructor.name}),s(d,v,C),s(async function(e,t){const n=new Uint8Array(new Uint32Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(4);return new Uint32Array(t.buffer)[0]},function(e){return j(e)&&e>=0&&e<=4294967295}),s(async function(e,t){const n=new Uint8Array(new Int32Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(4);return new Int32Array(t.buffer)[0]},function(e){return j(e)&&e>=-2147483648&&e<=2147483647}),s(async function(e,t){const n=new Uint8Array(new Uint16Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(2);return new Uint16Array(t.buffer)[0]},function(e){return j(e)&&e>=0&&e<=65535}),s(async function(e,t){const n=new Uint8Array(new Int16Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(2);return new Int16Array(t.buffer)[0]},function(e){return j(e)&&e>=-32768&&e<=32767}),s(async function(e,t){const n=new Uint8Array([t]);await e.append(n)},async function(e){const t=await e.consume(1);return new Uint8Array(t.buffer)[0]},function(e){return j(e)&&e>=0&&e<=255}),s(async function(e,t){const n=new Uint8Array(new Int8Array([t]).buffer);await e.append(n)},async function(e){const t=await e.consume(1);return new Int8Array(t.buffer)[0]},function(e){return j(e)&&e>=-128&&e<=127}),s(null,function(){return},function(e){return void 0===e}),s(null,function(){return null},function(e){return null===e}),s(null,function(){return NaN},function(e){return Number.isNaN(e)}),s(w,L,function(e){return\"boolean\"==typeof e}),s(async function(e,t){await u(e,t.description)},async function(e){const t=await p(e);return Symbol(t)},x),s(null,function(){return t},k),s(async function(e,t){const n=t.entries();await i(e,t.size);for(const[t,a]of n)await i(e,t),await i(e,a)},async function(e){const t=await b(e),n=new Map;t&&await async function a(r=0){const o=await b(e),s=await b(e);e.setObject([o,s],(e,t)=>n.set(e,t)),r<t-1&&await a(r+1)}();return n},function(e){return e instanceof Map}),s(async function(e,t){await i(e,t.size);for(const n of t)await i(e,n)},async function(e){const t=await b(e),n=new Set;t&&await async function a(r=0){const o=await b(e);e.setObject([o],e=>n.add(e)),r<t-1&&await a(r+1)}();return n},function(e){return e instanceof Set}),s(async function(e,t){await d(e,t.getTime())},async function(e){const t=await v(e);return new Date(t)},function(e){return e instanceof Date}),s(async function(e,t){await u(e,t.message),await u(e,t.stack)},async function(e){const t=await p(e),n=await p(e),a=new Error(t);return a.stack=n,a},function(e){return e instanceof Error}),s(async function(e,t){await u(e,t.source),await u(e,t.flags)},async function(e){const t=await p(e),n=await p(e);return new RegExp(t,n)},function(e){return e instanceof RegExp}),s(async function(e,t){await u(e,t.valueOf())},async function(e){return new String(await p(e))},function(e){return e instanceof String}),s(async function(e,t){await d(e,t.valueOf())},async function(e){return new Number(await v(e))},function(e){return e instanceof Number}),s(async function(e,t){await w(e,t.valueOf())},async function(e){return new Boolean(await L(e))},function(e){return e instanceof Boolean});class l{constructor(e,t){this.index=e,this.data=t}getObject(){return this.data.objects[this.index]}}class m{constructor(e){this.stream=new y(e),this.objects=[],this.setters=[]}consume(e){return this.stream.consume(e)}getObjectId(){const e=this.objects.length;return this.objects.push(void 0),e}resolveObject(e,t){(function(e){return U(e)||x(e)})(t)&&!A(t)&&(this.objects[e]=t)}setObject(e,t){this.setters.push({functionArguments:e,setterFunction:t})}executeSetters(){this.setters.forEach(({functionArguments:e,setterFunction:t})=>{t(...e.map(e=>A(e)?e.getObject():e))})}}class y{constructor(e){this.offset=0,this.value=new Uint8Array(0),this.consumeData=e}async consume(e){if(this.offset+e>this.value.length){const t=new Uint8Array(this.value).subarray(this.offset,this.value.length),n=await this.consumeData();return t.length+n.length!=this.value.length&&(this.value=new Uint8Array(t.length+n.length)),this.value.set(t),this.value.set(n,t.length),this.offset=0,this.consume(e)}{const t=this.value.slice(this.offset,this.offset+e);return this.offset+=t.length,t}}}function g(){let e,t,n,a,r,o;return{next:async t=>t?async function(t){r?await r:async function(){let t;a=new Promise(e=>t=e),e=new m(i),s();const n=await b(e);e.executeSetters(),t(n)}().catch(()=>{});return function(){r=new Promise(e=>o=e)}(),n(t),{done:!1}}(t):{value:await a,done:!0},return:()=>({done:!0})};function s(){t=new Promise(e=>n=e)}async function i(){const e=await t;return s(),o&&o(),e}}async function b(e){const t=(await e.consume(1))[0],n=r[t].parse,a=e.getObjectId(),o=await n(e);return 0!=t&&U(o)&&(await async function(e,t){const n=await h(e);e.setObject([n],e=>e.forEach(([e,n])=>t[e]=n))}(e,o),await async function(e,t){const n=await b(e);n&&await a();async function a(r=0){const o=await p(e),s=await b(e);e.setObject([s],e=>t[o]=e),r<n-1&&await a(r+1)}}(e,o)),e.resolveObject(a,o),o}async function h(e){const t=await b(e),n=new Array(t);return t&&await async function a(r=0){const o=await b(e);k(o)||e.setObject([o],e=>n[r]=e);r<t-1&&await a(r+1)}(),n}async function p(e){const t=await b(e),n=await e.consume(t);return a.decode(n)}async function v(e){const t=await e.consume(8);return new Float64Array(t.buffer)[0]}async function L(e){const t=await e.consume(1);return Boolean(t[0])}function A(e){return e instanceof l}function U(e){return e===Object(e)}function R(e){return\"number\"==typeof e.length}function k(e){return e===t}function C(e){return\"number\"==typeof e}function j(e){return C(e)&&Number.isInteger(e)}function x(e){return\"symbol\"==typeof e}const I=globalThis.singlefile,M=new Map,O=new Map;function E(e,t={}){return new Promise((n,a)=>{const r=new XMLHttpRequest;if(r.withCredentials=!0,r.responseType=\"arraybuffer\",r.onerror=e=>a(new Error(e.detail)),r.onreadystatechange=()=>{r.readyState==XMLHttpRequest.DONE&&n({status:r.status,headers:{get:e=>r.getResponseHeader(e)},arrayBuffer:async()=>r.response})},r.open(\"GET\",e,!0),t.headers)for(const e of Object.entries(t.headers))r.setRequestHeader(e[0],e[1]);r.send()})}function T({requestId:e,truncated:t,finished:n,data:a}){let r;if(t?(r=O.get(e),r||(r=[],O.set(e,r)),r.push(new Uint8Array(a)),n&&O.delete(e)):a&&(r=[new Uint8Array(a)]),!t||n)return r}browser.runtime.onMessage.addListener(async({method:e,truncated:t,finished:n,requestId:a,url:r,data:o,mimeType:s,options:i,width:c,height:u,tabId:f})=>{if(\"processPage\"==e){const e=await I.getPageData(i,{fetch:E},null,null),t=new Blob([\"string\"==typeof e.content?e.content:new Uint8Array(e.content)],{type:e.mimeType});return{url:URL.createObjectURL(t),archiveTime:e.archiveTime,doctype:e.doctype,filename:e.filename,title:e.title}}if(\"compressPage\"==e){let e=M.get(f);if(e||(e=g(),M.set(f,e)),o)return await e.next(new Uint8Array(o)),{};{const t=await e.next();M.delete(f);const n=t.value,a=await I.processors.compression.process(n,i);return URL.createObjectURL(a)}}if(\"getBlobURL\"==e){const e={};s&&(e.type=s);const r=T({requestId:a,truncated:t,finished:n,data:o});return r?URL.createObjectURL(new Blob(r,e)):{}}if(\"revokeObjectURL\"==e)return URL.revokeObjectURL(r),{};if(\"getImageData\"==e){const e=new Image;await new Promise((t,n)=>{e.onload=t,e.onerror=e=>n(new Error(e.detail)),e.src=r});const t=document.createElement(\"canvas\");t.width=c,t.height=u;const n=t.getContext(\"2d\");n.drawImage(e,0,0,c,u);const{data:a}=await n.getImageData(0,0,c,u);return{url:URL.createObjectURL(new Blob([a]))}}if(\"saveToClipboard\"==e){const e=T({requestId:a,truncated:t,finished:n,data:o});if(e){const t=new Uint8Array(e.map(e=>e.length).reduce((e,t)=>e+t));for(let n=0,a=0;n<e.length;n++)t.set(e[n],a),a+=e[n].length;!function(e){const t=\"copy\";function n(t){t.clipboardData.setData(e.mimeType,e.content),t.clipboardData.setData(\"text/plain\",e.content),t.preventDefault()}document.addEventListener(t,n),document.execCommand(t),document.removeEventListener(t,n)}({content:(new TextDecoder).decode(t),mimeType:s})}return{}}})}();\n"
  },
  {
    "path": "lib/single-file-extension.js",
    "content": "!function(){\"use strict\";const t=[0],e=Symbol(),n=new TextEncoder,r=new TextDecoder,o=new Array(256);let a=0;function i(e,n,r,i){if(void 0===i){if(a++,!(o.length-a>=t.length))throw new Error(\"Reached maximum number of custom types\");o[o.length-a]={serialize:e,parse:n,test:r}}else o[i]={serialize:e,parse:n,test:r}}async function s(t,e){const n=d(t,e);let r=new Uint8Array([]);for await(const t of n){const e=r;r=new Uint8Array(e.length+t.length),r.set(e,0),r.set(t,e.length)}return r}i(async function(t,e){const n=t.objects.indexOf(e);await u(t,n)},async function(t){const e=await v(t);return new g(e,t)},I,0),i(null,function(){return{}},R),i(f,E,x),i(m,S,function(t){return\"string\"==typeof t}),i(p,async function(t){const e=await v(t),n=await t.consume(8*e);return new Float64Array(n.buffer)},function(t){return\"Float64Array\"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Float32Array(n.buffer)},function(t){return\"Float32Array\"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Uint32Array(n.buffer)},function(t){return\"Uint32Array\"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(4*e);return new Int32Array(n.buffer)},function(t){return\"Int32Array\"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(2*e);return new Uint16Array(n.buffer)},function(t){return\"Uint16Array\"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(2*e);return new Int16Array(n.buffer)},function(t){return\"Int16Array\"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(e);return new Uint8ClampedArray(n.buffer)},function(t){return\"Uint8ClampedArray\"==t.constructor.name}),i(p,async function(t){const e=await v(t);return await t.consume(e)},function(t){return\"Uint8Array\"==t.constructor.name}),i(p,async function(t){const e=await v(t),n=await t.consume(e);return new Int8Array(n.buffer)},function(t){return\"Int8Array\"==t.constructor.name}),i(async function(t,e){await u(t,e.byteLength),await t.append(new Uint8Array(e))},async function(t){const e=await v(t);return(await t.consume(e)).buffer},function(t){return\"ArrayBuffer\"==t.constructor.name}),i(h,T,L),i(async function(t,e){const n=new Uint8Array(new Uint32Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(4);return new Uint32Array(e.buffer)[0]},function(t){return D(t)&&t>=0&&t<=4294967295}),i(async function(t,e){const n=new Uint8Array(new Int32Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(4);return new Int32Array(e.buffer)[0]},function(t){return D(t)&&t>=-2147483648&&t<=2147483647}),i(async function(t,e){const n=new Uint8Array(new Uint16Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(2);return new Uint16Array(e.buffer)[0]},function(t){return D(t)&&t>=0&&t<=65535}),i(async function(t,e){const n=new Uint8Array(new Int16Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(2);return new Int16Array(e.buffer)[0]},function(t){return D(t)&&t>=-32768&&t<=32767}),i(async function(t,e){const n=new Uint8Array([e]);await t.append(n)},async function(t){const e=await t.consume(1);return new Uint8Array(e.buffer)[0]},function(t){return D(t)&&t>=0&&t<=255}),i(async function(t,e){const n=new Uint8Array(new Int8Array([e]).buffer);await t.append(n)},async function(t){const e=await t.consume(1);return new Int8Array(e.buffer)[0]},function(t){return D(t)&&t>=-128&&t<=127}),i(null,function(){return},function(t){return void 0===t}),i(null,function(){return null},function(t){return null===t}),i(null,function(){return NaN},function(t){return Number.isNaN(t)}),i(y,P,function(t){return\"boolean\"==typeof t}),i(async function(t,e){await m(t,e.description)},async function(t){const e=await S(t);return Symbol(e)},k),i(null,function(){return e},U),i(async function(t,e){const n=e.entries();await u(t,e.size);for(const[e,r]of n)await u(t,e),await u(t,r)},async function(t){const e=await v(t),n=new Map;e&&await async function r(o=0){const a=await v(t),i=await v(t);t.setObject([a,i],(t,e)=>n.set(t,e)),o<e-1&&await r(o+1)}();return n},function(t){return t instanceof Map}),i(async function(t,e){await u(t,e.size);for(const n of e)await u(t,n)},async function(t){const e=await v(t),n=new Set;e&&await async function r(o=0){const a=await v(t);t.setObject([a],t=>n.add(t)),o<e-1&&await r(o+1)}();return n},function(t){return t instanceof Set}),i(async function(t,e){await h(t,e.getTime())},async function(t){const e=await T(t);return new Date(e)},function(t){return t instanceof Date}),i(async function(t,e){await m(t,e.message),await m(t,e.stack)},async function(t){const e=await S(t),n=await S(t),r=new Error(e);return r.stack=n,r},function(t){return t instanceof Error}),i(async function(t,e){await m(t,e.source),await m(t,e.flags)},async function(t){const e=await S(t),n=await S(t);return new RegExp(e,n)},function(t){return t instanceof RegExp}),i(async function(t,e){await m(t,e.valueOf())},async function(t){return new String(await S(t))},function(t){return t instanceof String}),i(async function(t,e){await h(t,e.valueOf())},async function(t){return new Number(await T(t))},function(t){return t instanceof Number}),i(async function(t,e){await y(t,e.valueOf())},async function(t){return new Boolean(await P(t))},function(t){return t instanceof Boolean});class c{constructor(t,e){this.stream=new l(t,e),this.objects=[]}append(t){return this.stream.append(t)}flush(){return this.stream.flush()}addObject(t){this.objects.push(M(t)&&!I(t,this)?t:void 0)}}class l{constructor(t,e){this.offset=0,this.appendData=t,this.value=new Uint8Array(e)}async append(t){if(this.offset+t.length>this.value.length){const e=this.value.length-this.offset;await this.append(new Uint8Array(t).subarray(0,e)),await this.appendData({value:this.value}),this.offset=0,await this.append(new Uint8Array(t).subarray(e))}else this.value.set(t,this.offset),this.offset+=t.length}async flush(){this.offset&&await this.appendData({value:new Uint8Array(this.value).subarray(0,this.offset),done:!0})}}function d(t,{chunkSize:e=8388608}={}){let n,r,o,a,i,s;return{[Symbol.asyncIterator]:()=>({next:()=>a?{done:a}:async function(){s?s():l().catch(()=>{});i=new Promise(t=>s=t);const t=await async function(){const{value:t,done:e}=await r;a=e,e||d();return t}();return{value:t}}(),return:()=>({done:!0})})};async function l(){d(),n=new c(f,e),await u(n,t),await n.flush()}function d(){r=new Promise(t=>o=t)}async function f(t){o(t),await i}}async function u(t,e){const n=o.findIndex(({test:n}={})=>n&&n(e,t));t.addObject(e),await t.append(new Uint8Array([n]));const r=o[n].serialize;r&&await r(t,e),0!=n&&R(e)&&(await async function(t,e){const n=Object.getOwnPropertySymbols(e),r=n.map(t=>[t,e[t]]);await f(t,r)}(t,e),await async function(t,e){if(ArrayBuffer.isView(e))await u(t,0);else{let n=Object.entries(e);x(e)&&(n=n.filter(([t])=>!D(Number(t)))),await u(t,n.length);for(const[e,r]of n)await m(t,e),await u(t,r)}}(t,e))}async function f(t,n){await u(t,n.length);const r=Object.keys(n).filter(t=>D(Number(t))).map(t=>Number(t));let o=0,a=r[o];for(const[i,s]of n.entries())a==i?(a=r[++o],await u(t,s)):await u(t,e)}async function m(t,e){const r=n.encode(e);await u(t,r.length),await t.append(r)}async function p(t,e){await u(t,e.length),await t.append(\"Uint8Array\"==e.constructor.name?e:new Uint8Array(e.buffer))}async function h(t,e){const n=new Uint8Array(new Float64Array([e]).buffer);await t.append(n)}async function y(t,e){const n=new Uint8Array([Number(e)]);await t.append(n)}class g{constructor(t,e){this.index=t,this.data=e}getObject(){return this.data.objects[this.index]}}class w{constructor(t){this.stream=new b(t),this.objects=[],this.setters=[]}consume(t){return this.stream.consume(t)}getObjectId(){const t=this.objects.length;return this.objects.push(void 0),t}resolveObject(t,e){M(e)&&!C(e)&&(this.objects[t]=e)}setObject(t,e){this.setters.push({functionArguments:t,setterFunction:e})}executeSetters(){this.setters.forEach(({functionArguments:t,setterFunction:e})=>{e(...t.map(t=>C(t)?t.getObject():t))})}}class b{constructor(t){this.offset=0,this.value=new Uint8Array(0),this.consumeData=t}async consume(t){if(this.offset+t>this.value.length){const e=new Uint8Array(this.value).subarray(this.offset,this.value.length),n=await this.consumeData();return e.length+n.length!=this.value.length&&(this.value=new Uint8Array(e.length+n.length)),this.value.set(e),this.value.set(n,e.length),this.offset=0,this.consume(t)}{const e=this.value.slice(this.offset,this.offset+t);return this.offset+=e.length,e}}}function A(){let t,e,n,r,o,a;return{next:async e=>e?async function(e){o?await o:async function(){let e;r=new Promise(t=>e=t),t=new w(s),i();const n=await v(t);t.executeSetters(),e(n)}().catch(()=>{});return function(){o=new Promise(t=>a=t)}(),n(e),{done:!1}}(e):{value:await r,done:!0},return:()=>({done:!0})};function i(){e=new Promise(t=>n=t)}async function s(){const t=await e;return i(),a&&a(),t}}async function v(t){const e=(await t.consume(1))[0],n=o[e].parse,r=t.getObjectId(),a=await n(t);return 0!=e&&R(a)&&(await async function(t,e){const n=await E(t);t.setObject([n],t=>t.forEach(([t,n])=>e[t]=n))}(t,a),await async function(t,e){const n=await v(t);n&&await r();async function r(o=0){const a=await S(t),i=await v(t);t.setObject([i],t=>e[a]=t),o<n-1&&await r(o+1)}}(t,a)),t.resolveObject(r,a),a}async function E(t){const e=await v(t),n=new Array(e);return e&&await async function r(o=0){const a=await v(t);U(a)||t.setObject([a],t=>n[o]=t);o<e-1&&await r(o+1)}(),n}async function S(t){const e=await v(t),n=await t.consume(e);return r.decode(n)}async function T(t){const e=await t.consume(8);return new Float64Array(e.buffer)[0]}async function P(t){const e=await t.consume(1);return Boolean(e[0])}function I(t,e){return R(t)&&e.objects.includes(t)}function C(t){return t instanceof g}function R(t){return t===Object(t)}function x(t){return\"number\"==typeof t.length}function U(t){return t===e}function L(t){return\"number\"==typeof t}function D(t){return L(t)&&Number.isInteger(t)}function k(t){return\"symbol\"==typeof t}function M(t){return R(t)||k(t)}const O=globalThis.singlefile,N=O.helper.SELECTED_CONTENT_ATTRIBUTE_NAME,B=\"singlefile-mask\",F=\"singlefile-mask-content\",_=\"singlefile-progress-bar\",j=\"singlefile-progress-bar-content\",W=\"single-file-selection-zone\",G=\"singlefile-logs-window\",H=\"singlefile-logs\",q=\"singlefile-logs-line\",z=\"singlefile-logs-line-text\",V=\"singlefile-logs-line-icon\",X=O.helper.SINGLE_FILE_UI_ELEMENT_CLASS,K=new Set(Array.from(getComputedStyle(document.documentElement)));let Z,Q,J,Y,$,tt,et;try{Z=browser.i18n.getMessage(\"logPanelWidth\"),Q=browser.i18n.getMessage(\"logPanelDeferredImages\"),J=browser.i18n.getMessage(\"logPanelFrameContents\"),Y=browser.i18n.getMessage(\"logPanelEmbeddedImage\"),$=browser.i18n.getMessage(\"logPanelStep\")}catch(t){}function nt(t,e){return prompt(t,e)}function rt(t){const e=document.querySelector(B);e&&e.style.setProperty(\"display\",t?\"block\":\"none\"),et&&et.style.setProperty(\"display\",t?\"block\":\"none\")}function ot(t){if(!document.querySelector(B)&&(t.logsEnabled&&document.documentElement.appendChild(et),t.shadowEnabled)){const e=function(){try{let t=document.querySelector(B);if(!t){t=bt(B,document.documentElement);const e=t.attachShadow({mode:\"open\"}),n=document.createElement(\"style\");n.textContent=`\\n\\t\\t\\t\\t@keyframes single-file-progress { \\n\\t\\t\\t\\t\\t0% { \\n\\t\\t\\t\\t\\t\\tleft: -50px;\\n\\t\\t\\t\\t\\t} \\n\\t\\t\\t\\t\\t100% { \\n\\t\\t\\t\\t\\t\\tleft: 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.${_} {\\n\\t\\t\\t\\t\\tposition: fixed;\\n\\t\\t\\t\\t\\ttop: 0;\\n\\t\\t\\t\\t\\tleft: 0;\\n\\t\\t\\t\\t\\twidth: 0;\\n\\t\\t\\t\\t\\theight: 8px;\\n\\t\\t\\t\\t\\tz-index: 2147483646;\\n\\t\\t\\t\\t\\topacity: .5;\\n\\t\\t\\t\\t\\toverflow: hidden;\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\ttransition: width 200ms ease-in-out;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.${j} {\\n\\t\\t\\t\\t\\tposition: absolute;\\n\\t\\t\\t\\t\\tleft: 0;\\n\\t\\t\\t\\t\\tanimation: single-file-progress 3s linear infinite reverse;\\n\\t\\t\\t\\t\\tbackground: \\n\\t\\t\\t\\t\\t\\twhite \\n\\t\\t\\t\\t\\t\\tlinear-gradient(-45deg, rgba(0, 0, 0, 0.075) 25%, \\n\\t\\t\\t\\t\\t\\t\\ttransparent 25%, \\n\\t\\t\\t\\t\\t\\t\\ttransparent 50%, \\n\\t\\t\\t\\t\\t\\t\\trgba(0, 0, 0, 0.075) 50%, \\n\\t\\t\\t\\t\\t\\t\\trgba(0, 0, 0, 0.075) 75%, \\n\\t\\t\\t\\t\\t\\t\\ttransparent 75%, transparent)\\n\\t\\t\\t\\t\\t\\trepeat scroll 0% 0% / 50px 50px padding-box border-box;\\n\\t\\t\\t\\t\\twidth: calc(100% + 50px);\\n\\t\\t\\t\\t\\theight: 100%;\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.${F} {\\n\\t\\t\\t\\t\\tposition: fixed;\\n\\t\\t\\t\\t\\ttop: 0;\\n\\t\\t\\t\\t\\tleft: 0;\\n\\t\\t\\t\\t\\twidth: 100%;\\n\\t\\t\\t\\t\\theight: 100%;\\n\\t\\t\\t\\t\\tz-index: 2147483646;\\n\\t\\t\\t\\t\\topacity: 0;\\n\\t\\t\\t\\t\\tbackground-color: black;\\n\\t\\t\\t\\t\\ttransition: opacity 250ms;\\n\\t\\t\\t\\t}\\n\\t\\t\\t`,e.appendChild(n);let r=document.createElement(\"div\");r.classList.add(F),e.appendChild(r),t.offsetWidth,r.style.setProperty(\"opacity\",.3),t.offsetWidth}return t}catch(t){}}();t.progressBarEnabled&&function(t){try{if(!t.shadowRoot.querySelector(\".\"+_)){let e=document.createElement(\"div\");e.classList.add(_),t.shadowRoot.appendChild(e);const n=document.createElement(\"div\");n.classList.add(j),e.appendChild(n)}}catch(t){}}(e)}}function at(){const t=document.querySelector(B);t&&t.remove(),et.remove(),ht()}function it(t,e,n){n.shadowEnabled&&n.progressBarEnabled&&function(t,e){try{const n=document.querySelector(B);if(n){const r=n.shadowRoot.querySelector(\".\"+_);if(r&&e){const n=Math.floor(t/e*100)+\"%\";r.style.getPropertyValue(\"width\")!=n&&(r.style.setProperty(\"width\",n),r.offsetWidth)}}}catch(t){}}(t,e)}function st(t){yt(\"insert-embedded-image\",Y,\"…\",t)}function ct(t){yt(\"insert-embedded-image\",Y,\"✓\",t)}function lt(){let t;const e=[],n=getSelection();for(let r=0;r<n.rangeCount;r++){let o=n.getRangeAt(r);if(o&&o.commonAncestorContainer){const n=document.createTreeWalker(o.commonAncestorContainer);let r=!1,a=!1;for(;!a;){if((r||n.currentNode==o.startContainer||n.currentNode==o.endContainer)&&(r=!0,(o.startContainer!=o.endContainer||o.startOffset!=o.endOffset)&&(t=!0,\"A\"==n.currentNode.tagName&&n.currentNode.href))){const t=new URL(n.currentNode.href);t.hash=\"\",e.push(t.href)}n.currentNode==o.endContainer?a=!0:n.nextNode()}t&&n.currentNode==o.endContainer&&n.currentNode.querySelectorAll&&n.currentNode.querySelectorAll(\"*\").forEach(t=>{if(\"A\"==t.tagName&&t.href){const n=new URL(t.href);n.hash=\"\",e.push(n.href)}})}}return Array.from(new Set(e))}async function dt(t){let e=ut();return e||t?e:(e=await new Promise(t=>{let e=[];function n(t){e=[],s(),t.preventDefault()}function r(t){const e=function(t){let e,n=t.target,r=n.getBoundingClientRect();for(e=wt(\"floor\",n,t.clientX-r.left,gt(n,\"left\")),e==n&&(e=wt(\"ceil\",n,r.left+r.width-t.clientX,gt(n,\"right\"))),e==n&&(e=wt(\"floor\",n,t.clientY-r.top,gt(n,\"top\"))),e==n&&(e=wt(\"ceil\",n,r.top+r.height-t.clientY,gt(n,\"bottom\"))),n=e;n&&n.clientWidth<=8&&n.clientHeight<=8;)n=n.parentElement;return n}(t);var n;e&&(tt=e,n=e,requestAnimationFrame(()=>{const t=pt(),e=n.getBoundingClientRect(),r=document.scrollingElement||document.documentElement;t.style.setProperty(\"top\",r.scrollTop+e.top-10+\"px\"),t.style.setProperty(\"left\",r.scrollLeft+e.left-10+\"px\"),t.style.setProperty(\"width\",e.width+20+\"px\"),t.style.setProperty(\"height\",e.height+20+\"px\")}))}function o(t){t.preventDefault(),t.stopPropagation(),0==t.button?s(tt,t.ctrlKey):i()}function a(t){\"Escape\"==t.key&&i()}function i(){e.length&&getSelection().removeAllRanges(),e=[],l()}function s(t,e){if(t){e||d();const n=document.createRange();n.selectNodeContents(t),c(),getSelection().addRange(n),u(),e||l()}else l()}function c(){const t=getSelection();for(let e=t.rangeCount-1;e>=0;e--){const n=t.getRangeAt(e);n.startOffset==n.endOffset&&(t.removeRange(n),e--)}}function l(){pt().remove(),removeEventListener(\"mousemove\",r,!0),removeEventListener(\"click\",o,!0),removeEventListener(\"keyup\",a,!0),tt=null,t(Boolean(e.length)),setTimeout(()=>document.removeEventListener(\"contextmenu\",n,!0),0)}function d(){getSelection().removeAllRanges(),e.forEach(t=>getSelection().addRange(t))}function u(){e=[];for(let t=0;t<getSelection().rangeCount;t++){const n=getSelection().getRangeAt(t);e.push(n)}}addEventListener(\"mousemove\",r,!0),addEventListener(\"click\",o,!0),addEventListener(\"keyup\",a,!0),document.addEventListener(\"contextmenu\",n,!0),getSelection().removeAllRanges()}),e?ut():void 0)}function ut(){const t=getSelection();let e;for(let n=0;n<t.rangeCount;n++){let r=t.getRangeAt(n);if(r&&r.commonAncestorContainer){const n=document.createTreeWalker(r.commonAncestorContainer);let o=!1,a=!1;for(;!a;)(o||n.currentNode==r.startContainer||n.currentNode==r.endContainer)&&(o=!0,r.startContainer==r.endContainer&&r.startOffset==r.endOffset||(e=!0,ft(n.currentNode)),r.startContainer===r.endContainer&&1==t.rangeCount&&0==r.startOffset&&0==r.endOffset&&(\"IMG\"!==r.startContainer.tagName&&\"VIDEO\"!==r.startContainer.tagName||(e=!0,ft(n.currentNode)))),e&&n.currentNode==r.startContainer&&mt(n.currentNode),n.currentNode==r.endContainer?a=!0:n.nextNode();if(e&&n.currentNode==r.endContainer&&n.currentNode.querySelectorAll)for(let t=r.startContainer===r.endContainer?r.startOffset:0;t<r.endOffset;t++){const e=r.endContainer.childNodes[t];e&&(ft(e),e.querySelectorAll&&e.querySelectorAll(\"*\").forEach(ft))}}}return e}function ft(t){(t.nodeType==Node.ELEMENT_NODE?t:t.parentElement).setAttribute(N,\"\")}function mt(t){t.parentElement&&(ft(t),mt(t.parentElement))}function pt(){let t=document.querySelector(W);return t||(t=bt(W,document.body),t.style.setProperty(\"box-sizing\",\"border-box\",\"important\"),t.style.setProperty(\"background-color\",\"#3ea9d7\",\"important\"),t.style.setProperty(\"border\",\"10px solid #0b4892\",\"important\"),t.style.setProperty(\"border-radius\",\"2px\",\"important\"),t.style.setProperty(\"opacity\",\".25\",\"important\"),t.style.setProperty(\"pointer-events\",\"none\",\"important\"),t.style.setProperty(\"position\",\"absolute\",\"important\"),t.style.setProperty(\"transition\",\"all 100ms\",\"important\"),t.style.setProperty(\"cursor\",\"pointer\",\"important\"),t.style.setProperty(\"z-index\",\"2147483647\",\"important\"),t.style.removeProperty(\"border-inline-end\"),t.style.removeProperty(\"border-inline-start\"),t.style.removeProperty(\"inline-size\"),t.style.removeProperty(\"block-size\"),t.style.removeProperty(\"inset-block-start\"),t.style.removeProperty(\"inset-inline-end\"),t.style.removeProperty(\"inset-block-end\"),t.style.removeProperty(\"inset-inline-start\")),t}function ht(){try{if(et=document.querySelector(G),!et){et=bt(G);const t=et.attachShadow({mode:\"open\"}),e=document.createElement(\"style\");e.textContent=`\\n\\t\\t\\t\\t@keyframes single-file-pulse { \\n\\t\\t\\t\\t\\t0% { \\n\\t\\t\\t\\t\\t\\topacity: .25;\\n\\t\\t\\t\\t\\t} \\n\\t\\t\\t\\t\\t100% { \\n\\t\\t\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t\\t\\t} \\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.${H} {\\n\\t\\t\\t\\t\\tposition: fixed;\\n\\t\\t\\t\\t\\tbottom: 24px;\\n\\t\\t\\t\\t\\tleft: 8px;\\n\\t\\t\\t\\t\\tz-index: 2147483647;\\n\\t\\t\\t\\t\\topacity: 0.9;\\n\\t\\t\\t\\t\\tpadding: 4px;\\n\\t\\t\\t\\t\\tbackground-color: white;\\n\\t\\t\\t\\t\\tmin-width: ${Z}px;\\n\\t\\t\\t\\t\\tmin-height: 16px;\\n\\t\\t\\t\\t\\ttransition: height 100ms;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.${q} {\\n\\t\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\t\\tjustify-content: space-between;\\n\\t\\t\\t\\t\\tpadding: 2px;\\n\\t\\t\\t\\t\\tfont-family: arial, sans-serif;\\n\\t\\t\\t\\t\\tcolor: black;\\n\\t\\t\\t\\t\\tbackground-color: white;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.${z} {\\n\\t\\t\\t\\t\\tfont-size: 13px;\\n\\t\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t\\t\\ttransition: opacity 200ms;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.${V} {\\n\\t\\t\\t\\t\\tfont-size: 11px;\\n\\t\\t\\t\\t\\tmin-width: 15px;\\n\\t\\t\\t\\t\\ttext-align: center;\\n\\t\\t\\t\\t\\tposition: relative;\\n\\t\\t\\t\\t\\ttop: 1px;\\n\\t\\t\\t\\t}\\n\\t\\t\\t`,t.appendChild(e);const n=document.createElement(\"div\");n.classList.add(H),t.appendChild(n)}}catch(t){}}function yt(t,e,n,r){try{if(r.logsEnabled){const r=et.shadowRoot.querySelector(\".\"+H);let o=r.querySelector(\"[data-id='\"+t+\"']\");if(!o){o=document.createElement(\"div\"),o.classList.add(q),r.appendChild(o),o.setAttribute(\"data-id\",t);const n=document.createElement(\"div\");n.classList.add(z),o.appendChild(n),n.textContent=e;const a=document.createElement(\"div\");a.classList.add(V),o.appendChild(a)}!function(t,e,n){const r=t.childNodes[0],o=t.childNodes[1];r.textContent=e,o.style.setProperty(\"color\",\"✓\"==n?\"#055000\":\"black\"),\"✓\"==n?(r.style.setProperty(\"opacity\",\".5\"),o.style.setProperty(\"opacity\",\".5\"),o.style.setProperty(\"animation\",\"none\")):o.style.setProperty(\"animation\",\"1s ease-in-out 0s infinite alternate none running single-file-pulse\");o.textContent=n}(o,e,n)}}catch(t){}}function gt(t,e){let n,r=t,o=[];do{const t=r.getBoundingClientRect();if(r.parentElement){const a=r.parentElement.getBoundingClientRect();n=Math.abs(a[e]-t[e])<=8,n&&(r.parentElement.clientWidth>8&&r.parentElement.clientHeight>8&&(r.parentElement.clientWidth-r.clientWidth>8||r.parentElement.clientHeight-r.clientHeight>8)&&o.push(r.parentElement),r=r.parentElement)}else n=!1}while(n&&r);return o}function wt(t,e,n,r){return Math[t](n/8)<=r.length&&(e=r[r.length-Math[t](n/8)-1]),e}function bt(t,e){const n=document.createElement(t);return n.className=X,e&&e.appendChild(n),K.forEach(t=>n.style.setProperty(t,\"initial\",\"important\")),n}ht();const At=globalThis.singlefile,vt=At.helper.SINGLE_FILE_UI_ELEMENT_CLASS,Et=\"singlefile-open-file-bar\",St=\"singlefile-share-page-bar\";let Tt,Pt,It,Ct;const Rt=new Set(Array.from(getComputedStyle(document.documentElement)));function xt(t){({EMBEDDED_IMAGE_BUTTON_MESSAGE:Tt,SHARE_PAGE_BUTTON_MESSAGE:Pt,SHARE_SELECTION_BUTTON_MESSAGE:It,ERROR_TITLE_MESSAGE:Ct}=t)}function Ut(t,e){console.error(\"SingleFile\",t,e),Lt(\"singlefile-error-bar\",Ct+t,{link:e})}function Lt(t,e,{link:n,buttonLabel:r,buttonOnclick:o}={}){try{if(!document.querySelector(t)){const a=function(t){const e=document.createElement(t);return e.className=vt,Rt.forEach(t=>e.style.setProperty(t,\"initial\",\"important\")),e}(t),i=a.attachShadow({mode:\"open\"}),s=document.createElement(\"style\");s.textContent=\"\\n\\t\\t\\t\\t.container {\\n\\t\\t\\t\\t\\tbackground-color: #ff6c00;\\n\\t\\t\\t\\t\\tcolor: white;\\n\\t\\t\\t\\t\\tdisplay: flex;\\n\\t\\t\\t\\t\\tposition: fixed;\\n\\t\\t\\t\\t\\ttop: 0px;\\n\\t\\t\\t\\t\\tleft: 0px;\\n\\t\\t\\t\\t\\tright: 0px;\\n\\t\\t\\t\\t\\theight: auto;\\n\\t\\t\\t\\t\\twidth: auto;\\n\\t\\t\\t\\t\\tmin-height: 24px;\\n\\t\\t\\t\\t\\tmin-width: 24px;\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\tz-index: 2147483647;\\n\\t\\t\\t\\t\\tmargin: 0;\\n\\t\\t\\t\\t\\tpadding: 2px;\\n\\t\\t\\t\\t\\tfont-family: Arial;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.singlefile-open-file-bar.container, .singlefile-share-page-bar.container {\\n\\t\\t\\t\\t\\tbackground-color: gainsboro;\\n\\t\\t\\t\\t\\tborder-block-end: gray 1px solid;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.text {\\n\\t\\t\\t\\t\\tflex: 1;\\n\\t\\t\\t\\t\\tpadding-top: 4px;\\n\\t\\t\\t\\t\\tpadding-bottom: 4px;\\n\\t\\t\\t\\t\\tpadding-left: 8px;\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tbutton {\\n\\t\\t\\t\\t\\tbackground-color: grey;\\n\\t\\t\\t\\t\\tcolor: white;\\n\\t\\t\\t\\t\\tborder: 1px solid darkgrey;\\n\\t\\t\\t\\t\\tpadding: 3px;\\n\\t\\t\\t\\t\\tpadding-left: 8px;\\n\\t\\t\\t\\t\\tpadding-right: 8px;\\n\\t\\t\\t\\t\\tborder-radius: 4px;\\n\\t\\t\\t\\t\\tcursor: pointer;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.close-button {\\n\\t\\t\\t\\t\\topacity: .7;\\n\\t\\t\\t\\t\\tpadding-left: 8px;\\n\\t\\t\\t\\t\\tpadding-right: 8px;\\n\\t\\t\\t\\t\\tcursor: pointer;\\n\\t\\t\\t\\t\\ttransition: opacity 250ms;\\n\\t\\t\\t\\t\\theight: 16px;\\n\\t\\t\\t\\t\\tfont-size: .8rem;\\n\\t\\t\\t\\t\\talign-self: center;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.singlefile-open-file-bar button, .singlefile-share-page-bar button{\\n\\t\\t\\t\\t\\tbackground-color: dimgrey;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.singlefile-open-file-bar .close-button, .singlefile-share-page-bar .close-button{\\n\\t\\t\\t\\t\\tfilter: invert(1);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\ta {\\n\\t\\t\\t\\t\\tcolor: #303036;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t.close-button:hover {\\n\\t\\t\\t\\t\\topacity: 1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\",i.appendChild(s);const c=document.createElement(\"div\");c.classList.add(t),c.classList.add(\"container\");const l=document.createElement(\"span\");l.classList.add(\"text\");const d=e.split(\"__DOC_LINK__\");if(l.textContent=d[0],n&&2==d.length){const t=document.createElement(\"a\");t.textContent=n,t.href=n,t.target=\"_blank\",l.appendChild(t),l.appendChild(document.createTextNode(d[1]))}if(r&&o){const t=document.createElement(\"button\");t.textContent=r,t.onclick=()=>o(),l.appendChild(t)}c.appendChild(l);const u=document.createElement(\"img\");u.classList.add(\"close-button\"),c.appendChild(u),i.appendChild(c),u.src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSlUqHewg4hChOogFURFHqWIRLJS2QqsOJpf+CE0akhQXR8G14ODPYtXBxVlXB1dBEPwBcXNzUnSREr9LCi1ivOO4h/e+9+XuO0Col5lqdowDqmYZqXhMzOZWxMAruhGiOYohiZl6Ir2Qgef4uoeP73dRnuVd9+foVfImA3wi8SzTDYt4nXh609I57xOHWUlSiM+Jxwy6IPEj12WX3zgXHRZ4ZtjIpOaIw8RisY3lNmYlQyWeIo4oqkb5QtZlhfMWZ7VcZc178hcG89pymuu0BhHHIhJIQoSMKjZQhoUo7RopJlJ0HvPwDzj+JLlkcm2AkWMeFaiQHD/4H/zurVmYnHCTgjGg88W2P4aBwC7QqNn297FtN04A/zNwpbX8lTow80l6raVFjoDQNnBx3dLkPeByB+h/0iVDciQ/LaFQAN7P6JtyQN8t0LPq9q15jtMHIEO9WroBDg6BkSJlr3m8u6u9b//WNPv3A6mTcr3f/E/sAAAABmJLR0QAigCKAIrj2uckAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QkPDysvCdPVuwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAELSURBVHja7ZpLFsIwDAPj3v/OsGHDe1BIa8tKO7Mnlkw+dpoxAAAAAGCfx4ur6Yx/B337UUS4mp/VuWUEcjSfOgO+BXCZCWe0hSqQo/npBLglIUNLdAV2MH84Ad1JyIwdLkK6YoabIHWscBWmihHuAqvHtv+XqmdXOK9TxdKy3axUm2vZkXXGgPJksTuz1bVFeeU2Y6ijsLIpXbtKa1kDs2ews69o7+A+ihJ2lvI+/lcS1G21zUVG18XKNm4OS4BNkGOQQohSmGaIdpgLESvzyiRwKepsXjE2H0ZWMF8Zi4+jK5mviM0DiRXNZ2rhkdTK5jO0xermz2o8dCnq+FS2XNNVH0sDAAAA3JYnre9cH8BZmhEAAAAASUVORK5CYII=\",u.onclick=t=>{0===t.button&&(o&&o(!0),a.remove())},document.documentElement.appendChild(a)}}catch(t){}}const Dt=16777216;let kt,Mt,Ot,Nt,Bt;try{kt=browser.i18n.getMessage(\"topPanelEmbeddedImageButton\"),Mt=browser.i18n.getMessage(\"topPanelSharePageButton\"),Ot=browser.i18n.getMessage(\"topPanelShareSelectionButton\"),Nt=browser.i18n.getMessage(\"topPanelError\")}catch(t){}async function Ft(t,e){e.includeBOM&&(t.content=\"\\ufeff\"+t.content);const n=e.embeddedImage,r={method:\"downloads.download\",taskId:e.taskId,insertTextBody:e.insertTextBody,confirmFilename:e.confirmFilename,filenameConflictAction:e.filenameConflictAction,filename:t.filename,mimeType:t.mimeType,saveToClipboard:e.saveToClipboard,saveToGDrive:e.saveToGDrive,saveToDropbox:e.saveToDropbox,saveWithWebDAV:e.saveWithWebDAV,webDAVURL:e.webDAVURL,webDAVUser:e.webDAVUser,webDAVPassword:e.webDAVPassword,saveWithMCP:e.saveWithMCP,mcpServerUrl:e.mcpServerUrl,mcpAuthToken:e.mcpAuthToken,saveToGitHub:e.saveToGitHub,githubToken:e.githubToken,githubUser:e.githubUser,githubRepository:e.githubRepository,githubBranch:e.githubBranch,saveWithCompanion:e.saveWithCompanion,forceWebAuthFlow:e.forceWebAuthFlow,filenameReplacementCharacter:e.filenameReplacementCharacter,openEditor:e.openEditor,openSavedPage:e.openSavedPage,compressHTML:e.compressHTML,backgroundSave:e.backgroundSave,bookmarkId:e.bookmarkId,replaceBookmarkURL:e.replaceBookmarkURL,applySystemTheme:e.applySystemTheme,contentWidth:e.contentWidth,defaultEditorMode:e.defaultEditorMode,includeInfobar:e.includeInfobar,openInfobar:e.openInfobar,warnUnsavedPage:e.warnUnsavedPage,createRootDirectory:e.createRootDirectory,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,embeddedImage:n?Array.from(n):null,preventAppendedData:e.preventAppendedData,extractDataFromPage:e.extractDataFromPage,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,insertMetaCSP:e.insertMetaCSP,password:e.password,compressContent:e.compressContent,foregroundSave:e.foregroundSave,sharePage:e.sharePage,saveToRestFormApi:e.saveToRestFormApi,saveToRestFormApiUrl:e.saveToRestFormApiUrl,saveToRestFormApiFileFieldName:e.saveToRestFormApiFileFieldName,saveToRestFormApiUrlFieldName:e.saveToRestFormApiUrlFieldName,saveToRestFormApiToken:e.saveToRestFormApiToken,saveToS3:e.saveToS3,S3Domain:e.S3Domain,S3Region:e.S3Region,S3Bucket:e.S3Bucket,S3AccessKey:e.S3AccessKey,S3SecretKey:e.S3SecretKey,infobarPositionAbsolute:e.infobarPositionAbsolute,infobarPositionTop:e.infobarPositionTop,infobarPositionBottom:e.infobarPositionBottom,infobarPositionLeft:e.infobarPositionLeft,infobarPositionRight:e.infobarPositionRight,originalUrl:e.url,title:t.title},o=setInterval(()=>{browser.runtime.sendMessage({method:\"ping\"}).then(()=>{})},15e3);if(e.compressContent)if((!e.backgroundSave||e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3)&&e.confirmFilename&&!e.openEditor&&(t.filename=nt(\"Save as\",t.filename)),t.filename){const o=new Blob([await s(t)],{type:t.mimeType}),a=URL.createObjectURL(o);r.filename=t.filename,r.blobURL=a;const i=await browser.runtime.sendMessage(r);if(r.openSavedPage||URL.revokeObjectURL(a),i.error){r.embeddedImage=n,r.blobURL=null,r.pageData=t;const e=d(r);for await(const t of e)await browser.runtime.sendMessage({method:\"downloads.download\",compressContent:!0,data:Array.from(t)});await browser.runtime.sendMessage({method:\"downloads.download\",compressContent:!0,mimeType:t.mimeType})}if(e.backgroundSave){const n=e.openEditor?null:t.hash;await browser.runtime.sendMessage({method:\"downloads.end\",taskId:e.taskId,hash:n,woleetKey:e.woleetKey})}}else browser.runtime.sendMessage({method:\"downloads.cancel\"}),browser.runtime.sendMessage({method:\"ui.processCancelled\"});else{if(e.backgroundSave&&!e.sharePage||e.openEditor||e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3){let n=t.filename;if((e.saveToGDrive||e.saveToGitHub||e.saveWithCompanion||e.saveWithWebDAV||e.saveWithMCP||e.saveToDropbox||e.saveToRestFormApi||e.saveToS3)&&e.confirmFilename&&!e.openEditor&&(n=nt(\"Save as\",t.filename)),n){r.filename=t.filename=n;const e=URL.createObjectURL(new Blob([t.content],{type:t.mimeType}));r.blobURL=e;const o=await browser.runtime.sendMessage(r);if(r.openSavedPage||URL.revokeObjectURL(e),o.error){r.blobURL=null;for(let e=0;e*Dt<t.content.length;e++)r.truncated=t.content.length>Dt,r.truncated?(r.finished=(e+1)*Dt>t.content.length,r.content=t.content.substring(e*Dt,(e+1)*Dt)):r.content=t.content,await browser.runtime.sendMessage(r)}}else browser.runtime.sendMessage({method:\"downloads.cancel\"}),browser.runtime.sendMessage({method:\"ui.processCancelled\"})}else e.saveToClipboard?function(t){const e=\"copy\";function n(e){e.clipboardData.setData(t.mimeType,t.content),e.clipboardData.setData(\"text/plain\",t.content),e.preventDefault()}document.addEventListener(e,n),document.execCommand(e),document.removeEventListener(e,n)}(t):await _t(t,e),e.openSavedPage&&open(URL.createObjectURL(new Blob([t.content],{type:t.mimeType}))),browser.runtime.sendMessage({method:\"ui.processEnd\"});const n=e.openEditor?null:t.hash;await browser.runtime.sendMessage({method:\"downloads.end\",taskId:e.taskId,hash:n,woleetKey:e.woleetKey})}clearInterval(o)}async function _t(t,e){if(Array.isArray(t.content)&&(t.content=new Uint8Array(t.content)),e.sharePage&&navigator.share)await jt(t,e);else{let n=t.filename;if(e.confirmFilename&&(n=nt(\"Save as\",t.filename),n?t.filename=n:(browser.runtime.sendMessage({method:\"downloads.cancel\"}),browser.runtime.sendMessage({method:\"ui.processCancelled\"}))),n){const e=document.createElement(\"a\");return e.download=t.filename,e.href=URL.createObjectURL(new Blob([t.content],{type:t.mimeType})),e.dispatchEvent(new MouseEvent(\"click\")),new Promise(t=>setTimeout(()=>{URL.revokeObjectURL(e.href),t()},1e3))}}}async function jt(t,e){Bt=function(){let t;return{display:async function(e){return new Promise(n=>{t=n,Lt(St,\"\",{buttonLabel:e?It:Pt,buttonOnclick:n})})},hide:function(){const t=document.querySelector(St);t&&t.remove()},cancel:function(){this.hide(),t&&t(!0)}}}();if(!await Bt.display(e.selected)){const n={files:[new File([t.content],t.filename,{type:t.mimeType})]};try{await navigator.share(n),Bt.hide()}catch(n){if(Bt.hide(),\"AbortError\"!==n.name)throw n;await jt(t,e)}}}xt({EMBEDDED_IMAGE_BUTTON_MESSAGE:kt,SHARE_PAGE_BUTTON_MESSAGE:Mt,SHARE_SELECTION_BUTTON_MESSAGE:Ot,ERROR_TITLE_MESSAGE:Nt});const Wt=\"single-file-response-fetch\",Gt=\"Host fetch error (SingleFile)\",Ht=Boolean(window.wrappedJSObject),qt=window.fetch.bind(window);let zt,Vt=0,Xt=new Map;async function Kt(t,e={},n=!0){try{const r={cache:e.cache||\"force-cache\",headers:e.headers,referrerPolicy:e.referrerPolicy||\"strict-origin-when-cross-origin\"};let o;try{o=e.referrer&&!Ht||!n?await qt(t,r):await async function(t,e){if(void 0===zt&&(zt=!1,document.addEventListener(\"single-file-response-fetch-supported\",()=>zt=!0,!1),document.dispatchEvent(new CustomEvent(\"single-file-request-fetch-supported\"))),zt)return new Promise((n,r)=>{document.dispatchEvent(new CustomEvent(\"single-file-request-fetch\",{detail:JSON.stringify({url:t,options:e})})),document.addEventListener(Wt,function e(o){o.detail?o.detail.url==t&&(document.removeEventListener(Wt,e,!1),o.detail.response?n({status:o.detail.status,headers:new Map(o.detail.headers),arrayBuffer:async()=>o.detail.response}):r(o.detail.error)):r()},!1)});throw new Error(Gt)}(t,r),401!=o.status&&403!=o.status&&404!=o.status||\"no-referrer\"==r.referrerPolicy||e.referrer||(o=await Kt(t,{...r,referrerPolicy:\"no-referrer\"},n))}catch(a){if(a&&a.message==Gt)o=await Kt(t,{...r},!1);else{if(\"no-referrer\"==r.referrerPolicy||e.referrer)throw a;o=await Kt(t,{...r,referrerPolicy:\"no-referrer\"},n)}}return o}catch(n){Vt++;const r=new Promise((t,e)=>Xt.set(Vt,{resolve:t,reject:e}));return await Zt({method:\"singlefile.fetch\",url:t,requestId:Vt,referrer:e.referrer,headers:e.headers}),r}}async function Zt(t){const e=await browser.runtime.sendMessage(t);if(!e||e.error)throw new Error(e&&e.error&&e.error.toString());return e}browser.runtime.onMessage.addListener(t=>\"singlefile.fetchFrame\"==t.method&&window.frameId&&window.frameId==t.frameId?async function(t){try{const e=await qt(t.url,{cache:\"force-cache\",headers:t.headers,referrerPolicy:\"strict-origin-when-cross-origin\"});return{status:e.status,headers:[...e.headers],array:Array.from(new Uint8Array(await e.arrayBuffer()))}}catch(t){return{error:t&&(t.message||t.toString())}}}(t):\"singlefile.fetchResponse\"==t.method?async function(t){const e=Xt.get(t.requestId);e&&(t.error?(e.reject(new Error(t.error)),Xt.delete(t.requestId)):(t.truncated&&(e.array?e.array=e.array.concat(t.array):(e.array=t.array,Xt.set(t.requestId,e)),t.finished&&(t.array=e.array)),t.truncated&&!t.finished||(e.resolve({status:t.status,headers:{get:e=>t.headers&&t.headers[e]},arrayBuffer:async()=>new Uint8Array(t.array).buffer}),Xt.delete(t.requestId))));return{}}(t):void 0);const Qt=globalThis.singlefile,Jt=globalThis.singlefileBootstrap,Yt=\"moz-extension:\",$t=browser.i18n.getMessage(\"topPanelEmbeddedImageButton\"),te=browser.i18n.getMessage(\"topPanelSharePageButton\"),ee=browser.i18n.getMessage(\"topPanelShareSelectionButton\"),ne=browser.i18n.getMessage(\"topPanelError\"),re=\"_singleFile_waitForUserScript\",oe=\"single-file-on-init-capture\";let ae,ie,se,ce,le,de,ue;xt({EMBEDDED_IMAGE_BUTTON_MESSAGE:$t,SHARE_PAGE_BUTTON_MESSAGE:te,SHARE_SELECTION_BUTTON_MESSAGE:ee,ERROR_TITLE_MESSAGE:ne}),Jt&&Jt.initializedSingleFile||(Qt.init({fetch:Kt,frameFetch:async function(t,e){const n=await Zt({method:\"singlefile.fetchFrame\",url:t,frameId:e.frameId,referrer:e.referrer,headers:e.headers});return{status:n.status,headers:new Map(n.headers),arrayBuffer:async()=>new Uint8Array(n.array).buffer}}}),browser.runtime.onMessage.addListener(t=>{if(\"content.save\"==t.method||\"content.cancelSave\"==t.method||\"content.download\"==t.method||\"content.getSelectedLinks\"==t.method||\"content.error\"==t.method||\"content.prompt\"==t.method||\"content.beginScrollTo\"==t.method||\"content.scrollTo\"==t.method||\"content.endScrollTo\"==t.method)return async function(t){if(!location.href.startsWith(Yt)){if(\"content.save\"==t.method)return await async function(t){const e=setInterval(()=>{browser.runtime.sendMessage({method:\"ping\"}).then(()=>{})},15e3),n=t.options;let r;(n.selected||n.optionallySelected)&&(r=await dt(n.optionallySelected));if(!(ie||Jt&&Jt.pageInfo.processing)){if(n.updatedResources=Jt?Jt.pageInfo.updatedResources:{},n.visitDate=Jt?Jt.pageInfo.visitDate:new Date,Object.keys(n.updatedResources).forEach(t=>n.updatedResources[t].retrieved=!1),n.optionallySelected&&r&&(n.selected=!0),!n.selected||r){Jt&&(Jt.pageInfo.processing=!0),ie=!0;try{const t=await async function(t){const e=Qt.processors.frameTree;let n;Qt.helper.initDoc(document),ot(t),ae=new Qt.SingleFile(t);const r=[];t.insertCanonicalLink=!0;let o,a=0,i=0;t.onprogress=async t=>{const{options:e}=t.detail;if(!ae.cancelled){if(t.type==t.RESOURCES_INITIALIZING&&!o&&e.insertEmbeddedScreenshotImage&&e.compressContent){o=!0,rt(!1);const t=await browser.runtime.sendMessage({method:\"tabs.getScreenshot\",width:document.documentElement.scrollWidth,height:document.documentElement.scrollHeight,innerHeight:globalThis.innerHeight});rt(!0),st(e),e.embeddedImage=new Uint8Array(await(await Kt(t)).arrayBuffer()),URL.revokeObjectURL(t),ct(e)}t.type==t.RESOURCES_INITIALIZED&&(i=t.detail.max,e.loadDeferredImages&&Qt.processors.lazy.resetZoomLevel(e)),t.type==t.RESOURCES_INITIALIZED||t.type==t.RESOURCE_LOADED?(t.type==t.RESOURCE_LOADED&&a++,await browser.runtime.sendMessage({method:\"ui.processProgress\",index:a,maxIndex:i}),it(a,i,e)):t.detail.frame||t.type==t.PAGE_LOADING||t.type==t.PAGE_LOADED||(t.type==t.STAGE_STARTED?t.detail.step<3&&function(t,e){yt(\"step-\"+t,`${$} ${t+1} / 3`,\"…\",e)}(t.detail.step,e):t.type==t.STAGE_ENDED&&t.detail.step<3&&function(t,e){yt(\"step-\"+t,`${$} ${t+1} / 3`,\"✓\",e)}(t.detail.step,e))}};const s=globalThis[re];t.userScriptEnabled&&s&&await s(oe,t);const c=ae.cancel.bind(ae);if(t.insertEmbeddedImage&&t.compressContent){st(t),ce=function(){let t;return{display:async function(){return new Promise(e=>{t=e,Lt(Et,\"\",{buttonLabel:Tt,buttonOnclick:e})})},hide:function(){const t=document.querySelector(Et);t&&t.remove()},cancel:function(){this.hide(),t&&t(!0)}}}();await ce.display()||(t.embeddedImage=await function({accept:t}={accept:\"image/*\"}){const e=document.createElement(\"input\");return e.type=\"file\",e.accept=t,e.click(),new Promise(t=>{e.addEventListener(\"change\",async e=>{if(e.target.files.length){const n=e.target.files[0];if(\"image/png\"==n.type){const e=new FileReader;e.addEventListener(\"load\",async()=>t(new Uint8Array(e.result))),e.addEventListener(\"error\",()=>t()),e.readAsArrayBuffer(n)}else{const e=await new Promise(t=>{const e=new FileReader;e.addEventListener(\"load\",()=>t(e.result)),e.addEventListener(\"error\",()=>t()),e.readAsDataURL(n)});if(e){const r=await createImageBitmap(n),o=new Image;o.src=e,o.addEventListener(\"error\",()=>t()),await new Promise(t=>o.addEventListener(\"load\",t));const a=new OffscreenCanvas(o.width,o.height);a.getContext(\"2d\").drawImage(r,0,0);const i=await a.convertToBlob({type:\"image/png\"}),s=new FileReader;s.addEventListener(\"load\",()=>t(new Uint8Array(s.result))),s.addEventListener(\"error\",()=>t()),s.readAsArrayBuffer(i)}else t()}}else t()}),e.addEventListener(\"cancel\",()=>t())})}({accept:\"image/*\"}),ce.hide()),ct(t)}if(!t.saveRawPage&&!ae.cancelled){let n;if(t.loadDeferredImages&&(n=Qt.processors.lazy.process(t),function(t){yt(\"load-deferred-images\",Q,\"…\",t)}(t),n.then(()=>{ae.cancelled||function(t){yt(\"load-deferred-images\",Q,\"✓\",t)}(t)}),t.loadDeferredImagesBeforeFrames&&await n),!t.removeFrames&&e&&globalThis.frames){let n;n=t.loadDeferredImages?new Promise(n=>globalThis.setTimeout(()=>n(e.getAsync(t)),t.loadDeferredImagesBeforeFrames||!t.loadDeferredImages?0:t.loadDeferredImagesMaxIdleTime)):e.getAsync(t),function(t){yt(\"load-frames\",J,\"…\",t)}(t),n.then(()=>{ae.cancelled||function(t){yt(\"load-frames\",J,\"✓\",t)}(t)}),t.loadDeferredImagesBeforeFrames?t.frames=await new Promise(t=>{ae.cancel=function(){c(),t([])},n.then(t)}):r.push(n)}t.loadDeferredImages&&!t.loadDeferredImagesBeforeFrames&&r.push(n)}t.loadDeferredImagesBeforeFrames||ae.cancelled||([t.frames]=await new Promise(t=>{const e=Promise.all(r);ae.cancel=function(){c(),t([[]])},e.then(()=>t(e))}));t.delayBeforeProcessing&&await new Promise(e=>setTimeout(e,1e3*t.delayBeforeProcessing));n=t.frames&&t.frames.sessionId;const l=t.frames&&t.frames.find(t=>t.requestedFrame);t.win=globalThis,l?(t.content=l.content,t.url=l.baseURI,t.canvases=l.canvases,t.fonts=l.fonts,t.stylesheets=l.stylesheets,t.images=l.images,t.posters=l.posters,t.videos=l.videos,t.usedFonts=l.usedFonts,t.shadowRoots=l.shadowRoots,t.adoptedStyleSheets=l.adoptedStyleSheets,t.worklets=l.worklets):t.doc=document;ae.cancelled||await ae.run();n&&e.cleanup(n);let d;ae.cancelled||(t.confirmInfobarContent&&(t.infobarContent=nt(\"Infobar content\",t.infobarContent)||\"\"),d=await ae.getPageData(),(t.selected||t.optionallySelected)&&document.querySelectorAll(\"[\"+N+\"]\").forEach(t=>t.removeAttribute(N)),at(),t.displayStats&&(console.log(\"SingleFile stats\"),console.table(d.stats)));t.delayAfterProcessing&&await new Promise(e=>setTimeout(e,1e3*t.delayAfterProcessing));return d}(n);t&&await Ft(t,n)}catch(t){if(!ae.cancelled){console.error(t);const e=t&&(t.message||t.toString());browser.runtime.sendMessage({method:\"ui.processError\",error:e}),Ut(e)}}}else browser.runtime.sendMessage({method:\"ui.processCancelled\"});ie=!1,Jt&&(Jt.pageInfo.processing=!1)}clearInterval(e)}(t),{};if(\"content.cancelSave\"==t.method)return ae&&(ae.cancel(),at(),ce&&(ce.cancel(),ce=null),browser.runtime.sendMessage({method:\"ui.processCancelled\"})),t.options.loadDeferredImages&&Qt.processors.lazy.resetZoomLevel(t.options),{};if(\"content.getSelectedLinks\"==t.method)return{urls:lt()};if(\"content.download\"==t.method){se||(se=A());const e=await se.next(t.data);if(e.done){se=null;try{await _t(e.value,{foregroundSave:e.value.foregroundSave,sharePage:e.value.sharePage})}catch(t){return{error:t&&(t.message||t.toString())}}finally{await browser.runtime.sendMessage({method:\"downloads.end\",taskId:e.value.taskId})}}return{}}if(\"content.error\"==t.method)return Ut(t.error,t.link),{};if(\"content.prompt\"==t.method)return nt(t.message,t.value);if(\"content.beginScrollTo\"==t.method)return le=globalThis.scrollY,de=document.documentElement.style.getPropertyValue(\"transform\"),ue=document.documentElement.style.getPropertyValue(\"overflow\"),globalThis.scrollTo(0,0),document.documentElement.style.setProperty(\"transform\",\"translateY(0px)\"),document.documentElement.style.setProperty(\"overflow\",\"hidden\"),{};if(\"content.scrollTo\"==t.method)return document.documentElement.style.setProperty(\"transform\",\"translateY(-\"+t.y+\"px)\"),await new Promise(t=>setTimeout(t,500)),{};if(\"content.endScrollTo\"==t.method)return globalThis.scrollTo(0,le),document.documentElement.style.setProperty(\"transform\",de),document.documentElement.style.setProperty(\"overflow\",ue),{}}}(t)}),Jt?Jt.initializedSingleFile=!0:globalThis.singlefileBootstrap={initializedSingleFile:!0})}();\n"
  },
  {
    "path": "lib/single-file-frames.bundle.js",
    "content": "!function(){\"use strict\";\"undefined\"==typeof globalThis&&(window.globalThis=window),(()=>{const e=globalThis.chrome;globalThis.__defineGetter__(\"browser\",()=>({action:{onClicked:{addListener:t=>e.action.onClicked.addListener(t)},setBadgeText:t=>e.action.setBadgeText(t),setBadgeBackgroundColor:t=>e.action.setBadgeBackgroundColor(t),setTitle:t=>e.action.setTitle(t),setIcon:t=>e.action.setIcon(t)},bookmarks:{get:t=>e.bookmarks.get(t),onCreated:{addListener:t=>e.bookmarks.onCreated.addListener(t),removeListener:t=>e.bookmarks.onCreated.removeListener(t)},onChanged:{addListener:t=>e.bookmarks.onChanged.addListener(t),removeListener:t=>e.bookmarks.onChanged.removeListener(t)},onMoved:{addListener:t=>e.bookmarks.onMoved.addListener(t),removeListener:t=>e.bookmarks.onMoved.removeListener(t)},update:(t,n)=>e.bookmarks.update(t,n)},commands:{onCommand:{addListener:t=>e.commands.onCommand.addListener(t)}},downloads:{download:t=>e.downloads.download(t),onChanged:{addListener:t=>e.downloads.onChanged.addListener(t),removeListener:t=>e.downloads.onChanged.removeListener(t)},search:t=>e.downloads.search(t)},i18n:{getUILanguage:()=>e.i18n.getUILanguage(),getMessage:(t,n)=>e.i18n.getMessage(t,n)},identity:{getRedirectURL:()=>e.identity.getRedirectURL(),getAuthToken:t=>e.identity.getAuthToken(t),launchWebAuthFlow:t=>e.identity.launchWebAuthFlow(t),removeCachedAuthToken:t=>e.identity.removeCachedAuthToken(t)},contextMenus:{onClicked:{addListener:t=>e.contextMenus.onClicked.addListener(t)},create:t=>e.contextMenus.create(t),update:(t,n)=>e.contextMenus.update(t,n),removeAll:()=>e.contextMenus.removeAll()},permissions:{request:t=>e.permissions.request(t),remove:t=>e.permissions.remove(t)},runtime:{id:e.runtime.id,sendNativeMessage:(t,n)=>new Promise((r,o)=>{e.runtime.sendNativeMessage(t,n,t=>{e.runtime.lastError?o(e.runtime.lastError):r(t)})}),getManifest:()=>e.runtime.getManifest(),onMessage:{addListener:t=>e.runtime.onMessage.addListener((e,n,r)=>{const o=t(e,n);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{r(e)}catch(e){}}),!0}),removeListener:t=>e.runtime.onMessage.removeListener(t)},onMessageExternal:{addListener:t=>e.runtime.onMessageExternal.addListener((e,n,r)=>{const o=t(e,n);if(o&&\"function\"==typeof o.then)return o.then(e=>{if(void 0!==e)try{r(e)}catch(e){}}),!0})},sendMessage:t=>new Promise((n,r)=>{e.runtime.sendMessage(t,t=>{e.runtime.lastError?r(e.runtime.lastError):n(t)}),e.runtime.lastError&&r(e.runtime.lastError)}),getURL:t=>e.runtime.getURL(t),getContexts:t=>e.runtime.getContexts(t),get lastError(){return e.runtime.lastError}},scripting:{executeScript:t=>e.scripting.executeScript(t)},storage:{local:{set:t=>e.storage.local.set(t),get:t=>e.storage.local.get(t),clear:()=>e.storage.local.clear(),remove:t=>e.storage.local.remove(t)},sync:{set:t=>e.storage.sync.set(t),get:t=>e.storage.sync.get(t),clear:()=>e.storage.sync.clear(),remove:t=>e.storage.sync.remove(t)}},tabs:{onCreated:{addListener:t=>e.tabs.onCreated.addListener(t)},onActivated:{addListener:t=>e.tabs.onActivated.addListener(t)},onUpdated:{addListener:t=>e.tabs.onUpdated.addListener(t),removeListener:t=>e.tabs.onUpdated.removeListener(t)},onRemoved:{addListener:t=>e.tabs.onRemoved.addListener(t),removeListener:t=>e.tabs.onRemoved.removeListener(t)},onReplaced:{addListener:t=>e.tabs.onReplaced.addListener(t),removeListener:t=>e.tabs.onReplaced.removeListener(t)},captureVisibleTab:(t,n)=>e.tabs.captureVisibleTab(t,n),sendMessage:(t,n,r={})=>new Promise((o,s)=>{e.tabs.sendMessage(t,n,r,t=>{e.runtime.lastError?s(e.runtime.lastError):o(t)}),e.runtime.lastError&&s(e.runtime.lastError)}),query:t=>e.tabs.query(t),create:t=>e.tabs.create(t),get:t=>e.tabs.get(t),remove:t=>e.tabs.remove(t),update:(t,n)=>e.tabs.update(t,n)},devtools:{inspectedWindow:{onResourceContentCommitted:{addListener:t=>e.devtools.inspectedWindow.onResourceContentCommitted.addListener(t)},get tabId(){return e.devtools.inspectedWindow.tabId}}},offscreen:{createDocument:t=>e.offscreen.createDocument(t)},declarativeNetRequest:{updateSessionRules:t=>e.declarativeNetRequest.updateSessionRules(t)}}))})()}();\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).singlefile={})}(this,function(e){\"use strict\";const t=\"single-file-load-image\",s=\"single-file-image-loaded\",o=\"_singleFile_fontFaces\",n=\"_singleFile_worklets\",i=globalThis.CustomEvent,r=globalThis.document,a=globalThis.Document,l=globalThis.JSON,d=globalThis.MutationObserver;let c,u;function m(){r instanceof a&&(r.addEventListener(\"single-file-new-font-face\",e=>{const t=e.detail,s=Object.assign({},t);delete s.src,c.set(l.stringify(s),t)}),r.addEventListener(\"single-file-delete-font\",e=>{const t=e.detail,s=Object.assign({},t);delete s.src,c.delete(l.stringify(s))}),r.addEventListener(\"single-file-clear-fonts\",()=>c=new Map),r.addEventListener(\"single-file-new-worklet\",e=>{const t=e.detail;u.set(t.moduleURL,t)}))}c=globalThis.window[o]?globalThis.window[o]:globalThis.window[o]=new Map,u=globalThis.window[n]?globalThis.window[n]:globalThis.window[n]=new Map,m(),new d(m).observe(r,{childList:!0});const h=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",g=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+h+\"?|(\"+h+\")|.)\",\"ig\");const f=\"single-file-\",p=\"_singleFile_waitForUserScript\",b=\"__frameTree__::\",y=f+\"on-before-capture\",E=f+\"on-after-capture\",T=f+\"request-get-adopted-stylesheets\",w=f+\"response-get-adopted-stylesheets\",v=f+\"unregister-request-get-adopted-stylesheets\",I=f+\"user-script-init\",A=\"data-\"+f+\"removed-content\",S=\"data-\"+f+\"hidden-content\",R=\"data-\"+f+\"kept-content\",M=\"data-\"+f+\"hidden-frame\",L=\"data-\"+f+\"preserved-space-element\",P=\"data-\"+f+\"shadow-root-element\",_=\"data-\"+f+\"win-id\",k=\"data-\"+f+\"image\",x=\"data-\"+f+\"poster\",C=\"data-\"+f+\"video\",F=\"data-\"+f+\"canvas\",q=\"data-\"+f+\"movable-style\",N=\"data-\"+f+\"input-value\",D=\"data-\"+f+\"input-checked\",U=\"data-\"+f+\"lazy-loaded-src\",O=\"data-\"+f+\"stylesheet\",H=\"data-\"+f+\"disabled-noscript\",V=\"data-\"+f+\"async-script\",W=\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\",z=[\"NOSCRIPT\",\"DISABLED-NOSCRIPT\",\"META\",\"LINK\",\"STYLE\",\"TITLE\",\"TEMPLATE\",\"SOURCE\",\"OBJECT\",\"SCRIPT\",\"HEAD\",\"BODY\"],B=[\"SCRIPT\",\"NOSCRIPT\",\"META\",\"LINK\",\"TEMPLATE\"],j=/^'(.*?)'$/,Y=/^\"(.*?)\"$/,G={regular:\"400\",normal:\"400\",bold:\"700\",bolder:\"700\",lighter:\"100\"},$=\"single-file-ui-element\",K=\"data:,\",Z=\"data-sf-nesting-track-id\",J=(e,t,s)=>globalThis.addEventListener(e,t,s),X=globalThis.JSON,Q=globalThis.CustomEvent,ee=globalThis.MutationObserver,te=globalThis.URL,se=globalThis.DOMParser;function oe(e,t,s,o,n={usedFonts:new Map,canvases:[],images:[],posters:[],videos:[],shadowRoots:[],markedElements:[]},i=new Map,r){if(s.childNodes){Array.from(s.childNodes).filter(t=>t instanceof e.HTMLElement||t instanceof e.SVGElement||t instanceof globalThis.HTMLElement||t instanceof globalThis.SVGElement).forEach(s=>{let a,l,d;if(!o.autoSaveExternalSave&&(o.removeHiddenElements||o.removeUnusedFonts||o.compressHTML)&&(d=me(e,s),(s instanceof e.HTMLElement||s instanceof globalThis.HTMLElement)&&o.removeHiddenElements&&(l=(r||s.closest(\"html > head\"))&&z.includes(s.tagName.toUpperCase())||s.closest(\"details\"),l||(a=r||le(s,d),a&&!B.includes(s.tagName.toUpperCase())&&(s.setAttribute(S,\"\"),n.markedElements.push(s)))),!a)){if(o.compressHTML&&d){const e=d.getPropertyValue(\"white-space\");e&&e.startsWith(\"pre\")&&(s.setAttribute(L,\"\"),n.markedElements.push(s))}o.removeUnusedFonts&&(ie(d,o,n.usedFonts),ie(me(e,s,\":first-letter\"),o,n.usedFonts),ie(me(e,s,\":before\"),o,n.usedFonts),ie(me(e,s,\":after\"),o,n.usedFonts))}!function(e,t,s,o,n,i,r){const a=s.tagName&&s.tagName.toUpperCase();if(\"CANVAS\"==a)try{n.canvases.push({dataURI:s.toDataURL(\"image/png\"),backgroundColor:r.getPropertyValue(\"background-color\")}),s.setAttribute(F,n.canvases.length-1),n.markedElements.push(s)}catch(e){}if(\"IMG\"==a){const t={currentSrc:i?K:o.loadDeferredImages&&s.getAttribute(U)||s.currentSrc};if(n.images.push(t),s.setAttribute(k,n.images.length-1),n.markedElements.push(s),s.removeAttribute(U),r=r||me(e,s)){t.size=function(e,t,s){let o=t.naturalWidth,n=t.naturalHeight;if(!o&&!n){const i=null==t.getAttribute(\"style\");if(s=s||me(e,t)){let e,r,a,l,d,c,u,m,h=!1;if(\"content-box\"==s.getPropertyValue(\"box-sizing\")){const e=t.style.getPropertyValue(\"box-sizing\"),s=t.style.getPropertyPriority(\"box-sizing\"),o=t.clientWidth;t.style.setProperty(\"box-sizing\",\"border-box\",\"important\"),h=t.clientWidth!=o,e?t.style.setProperty(\"box-sizing\",e,s):t.style.removeProperty(\"box-sizing\")}e=ce(\"padding-left\",s),r=ce(\"padding-right\",s),a=ce(\"padding-top\",s),l=ce(\"padding-bottom\",s),h?(d=ce(\"border-left-width\",s),c=ce(\"border-right-width\",s),u=ce(\"border-top-width\",s),m=ce(\"border-bottom-width\",s)):d=c=u=m=0,o=Math.max(0,t.clientWidth-e-r-d-c),n=Math.max(0,t.clientHeight-a-l-u-m),i&&t.removeAttribute(\"style\")}}return{pxWidth:o,pxHeight:n}}(e,s,r);const o=r.getPropertyValue(\"box-shadow\"),n=r.getPropertyValue(\"background-image\");o&&\"none\"!=o||n&&\"none\"!=n||!(t.size.pxWidth>1||t.size.pxHeight>1)||(t.replaceable=!0,t.backgroundColor=r.getPropertyValue(\"background-color\"),t.objectFit=r.getPropertyValue(\"object-fit\"),t.boxSizing=r.getPropertyValue(\"box-sizing\"),t.objectPosition=r.getPropertyValue(\"object-position\"))}}if(\"VIDEO\"==a){const o=s.currentSrc;if(o&&!o.startsWith(\"blob:\")&&!o.startsWith(\"data:\")){const t=me(e,s.parentNode);n.videos.push({positionParent:t&&t.getPropertyValue(\"position\"),src:o,size:{pxWidth:s.clientWidth,pxHeight:s.clientHeight,videoWidth:s.videoWidth,videoHeight:s.videoHeight},currentTime:s.currentTime}),s.setAttribute(C,n.videos.length-1)}if(!s.getAttribute(\"poster\")){const e=t.createElement(\"canvas\"),o=e.getContext(\"2d\");e.width=s.videoWidth,e.height=s.videoHeight;try{o.drawImage(s,0,0,e.width,e.height),n.posters.push(e.toDataURL(\"image/png\")),s.setAttribute(x,n.posters.length-1),n.markedElements.push(s)}catch(e){}}}\"IFRAME\"==a&&i&&o.removeHiddenElements&&(s.setAttribute(M,\"\"),n.markedElements.push(s));\"INPUT\"==a&&(\"password\"!=s.type&&(s.setAttribute(N,s.value),n.markedElements.push(s)),\"radio\"!=s.type&&\"checkbox\"!=s.type||(s.setAttribute(D,s.checked),n.markedElements.push(s)));\"TEXTAREA\"==a&&(s.setAttribute(N,s.value),n.markedElements.push(s));\"SELECT\"==a&&s.querySelectorAll(\"option\").forEach(e=>{e.selected&&(e.setAttribute(N,\"\"),n.markedElements.push(e))});\"SCRIPT\"==a&&(s.async&&\"\"!=s.getAttribute(\"async\")&&\"async\"!=s.getAttribute(\"async\")&&(s.setAttribute(V,\"\"),n.markedElements.push(s)),s.textContent=s.textContent.replace(/<\\/script>/gi,\"<\\\\/script>\"))}(e,t,s,o,n,a,d);const c=!(s instanceof e.SVGElement||s instanceof globalThis.SVGElement)&&re(s);if(c&&!s.classList.contains($)&&\"single-file-infobar\"!=s.tagName.toLowerCase()){const r={};s.setAttribute(P,n.shadowRoots.length),n.markedElements.push(s),n.shadowRoots.push(r);try{if(c.adoptedStyleSheets){const e=e=>r.adoptedStyleSheets=e.detail.adoptedStyleSheets;c.addEventListener(w,e),c.dispatchEvent(new Q(T,{bubbles:!0})),r.adoptedStyleSheets||s.dispatchEvent(new Q(T,{bubbles:!0})),c.removeEventListener(w,e)}}catch(e){}oe(e,t,c,o,n,i,a),r.content=c.innerHTML,r.mode=c.mode,r.delegateFocus=c.delegatesFocus,r.clonable=c.clonable,r.serializable=c.serializable;try{c.adoptedStyleSheets&&void 0===c.adoptedStyleSheets.length&&c.dispatchEvent(new Q(v,{bubbles:!0}))}catch(e){}}oe(e,t,s,o,n,i,a),!o.autoSaveExternalSave&&o.removeHiddenElements&&r&&(l||\"\"==s.getAttribute(R)?s.parentElement&&(s.parentElement.setAttribute(R,\"\"),n.markedElements.push(s.parentElement)):a&&(s.setAttribute(A,\"\"),n.markedElements.push(s)))})}return n}function ne(e,t=new Map){if(e){const s=[];for(const o of Array.from(e))if(t.has(o))s.push(t.get(o));else{let e=\"\";if(o&&o.cssRules)for(const t of o.cssRules)e+=t.cssText+\"\\n\";t.set(o,e),s.push(e)}return s}return[]}function ie(e,t,s){if(e){const o=e.getPropertyValue(\"font-style\")||\"normal\";e.getPropertyValue(\"font-family\").split(\",\").forEach(n=>{if(n=ae(n),!t.loadedFonts||t.loadedFonts.find(e=>ae(e.family)==n&&e.style==o)){const t=(i=e.getPropertyValue(\"font-weight\"),G[i.toLowerCase().trim()]||i),r=e.getPropertyValue(\"font-variant\")||\"normal\",a=[n,t,o,r];s.set(X.stringify(a),[n,t,o,r])}var i})}}function re(e){const t=globalThis.chrome;if(e.openOrClosedShadowRoot)return e.openOrClosedShadowRoot;if(!(t&&t.dom&&t.dom.openOrClosedShadowRoot))return e.shadowRoot;try{return t.dom.openOrClosedShadowRoot(e)}catch(t){return e.shadowRoot}}function ae(e=\"\"){return function(e){e=e.match(j)?e.replace(j,\"$1\"):e.replace(Y,\"$1\");return e.trim()}((t=e.trim(),t.replace(g,(e,t,s)=>{const o=\"0x\"+t-65536;return o!=o||s?t:o<0?String.fromCharCode(o+65536):String.fromCharCode(o>>10|55296,1023&o|56320)}))).toLowerCase();var t}function le(e,t){let s=!1;if(t){const o=t.getPropertyValue(\"display\"),n=t.getPropertyValue(\"opacity\"),i=t.getPropertyValue(\"visibility\");if(s=\"none\"==o,!s&&(\"0\"==n||\"hidden\"==i)&&e.getBoundingClientRect){const t=e.getBoundingClientRect();s=!t.width&&!t.height}}return Boolean(s)}function de(e){if(e){const t=[];return e.querySelectorAll(\"style\").forEach((s,o)=>{try{if(!s.sheet.disabled){const n=e.createElement(\"style\");n.textContent=s.textContent,e.body.appendChild(n);const i=n.sheet;n.remove();const r=Array.from(i.cssRules).map(e=>e.cssText).join(\"\\n\"),a=Array.from(s.sheet.cssRules).map(e=>e.cssText).join(\"\\n\");i&&r==a||(s.setAttribute(O,o),t[o]=Array.from(s.sheet.cssRules).map(e=>e.cssText).join(\"\\n\"))}}catch(e){}}),t}}function ce(e,t){if(t.getPropertyValue(e).endsWith(\"px\"))return parseFloat(t.getPropertyValue(e))}function ue(e){const t=e.doctype;let s=\"\";return t&&(s=\"<!DOCTYPE \"+t.nodeName,t.publicId?(s+=' PUBLIC \"'+t.publicId+'\"',t.systemId&&(s+=' \"'+t.systemId+'\"')):t.systemId&&(s+=' SYSTEM \"'+t.systemId+'\"'),t.internalSubset&&(s+=\" [\"+t.internalSubset+\"]\"),s+=\"> \"),s+e.documentElement.outerHTML}function me(e,t,s){try{return e.getComputedStyle(t,s)}catch(e){}}const he={LAZY_SRC_ATTRIBUTE_NAME:U,SINGLE_FILE_UI_ELEMENT_CLASS:$},ge=\"attributes\",fe=globalThis.browser,pe=globalThis.document,be=globalThis.MutationObserver,ye=new Map;let Ee;async function Te(e){if(pe.documentElement){ye.clear();const o=pe.body?Math.max(pe.body.scrollHeight,pe.documentElement.scrollHeight):pe.documentElement.scrollHeight,n=pe.body?Math.max(pe.body.scrollWidth,pe.documentElement.scrollWidth):pe.documentElement.scrollWidth;if(o>globalThis.innerHeight||n>globalThis.innerWidth){const a=Math.max(o-1.5*globalThis.innerHeight,0),l=Math.max(n-1.5*globalThis.innerWidth,0);if(globalThis.scrollY<a||globalThis.scrollX<l)return function(e){return Ee=0,new Promise(async o=>{let n;const a=new Set,l=new be(async t=>{if((t=t.filter(e=>e.type==ge)).length){t.filter(e=>{if(\"src\"==e.attributeName&&(e.target.setAttribute(he.LAZY_SRC_ATTRIBUTE_NAME,e.target.src),e.target.addEventListener(\"load\",c)),\"src\"==e.attributeName||\"srcset\"==e.attributeName||e.target.tagName&&\"SOURCE\"==e.target.tagName.toUpperCase())return!e.target.classList||!e.target.classList.contains(he.SINGLE_FILE_UI_ELEMENT_CLASS)}).length&&(n=!0,await ve(l,e,h),a.size||await we(l,e,h))}});async function d(t){await Ae(\"idleTimeout\",async()=>{n?Ee<10&&(Ee++,Re(\"idleTimeout\"),await d(Math.max(500,t/2))):(Re(\"loadTimeout\"),Re(\"maxTimeout\"),Ie(l,e,h))},t,e.loadDeferredImagesNativeTimeout)}function c(e){const t=e.target;t.removeAttribute(he.LAZY_SRC_ATTRIBUTE_NAME),t.removeEventListener(\"load\",c)}async function u(t){n=!0,await ve(l,e,h),await we(l,e,h),t.detail&&a.add(t.detail)}async function m(t){await ve(l,e,h),await we(l,e,h),a.delete(t.detail),a.size||await we(l,e,h)}function h(e){l.disconnect(),pe.removeEventListener(t,u),pe.removeEventListener(s,m),o(e)}await d(2*e.loadDeferredImagesMaxIdleTime),await ve(l,e,h),l.observe(pe,{subtree:!0,childList:!0,attributes:!0}),pe.addEventListener(t,u),pe.addEventListener(s,m),function(e){e.loadDeferredImagesBlockCookies&&r.dispatchEvent(new i(\"single-file-block-cookies-start\")),e.loadDeferredImagesBlockStorage&&r.dispatchEvent(new i(\"single-file-block-storage-start\")),e.loadDeferredImagesDispatchScrollEvent&&r.dispatchEvent(new i(\"single-file-dispatch-scroll-event-start\")),e.loadDeferredImagesKeepZoomLevel?r.dispatchEvent(new i(\"single-file-load-deferred-images-keep-zoom-level-start\")):r.dispatchEvent(new i(\"single-file-load-deferred-images-start\"))}(e)})}(e)}}}async function we(e,t,s){await Ae(\"loadTimeout\",()=>Ie(e,t,s),t.loadDeferredImagesMaxIdleTime,t.loadDeferredImagesNativeTimeout)}async function ve(e,t,s){await Ae(\"maxTimeout\",async()=>{await Re(\"loadTimeout\"),await Ie(e,t,s)},10*t.loadDeferredImagesMaxIdleTime,t.loadDeferredImagesNativeTimeout)}async function Ie(e,t,s){await Re(\"idleTimeout\"),function(e){e.loadDeferredImagesBlockCookies&&r.dispatchEvent(new i(\"single-file-block-cookies-end\")),e.loadDeferredImagesBlockStorage&&r.dispatchEvent(new i(\"single-file-block-storage-end\")),e.loadDeferredImagesDispatchScrollEvent&&r.dispatchEvent(new i(\"single-file-dispatch-scroll-event-end\")),e.loadDeferredImagesKeepZoomLevel?r.dispatchEvent(new i(\"single-file-load-deferred-images-keep-zoom-level-end\")):r.dispatchEvent(new i(\"single-file-load-deferred-images-end\"))}(t),await Ae(\"endTimeout\",async()=>{await Re(\"maxTimeout\"),s()},t.loadDeferredImagesMaxIdleTime/2,t.loadDeferredImagesNativeTimeout),e.disconnect()}async function Ae(e,t,s,o){if(fe&&fe.runtime&&fe.runtime.sendMessage&&!o){if(!ye.get(e)||!ye.get(e).pending){const o={callback:t,pending:!0};ye.set(e,o);try{await fe.runtime.sendMessage({method:\"singlefile.lazyTimeout.setTimeout\",type:e,delay:s})}catch(o){Se(e,t,s)}o.pending=!1}}else Se(e,t,s)}function Se(e,t,s){const o=ye.get(e);o&&globalThis.clearTimeout(o),ye.set(e,t),globalThis.setTimeout(t,s)}async function Re(e){if(fe&&fe.runtime&&fe.runtime.sendMessage)try{await fe.runtime.sendMessage({method:\"singlefile.lazyTimeout.clearTimeout\",type:e})}catch(t){Me(e)}else Me(e)}function Me(e){const t=ye.get(e);ye.delete(e),t&&globalThis.clearTimeout(t)}fe&&fe.runtime&&fe.runtime.onMessage&&fe.runtime.onMessage.addListener&&fe.runtime.onMessage.addListener(e=>{if(\"singlefile.lazyTimeout.onTimeout\"==e.method){const t=ye.get(e.type);if(t){ye.delete(e.type);try{t.callback()}catch(t){Me(e.type)}}}});const Le={ON_BEFORE_CAPTURE_EVENT_NAME:y,ON_AFTER_CAPTURE_EVENT_NAME:E,WIN_ID_ATTRIBUTE_NAME:_,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:p,preProcessDoc:function(e,t,s){e.querySelectorAll(\"noscript:not([\"+H+\"])\").forEach(e=>{e.setAttribute(H,e.textContent),e.textContent=\"\"}),function(e){e.querySelectorAll(\"meta[http-equiv=refresh]\").forEach(e=>{e.removeAttribute(\"http-equiv\"),e.setAttribute(\"disabled-http-equiv\",\"refresh\")})}(e),e.head&&e.head.querySelectorAll(W).forEach(e=>e.hidden=!0),e.querySelectorAll(\"svg foreignObject\").forEach(e=>{const t=e.querySelectorAll(\"html > head > \"+W+\", html > body > \"+W);t.length&&(Array.from(e.childNodes).forEach(e=>e.remove()),t.forEach(t=>e.appendChild(t)))});const o=new Map;let n;t&&e.documentElement?(!function(e){i(e.body);const t=function(e,t){const s=(new se).parseFromString(e,\"text/html\");s.head||s.documentElement.insertBefore(s.createElement(\"HEAD\"),s.body);let o=s.querySelector(\"base\");o&&o.getAttribute(\"href\")||(o&&o.remove(),o=s.createElement(\"base\"),o.setAttribute(\"href\",t),s.head.insertBefore(o,s.head.firstChild));return s}(ue(e)),s=r(e.body),o=r(t.body),n=new Set;function i(e,t=0,s=\"\"){const o=s?`${s}.${t+1}`:`${t+1}`;e.setAttribute(Z,o),Array.from(e.children).forEach((e,t)=>i(e,t,o))}function r(e){const t={};return s(e),t;function s(e){if(e.getAttribute){const o=e.getAttribute(Z);o&&(t[o]=e),Array.from(e.children).forEach(s)}}}function a(e,t){const s=e.getAttribute(Z);s&&!t.has(s)&&e.removeAttribute(Z),Array.from(e.children).forEach(e=>a(e,t))}Object.keys(s).forEach(t=>{if(t in o){if((s[t].parentElement?.getAttribute(Z)||null)!==(o[t]?.parentElement?.getAttribute(Z)||null)){let o=s[t];for(;o&&o!==e.body;){const e=o.getAttribute(Z);e&&n.add(e),o=o.parentElement}}}}),a(e.body,n)}(e),n=oe(t,e,e.documentElement,s),s.moveStylesInHead&&e.querySelectorAll(\"body style, body ~ style\").forEach(e=>{const s=me(t,e);s&&le(e,s)&&(e.setAttribute(q,\"\"),n.markedElements.push(e))})):n={canvases:[],images:[],posters:[],videos:[],usedFonts:[],shadowRoots:[],markedElements:[]};let i=\"\";if(e.referrer)try{i=new te(\"/\",new te(e.referrer).origin).href}catch(e){}return{canvases:n.canvases,fonts:Array.from(c.values()),worklets:Array.from(u.values()),stylesheets:de(e),images:n.images,posters:n.posters,videos:n.videos,usedFonts:Array.from(n.usedFonts.values()),shadowRoots:n.shadowRoots,referrer:i,markedElements:n.markedElements,invalidElements:o,scrollPosition:{x:t.scrollX,y:t.scrollY},adoptedStyleSheets:ne(e.adoptedStyleSheets)}},serialize:ue,postProcessDoc:function(e,t,s){if(e.querySelectorAll(\"[\"+H+\"]\").forEach(e=>{e.textContent=e.getAttribute(H),e.removeAttribute(H)}),e.querySelectorAll(\"meta[disabled-http-equiv]\").forEach(e=>{e.setAttribute(\"http-equiv\",e.getAttribute(\"disabled-http-equiv\")),e.removeAttribute(\"disabled-http-equiv\")}),e.head&&e.head.querySelectorAll(\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\").forEach(e=>e.removeAttribute(\"hidden\")),!t){const s=[A,M,S,L,k,x,C,F,N,D,P,O,V];t=e.querySelectorAll(s.map(e=>\"[\"+e+\"]\").join(\",\"))}t.forEach(e=>{e.removeAttribute(A),e.removeAttribute(S),e.removeAttribute(R),e.removeAttribute(M),e.removeAttribute(L),e.removeAttribute(k),e.removeAttribute(x),e.removeAttribute(C),e.removeAttribute(F),e.removeAttribute(N),e.removeAttribute(D),e.removeAttribute(P),e.removeAttribute(O),e.removeAttribute(V),e.removeAttribute(q)}),s&&s.forEach((e,t)=>e.replaceWith(t))},getShadowRoot:re},Pe=\"singlefile.frameTree.initRequest\",_e=\"singlefile.frameTree.ackInitRequest\",ke=\"singlefile.frameTree.cleanupRequest\",xe=\"singlefile.frameTree.initResponse\",Ce=5e3,Fe=\".\",qe=globalThis.window==globalThis.top,Ne=globalThis.browser,De=globalThis.top,Ue=globalThis.MessageChannel,Oe=globalThis.document,He=globalThis.JSON,Ve=globalThis.MutationObserver,We=globalThis.DOMParser;let ze,Be=globalThis.sessions;function je(){globalThis.addEventListener(\"message\",async e=>{if(\"string\"==typeof e.data&&e.data.startsWith(b)){e.preventDefault(),e.stopPropagation();const t=He.parse(e.data.substring(15));if(t.method==Pe)e.source&&tt(e.source,{method:_e,windowId:t.windowId,sessionId:t.sessionId}),qe||(globalThis.stop(),t.options.loadDeferredImages&&Te(t.options),await Ge(t));else if(t.method==_e)Je(\"requestTimeouts\",t.sessionId,t.windowId),Xe(t.sessionId,t.windowId);else if(t.method==ke)$e(t);else if(t.method==xe&&Be.get(t.sessionId)){e.ports[0].onmessage=e=>Ke(e.data)}}},!0)}function Ye(){return globalThis.crypto.getRandomValues(new Uint32Array(32)).join(\"\")}async function Ge(e){const t=e.sessionId;delete globalThis._singleFile_cleaningUp,qe||(ze=globalThis.frameId=e.windowId),Ze(Oe,e.options,ze,t),qe||(et({frames:[st(Oe,globalThis,ze,e.options,e.scrolling)],sessionId:t,requestedFrameId:Oe.documentElement.dataset.requestedFrameId&&ze}),delete Oe.documentElement.dataset.requestedFrameId)}function $e(e){if(!globalThis._singleFile_cleaningUp){globalThis._singleFile_cleaningUp=!0;const t=e.sessionId;Qe(ot(Oe),e.windowId,t)}}function Ke(e){e.frames.forEach(t=>Je(\"responseTimeouts\",e.sessionId,t.windowId));const t=Be.get(e.sessionId);if(t){e.requestedFrameId&&(t.requestedFrameId=e.requestedFrameId),e.frames.forEach(e=>{let s=t.frames.find(t=>e.windowId==t.windowId);s||(s={windowId:e.windowId},t.frames.push(s)),s.processed||(s.content=e.content,s.baseURI=e.baseURI,s.title=e.title,s.url=e.url,s.canvases=e.canvases,s.fonts=e.fonts,s.worklets=e.worklets,s.stylesheets=e.stylesheets,s.images=e.images,s.posters=e.posters,s.videos=e.videos,s.usedFonts=e.usedFonts,s.shadowRoots=e.shadowRoots,s.processed=e.processed,s.scrollPosition=e.scrollPosition,s.scrolling=e.scrolling,s.adoptedStyleSheets=e.adoptedStyleSheets)});t.frames.filter(e=>!e.processed).length||(t.frames=t.frames.sort((e,t)=>t.windowId.split(Fe).length-e.windowId.split(Fe).length),t.resolve&&(t.requestedFrameId&&t.frames.forEach(e=>{e.windowId==t.requestedFrameId&&(e.requestedFrame=!0)}),t.resolve(t.frames)))}}function Ze(e,t,s,o){const n=ot(e);!function(e,t,s,o,n){const i=[];let r;Be.get(n)?r=Be.get(n).requestTimeouts:(r={},Be.set(n,{requestTimeouts:r}));t.forEach((e,t)=>{const s=o+Fe+t;e.setAttribute(Le.WIN_ID_ATTRIBUTE_NAME,s),i.push({windowId:s})}),et({frames:i,sessionId:n,requestedFrameId:e.documentElement.dataset.requestedFrameId&&o}),t.forEach((e,t)=>{const i=o+Fe+t;try{tt(e.contentWindow,{method:Pe,windowId:i,sessionId:n,options:s,scrolling:e.scrolling})}catch(e){}r[i]=globalThis.setTimeout(()=>et({frames:[{windowId:i,processed:!0}],sessionId:n}),Ce)}),delete e.documentElement.dataset.requestedFrameId}(e,n,t,s,o),n.length&&function(e,t,s,o,n){const i=[];t.forEach((e,t)=>{const r=o+Fe+t;let a,l;try{a=e.contentDocument,l=e.contentWindow,l.stop()}catch(e){}const d=e.getAttribute(\"srcdoc\");if(!a&&d){a=(new We).parseFromString(d,\"text/html\"),l=globalThis}if(a)try{Je(\"requestTimeouts\",n,r),Ze(a,s,r,n),i.push(st(a,l,r,s,e.scrolling))}catch(e){i.push({windowId:r,processed:!0})}}),et({frames:i,sessionId:n,requestedFrameId:e.documentElement.dataset.requestedFrameId&&o}),delete e.documentElement.dataset.requestedFrameId}(e,n,t,s,o)}function Je(e,t,s){const o=Be.get(t);if(o&&o[e]){const t=o[e][s];t&&(globalThis.clearTimeout(t),delete o[e][s])}}function Xe(e,t){const s=Be.get(e);s&&s.responseTimeouts&&(s.responseTimeouts[t]=globalThis.setTimeout(()=>et({frames:[{windowId:t,processed:!0}],sessionId:e}),1e4))}function Qe(e,t,s){e.forEach((e,o)=>{const n=t+Fe+o;e.removeAttribute(Le.WIN_ID_ATTRIBUTE_NAME);try{tt(e.contentWindow,{method:ke,windowId:n,sessionId:s})}catch(e){}}),e.forEach((e,o)=>{const n=t+Fe+o;let i;try{i=e.contentDocument}catch(e){}if(i)try{Qe(ot(i),n,s)}catch(e){}})}function et(e){e.method=xe;try{De.singlefile.processors.frameTree.initResponse(e)}catch(t){tt(De,e,!0)}}function tt(e,t,s){if(e==De&&Ne&&Ne.runtime&&Ne.runtime.sendMessage)Ne.runtime.sendMessage(t);else if(s){const s=new Ue;e.postMessage(b+He.stringify({method:t.method,sessionId:t.sessionId}),\"*\",[s.port2]),s.port1.postMessage(t)}else e.postMessage(b+He.stringify(t),\"*\")}function st(e,t,s,o,n){const i=Le.preProcessDoc(e,t,o),r=Le.serialize(e);Le.postProcessDoc(e,i.markedElements,i.invalidElements);return{windowId:s,content:r,baseURI:e.baseURI.split(\"#\")[0],url:e.documentURI,title:e.title,canvases:i.canvases,fonts:i.fonts,worklets:i.worklets,stylesheets:i.stylesheets,images:i.images,posters:i.posters,videos:i.videos,usedFonts:i.usedFonts,shadowRoots:i.shadowRoots,scrollPosition:i.scrollPosition,scrolling:n,adoptedStyleSheets:i.adoptedStyleSheets,processed:!0}}function ot(e){let t=Array.from(e.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]'));return e.querySelectorAll(\"*\").forEach(e=>{const s=Le.getShadowRoot(e);s&&(t=t.concat(...ot(s)))}),t}Be||(Be=globalThis.sessions=new Map),qe&&(ze=\"0\",Ne&&Ne.runtime&&Ne.runtime.onMessage&&Ne.runtime.onMessage.addListener&&Ne.runtime.onMessage.addListener(e=>e.method==xe?(Ke(e),Promise.resolve({})):e.method==_e?(Je(\"requestTimeouts\",e.sessionId,e.windowId),Xe(e.sessionId,e.windowId),Promise.resolve({})):void 0)),je(),function e(){J(I,({detail:e})=>globalThis[p]=async(t,s)=>{const o=Object.assign({},s);let n;delete o.win,delete o.doc,delete o.onprogress,delete o.frames,delete o.taskId,delete o._migratedTemplateFormat,delete o.woleetKey;try{n=\"jsonDetail\"==e?X.stringify({options:o}):{options:o}}catch(e){}const i=new Q(t+\"-request\",{cancelable:!0,detail:n});let r;const a=new Promise(e=>{r=e,J(t+\"-response\",t=>{if(t.detail)try{const e=\"string\"==typeof t.detail?X.parse(t.detail):t.detail;e.options&&Object.assign(s,e.options)}catch(e){}e()})});(e=>{try{globalThis.dispatchEvent(e)}catch(e){}})(i),i.defaultPrevented?await a:r()}),new ee(e).observe(globalThis.document,{childList:!0})}(),new Ve(je).observe(Oe,{childList:!0}),e.TIMEOUT_INIT_REQUEST_MESSAGE=Ce,e.cleanup=function(e){Be.delete(e),$e({windowId:ze,sessionId:e})},e.getAsync=function(e){const t=Ye();return e=He.parse(He.stringify(e)),new Promise(s=>{Be.set(t,{frames:[],requestTimeouts:{},responseTimeouts:{},resolve:e=>{e.sessionId=t,s(e)}}),Ge({windowId:ze,sessionId:t,options:e})})},e.getSync=function(e){const t=Ye();e=He.parse(He.stringify(e)),Be.set(t,{frames:[],requestTimeouts:{},responseTimeouts:{}}),function(e){const t=e.sessionId;delete globalThis._singleFile_cleaningUp,qe||(ze=globalThis.frameId=e.windowId);Ze(Oe,e.options,ze,t),qe||(et({frames:[st(Oe,globalThis,ze,e.options,e.scrolling)],sessionId:t,requestedFrameId:Oe.documentElement.dataset.requestedFrameId&&ze}),delete Oe.documentElement.dataset.requestedFrameId)}({windowId:ze,sessionId:t,options:e});const s=Be.get(t).frames;return s.sessionId=t,s},e.initResponse=Ke});\n!function(){\"use strict\";const r=window.fetch.bind(window);let e=new Map;browser.runtime.onMessage.addListener(a=>\"singlefile.fetchFrame\"==a.method&&window.frameId&&window.frameId==a.frameId?async function(e){try{const a=await r(e.url,{cache:\"force-cache\",headers:e.headers,referrerPolicy:\"strict-origin-when-cross-origin\"});return{status:a.status,headers:[...a.headers],array:Array.from(new Uint8Array(await a.arrayBuffer()))}}catch(r){return{error:r&&(r.message||r.toString())}}}(a):\"singlefile.fetchResponse\"==a.method?async function(r){const a=e.get(r.requestId);a&&(r.error?(a.reject(new Error(r.error)),e.delete(r.requestId)):(r.truncated&&(a.array?a.array=a.array.concat(r.array):(a.array=r.array,e.set(r.requestId,a)),r.finished&&(r.array=a.array)),r.truncated&&!r.finished||(a.resolve({status:r.status,headers:{get:e=>r.headers&&r.headers[e]},arrayBuffer:async()=>new Uint8Array(r.array).buffer}),e.delete(r.requestId))));return{}}(a):void 0)}();\n"
  },
  {
    "path": "lib/single-file-frames.js",
    "content": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).singlefile={})}(this,function(e){\"use strict\";const t=\"single-file-load-image\",s=\"single-file-image-loaded\",o=\"_singleFile_fontFaces\",n=\"_singleFile_worklets\",i=globalThis.CustomEvent,r=globalThis.document,a=globalThis.Document,l=globalThis.JSON,d=globalThis.MutationObserver;let c,u;function m(){r instanceof a&&(r.addEventListener(\"single-file-new-font-face\",e=>{const t=e.detail,s=Object.assign({},t);delete s.src,c.set(l.stringify(s),t)}),r.addEventListener(\"single-file-delete-font\",e=>{const t=e.detail,s=Object.assign({},t);delete s.src,c.delete(l.stringify(s))}),r.addEventListener(\"single-file-clear-fonts\",()=>c=new Map),r.addEventListener(\"single-file-new-worklet\",e=>{const t=e.detail;u.set(t.moduleURL,t)}))}c=globalThis.window[o]?globalThis.window[o]:globalThis.window[o]=new Map,u=globalThis.window[n]?globalThis.window[n]:globalThis.window[n]=new Map,m(),new d(m).observe(r,{childList:!0});const h=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",g=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+h+\"?|(\"+h+\")|.)\",\"ig\");const f=\"single-file-\",p=\"_singleFile_waitForUserScript\",b=\"__frameTree__::\",y=f+\"on-before-capture\",E=f+\"on-after-capture\",T=f+\"request-get-adopted-stylesheets\",w=f+\"response-get-adopted-stylesheets\",v=f+\"unregister-request-get-adopted-stylesheets\",I=f+\"user-script-init\",A=\"data-\"+f+\"removed-content\",S=\"data-\"+f+\"hidden-content\",R=\"data-\"+f+\"kept-content\",M=\"data-\"+f+\"hidden-frame\",L=\"data-\"+f+\"preserved-space-element\",P=\"data-\"+f+\"shadow-root-element\",_=\"data-\"+f+\"win-id\",k=\"data-\"+f+\"image\",x=\"data-\"+f+\"poster\",C=\"data-\"+f+\"video\",F=\"data-\"+f+\"canvas\",q=\"data-\"+f+\"movable-style\",N=\"data-\"+f+\"input-value\",D=\"data-\"+f+\"input-checked\",U=\"data-\"+f+\"lazy-loaded-src\",O=\"data-\"+f+\"stylesheet\",H=\"data-\"+f+\"disabled-noscript\",V=\"data-\"+f+\"async-script\",W=\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\",z=[\"NOSCRIPT\",\"DISABLED-NOSCRIPT\",\"META\",\"LINK\",\"STYLE\",\"TITLE\",\"TEMPLATE\",\"SOURCE\",\"OBJECT\",\"SCRIPT\",\"HEAD\",\"BODY\"],B=[\"SCRIPT\",\"NOSCRIPT\",\"META\",\"LINK\",\"TEMPLATE\"],j=/^'(.*?)'$/,Y=/^\"(.*?)\"$/,G={regular:\"400\",normal:\"400\",bold:\"700\",bolder:\"700\",lighter:\"100\"},$=\"single-file-ui-element\",K=\"data:,\",Z=\"data-sf-nesting-track-id\",J=(e,t,s)=>globalThis.addEventListener(e,t,s),X=globalThis.JSON,Q=globalThis.CustomEvent,ee=globalThis.MutationObserver,te=globalThis.URL,se=globalThis.DOMParser;function oe(e,t,s,o,n={usedFonts:new Map,canvases:[],images:[],posters:[],videos:[],shadowRoots:[],markedElements:[]},i=new Map,r){if(s.childNodes){Array.from(s.childNodes).filter(t=>t instanceof e.HTMLElement||t instanceof e.SVGElement||t instanceof globalThis.HTMLElement||t instanceof globalThis.SVGElement).forEach(s=>{let a,l,d;if(!o.autoSaveExternalSave&&(o.removeHiddenElements||o.removeUnusedFonts||o.compressHTML)&&(d=me(e,s),(s instanceof e.HTMLElement||s instanceof globalThis.HTMLElement)&&o.removeHiddenElements&&(l=(r||s.closest(\"html > head\"))&&z.includes(s.tagName.toUpperCase())||s.closest(\"details\"),l||(a=r||le(s,d),a&&!B.includes(s.tagName.toUpperCase())&&(s.setAttribute(S,\"\"),n.markedElements.push(s)))),!a)){if(o.compressHTML&&d){const e=d.getPropertyValue(\"white-space\");e&&e.startsWith(\"pre\")&&(s.setAttribute(L,\"\"),n.markedElements.push(s))}o.removeUnusedFonts&&(ie(d,o,n.usedFonts),ie(me(e,s,\":first-letter\"),o,n.usedFonts),ie(me(e,s,\":before\"),o,n.usedFonts),ie(me(e,s,\":after\"),o,n.usedFonts))}!function(e,t,s,o,n,i,r){const a=s.tagName&&s.tagName.toUpperCase();if(\"CANVAS\"==a)try{n.canvases.push({dataURI:s.toDataURL(\"image/png\"),backgroundColor:r.getPropertyValue(\"background-color\")}),s.setAttribute(F,n.canvases.length-1),n.markedElements.push(s)}catch(e){}if(\"IMG\"==a){const t={currentSrc:i?K:o.loadDeferredImages&&s.getAttribute(U)||s.currentSrc};if(n.images.push(t),s.setAttribute(k,n.images.length-1),n.markedElements.push(s),s.removeAttribute(U),r=r||me(e,s)){t.size=function(e,t,s){let o=t.naturalWidth,n=t.naturalHeight;if(!o&&!n){const i=null==t.getAttribute(\"style\");if(s=s||me(e,t)){let e,r,a,l,d,c,u,m,h=!1;if(\"content-box\"==s.getPropertyValue(\"box-sizing\")){const e=t.style.getPropertyValue(\"box-sizing\"),s=t.style.getPropertyPriority(\"box-sizing\"),o=t.clientWidth;t.style.setProperty(\"box-sizing\",\"border-box\",\"important\"),h=t.clientWidth!=o,e?t.style.setProperty(\"box-sizing\",e,s):t.style.removeProperty(\"box-sizing\")}e=ce(\"padding-left\",s),r=ce(\"padding-right\",s),a=ce(\"padding-top\",s),l=ce(\"padding-bottom\",s),h?(d=ce(\"border-left-width\",s),c=ce(\"border-right-width\",s),u=ce(\"border-top-width\",s),m=ce(\"border-bottom-width\",s)):d=c=u=m=0,o=Math.max(0,t.clientWidth-e-r-d-c),n=Math.max(0,t.clientHeight-a-l-u-m),i&&t.removeAttribute(\"style\")}}return{pxWidth:o,pxHeight:n}}(e,s,r);const o=r.getPropertyValue(\"box-shadow\"),n=r.getPropertyValue(\"background-image\");o&&\"none\"!=o||n&&\"none\"!=n||!(t.size.pxWidth>1||t.size.pxHeight>1)||(t.replaceable=!0,t.backgroundColor=r.getPropertyValue(\"background-color\"),t.objectFit=r.getPropertyValue(\"object-fit\"),t.boxSizing=r.getPropertyValue(\"box-sizing\"),t.objectPosition=r.getPropertyValue(\"object-position\"))}}if(\"VIDEO\"==a){const o=s.currentSrc;if(o&&!o.startsWith(\"blob:\")&&!o.startsWith(\"data:\")){const t=me(e,s.parentNode);n.videos.push({positionParent:t&&t.getPropertyValue(\"position\"),src:o,size:{pxWidth:s.clientWidth,pxHeight:s.clientHeight,videoWidth:s.videoWidth,videoHeight:s.videoHeight},currentTime:s.currentTime}),s.setAttribute(C,n.videos.length-1)}if(!s.getAttribute(\"poster\")){const e=t.createElement(\"canvas\"),o=e.getContext(\"2d\");e.width=s.videoWidth,e.height=s.videoHeight;try{o.drawImage(s,0,0,e.width,e.height),n.posters.push(e.toDataURL(\"image/png\")),s.setAttribute(x,n.posters.length-1),n.markedElements.push(s)}catch(e){}}}\"IFRAME\"==a&&i&&o.removeHiddenElements&&(s.setAttribute(M,\"\"),n.markedElements.push(s));\"INPUT\"==a&&(\"password\"!=s.type&&(s.setAttribute(N,s.value),n.markedElements.push(s)),\"radio\"!=s.type&&\"checkbox\"!=s.type||(s.setAttribute(D,s.checked),n.markedElements.push(s)));\"TEXTAREA\"==a&&(s.setAttribute(N,s.value),n.markedElements.push(s));\"SELECT\"==a&&s.querySelectorAll(\"option\").forEach(e=>{e.selected&&(e.setAttribute(N,\"\"),n.markedElements.push(e))});\"SCRIPT\"==a&&(s.async&&\"\"!=s.getAttribute(\"async\")&&\"async\"!=s.getAttribute(\"async\")&&(s.setAttribute(V,\"\"),n.markedElements.push(s)),s.textContent=s.textContent.replace(/<\\/script>/gi,\"<\\\\/script>\"))}(e,t,s,o,n,a,d);const c=!(s instanceof e.SVGElement||s instanceof globalThis.SVGElement)&&re(s);if(c&&!s.classList.contains($)&&\"single-file-infobar\"!=s.tagName.toLowerCase()){const r={};s.setAttribute(P,n.shadowRoots.length),n.markedElements.push(s),n.shadowRoots.push(r);try{if(c.adoptedStyleSheets){const e=e=>r.adoptedStyleSheets=e.detail.adoptedStyleSheets;c.addEventListener(w,e),c.dispatchEvent(new Q(T,{bubbles:!0})),r.adoptedStyleSheets||s.dispatchEvent(new Q(T,{bubbles:!0})),c.removeEventListener(w,e)}}catch(e){}oe(e,t,c,o,n,i,a),r.content=c.innerHTML,r.mode=c.mode,r.delegateFocus=c.delegatesFocus,r.clonable=c.clonable,r.serializable=c.serializable;try{c.adoptedStyleSheets&&void 0===c.adoptedStyleSheets.length&&c.dispatchEvent(new Q(v,{bubbles:!0}))}catch(e){}}oe(e,t,s,o,n,i,a),!o.autoSaveExternalSave&&o.removeHiddenElements&&r&&(l||\"\"==s.getAttribute(R)?s.parentElement&&(s.parentElement.setAttribute(R,\"\"),n.markedElements.push(s.parentElement)):a&&(s.setAttribute(A,\"\"),n.markedElements.push(s)))})}return n}function ne(e,t=new Map){if(e){const s=[];for(const o of Array.from(e))if(t.has(o))s.push(t.get(o));else{let e=\"\";if(o&&o.cssRules)for(const t of o.cssRules)e+=t.cssText+\"\\n\";t.set(o,e),s.push(e)}return s}return[]}function ie(e,t,s){if(e){const o=e.getPropertyValue(\"font-style\")||\"normal\";e.getPropertyValue(\"font-family\").split(\",\").forEach(n=>{if(n=ae(n),!t.loadedFonts||t.loadedFonts.find(e=>ae(e.family)==n&&e.style==o)){const t=(i=e.getPropertyValue(\"font-weight\"),G[i.toLowerCase().trim()]||i),r=e.getPropertyValue(\"font-variant\")||\"normal\",a=[n,t,o,r];s.set(X.stringify(a),[n,t,o,r])}var i})}}function re(e){const t=globalThis.chrome;if(e.openOrClosedShadowRoot)return e.openOrClosedShadowRoot;if(!(t&&t.dom&&t.dom.openOrClosedShadowRoot))return e.shadowRoot;try{return t.dom.openOrClosedShadowRoot(e)}catch(t){return e.shadowRoot}}function ae(e=\"\"){return function(e){e=e.match(j)?e.replace(j,\"$1\"):e.replace(Y,\"$1\");return e.trim()}((t=e.trim(),t.replace(g,(e,t,s)=>{const o=\"0x\"+t-65536;return o!=o||s?t:o<0?String.fromCharCode(o+65536):String.fromCharCode(o>>10|55296,1023&o|56320)}))).toLowerCase();var t}function le(e,t){let s=!1;if(t){const o=t.getPropertyValue(\"display\"),n=t.getPropertyValue(\"opacity\"),i=t.getPropertyValue(\"visibility\");if(s=\"none\"==o,!s&&(\"0\"==n||\"hidden\"==i)&&e.getBoundingClientRect){const t=e.getBoundingClientRect();s=!t.width&&!t.height}}return Boolean(s)}function de(e){if(e){const t=[];return e.querySelectorAll(\"style\").forEach((s,o)=>{try{if(!s.sheet.disabled){const n=e.createElement(\"style\");n.textContent=s.textContent,e.body.appendChild(n);const i=n.sheet;n.remove();const r=Array.from(i.cssRules).map(e=>e.cssText).join(\"\\n\"),a=Array.from(s.sheet.cssRules).map(e=>e.cssText).join(\"\\n\");i&&r==a||(s.setAttribute(O,o),t[o]=Array.from(s.sheet.cssRules).map(e=>e.cssText).join(\"\\n\"))}}catch(e){}}),t}}function ce(e,t){if(t.getPropertyValue(e).endsWith(\"px\"))return parseFloat(t.getPropertyValue(e))}function ue(e){const t=e.doctype;let s=\"\";return t&&(s=\"<!DOCTYPE \"+t.nodeName,t.publicId?(s+=' PUBLIC \"'+t.publicId+'\"',t.systemId&&(s+=' \"'+t.systemId+'\"')):t.systemId&&(s+=' SYSTEM \"'+t.systemId+'\"'),t.internalSubset&&(s+=\" [\"+t.internalSubset+\"]\"),s+=\"> \"),s+e.documentElement.outerHTML}function me(e,t,s){try{return e.getComputedStyle(t,s)}catch(e){}}const he={LAZY_SRC_ATTRIBUTE_NAME:U,SINGLE_FILE_UI_ELEMENT_CLASS:$},ge=\"attributes\",fe=globalThis.browser,pe=globalThis.document,be=globalThis.MutationObserver,ye=new Map;let Ee;async function Te(e){if(pe.documentElement){ye.clear();const o=pe.body?Math.max(pe.body.scrollHeight,pe.documentElement.scrollHeight):pe.documentElement.scrollHeight,n=pe.body?Math.max(pe.body.scrollWidth,pe.documentElement.scrollWidth):pe.documentElement.scrollWidth;if(o>globalThis.innerHeight||n>globalThis.innerWidth){const a=Math.max(o-1.5*globalThis.innerHeight,0),l=Math.max(n-1.5*globalThis.innerWidth,0);if(globalThis.scrollY<a||globalThis.scrollX<l)return function(e){return Ee=0,new Promise(async o=>{let n;const a=new Set,l=new be(async t=>{if((t=t.filter(e=>e.type==ge)).length){t.filter(e=>{if(\"src\"==e.attributeName&&(e.target.setAttribute(he.LAZY_SRC_ATTRIBUTE_NAME,e.target.src),e.target.addEventListener(\"load\",c)),\"src\"==e.attributeName||\"srcset\"==e.attributeName||e.target.tagName&&\"SOURCE\"==e.target.tagName.toUpperCase())return!e.target.classList||!e.target.classList.contains(he.SINGLE_FILE_UI_ELEMENT_CLASS)}).length&&(n=!0,await ve(l,e,h),a.size||await we(l,e,h))}});async function d(t){await Ae(\"idleTimeout\",async()=>{n?Ee<10&&(Ee++,Re(\"idleTimeout\"),await d(Math.max(500,t/2))):(Re(\"loadTimeout\"),Re(\"maxTimeout\"),Ie(l,e,h))},t,e.loadDeferredImagesNativeTimeout)}function c(e){const t=e.target;t.removeAttribute(he.LAZY_SRC_ATTRIBUTE_NAME),t.removeEventListener(\"load\",c)}async function u(t){n=!0,await ve(l,e,h),await we(l,e,h),t.detail&&a.add(t.detail)}async function m(t){await ve(l,e,h),await we(l,e,h),a.delete(t.detail),a.size||await we(l,e,h)}function h(e){l.disconnect(),pe.removeEventListener(t,u),pe.removeEventListener(s,m),o(e)}await d(2*e.loadDeferredImagesMaxIdleTime),await ve(l,e,h),l.observe(pe,{subtree:!0,childList:!0,attributes:!0}),pe.addEventListener(t,u),pe.addEventListener(s,m),function(e){e.loadDeferredImagesBlockCookies&&r.dispatchEvent(new i(\"single-file-block-cookies-start\")),e.loadDeferredImagesBlockStorage&&r.dispatchEvent(new i(\"single-file-block-storage-start\")),e.loadDeferredImagesDispatchScrollEvent&&r.dispatchEvent(new i(\"single-file-dispatch-scroll-event-start\")),e.loadDeferredImagesKeepZoomLevel?r.dispatchEvent(new i(\"single-file-load-deferred-images-keep-zoom-level-start\")):r.dispatchEvent(new i(\"single-file-load-deferred-images-start\"))}(e)})}(e)}}}async function we(e,t,s){await Ae(\"loadTimeout\",()=>Ie(e,t,s),t.loadDeferredImagesMaxIdleTime,t.loadDeferredImagesNativeTimeout)}async function ve(e,t,s){await Ae(\"maxTimeout\",async()=>{await Re(\"loadTimeout\"),await Ie(e,t,s)},10*t.loadDeferredImagesMaxIdleTime,t.loadDeferredImagesNativeTimeout)}async function Ie(e,t,s){await Re(\"idleTimeout\"),function(e){e.loadDeferredImagesBlockCookies&&r.dispatchEvent(new i(\"single-file-block-cookies-end\")),e.loadDeferredImagesBlockStorage&&r.dispatchEvent(new i(\"single-file-block-storage-end\")),e.loadDeferredImagesDispatchScrollEvent&&r.dispatchEvent(new i(\"single-file-dispatch-scroll-event-end\")),e.loadDeferredImagesKeepZoomLevel?r.dispatchEvent(new i(\"single-file-load-deferred-images-keep-zoom-level-end\")):r.dispatchEvent(new i(\"single-file-load-deferred-images-end\"))}(t),await Ae(\"endTimeout\",async()=>{await Re(\"maxTimeout\"),s()},t.loadDeferredImagesMaxIdleTime/2,t.loadDeferredImagesNativeTimeout),e.disconnect()}async function Ae(e,t,s,o){if(fe&&fe.runtime&&fe.runtime.sendMessage&&!o){if(!ye.get(e)||!ye.get(e).pending){const o={callback:t,pending:!0};ye.set(e,o);try{await fe.runtime.sendMessage({method:\"singlefile.lazyTimeout.setTimeout\",type:e,delay:s})}catch(o){Se(e,t,s)}o.pending=!1}}else Se(e,t,s)}function Se(e,t,s){const o=ye.get(e);o&&globalThis.clearTimeout(o),ye.set(e,t),globalThis.setTimeout(t,s)}async function Re(e){if(fe&&fe.runtime&&fe.runtime.sendMessage)try{await fe.runtime.sendMessage({method:\"singlefile.lazyTimeout.clearTimeout\",type:e})}catch(t){Me(e)}else Me(e)}function Me(e){const t=ye.get(e);ye.delete(e),t&&globalThis.clearTimeout(t)}fe&&fe.runtime&&fe.runtime.onMessage&&fe.runtime.onMessage.addListener&&fe.runtime.onMessage.addListener(e=>{if(\"singlefile.lazyTimeout.onTimeout\"==e.method){const t=ye.get(e.type);if(t){ye.delete(e.type);try{t.callback()}catch(t){Me(e.type)}}}});const Le={ON_BEFORE_CAPTURE_EVENT_NAME:y,ON_AFTER_CAPTURE_EVENT_NAME:E,WIN_ID_ATTRIBUTE_NAME:_,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:p,preProcessDoc:function(e,t,s){e.querySelectorAll(\"noscript:not([\"+H+\"])\").forEach(e=>{e.setAttribute(H,e.textContent),e.textContent=\"\"}),function(e){e.querySelectorAll(\"meta[http-equiv=refresh]\").forEach(e=>{e.removeAttribute(\"http-equiv\"),e.setAttribute(\"disabled-http-equiv\",\"refresh\")})}(e),e.head&&e.head.querySelectorAll(W).forEach(e=>e.hidden=!0),e.querySelectorAll(\"svg foreignObject\").forEach(e=>{const t=e.querySelectorAll(\"html > head > \"+W+\", html > body > \"+W);t.length&&(Array.from(e.childNodes).forEach(e=>e.remove()),t.forEach(t=>e.appendChild(t)))});const o=new Map;let n;t&&e.documentElement?(!function(e){i(e.body);const t=function(e,t){const s=(new se).parseFromString(e,\"text/html\");s.head||s.documentElement.insertBefore(s.createElement(\"HEAD\"),s.body);let o=s.querySelector(\"base\");o&&o.getAttribute(\"href\")||(o&&o.remove(),o=s.createElement(\"base\"),o.setAttribute(\"href\",t),s.head.insertBefore(o,s.head.firstChild));return s}(ue(e)),s=r(e.body),o=r(t.body),n=new Set;function i(e,t=0,s=\"\"){const o=s?`${s}.${t+1}`:`${t+1}`;e.setAttribute(Z,o),Array.from(e.children).forEach((e,t)=>i(e,t,o))}function r(e){const t={};return s(e),t;function s(e){if(e.getAttribute){const o=e.getAttribute(Z);o&&(t[o]=e),Array.from(e.children).forEach(s)}}}function a(e,t){const s=e.getAttribute(Z);s&&!t.has(s)&&e.removeAttribute(Z),Array.from(e.children).forEach(e=>a(e,t))}Object.keys(s).forEach(t=>{if(t in o){if((s[t].parentElement?.getAttribute(Z)||null)!==(o[t]?.parentElement?.getAttribute(Z)||null)){let o=s[t];for(;o&&o!==e.body;){const e=o.getAttribute(Z);e&&n.add(e),o=o.parentElement}}}}),a(e.body,n)}(e),n=oe(t,e,e.documentElement,s),s.moveStylesInHead&&e.querySelectorAll(\"body style, body ~ style\").forEach(e=>{const s=me(t,e);s&&le(e,s)&&(e.setAttribute(q,\"\"),n.markedElements.push(e))})):n={canvases:[],images:[],posters:[],videos:[],usedFonts:[],shadowRoots:[],markedElements:[]};let i=\"\";if(e.referrer)try{i=new te(\"/\",new te(e.referrer).origin).href}catch(e){}return{canvases:n.canvases,fonts:Array.from(c.values()),worklets:Array.from(u.values()),stylesheets:de(e),images:n.images,posters:n.posters,videos:n.videos,usedFonts:Array.from(n.usedFonts.values()),shadowRoots:n.shadowRoots,referrer:i,markedElements:n.markedElements,invalidElements:o,scrollPosition:{x:t.scrollX,y:t.scrollY},adoptedStyleSheets:ne(e.adoptedStyleSheets)}},serialize:ue,postProcessDoc:function(e,t,s){if(e.querySelectorAll(\"[\"+H+\"]\").forEach(e=>{e.textContent=e.getAttribute(H),e.removeAttribute(H)}),e.querySelectorAll(\"meta[disabled-http-equiv]\").forEach(e=>{e.setAttribute(\"http-equiv\",e.getAttribute(\"disabled-http-equiv\")),e.removeAttribute(\"disabled-http-equiv\")}),e.head&&e.head.querySelectorAll(\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\").forEach(e=>e.removeAttribute(\"hidden\")),!t){const s=[A,M,S,L,k,x,C,F,N,D,P,O,V];t=e.querySelectorAll(s.map(e=>\"[\"+e+\"]\").join(\",\"))}t.forEach(e=>{e.removeAttribute(A),e.removeAttribute(S),e.removeAttribute(R),e.removeAttribute(M),e.removeAttribute(L),e.removeAttribute(k),e.removeAttribute(x),e.removeAttribute(C),e.removeAttribute(F),e.removeAttribute(N),e.removeAttribute(D),e.removeAttribute(P),e.removeAttribute(O),e.removeAttribute(V),e.removeAttribute(q)}),s&&s.forEach((e,t)=>e.replaceWith(t))},getShadowRoot:re},Pe=\"singlefile.frameTree.initRequest\",_e=\"singlefile.frameTree.ackInitRequest\",ke=\"singlefile.frameTree.cleanupRequest\",xe=\"singlefile.frameTree.initResponse\",Ce=5e3,Fe=\".\",qe=globalThis.window==globalThis.top,Ne=globalThis.browser,De=globalThis.top,Ue=globalThis.MessageChannel,Oe=globalThis.document,He=globalThis.JSON,Ve=globalThis.MutationObserver,We=globalThis.DOMParser;let ze,Be=globalThis.sessions;function je(){globalThis.addEventListener(\"message\",async e=>{if(\"string\"==typeof e.data&&e.data.startsWith(b)){e.preventDefault(),e.stopPropagation();const t=He.parse(e.data.substring(15));if(t.method==Pe)e.source&&tt(e.source,{method:_e,windowId:t.windowId,sessionId:t.sessionId}),qe||(globalThis.stop(),t.options.loadDeferredImages&&Te(t.options),await Ge(t));else if(t.method==_e)Je(\"requestTimeouts\",t.sessionId,t.windowId),Xe(t.sessionId,t.windowId);else if(t.method==ke)$e(t);else if(t.method==xe&&Be.get(t.sessionId)){e.ports[0].onmessage=e=>Ke(e.data)}}},!0)}function Ye(){return globalThis.crypto.getRandomValues(new Uint32Array(32)).join(\"\")}async function Ge(e){const t=e.sessionId;delete globalThis._singleFile_cleaningUp,qe||(ze=globalThis.frameId=e.windowId),Ze(Oe,e.options,ze,t),qe||(et({frames:[st(Oe,globalThis,ze,e.options,e.scrolling)],sessionId:t,requestedFrameId:Oe.documentElement.dataset.requestedFrameId&&ze}),delete Oe.documentElement.dataset.requestedFrameId)}function $e(e){if(!globalThis._singleFile_cleaningUp){globalThis._singleFile_cleaningUp=!0;const t=e.sessionId;Qe(ot(Oe),e.windowId,t)}}function Ke(e){e.frames.forEach(t=>Je(\"responseTimeouts\",e.sessionId,t.windowId));const t=Be.get(e.sessionId);if(t){e.requestedFrameId&&(t.requestedFrameId=e.requestedFrameId),e.frames.forEach(e=>{let s=t.frames.find(t=>e.windowId==t.windowId);s||(s={windowId:e.windowId},t.frames.push(s)),s.processed||(s.content=e.content,s.baseURI=e.baseURI,s.title=e.title,s.url=e.url,s.canvases=e.canvases,s.fonts=e.fonts,s.worklets=e.worklets,s.stylesheets=e.stylesheets,s.images=e.images,s.posters=e.posters,s.videos=e.videos,s.usedFonts=e.usedFonts,s.shadowRoots=e.shadowRoots,s.processed=e.processed,s.scrollPosition=e.scrollPosition,s.scrolling=e.scrolling,s.adoptedStyleSheets=e.adoptedStyleSheets)});t.frames.filter(e=>!e.processed).length||(t.frames=t.frames.sort((e,t)=>t.windowId.split(Fe).length-e.windowId.split(Fe).length),t.resolve&&(t.requestedFrameId&&t.frames.forEach(e=>{e.windowId==t.requestedFrameId&&(e.requestedFrame=!0)}),t.resolve(t.frames)))}}function Ze(e,t,s,o){const n=ot(e);!function(e,t,s,o,n){const i=[];let r;Be.get(n)?r=Be.get(n).requestTimeouts:(r={},Be.set(n,{requestTimeouts:r}));t.forEach((e,t)=>{const s=o+Fe+t;e.setAttribute(Le.WIN_ID_ATTRIBUTE_NAME,s),i.push({windowId:s})}),et({frames:i,sessionId:n,requestedFrameId:e.documentElement.dataset.requestedFrameId&&o}),t.forEach((e,t)=>{const i=o+Fe+t;try{tt(e.contentWindow,{method:Pe,windowId:i,sessionId:n,options:s,scrolling:e.scrolling})}catch(e){}r[i]=globalThis.setTimeout(()=>et({frames:[{windowId:i,processed:!0}],sessionId:n}),Ce)}),delete e.documentElement.dataset.requestedFrameId}(e,n,t,s,o),n.length&&function(e,t,s,o,n){const i=[];t.forEach((e,t)=>{const r=o+Fe+t;let a,l;try{a=e.contentDocument,l=e.contentWindow,l.stop()}catch(e){}const d=e.getAttribute(\"srcdoc\");if(!a&&d){a=(new We).parseFromString(d,\"text/html\"),l=globalThis}if(a)try{Je(\"requestTimeouts\",n,r),Ze(a,s,r,n),i.push(st(a,l,r,s,e.scrolling))}catch(e){i.push({windowId:r,processed:!0})}}),et({frames:i,sessionId:n,requestedFrameId:e.documentElement.dataset.requestedFrameId&&o}),delete e.documentElement.dataset.requestedFrameId}(e,n,t,s,o)}function Je(e,t,s){const o=Be.get(t);if(o&&o[e]){const t=o[e][s];t&&(globalThis.clearTimeout(t),delete o[e][s])}}function Xe(e,t){const s=Be.get(e);s&&s.responseTimeouts&&(s.responseTimeouts[t]=globalThis.setTimeout(()=>et({frames:[{windowId:t,processed:!0}],sessionId:e}),1e4))}function Qe(e,t,s){e.forEach((e,o)=>{const n=t+Fe+o;e.removeAttribute(Le.WIN_ID_ATTRIBUTE_NAME);try{tt(e.contentWindow,{method:ke,windowId:n,sessionId:s})}catch(e){}}),e.forEach((e,o)=>{const n=t+Fe+o;let i;try{i=e.contentDocument}catch(e){}if(i)try{Qe(ot(i),n,s)}catch(e){}})}function et(e){e.method=xe;try{De.singlefile.processors.frameTree.initResponse(e)}catch(t){tt(De,e,!0)}}function tt(e,t,s){if(e==De&&Ne&&Ne.runtime&&Ne.runtime.sendMessage)Ne.runtime.sendMessage(t);else if(s){const s=new Ue;e.postMessage(b+He.stringify({method:t.method,sessionId:t.sessionId}),\"*\",[s.port2]),s.port1.postMessage(t)}else e.postMessage(b+He.stringify(t),\"*\")}function st(e,t,s,o,n){const i=Le.preProcessDoc(e,t,o),r=Le.serialize(e);Le.postProcessDoc(e,i.markedElements,i.invalidElements);return{windowId:s,content:r,baseURI:e.baseURI.split(\"#\")[0],url:e.documentURI,title:e.title,canvases:i.canvases,fonts:i.fonts,worklets:i.worklets,stylesheets:i.stylesheets,images:i.images,posters:i.posters,videos:i.videos,usedFonts:i.usedFonts,shadowRoots:i.shadowRoots,scrollPosition:i.scrollPosition,scrolling:n,adoptedStyleSheets:i.adoptedStyleSheets,processed:!0}}function ot(e){let t=Array.from(e.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]'));return e.querySelectorAll(\"*\").forEach(e=>{const s=Le.getShadowRoot(e);s&&(t=t.concat(...ot(s)))}),t}Be||(Be=globalThis.sessions=new Map),qe&&(ze=\"0\",Ne&&Ne.runtime&&Ne.runtime.onMessage&&Ne.runtime.onMessage.addListener&&Ne.runtime.onMessage.addListener(e=>e.method==xe?(Ke(e),Promise.resolve({})):e.method==_e?(Je(\"requestTimeouts\",e.sessionId,e.windowId),Xe(e.sessionId,e.windowId),Promise.resolve({})):void 0)),je(),function e(){J(I,({detail:e})=>globalThis[p]=async(t,s)=>{const o=Object.assign({},s);let n;delete o.win,delete o.doc,delete o.onprogress,delete o.frames,delete o.taskId,delete o._migratedTemplateFormat,delete o.woleetKey;try{n=\"jsonDetail\"==e?X.stringify({options:o}):{options:o}}catch(e){}const i=new Q(t+\"-request\",{cancelable:!0,detail:n});let r;const a=new Promise(e=>{r=e,J(t+\"-response\",t=>{if(t.detail)try{const e=\"string\"==typeof t.detail?X.parse(t.detail):t.detail;e.options&&Object.assign(s,e.options)}catch(e){}e()})});(e=>{try{globalThis.dispatchEvent(e)}catch(e){}})(i),i.defaultPrevented?await a:r()}),new ee(e).observe(globalThis.document,{childList:!0})}(),new Ve(je).observe(Oe,{childList:!0}),e.TIMEOUT_INIT_REQUEST_MESSAGE=Ce,e.cleanup=function(e){Be.delete(e),$e({windowId:ze,sessionId:e})},e.getAsync=function(e){const t=Ye();return e=He.parse(He.stringify(e)),new Promise(s=>{Be.set(t,{frames:[],requestTimeouts:{},responseTimeouts:{},resolve:e=>{e.sessionId=t,s(e)}}),Ge({windowId:ze,sessionId:t,options:e})})},e.getSync=function(e){const t=Ye();e=He.parse(He.stringify(e)),Be.set(t,{frames:[],requestTimeouts:{},responseTimeouts:{}}),function(e){const t=e.sessionId;delete globalThis._singleFile_cleaningUp,qe||(ze=globalThis.frameId=e.windowId);Ze(Oe,e.options,ze,t),qe||(et({frames:[st(Oe,globalThis,ze,e.options,e.scrolling)],sessionId:t,requestedFrameId:Oe.documentElement.dataset.requestedFrameId&&ze}),delete Oe.documentElement.dataset.requestedFrameId)}({windowId:ze,sessionId:t,options:e});const s=Be.get(t).frames;return s.sessionId=t,s},e.initResponse=Ke});\n"
  },
  {
    "path": "lib/single-file-hooks-frames.js",
    "content": "!function(){\"use strict\";(e=>{const t=\"single-file-lazy-load\",n=\"single-file-load-image\",i=\"single-file-request-get-adopted-stylesheets\",r={family:\"font-family\",ascentOverride:\"ascent-override\",descentOverride:\"descent-override\",display:\"font-display\",featureSettings:\"font-feature-settings\",lineGapOverride:\"line-gap-override\",stretch:\"font-stretch\",style:\"font-style\",unicodeRange:\"unicode-range\",variationSettings:\"font-variation-settings\",weight:\"font-weight\"},o=e.fetch.bind(e),s=e.CustomEvent,l=e.document,a=e.screen,c=e.Element,d=e.UIEvent,g=e.Event,f=e.FileReader,p=e.Blob,u=e.JSON,m=e.MutationObserver,h=e.URL,_=e.CSSStyleSheet,y=new Map,v=new Map;let E,S=new WeakMap;function init(){l.addEventListener(\"single-file-load-deferred-images-start\",()=>loadDeferredImagesStart()),l.addEventListener(\"single-file-load-deferred-images-keep-zoom-level-start\",()=>loadDeferredImagesStart(!0)),l.addEventListener(\"single-file-load-deferred-images-end\",()=>loadDeferredImagesEnd()),l.addEventListener(\"single-file-load-deferred-images-keep-zoom-level-end\",()=>loadDeferredImagesEnd(!0)),l.addEventListener(\"single-file-load-deferred-images-reset\",resetScreenSize),l.addEventListener(\"single-file-load-deferred-images-keep-zoom-level-reset\",()=>{const e=l.documentElement.style.getPropertyValue(\"-sf-transform\"),t=l.documentElement.style.getPropertyPriority(\"-sf-transform\"),n=l.documentElement.style.getPropertyValue(\"-sf-transform-origin\"),i=l.documentElement.style.getPropertyPriority(\"-sf-transform-origin\"),r=l.documentElement.style.getPropertyValue(\"-sf-min-height\"),o=l.documentElement.style.getPropertyPriority(\"-sf-min-height\");l.documentElement.style.setProperty(\"transform\",e,t),l.documentElement.style.setProperty(\"transform-origin\",n,i),l.documentElement.style.setProperty(\"min-height\",r,o),l.documentElement.style.removeProperty(\"-sf-transform\"),l.documentElement.style.removeProperty(\"-sf-transform-origin\"),l.documentElement.style.removeProperty(\"-sf-min-height\"),resetScreenSize()}),l.addEventListener(\"single-file-dispatch-scroll-event-start\",()=>{E=!0}),l.addEventListener(\"single-file-dispatch-scroll-event-end\",()=>{E=!1}),l.addEventListener(\"single-file-block-cookies-start\",()=>{try{l.__defineGetter__(\"cookie\",()=>{throw new Error(\"document.cookie temporary blocked by SingleFile\")})}catch(e){}}),l.addEventListener(\"single-file-block-cookies-end\",()=>{delete l.cookie}),l.addEventListener(\"single-file-block-storage-start\",()=>{e._singleFile_localStorage||(e._singleFile_localStorage=e.localStorage,e.__defineGetter__(\"localStorage\",()=>{throw new Error(\"localStorage temporary blocked by SingleFile\")})),e._singleFile_indexedDB||(e._singleFile_indexedDB=e.indexedDB,e.__defineGetter__(\"indexedDB\",()=>{throw new Error(\"indexedDB temporary blocked by SingleFile\")}))}),l.addEventListener(\"single-file-block-storage-end\",()=>{e._singleFile_localStorage&&(delete e.localStorage,e.localStorage=e._singleFile_localStorage,delete e._singleFile_localStorage),e._singleFile_indexedDB||(delete e.indexedDB,e.indexedDB=e._singleFile_indexedDB,delete e._singleFile_indexedDB)}),l.addEventListener(\"single-file-request-fetch-supported\",()=>l.dispatchEvent(new s(\"single-file-response-fetch-supported\"))),l.addEventListener(\"single-file-request-fetch\",async e=>{const{url:t,options:n}=u.parse(e.detail);let i;try{const e=await o(t,n);i={url:t,response:await e.arrayBuffer(),headers:[...e.headers],status:e.status}}catch(e){i={url:t,error:e&&(e.message||e.toString())}}l.dispatchEvent(new s(\"single-file-response-fetch\",{detail:i}))}),l.addEventListener(i,getAdoptedStylesheetsListener),l.addEventListener(\"single-file-bootstrap\",t=>{try{e.bootstrap&&t.detail.data&&e.bootstrap(t.detail.data)}catch(e){}})}function loadDeferredImagesStart(i){const r=l.scrollingElement||l.documentElement,o=r.clientHeight,d=r.clientWidth,f=Math.max(r.scrollHeight-o,o),p=Math.max(r.scrollWidth-d,d);if(l.querySelectorAll(\"[loading=lazy]\").forEach(e=>{e.loading=\"eager\",e.setAttribute(t,\"\")}),r.__defineGetter__(\"clientHeight\",()=>f),r.__defineGetter__(\"clientWidth\",()=>p),a.__defineGetter__(\"height\",()=>f),a.__defineGetter__(\"width\",()=>p),e._singleFile_innerHeight=e.innerHeight,e._singleFile_innerWidth=e.innerWidth,e.__defineGetter__(\"innerHeight\",()=>f),e.__defineGetter__(\"innerWidth\",()=>p),i||e._singleFile_getBoundingClientRect||(e._singleFile_getBoundingClientRect=c.prototype.getBoundingClientRect,c.prototype.getBoundingClientRect=function(){const t=e._singleFile_getBoundingClientRect.call(this);return this==r&&(t.__defineGetter__(\"height\",()=>f),t.__defineGetter__(\"bottom\",()=>f+t.top),t.__defineGetter__(\"width\",()=>p),t.__defineGetter__(\"right\",()=>p+t.left)),t}),!e._singleFileImage){const t=e.Image;e._singleFileImage=e.Image,e.__defineGetter__(\"Image\",function(){return function(){const e=new t(...arguments),i=new t(...arguments);return i.__defineSetter__(\"src\",t=>{e.src=t,l.dispatchEvent(new s(n,{detail:e.src}))}),i.__defineGetter__(\"src\",()=>e.src),i.__defineSetter__(\"srcset\",t=>{l.dispatchEvent(new s(n)),e.srcset=t}),i.__defineGetter__(\"srcset\",()=>e.srcset),i.__defineGetter__(\"height\",()=>e.height),i.__defineGetter__(\"width\",()=>e.width),i.__defineGetter__(\"naturalHeight\",()=>e.naturalHeight),i.__defineGetter__(\"naturalWidth\",()=>e.naturalWidth),e.decode&&i.__defineGetter__(\"decode\",()=>()=>e.decode()),e.onload=e.onloadend=e.onerror=t=>{l.dispatchEvent(new s(\"single-file-image-loaded\",{detail:e.src})),i.dispatchEvent(new g(t.type,t))},i}})}let u,m;i?(u=o/f,m=d/p):(u=(o+e.scrollY)/f,m=(d+e.scrollX)/p);const h=Math.min(u,m);if(h<1){const e=l.documentElement.style.getPropertyValue(\"transform\"),t=l.documentElement.style.getPropertyPriority(\"transform\"),n=l.documentElement.style.getPropertyValue(\"transform-origin\"),r=l.documentElement.style.getPropertyPriority(\"transform-origin\"),o=l.documentElement.style.getPropertyValue(\"min-height\"),s=l.documentElement.style.getPropertyPriority(\"min-height\");l.documentElement.style.setProperty(\"transform-origin\",(u<1?\"50%\":\"0\")+\" \"+(m<1?\"50%\":\"0\")+\" 0\",\"important\"),l.documentElement.style.setProperty(\"transform\",\"scale3d(\"+h+\", \"+h+\", 1)\",\"important\"),l.documentElement.style.setProperty(\"min-height\",100/h+\"vh\",\"important\"),dispatchResizeEvent(),i?(l.documentElement.style.setProperty(\"-sf-transform\",e,t),l.documentElement.style.setProperty(\"-sf-transform-origin\",n,r),l.documentElement.style.setProperty(\"-sf-min-height\",o,s)):(l.documentElement.style.setProperty(\"transform\",e,t),l.documentElement.style.setProperty(\"transform-origin\",n,r),l.documentElement.style.setProperty(\"min-height\",o,s))}if(!i){dispatchResizeEvent();const t=r.getBoundingClientRect();e.window==e.window.top&&[...y].forEach(([e,n])=>{const i=n.options&&n.options.root&&n.options.root.getBoundingClientRect,r=i&&n.options.root.getBoundingClientRect(),o=v.get(e);if(o){const s=o.map(e=>{const n=e.getBoundingClientRect();return{target:e,intersectionRatio:1,boundingClientRect:n,intersectionRect:n,isIntersecting:!0,rootBounds:i?r:t,time:0}}).filter(e=>e.boundingClientRect.width&&e.boundingClientRect.height);s.length&&n.callback.call(e,s,e)}})}}function loadDeferredImagesEnd(n){l.querySelectorAll(\"[\"+t+\"]\").forEach(e=>{e.loading=\"lazy\",e.removeAttribute(t)}),n||e._singleFile_getBoundingClientRect&&(c.prototype.getBoundingClientRect=e._singleFile_getBoundingClientRect,delete e._singleFile_getBoundingClientRect),e._singleFileImage&&(delete e.Image,e.Image=e._singleFileImage,delete e._singleFileImage),n||dispatchResizeEvent()}function resetScreenSize(){const t=l.scrollingElement||l.documentElement;null!=e._singleFile_innerHeight&&(delete e.innerHeight,e.innerHeight=e._singleFile_innerHeight,delete e._singleFile_innerHeight),null!=e._singleFile_innerWidth&&(delete e.innerWidth,e.innerWidth=e._singleFile_innerWidth,delete e._singleFile_innerWidth),delete t.clientHeight,delete t.clientWidth,delete a.height,delete a.width}if(init(),new m(init).observe(l,{childList:!0}),e.CSS&&e.CSS.paintWorklet&&e.CSS.paintWorklet.addModule){const t=e.CSS.paintWorklet.addModule;e.CSS.paintWorklet.addModule=function(n,i){try{const r=t.apply(e.CSS.paintWorklet,arguments);return n=new h(n,l.baseURI).href,l.dispatchEvent(new s(\"single-file-new-worklet\",{detail:{moduleURL:n,options:i}})),r}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}}}if(e.FontFace){const t=e.FontFace;e.FontFace=function(e,n,...i){try{return new.target?(getDetailObject(e,n,...i).then(e=>l.dispatchEvent(new s(\"single-file-new-font-face\",{detail:e}))),new t(e,n,...i)):t()}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},e.FontFace.prototype=t.prototype,e.FontFace.toString=function(){return\"function FontFace() { [native code] }\"};const n=l.fonts.delete;l.fonts.delete=function(e){try{return getDetailObject(e.family).then(e=>l.dispatchEvent(new s(\"single-file-delete-font\",{detail:e}))),n.call(l.fonts,e)}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},l.fonts.delete.toString=function(){return\"function delete() { [native code] }\"};const i=l.fonts.clear;l.fonts.clear=function(){try{return l.dispatchEvent(new s(\"single-file-clear-fonts\")),i.call(l.fonts)}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},l.fonts.clear.toString=function(){return\"function clear() { [native code] }\"}}if(e.IntersectionObserver){const t=e.IntersectionObserver;e.IntersectionObserver=function(){try{const e=new t(...arguments),n=t.prototype.observe||e.observe,i=t.prototype.unobserve||e.unobserve,r=arguments[0],o=arguments[1];return n&&(e.observe=function(t){try{let i=v.get(e);return i||(i=[],v.set(e,i)),i.push(t),n.call(e,t)}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},e.observe.toString=function(){return\"function observe() { [native code] }\"}),i&&(e.unobserve=function(t){try{let n=v.get(e);return n&&(n=n.filter(e=>e!=t),n.length?v.set(e,n):(v.delete(e),y.delete(e))),i.call(e,t)}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},e.unobserve.toString=function(){return\"function unobserve() { [native code] }\"}),y.set(e,{callback:r,options:o}),e}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},e.IntersectionObserver.prototype=t.prototype,e.IntersectionObserver.toString=function(){return\"function IntersectionObserver() { [native code] }\"}}const w=_.prototype.replaceSync;_.prototype.replaceSync=function(e){try{const t=w.apply(this,[e]);return S.set(this,e),t}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},_.prototype.replaceSync.toString=function(){return\"function replaceSync() { [native code] }\"};const b=_.prototype.replace;_.prototype.replace=async function(e){try{const t=await b.apply(this,[e]);return S.set(this,e),t}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},_.prototype.replace.toString=function(){return\"function replace() { [native code] }\"};const k=_.prototype.insertRule;_.prototype.insertRule=function(e,t){try{const n=k.apply(this,[e,t]);return S.delete(this),n}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},_.prototype.insertRule.toString=function(){return\"function insertRule() { [native code] }\"};const F=_.prototype.deleteRule;function getAdoptedStylesheetsListener(e){const t=e.target.shadowRoot;if(e.stopPropagation(),t){t.addEventListener(i,getAdoptedStylesheetsListener,{capture:!0}),t.addEventListener(\"single-file-unregister-request-get-adopted-stylesheets\",()=>{t.removeEventListener(i,getAdoptedStylesheetsListener)},{once:!0});const e=Array.from(t.adoptedStyleSheets).map(e=>S.has(e)?S.get(e):Array.from(e.cssRules).map(e=>e.cssText).join(\"\\n\"));e.length&&t.dispatchEvent(new s(\"single-file-response-get-adopted-stylesheets\",{detail:{adoptedStyleSheets:e}}))}}async function getDetailObject(e,t,n){const i={};return i[\"font-family\"]=e,i.src=t,n&&Object.keys(n).forEach(e=>{r[e]&&(i[r[e]]=n[e])}),new Promise(e=>{if(i.src instanceof ArrayBuffer){const t=new f;t.readAsDataURL(new p([i.src])),t.addEventListener(\"load\",()=>{i.src=\"url(\"+t.result+\")\",e(i)})}else e(i)})}function dispatchResizeEvent(){try{e.dispatchEvent(new d(\"resize\")),E&&e.dispatchEvent(new d(\"scroll\"))}catch(e){}}_.prototype.deleteRule=function(e){try{const t=F.apply(this,[e]);return S.delete(this),t}catch(e){throw e.stack=e.message+\"\\n    \\n\"+e.stack.trim().split(\"\\n\").slice(-1).join(\"\\n\"),e}},_.prototype.deleteRule.toString=function(){return\"function deleteRule() { [native code] }\"}})(\"object\"==typeof globalThis?globalThis:globalThis.window)}();\n"
  },
  {
    "path": "lib/single-file-infobar.js",
    "content": "!function(){\"use strict\";const n=\"single-file-infobar\";function o(o,i,t){if(!o.querySelector(n)){let t;i.infobarContent?t=i.infobarContent.replace(/\\\\n/g,\"\\n\").replace(/\\\\t/g,\"\\t\"):i.saveDate&&(t=i.saveDate),t=t||\"No info\";const e=\"BODY\"==o.body.tagName?o.body:o.documentElement,a=function(n,o,i){const t=n.createElement(o);return i.appendChild(t),Array.from(getComputedStyle(t)).forEach(n=>t.style.setProperty(n,\"initial\",\"important\")),t}(o,n,e);let r;r=a.attachShadow({mode:\"open\"});const A=o.createElement(\"div\"),c=o.createElement(\"style\");if(c.textContent=\"\\n.infobar,\\n.infobar .infobar-icon,\\n.infobar .infobar-link-icon {\\n  min-inline-size: 28px;\\n  min-block-size: 28px;\\n  box-sizing: border-box;\\n}\\n\\n.infobar,\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  opacity: 0.7;\\n  transition: opacity 250ms;\\n}\\n\\n.infobar:hover,\\n.infobar .infobar-close-icon:hover,\\n.infobar .infobar-link-icon:hover {\\n  opacity: 1;\\n}\\n\\n.infobar,\\n.infobar-content {\\n  display: flex;\\n}\\n\\n.infobar {\\n  position: fixed;\\n  max-height: calc(100% - 32px);\\n  top: 16px;\\n  right: 16px;\\n  margin-inline-start: 16px;\\n  margin-block-end: 16px;\\n  color: #2d2d2d;\\n  background-color: #737373;\\n  border: 2px solid;\\n  border-color: #eee;\\n  border-radius: 16px;\\n  z-index: 2147483647;\\n  animation-name: flash;\\n  animation-duration: .5s;\\n  animation-timing-function: cubic-bezier(0.39, 0.58, 0.57, 1);\\n  animation-delay: 1s;\\n  animation-iteration-count: 2;\\n}\\n\\n.infobar:valid, .infobar:not(:focus-within):not(.infobar-focus) .infobar-content {\\n  display: none;\\n}\\n\\n.infobar:focus-within, .infobar.infobar-focus {\\n  background-color: #f9f9f9;\\n  border-color: #878787;\\n  border-radius: 8px;\\n  opacity: 1;\\n  transition-property: opacity, background-color, border-color, border-radius, color;\\n}\\n\\n.infobar-content {\\n  border: 2px solid;\\n  border-color: #f9f9f9;\\n  border-radius: 6px;\\n  background-color: #f9f9f9;\\n  overflow: auto;\\n}\\n\\n.infobar-content span {\\n  font-family: Arial, Helvetica, sans-serif;\\n  font-size: 14px;\\n  line-height: 18px;\\n  word-break: break-word;\\n  white-space: pre-wrap;\\n  margin-inline: 4px;\\n  margin-block: 4px;\\n}\\n\\n.infobar .infobar-icon,\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  cursor: pointer;\\n  background-position: center;\\n  background-repeat: no-repeat;\\n}\\n\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  align-self: flex-start;\\n}\\n\\n.infobar .infobar-icon {\\n  position: absolute;\\n  min-inline-size: 24px;\\n  min-block-size: 24px;\\n}\\n\\n@keyframes flash {\\n  0%, 100% {\\n\\tbackground-color: #737373;\\n  }\\n  50% {\\n\\tbackground-color: #dd6a00;\\n  }\\n}\\n\\n.infobar:focus-within .infobar-icon, .infobar.infobar-focus .infobar-icon {\\n  z-index: -1;\\n  background-image: none;\\n  margin: 4px;\\n}\\n\\n.infobar .infobar-close-icon {\\n  min-inline-size: 22px;\\n  min-block-size: 22px;\\n}\\n\\n.infobar .infobar-icon {\\n  background-color: transparent;\\n  background-size: 70%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHADIRLMaOHwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAPUExURQAAAIqKioyNjY2OjvDw8L2y1DEAAAABdFJOUwBA5thmAAAAAWJLR0QB/wIt3gAAAGNJREFUSMdjYCAJsLi4OBCQx6/CBQwIGIDPCBcXAkYQUsACU+AwlBVQHg6Eg5pgZBGOboIJZugDFwRwoJECJCUOhJI1wZwzqmBUwagCuipgIqTABG9h7YIKaKGAURAFEF/6AQAO4HqSoDP8bgAAAABJRU5ErkJggg==);\\n}\\n\\n.infobar .infobar-link-icon {\\n  right: 4px;\\n  background-size: 60%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8H+DhhoQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJJJREFUOI3t070NRCEMA2CnYAOyDyPwpHj/Va7hJ3FzV7zy3ET5JIwoAF6Jk4wzAJAkzxAYG9YRTgB+24wBgKmfrGAKTcEfAY4KRlRoIeBTgKOCERVaCPgU4Khge2GqKOBTgKOCERVaAEC/4PNcnyoSWHpjqkhwKxbcig0Q6AorXYF/+A6eIYD1lVbwG/jdA6/kA2THRAURVubcAAAAAElFTkSuQmCC);\\n}\\n\\n.infobar .infobar-close-icon {\\n  appearance: none;\\n  background-size: 80%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8VC4EQ6QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJtJREFUOI3NkrsBgCAMRLFwBPdxBArcfxXFkO8rbKWAAJfHJ9faf9vuYX/749T5NmShm3bEwbe2SxeuM4+2oxDL1cDoKtVUjRy+tH78Cv2CS+wIiQNC1AEhk4AQeUTMWUJMfUJMSEJMSEY8kIx4IONroaYAimNxsXp1PA7PxwfVL8QnowwoVC0lig07wDDVUjAdbAnjwtow/z/bDW7eI4M2KruJAAAAAElFTkSuQmCC);\\n}\\n\",i.infobarPositionAbsolute){c.textContent+=\".infobar { position: absolute; }\";\"static\"==getComputedStyle(e).position&&e.style.setProperty(\"position\",\"relative\",\"important\")}i.infobarPositionTop?c.textContent+=`.infobar { top: ${i.infobarPositionTop}; bottom: auto; }`:i.infobarPositionBottom&&(c.textContent+=`.infobar { bottom: ${i.infobarPositionBottom}; top: auto; }`),i.infobarPositionRight?c.textContent+=`.infobar { right: ${i.infobarPositionRight}; left: auto; }`:i.infobarPositionLeft&&(c.textContent+=`.infobar { left: ${i.infobarPositionLeft}; right: auto; }`),c.textContent=c.textContent.replace(/ {2}/g,\"\").replace(/\\n/g,\"\").replace(/: /g,\":\").replace(/, /g,\",\"),A.appendChild(c);const s=o.createElement(\"form\");s.classList.add(\"infobar\"),i.openInfobar&&s.classList.add(\"infobar-focus\"),A.appendChild(s);const l=o.createElement(\"span\");l.tabIndex=-1,l.classList.add(\"infobar-icon\"),s.appendChild(l);const b=o.createElement(\"span\");b.tabIndex=-1,b.classList.add(\"infobar-content\");const f=o.createElement(\"input\");f.type=\"checkbox\",f.required=!0,f.classList.add(\"infobar-close-icon\"),f.title=\"Close\",b.appendChild(f);const d=o.createElement(\"span\");d.textContent=t,b.appendChild(d);const p=o.createElement(\"a\");p.classList.add(\"infobar-link-icon\"),p.target=\"_blank\",p.rel=\"noopener noreferrer\",p.title=\"Open source URL: \"+i.saveUrl,p.href=i.saveUrl,b.appendChild(p),s.appendChild(b),r.appendChild(A)}}(n=>{const i=n.browser,t=n.MutationObserver;let e;async function a(){let n={displayInfobar:!0};const t=function(n,o=\"SingleFile\"){const i=n.evaluate(\"//comment()\",n,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);let t=i&&i.singleNodeValue;if(t&&t.nodeType==Node.COMMENT_NODE&&t.textContent.includes(o)){const n=t.textContent.split(\"\\n\"),[,,o,...i]=n,e=o.match(/^ url: (.*) ?$/),a=e&&e[1];if(a){let n,o;if(i.length&&(o=i[0].split(\"saved date: \")[1],o&&i.shift(),i.length>1)){let o=i[0].split(\"info: \")[1].trim();for(let n=1;n<i.length-1;n++)o+=\"\\n\"+i[n].trim();n=o.trim()}return{saveUrl:a,infobarContent:n,saveDate:o}}}}(document);if(t&&t.saveUrl){if(i&&i.runtime&&i.runtime.sendMessage)try{n=await i.runtime.sendMessage({method:\"tabs.getOptions\",url:t.saveUrl})}catch(n){}n.displayInfobar&&(t.openInfobar=n.openInfobar,t.infobarPositionAbsolute=n.infobarPositionAbsolute,t.infobarPositionTop=n.infobarPositionTop,t.infobarPositionRight=n.infobarPositionRight,t.infobarPositionBottom=n.infobarPositionBottom,t.infobarPositionLeft=n.infobarPositionLeft,o(document,t),function(n,{saveUrl:o,infobarContent:i,saveDate:t}){if(o){const e=n.querySelector(\"single-file-infobar\").shadowRoot;e.querySelector(\".infobar-content span\").textContent=i||t;const a=e.querySelector(\".infobar-content .infobar-link-icon\");a.href=o,a.title=\"Open source URL: \"+o}}(document,t))}}!function o(){n.window==n.top&&(document.addEventListener(\"single-file-display-infobar\",a,!1),\"\"!=document.documentElement.getAttribute(\"data-sfz\")||e?\"loading\"==document.readyState?document.addEventListener(\"DOMContentLoaded\",a,!1):a():e=new t(o).observe(document,{childList:!0}));n.singlefile&&(n.singlefile.infobar={displayIcon:a})}()})(\"object\"==typeof globalThis?globalThis:window)}();\n"
  },
  {
    "path": "lib/single-file-z-worker.js",
    "content": "!function(){const{Array:e,Object:t,Number:n,Math:s,Error:r,Uint8Array:a,Uint16Array:i,Uint32Array:o,Int32Array:l,Map:c,DataView:h,Promise:f,TextEncoder:u,crypto:p,postMessage:d,TransformStream:g,ReadableStream:w,WritableStream:y}=self,v=void 0,b=\"undefined\",m=\"function\";class _{constructor(e){return class extends g{constructor(t,n){const s=new e(n);super({transform(e,t){t.enqueue(s.append(e))},flush(e){const t=s.flush();t&&e.enqueue(t)}})}}}}const k=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;k[e]=t}class S{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,s=0|e.length;s>n;n++)t=t>>>8^k[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class z extends g{constructor(){let e;const t=new S;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new a(4);new h(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const D={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],s=D.getPartial(n);return 32===s?e.concat(t):D._shiftRight(t,s,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+D.getPartial(n)},clamp(e,t){if(32*e.length<t)return e;const n=(e=e.slice(0,s.ceil(t/32))).length;return t&=31,n>0&&t&&(e[n-1]=D.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>s.round(e/1099511627776)||32,_shiftRight(e,t,n,s){for(void 0===s&&(s=[]);t>=32;t-=32)s.push(n),n=0;if(0===t)return s.concat(e);for(let r=0;r<e.length;r++)s.push(n|e[r]>>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=D.getPartial(r);return s.push(D.partial(t+a&31,t+a>32?n:s.pop(),1)),s}},C={bytes:{fromBits(e){const t=D.bitLength(e)/8,n=new a(t);let s;for(let r=0;t>r;r++)3&r||(s=e[r/4]),n[r]=s>>>24,s<<=8;return n},toBits(e){const t=[];let n,s=0;for(n=0;n<e.length;n++)s=s<<8|e[n],3&~n||(t.push(s),s=0);return 3&n&&t.push(D.partial(8*(3&n),s)),t}}},x=class{constructor(e){const t=this;t.blockSize=512,t._init=[1732584193,4023233417,2562383102,271733878,3285377520],t._key=[1518500249,1859775393,2400959708,3395469782],e?(t._h=e._h.slice(0),t._buffer=e._buffer.slice(0),t._length=e._length):t.reset()}reset(){const e=this;return e._h=e._init.slice(0),e._buffer=[],e._length=0,e}update(e){const t=this;\"string\"==typeof e&&(e=C.utf8String.toBits(e));const n=t._buffer=D.concat(t._buffer,e),s=t._length,a=t._length=s+D.bitLength(e);if(a>9007199254740991)throw new r(\"Cannot hash more than 2^53 - 1 bits\");const i=new o(n);let l=0;for(let e=t.blockSize+s-(t.blockSize+s&t.blockSize-1);a>=e;e+=t.blockSize)t._block(i.subarray(16*l,16*(l+1))),l+=1;return n.splice(0,16*l),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=D.concat(t,[D.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(s.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,s){return e>19?e>39?e>59?e>79?void 0:t^n^s:t&n|t&s|n&s:t^n^s:t&n|~t&s}_S(e,t){return t<<e|t>>>32-e}_block(t){const n=this,r=n._h,a=e(80);for(let e=0;16>e;e++)a[e]=t[e];let i=r[0],o=r[1],l=r[2],c=r[3],h=r[4];for(let e=0;79>=e;e++){16>e||(a[e]=n._S(1,a[e-3]^a[e-8]^a[e-14]^a[e-16]));const t=n._S(5,i)+n._f(e,o,l,c)+h+a[e]+n._key[s.floor(e/20)]|0;h=c,c=l,l=n._S(30,o),o=i,i=t}r[0]=r[0]+i|0,r[1]=r[1]+o|0,r[2]=r[2]+l|0,r[3]=r[3]+c|0,r[4]=r[4]+h|0}},I={getRandomValues(e){const t=new o(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(s.random()>.5?1:-1))};for(let r,a=0;a<e.length;a+=4){const e=n(4294967296*(r||s.random()));r=987654071*e(),t[a/4]=4294967296*e()|0}return e}},T={importKey:e=>new T.hmacSha1(C.bytes.toBits(e)),pbkdf2(e,t,n,s){if(n=n||1e4,0>s||0>n)throw new r(\"invalid params to pbkdf2\");const a=1+(s>>5)<<2;let i,o,l,c,f;const u=new ArrayBuffer(a),p=new h(u);let d=0;const g=D;for(t=C.bytes.toBits(t),f=1;(a||1)>d;f++){for(i=o=e.encrypt(g.concat(t,[f])),l=1;n>l;l++)for(o=e.encrypt(o),c=0;c<o.length;c++)i[c]^=o[c];for(l=0;(a||1)>d&&l<i.length;l++)p.setInt32(d,i[l]),d+=4}return u.slice(0,s/8)},hmacSha1:class{constructor(e){const t=this,n=t._hash=x,s=[[],[]];t._baseHash=[new n,new n];const r=t._baseHash[0].blockSize/32;e.length>r&&(e=(new n).update(e).finalize());for(let t=0;r>t;t++)s[0][t]=909522486^e[t],s[1][t]=1549556828^e[t];t._baseHash[0].update(s[0]),t._baseHash[1].update(s[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new r(\"encrypt on already updated hmac called!\");return this.update(e),this.digest(e)}}},A=typeof p!=b&&typeof p.getRandomValues==m,q=\"Invalid password\",R=\"Invalid signature\",H=\"zipjs-abort-check-password\";function P(e){return A?p.getRandomValues(e):I.getRandomValues(e)}const B=16,K={name:\"PBKDF2\"},V=t.assign({hash:{name:\"HMAC\"}},K),E=t.assign({iterations:1e3,hash:{name:\"SHA-1\"}},K),U=[\"deriveBits\"],W=[8,12,16],M=[16,24,32],N=10,O=[0,0,0,0],F=typeof p!=b,L=F&&p.subtle,j=F&&typeof L!=b,G=C.bytes,X=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],s=t._tables[1],a=e.length;let i,o,l,c=1;if(4!==a&&6!==a&&8!==a)throw new r(\"invalid aes key size\");for(t._key=[o=e.slice(0),l=[]],i=a;4*a+28>i;i++){let e=o[i-1];(i%a==0||8===a&&i%a==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],i%a==0&&(e=e<<8^e>>>24^c<<24,c=c<<1^283*(c>>7))),o[i]=o[i-a]^e}for(let e=0;i;e++,i--){const t=o[3&e?i:i-4];l[e]=4>=i||4>e?t:s[0][n[t>>>24]]^s[1][n[t>>16&255]]^s[2][n[t>>8&255]]^s[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],s=t[4],r=[],a=[];let i,o,l,c;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let h=i=0;!n[h];h^=o||1,i=a[i]||1){let a=i^i<<1^i<<2^i<<3^i<<4;a=a>>8^255&a^99,n[h]=a,s[a]=h,c=r[l=r[o=r[h]]];let f=16843009*c^65537*l^257*o^16843008*h,u=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][h]=u=u<<24^u>>>8,t[n][a]=f=f<<24^f>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new r(\"invalid aes block size\");const n=this._key[t],s=n.length/4-2,a=[0,0,0,0],i=this._tables[t],o=i[0],l=i[1],c=i[2],h=i[3],f=i[4];let u,p,d,g=e[0]^n[0],w=e[t?3:1]^n[1],y=e[2]^n[2],v=e[t?1:3]^n[3],b=4;for(let e=0;s>e;e++)u=o[g>>>24]^l[w>>16&255]^c[y>>8&255]^h[255&v]^n[b],p=o[w>>>24]^l[y>>16&255]^c[v>>8&255]^h[255&g]^n[b+1],d=o[y>>>24]^l[v>>16&255]^c[g>>8&255]^h[255&w]^n[b+2],v=o[v>>>24]^l[g>>16&255]^c[w>>8&255]^h[255&y]^n[b+3],b+=4,g=u,w=p,y=d;for(let e=0;4>e;e++)a[t?3&-e:e]=f[g>>>24]<<24^f[w>>16&255]<<16^f[y>>8&255]<<8^f[255&v]^n[b++],u=g,g=w,w=y,y=v,v=u;return a}},J=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,s=255&e;255===t?(t=0,255===n?(n=0,255===s?s=0:++s):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=s}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let s;if(!(s=t.length))return[];const r=D.bitLength(t);for(let r=0;s>r;r+=4){this.incCounter(n);const s=e.encrypt(n);t[r]^=s[0],t[r+1]^=s[1],t[r+2]^=s[2],t[r+3]^=s[3]}return D.clamp(t,r)}},Q=T.hmacSha1;let Y=F&&j&&typeof L.importKey==m,Z=F&&j&&typeof L.deriveBits==m;class $ extends g{constructor({password:e,rawPassword:n,signed:s,encryptionStrength:i,checkPasswordOnly:o}){super({start(){t.assign(this,{ready:new f(e=>this.resolveReady=e),password:se(e,n),signed:s,strength:i-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:i,resolveReady:l,ready:c}=n;s?(await(async(e,t,n,s)=>{const a=await ne(e,t,n,ae(s,0,W[t])),i=ae(s,W[t]);if(a[0]!=i[0]||a[1]!=i[1])throw new r(q)})(n,i,s,ae(e,0,W[i]+2)),e=ae(e,W[i]+2),o?t.error(new r(H)):l()):await c;const h=new a(e.length-N-(e.length-N)%B);t.enqueue(te(n,e,h,0,N,!0))},async flush(e){const{signed:t,ctr:n,hmac:s,pending:i,ready:o}=this;if(s&&n){await o;const l=ae(i,0,i.length-N),c=ae(i,i.length-N);let h=new a;if(l.length){const e=oe(G,l);s.update(e);const t=n.update(e);h=ie(G,t)}if(t){const e=ae(ie(G,s.digest()),0,N);for(let t=0;N>t;t++)if(e[t]!=c[t])throw new r(R)}e.enqueue(h)}}})}}class ee extends g{constructor({password:e,rawPassword:n,encryptionStrength:s}){let r;super({start(){t.assign(this,{ready:new f(e=>this.resolveReady=e),password:se(e,n),strength:s-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:i,ready:o}=n;let l=new a;s?(l=await(async(e,t,n)=>{const s=P(new a(W[t]));return re(s,await ne(e,t,n,s))})(n,r,s),i()):await o;const c=new a(l.length+e.length-e.length%B);c.set(l,0),t.enqueue(te(n,e,c,l.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:i}=this;if(n&&t){await i;let o=new a;if(s.length){const e=t.update(oe(G,s));n.update(e),o=ie(G,e)}r.signature=ie(G,n.digest()).slice(0,N),e.enqueue(re(o,r.signature))}}}),r=this}}function te(e,t,n,s,r,i){const{ctr:o,hmac:l,pending:c}=e,h=t.length-r;let f;for(c.length&&(t=re(c,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new a(t)).set(n,0)}return e})(n,h-h%B)),f=0;h-B>=f;f+=B){const e=oe(G,ae(t,f,f+B));i&&l.update(e);const r=o.update(e);i||l.update(r),n.set(ie(G,r),f+s)}return e.pending=ae(t,f),n}async function ne(n,s,r,i){n.password=null;const o=await(async(e,t,n,s,r)=>{if(!Y)return T.importKey(t);try{return await L.importKey(\"raw\",t,n,!1,r)}catch(e){return Y=!1,T.importKey(t)}})(0,r,V,0,U),l=await(async(e,t,n)=>{if(!Z)return T.pbkdf2(t,e.salt,E.iterations,n);try{return await L.deriveBits(e,t,n)}catch(s){return Z=!1,T.pbkdf2(t,e.salt,E.iterations,n)}})(t.assign({salt:i},E),o,8*(2*M[s]+2)),c=new a(l),h=oe(G,ae(c,0,M[s])),f=oe(G,ae(c,M[s],2*M[s])),u=ae(c,2*M[s]);return t.assign(n,{keys:{key:h,authentication:f,passwordVerification:u},ctr:new J(new X(h),e.from(O)),hmac:new Q(f)}),u}function se(e,t){return t===v?(e=>{if(typeof u==b){const t=new a((e=unescape(encodeURIComponent(e))).length);for(let n=0;n<t.length;n++)t[n]=e.charCodeAt(n);return t}return(new u).encode(e)})(e):t}function re(e,t){let n=e;return e.length+t.length&&(n=new a(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function ae(e,t,n){return e.subarray(t,n)}function ie(e,t){return e.fromBits(t)}function oe(e,t){return e.toBits(t)}class le extends g{constructor({password:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){t.assign(this,{password:e,passwordVerification:n}),ue(this,e)},transform(e,t){const n=this;if(n.password){const t=he(n,e.subarray(0,12));if(n.password=null,t[11]!=n.passwordVerification)throw new r(q);e=e.subarray(12)}s?t.error(new r(H)):t.enqueue(he(n,e))}})}}class ce extends g{constructor({password:e,passwordVerification:n}){super({start(){t.assign(this,{password:e,passwordVerification:n}),ue(this,e)},transform(e,t){const n=this;let s,r;if(n.password){n.password=null;const t=P(new a(12));t[11]=n.passwordVerification,s=new a(e.length+t.length),s.set(fe(n,t),0),r=12}else s=new a(e.length),r=0;s.set(fe(n,e),r),t.enqueue(s)}})}}function he(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=de(e)^t[s],pe(e,n[s]);return n}function fe(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=de(e)^t[s],pe(e,t[s]);return n}function ue(e,n){const s=[305419896,591751049,878082192];t.assign(e,{keys:s,crcKey0:new S(s[0]),crcKey2:new S(s[2])});for(let t=0;t<n.length;t++)pe(e,n.charCodeAt(t))}function pe(e,t){let[n,r,a]=e.keys;e.crcKey0.append([t]),n=~e.crcKey0.get(),r=we(s.imul(we(r+ge(n)),134775813)+1),e.crcKey2.append([r>>>24]),a=~e.crcKey2.get(),e.keys=[n,r,a]}function de(e){const t=2|e.keys[2];return ge(s.imul(t,1^t)>>>8)}function ge(e){return 255&e}function we(e){return 4294967295&e}const ye=\"deflate-raw\";class ve extends g{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:s}){super({});const{compressed:r,encrypted:a,useCompressionStream:i,zipCrypto:o,signed:l,level:c}=e,f=this;let u,p,d=me(super.readable);a&&!o||!l||(u=new z,d=Se(d,u)),r&&(d=ke(d,i,{level:c,chunkSize:t},s,n)),a&&(o?d=Se(d,new ce(e)):(p=new ee(e),d=Se(d,p))),_e(f,d,()=>{let e;a&&!o&&(e=p.signature),a&&!o||!l||(e=new h(u.value.buffer).getUint32(0)),f.signature=e})}}class be extends g{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:s}){super({});const{zipCrypto:a,encrypted:i,signed:o,signature:l,compressed:c,useCompressionStream:f}=e;let u,p,d=me(super.readable);i&&(a?d=Se(d,new le(e)):(p=new $(e),d=Se(d,p))),c&&(d=ke(d,f,{chunkSize:t},s,n)),i&&!a||!o||(u=new z,d=Se(d,u)),_e(this,d,()=>{if((!i||a)&&o){const e=new h(u.value.buffer);if(l!=e.getUint32(0,!1))throw new r(R)}})}}function me(e){return Se(e,new g({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function _e(e,n,s){n=Se(n,new g({flush:s})),t.defineProperty(e,\"readable\",{get:()=>n})}function ke(e,t,n,s,r){try{e=Se(e,new(t&&s?s:r)(ye,n))}catch(s){if(!t)return e;try{e=Se(e,new r(ye,n))}catch(t){return e}}return e}function Se(e,t){return e.pipeThrough(t)}const ze=\"data\",De=\"close\";class Ce extends g{constructor(e,n){super({});const s=this,{codecType:r}=e;let a;r.startsWith(\"deflate\")?a=ve:r.startsWith(\"inflate\")&&(a=be);let i=0,o=0;const l=new a(e,n),c=super.readable,h=new g({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){t.assign(s,{inputSize:o})}}),f=new g({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){const{signature:e}=l;t.assign(s,{signature:e,outputSize:i,inputSize:o})}});t.defineProperty(s,\"readable\",{get:()=>c.pipeThrough(h).pipeThrough(l).pipeThrough(f)})}}class xe extends g{constructor(e){let t;super({transform:function n(s,r){if(t){const e=new a(t.length+s.length);e.set(t),e.set(s,t.length),s=e,t=null}s.length>e?(r.enqueue(s.slice(0,e)),n(s.slice(e),r)):t=s},flush(e){t&&t.length&&e.enqueue(t)}})}}const Ie=new c,Te=new c;let Ae,qe=0,Re=!0;async function He(e){try{const{options:t,scripts:s,config:r}=e;if(s&&s.length)try{Re?importScripts.apply(v,s):await Pe(s)}catch(e){Re=!1,await Pe(s)}self.initCodec&&self.initCodec(),r.CompressionStreamNative=self.CompressionStream,r.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(r.CompressionStream=new _(self.Deflate)),self.Inflate&&(r.DecompressionStream=new _(self.Inflate));const a={highWaterMark:1},i=e.readable||new w({async pull(e){const t=new f(e=>Ie.set(qe,e));Be({type:\"pull\",messageId:qe}),qe=(qe+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await t;e.enqueue(s),r&&e.close()}},a),o=e.writable||new y({async write(e){let t;const s=new f(e=>t=e);Te.set(qe,t),Be({type:ze,value:e,messageId:qe}),qe=(qe+1)%n.MAX_SAFE_INTEGER,await s}},a),l=new Ce(t,r);Ae=new AbortController;const{signal:c}=Ae;await i.pipeThrough(l).pipeThrough(new xe(r.chunkSize)).pipeTo(o,{signal:c,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{signature:h,inputSize:u,outputSize:p}=l;Be({type:De,result:{signature:h,inputSize:u,outputSize:p}})}catch(e){Ke(e)}}async function Pe(e){for(const t of e)await import(t)}function Be(e){let{value:t}=e;if(t)if(t.length)try{t=new a(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Ke(e=new r(\"Unknown error\")){const{message:t,stack:n,code:s,name:a}=e;d({error:{message:t,stack:n,code:s,name:a}})}addEventListener(\"message\",({data:e})=>{const{type:t,messageId:n,value:s,done:r}=e;try{if(\"start\"==t&&He(e),t==ze){const e=Ie.get(n);Ie.delete(n),e({value:new a(s),done:r})}if(\"ack\"==t){const e=Te.get(n);Te.delete(n),e()}t==De&&Ae.abort()}catch(e){Ke(e)}});var Ve=a,Ee=i,Ue=l,We=new Ve([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Me=new Ve([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Ne=new Ve([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Oe=(e,t)=>{for(var n=new Ee(31),s=0;31>s;++s)n[s]=t+=1<<e[s-1];var r=new Ue(n[30]);for(s=1;30>s;++s)for(var a=n[s];a<n[s+1];++a)r[a]=a-n[s]<<5|s;return{b:n,r:r}},Fe=Oe(We,2),Le=Fe.b,je=Fe.r;Le[28]=258,je[258]=28;for(var Ge=Oe(Me,0),Xe=Ge.b,Je=Ge.r,Qe=new Ee(32768),Ye=0;32768>Ye;++Ye){var Ze=(43690&Ye)>>1|(21845&Ye)<<1;Ze=(61680&(Ze=(52428&Ze)>>2|(13107&Ze)<<2))>>4|(3855&Ze)<<4,Qe[Ye]=((65280&Ze)>>8|(255&Ze)<<8)>>1}var $e=(e,t,n)=>{for(var s=e.length,r=0,a=new Ee(t);s>r;++r)e[r]&&++a[e[r]-1];var i,o=new Ee(t);for(r=1;t>r;++r)o[r]=o[r-1]+a[r-1]<<1;if(n){i=new Ee(1<<t);var l=15-t;for(r=0;s>r;++r)if(e[r])for(var c=r<<4|e[r],h=t-e[r],f=o[e[r]-1]++<<h,u=f|(1<<h)-1;u>=f;++f)i[Qe[f]>>l]=c}else for(i=new Ee(s),r=0;s>r;++r)e[r]&&(i[r]=Qe[o[e[r]-1]++]>>15-e[r]);return i},et=new Ve(288);for(Ye=0;144>Ye;++Ye)et[Ye]=8;for(Ye=144;256>Ye;++Ye)et[Ye]=9;for(Ye=256;280>Ye;++Ye)et[Ye]=7;for(Ye=280;288>Ye;++Ye)et[Ye]=8;var tt=new Ve(32);for(Ye=0;32>Ye;++Ye)tt[Ye]=5;var nt=$e(et,9,0),st=$e(et,9,1),rt=$e(tt,5,0),at=$e(tt,5,1),it=e=>{for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},ot=(e,t,n)=>{var s=t/8|0;return(e[s]|e[s+1]<<8)>>(7&t)&n},lt=(e,t)=>{var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},ct=e=>(e+7)/8|0,ht=(e,t,n)=>((null==t||0>t)&&(t=0),(null==n||n>e.length)&&(n=e.length),new Ve(e.subarray(t,n))),ft=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],ut=(e,t,n)=>{var s=new r(t||ft[e]);if(s.code=e,r.captureStackTrace&&r.captureStackTrace(s,ut),!n)throw s;return s},pt=(e,t,n)=>{n<<=7&t;var s=t/8|0;e[s]|=n,e[s+1]|=n>>8},dt=(e,t,n)=>{n<<=7&t;var s=t/8|0;e[s]|=n,e[s+1]|=n>>8,e[s+2]|=n>>16},gt=(e,t)=>{for(var n=[],s=0;s<e.length;++s)e[s]&&n.push({s:s,f:e[s]});var r=n.length,a=n.slice();if(!r)return{t:kt,l:0};if(1==r){var i=new Ve(n[0].s+1);return i[n[0].s]=1,{t:i,l:1}}n.sort((e,t)=>e.f-t.f),n.push({s:-1,f:25001});var o=n[0],l=n[1],c=0,h=1,f=2;for(n[0]={s:-1,f:o.f+l.f,l:o,r:l};h!=r-1;)o=n[n[c].f<n[f].f?c++:f++],l=n[c!=h&&n[c].f<n[f].f?c++:f++],n[h++]={s:-1,f:o.f+l.f,l:o,r:l};var u=a[0].s;for(s=1;r>s;++s)a[s].s>u&&(u=a[s].s);var p=new Ee(u+1),d=wt(n[h-1],p,0);if(d>t){s=0;var g=0,w=d-t,y=1<<w;for(a.sort((e,t)=>p[t.s]-p[e.s]||e.f-t.f);r>s;++s){var v=a[s].s;if(p[v]<=t)break;g+=y-(1<<d-p[v]),p[v]=t}for(g>>=w;g>0;){var b=a[s].s;p[b]<t?g-=1<<t-p[b]++-1:++s}for(;s>=0&&g;--s){var m=a[s].s;p[m]==t&&(--p[m],++g)}d=t}return{t:new Ve(p),l:d}},wt=(e,t,n)=>-1==e.s?s.max(wt(e.l,t,n+1),wt(e.r,t,n+1)):t[e.s]=n,yt=e=>{for(var t=e.length;t&&!e[--t];);for(var n=new Ee(++t),s=0,r=e[0],a=1,i=e=>{n[s++]=e},o=1;t>=o;++o)if(e[o]==r&&o!=t)++a;else{if(!r&&a>2){for(;a>138;a-=138)i(32754);a>2&&(i(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(i(r),--a;a>6;a-=6)i(8304);a>2&&(i(a-3<<5|8208),a=0)}for(;a--;)i(r);a=1,r=e[o]}return{c:n.subarray(0,s),n:t}},vt=(e,t)=>{for(var n=0,s=0;s<t.length;++s)n+=e[s]*t[s];return n},bt=(e,t,n)=>{var s=n.length,r=ct(t+2);e[r]=255&s,e[r+1]=s>>8,e[r+2]=255^e[r],e[r+3]=255^e[r+1];for(var a=0;s>a;++a)e[r+a+4]=n[a];return 8*(r+4+s)},mt=(e,t,n,s,r,a,i,o,l,c,h)=>{pt(t,h++,n),++r[256];for(var f=gt(r,15),u=f.t,p=f.l,d=gt(a,15),g=d.t,w=d.l,y=yt(u),v=y.c,b=y.n,m=yt(g),_=m.c,k=m.n,S=new Ee(19),z=0;z<v.length;++z)++S[31&v[z]];for(z=0;z<_.length;++z)++S[31&_[z]];for(var D=gt(S,7),C=D.t,x=D.l,I=19;I>4&&!C[Ne[I-1]];--I);var T,A,q,R,H=c+5<<3,P=vt(r,et)+vt(a,tt)+i,B=vt(r,u)+vt(a,g)+i+14+3*I+vt(S,C)+2*S[16]+3*S[17]+7*S[18];if(l>=0&&P>=H&&B>=H)return bt(t,h,e.subarray(l,l+c));if(pt(t,h,1+(P>B)),h+=2,P>B){T=$e(u,p,0),A=u,q=$e(g,w,0),R=g;var K=$e(C,x,0);for(pt(t,h,b-257),pt(t,h+5,k-1),pt(t,h+10,I-4),h+=14,z=0;I>z;++z)pt(t,h+3*z,C[Ne[z]]);h+=3*I;for(var V=[v,_],E=0;2>E;++E){var U=V[E];for(z=0;z<U.length;++z){var W=31&U[z];pt(t,h,K[W]),h+=C[W],W>15&&(pt(t,h,U[z]>>5&127),h+=U[z]>>12)}}}else T=nt,A=et,q=rt,R=tt;for(z=0;o>z;++z){var M=s[z];if(M>255){dt(t,h,T[257+(W=M>>18&31)]),h+=A[W+257],W>7&&(pt(t,h,M>>23&31),h+=We[W]);var N=31&M;dt(t,h,q[N]),h+=R[N],N>3&&(dt(t,h,M>>5&8191),h+=Me[N])}else dt(t,h,T[M]),h+=A[M]}return dt(t,h,T[256]),h+A[256]},_t=new Ue([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),kt=new Ve(0),St=function(){function e(e,t){if(\"function\"==typeof e&&(t=e,e={}),this.ondata=t,this.o=e||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new Ve(98304),this.o.dictionary){var n=this.o.dictionary.subarray(-32768);this.b.set(n,32768-n.length),this.s.i=32768-n.length}}return e.prototype.p=function(e,t){this.ondata(((e,t,n,r,a)=>{if(!a&&(a={l:1},t.dictionary)){var i=t.dictionary.subarray(-32768),o=new Ve(i.length+e.length);o.set(i),o.set(e,i.length),e=o,a.w=i.length}return((e,t,n,r,a,i)=>{var o=i.z||e.length,l=new Ve(0+o+5*(1+s.ceil(o/7e3))+0),c=l.subarray(0,l.length-0),h=i.l,f=7&(i.r||0);if(t){f&&(c[0]=i.r>>3);for(var u=_t[t-1],p=u>>13,d=8191&u,g=(1<<n)-1,w=i.p||new Ee(32768),y=i.h||new Ee(g+1),v=s.ceil(n/3),b=2*v,m=t=>(e[t]^e[t+1]<<v^e[t+2]<<b)&g,_=new Ue(25e3),k=new Ee(288),S=new Ee(32),z=0,D=0,C=i.i||0,x=0,I=i.w||0,T=0;o>C+2;++C){var A=m(C),q=32767&C,R=y[A];if(w[q]=R,y[A]=q,C>=I){var H=o-C;if((z>7e3||x>24576)&&(H>423||!h)){f=mt(e,c,0,_,k,S,D,x,T,C-T,f),x=z=D=0,T=C;for(var P=0;286>P;++P)k[P]=0;for(P=0;30>P;++P)S[P]=0}var B=2,K=0,V=d,E=q-R&32767;if(H>2&&A==m(C-E))for(var U=s.min(p,H)-1,W=s.min(32767,C),M=s.min(258,H);W>=E&&--V&&q!=R;){if(e[C+B]==e[C+B-E]){for(var N=0;M>N&&e[C+N]==e[C+N-E];++N);if(N>B){if(B=N,K=E,N>U)break;var O=s.min(E,N-2),F=0;for(P=0;O>P;++P){var L=C-E+P&32767,j=L-w[L]&32767;j>F&&(F=j,R=L)}}}E+=(q=R)-(R=w[q])&32767}if(K){_[x++]=268435456|je[B]<<18|Je[K];var G=31&je[B],X=31&Je[K];D+=We[G]+Me[X],++k[257+G],++S[X],I=C+B,++z}else _[x++]=e[C],++k[e[C]]}}for(C=s.max(C,I);o>C;++C)_[x++]=e[C],++k[e[C]];f=mt(e,c,h,_,k,S,D,x,T,C-T,f),h||(i.r=7&f|c[f/8|0]<<3,f-=7,i.h=y,i.p=w,i.i=C,i.w=I)}else{for(C=i.w||0;o+h>C;C+=65535){var J=C+65535;o>J||(c[f/8|0]=h,J=o),f=bt(c,f+1,e.subarray(C,J))}i.i=o}return ht(l,0,0+ct(f)+0)})(e,null==t.level?6:t.level,null==t.mem?a.l?s.ceil(1.5*s.max(8,s.min(13,s.log(e.length)))):20:12+t.mem,0,0,a)})(e,this.o,0,0,this.s),t)},e.prototype.push=function(e,t){this.ondata||ut(5),this.s.l&&ut(4);var n=e.length+this.s.z;if(n>this.b.length){if(n>2*this.b.length-32768){var s=new Ve(-32768&n);s.set(this.b.subarray(0,this.s.z)),this.b=s}var r=this.b.length-this.s.z;this.b.set(e.subarray(0,r),this.s.z),this.s.z=this.b.length,this.p(this.b,!1),this.b.set(this.b.subarray(-32768)),this.b.set(e.subarray(r),32768),this.s.z=e.length-r+32768,this.s.i=32766,this.s.w=32768}else this.b.set(e,this.s.z),this.s.z+=e.length;this.s.l=1&t,(this.s.z>this.s.w+8191||t)&&(this.p(this.b,t||!1),this.s.w=this.s.i,this.s.i-=2)},e.prototype.flush=function(){this.ondata||ut(5),this.s.l&&ut(4),this.p(this.b,!1),this.s.w=this.s.i,this.s.i-=2},e}(),zt=function(){function e(e,t){\"function\"==typeof e&&(t=e,e={}),this.ondata=t;var n=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:n?n.length:0},this.o=new Ve(32768),this.p=new Ve(0),n&&this.o.set(n)}return e.prototype.e=function(e){if(this.ondata||ut(5),this.d&&ut(4),this.p.length){if(e.length){var t=new Ve(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,n=((e,t,n)=>{var r=e.length;if(!r||t.f&&!t.l)return n||new Ve(0);var a=!n,i=a||2!=t.i,o=t.i;a&&(n=new Ve(3*r));var l=e=>{var t=n.length;if(e>t){var r=new Ve(s.max(2*t,e));r.set(n),n=r}},c=t.f||0,h=t.p||0,f=t.b||0,u=t.l,p=t.d,d=t.m,g=t.n,w=8*r;do{if(!u){c=ot(e,h,1);var y=ot(e,h+1,3);if(h+=3,!y){var v=e[(T=ct(h)+4)-4]|e[T-3]<<8,b=T+v;if(b>r){o&&ut(0);break}i&&l(f+v),n.set(e.subarray(T,b),f),t.b=f+=v,t.p=h=8*b,t.f=c;continue}if(1==y)u=st,p=at,d=9,g=5;else if(2==y){var m=ot(e,h,31)+257,_=ot(e,h+10,15)+4,k=m+ot(e,h+5,31)+1;h+=14;for(var S=new Ve(k),z=new Ve(19),D=0;_>D;++D)z[Ne[D]]=ot(e,h+3*D,7);h+=3*_;var C=it(z),x=(1<<C)-1,I=$e(z,C,1);for(D=0;k>D;){var T,A=I[ot(e,h,x)];if(h+=15&A,16>(T=A>>4))S[D++]=T;else{var q=0,R=0;for(16==T?(R=3+ot(e,h,3),h+=2,q=S[D-1]):17==T?(R=3+ot(e,h,7),h+=3):18==T&&(R=11+ot(e,h,127),h+=7);R--;)S[D++]=q}}var H=S.subarray(0,m),P=S.subarray(m);d=it(H),g=it(P),u=$e(H,d,1),p=$e(P,g,1)}else ut(1);if(h>w){o&&ut(0);break}}i&&l(f+131072);for(var B=(1<<d)-1,K=(1<<g)-1,V=h;;V=h){var E=(q=u[lt(e,h)&B])>>4;if((h+=15&q)>w){o&&ut(0);break}if(q||ut(2),256>E)n[f++]=E;else{if(256==E){V=h,u=null;break}var U=E-254;if(E>264){var W=We[D=E-257];U=ot(e,h,(1<<W)-1)+Le[D],h+=W}var M=p[lt(e,h)&K],N=M>>4;if(M||ut(3),h+=15&M,P=Xe[N],N>3&&(W=Me[N],P+=lt(e,h)&(1<<W)-1,h+=W),h>w){o&&ut(0);break}i&&l(f+131072);var O=f+U;if(P>f){var F=0-P,L=s.min(P,O);for(0>F+f&&ut(3);L>f;++f)n[f]=(void 0)[F+f]}for(;O>f;++f)n[f]=n[f-P]}}t.l=u,t.p=V,t.b=f,t.f=c,u&&(c=1,t.m=d,t.d=p,t.n=g)}while(!c);return f!=n.length&&a?ht(n,0,f):n.subarray(0,f)})(this.p,this.s,this.o);this.ondata(ht(n,t,this.s.b),this.d),this.o=ht(n,this.s.b-32768),this.s.b=this.o.length,this.p=ht(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),Dt=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{Dt.decode(kt,{stream:!0})}catch(e){}function Ct(e,n,s){return class{constructor(r){const i=this;var o,l;o=r,l=\"level\",(typeof t.hasOwn===m?t.hasOwn(o,l):o.hasOwnProperty(l))&&r.level===v&&delete r.level,i.codec=new e(t.assign({},n,r)),s(i.codec,e=>{if(i.pendingData){const t=i.pendingData;i.pendingData=new a(t.length+e.length);const{pendingData:n}=i;n.set(t,0),n.set(e,t.length)}else i.pendingData=new a(e)})}append(e){return this.codec.push(e),r(this)}flush(){return this.codec.push(new a,!0),r(this)}};function r(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new a}}const{Deflate:xt,Inflate:It}=((e,t={},n)=>({Deflate:Ct(e.Deflate,t.deflate,n),Inflate:Ct(e.Inflate,t.inflate,n)}))({Deflate:St,Inflate:zt},v,(e,t)=>e.ondata=t);self.initCodec=()=>{self.Deflate=xt,self.Inflate=It}}();\n"
  },
  {
    "path": "lib/single-file-zip.js",
    "content": "const{Array:e,Object:t,String:n,Number:s,BigInt:r,Math:a,Date:i,Map:o,Set:c,Response:l,URL:u,Error:f,Uint8Array:d,Uint16Array:h,Uint32Array:p,DataView:w,Blob:g,Promise:m,TextEncoder:y,TextDecoder:b,crypto:z,btoa:S,TransformStream:v,ReadableStream:k,WritableStream:x,CompressionStream:D,DecompressionStream:_,navigator:C,Worker:F}=globalThis,T=4294967295,E=65535,A=67324752,W=134695760,U=W,R=33639248,N=101010256,H=101075792,P=117853008,q=22,B=39169,I=21589,M=6534,L=2048,O=\"/\",V=new i(2107,11,31),K=new i(1980,0,1),$=void 0,Z=\"undefined\",G=\"function\";class j{constructor(e){return class extends v{constructor(t,n){const s=new e(n);super({transform(e,t){t.enqueue(s.append(e))},flush(e){const t=s.flush();t&&e.enqueue(t)}})}}}}let J=2;try{typeof C!=Z&&C.hardwareConcurrency&&(J=C.hardwareConcurrency)}catch(e){}const X={chunkSize:524288,maxWorkers:J,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,workerScripts:$,CompressionStreamNative:typeof D!=Z&&D,DecompressionStreamNative:typeof _!=Z&&_},Y=t.assign({},X);function Q(){return Y}function ee(e){return a.max(e.chunkSize,64)}function te(t){const{baseURL:n,chunkSize:s,maxWorkers:r,terminateWorkerTimeout:a,useCompressionStream:i,useWebWorkers:o,Deflate:c,Inflate:l,CompressionStream:u,DecompressionStream:d,workerScripts:h}=t;if(ne(\"baseURL\",n),ne(\"chunkSize\",s),ne(\"maxWorkers\",r),ne(\"terminateWorkerTimeout\",a),ne(\"useCompressionStream\",i),ne(\"useWebWorkers\",o),c&&(Y.CompressionStream=new j(c)),l&&(Y.DecompressionStream=new j(l)),ne(\"CompressionStream\",u),ne(\"DecompressionStream\",d),h!==$){const{deflate:t,inflate:n}=h;if((t||n)&&(Y.workerScripts||(Y.workerScripts={})),t){if(!e.isArray(t))throw new f(\"workerScripts.deflate must be an array\");Y.workerScripts.deflate=t}if(n){if(!e.isArray(n))throw new f(\"workerScripts.inflate must be an array\");Y.workerScripts.inflate=n}}}function ne(e,t){t!==$&&(Y[e]=t)}function se(){return\"application/octet-stream\"}function re(e,t={},n){return{Deflate:ae(e.Deflate,t.deflate,n),Inflate:ae(e.Inflate,t.inflate,n)}}function ae(e,n,s){return class{constructor(r){const a=this;var i,o;i=r,o=\"level\",(typeof t.hasOwn===G?t.hasOwn(i,o):i.hasOwnProperty(o))&&r.level===$&&delete r.level,a.codec=new e(t.assign({},n,r)),s(a.codec,e=>{if(a.pendingData){const t=a.pendingData;a.pendingData=new d(t.length+e.length);const{pendingData:n}=a;n.set(t,0),n.set(e,t.length)}else a.pendingData=new d(e)})}append(e){return this.codec.push(e),r(this)}flush(){return this.codec.push(new d,!0),r(this)}};function r(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new d}}const ie=[];for(let e=0;e<256;e++){let t=e;for(let e=0;e<8;e++)1&t?t=t>>>1^3988292384:t>>>=1;ie[e]=t}class oe{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,s=0|e.length;n<s;n++)t=t>>>8^ie[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class ce extends v{constructor(){let e;const t=new oe;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new d(4);new w(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}function le(e){if(typeof y==Z){e=unescape(encodeURIComponent(e));const t=new d(e.length);for(let n=0;n<t.length;n++)t[n]=e.charCodeAt(n);return t}return(new y).encode(e)}const ue={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],s=ue.getPartial(n);return 32===s?e.concat(t):ue._shiftRight(t,s,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+ue.getPartial(n)},clamp(e,t){if(32*e.length<t)return e;const n=(e=e.slice(0,a.ceil(t/32))).length;return t&=31,n>0&&t&&(e[n-1]=ue.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>a.round(e/1099511627776)||32,_shiftRight(e,t,n,s){for(void 0===s&&(s=[]);t>=32;t-=32)s.push(n),n=0;if(0===t)return s.concat(e);for(let r=0;r<e.length;r++)s.push(n|e[r]>>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=ue.getPartial(r);return s.push(ue.partial(t+a&31,t+a>32?n:s.pop(),1)),s}},fe={bytes:{fromBits(e){const t=ue.bitLength(e)/8,n=new d(t);let s;for(let r=0;r<t;r++)3&r||(s=e[r/4]),n[r]=s>>>24,s<<=8;return n},toBits(e){const t=[];let n,s=0;for(n=0;n<e.length;n++)s=s<<8|e[n],3&~n||(t.push(s),s=0);return 3&n&&t.push(ue.partial(8*(3&n),s)),t}}},de={sha1:class{constructor(e){const t=this;t.blockSize=512,t._init=[1732584193,4023233417,2562383102,271733878,3285377520],t._key=[1518500249,1859775393,2400959708,3395469782],e?(t._h=e._h.slice(0),t._buffer=e._buffer.slice(0),t._length=e._length):t.reset()}reset(){const e=this;return e._h=e._init.slice(0),e._buffer=[],e._length=0,e}update(e){const t=this;\"string\"==typeof e&&(e=fe.utf8String.toBits(e));const n=t._buffer=ue.concat(t._buffer,e),s=t._length,r=t._length=s+ue.bitLength(e);if(r>9007199254740991)throw new f(\"Cannot hash more than 2^53 - 1 bits\");const a=new p(n);let i=0;for(let e=t.blockSize+s-(t.blockSize+s&t.blockSize-1);e<=r;e+=t.blockSize)t._block(a.subarray(16*i,16*(i+1))),i+=1;return n.splice(0,16*i),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=ue.concat(t,[ue.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(a.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,s){return e<=19?t&n|~t&s:e<=39?t^n^s:e<=59?t&n|t&s|n&s:e<=79?t^n^s:void 0}_S(e,t){return t<<e|t>>>32-e}_block(t){const n=this,s=n._h,r=e(80);for(let e=0;e<16;e++)r[e]=t[e];let i=s[0],o=s[1],c=s[2],l=s[3],u=s[4];for(let e=0;e<=79;e++){e>=16&&(r[e]=n._S(1,r[e-3]^r[e-8]^r[e-14]^r[e-16]));const t=n._S(5,i)+n._f(e,o,c,l)+u+r[e]+n._key[a.floor(e/20)]|0;u=l,l=c,c=n._S(30,o),o=i,i=t}s[0]=s[0]+i|0,s[1]=s[1]+o|0,s[2]=s[2]+c|0,s[3]=s[3]+l|0,s[4]=s[4]+u|0}}},he={aes:class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],s=t._tables[1],r=e.length;let a,i,o,c=1;if(4!==r&&6!==r&&8!==r)throw new f(\"invalid aes key size\");for(t._key=[i=e.slice(0),o=[]],a=r;a<4*r+28;a++){let e=i[a-1];(a%r===0||8===r&&a%r===4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],a%r===0&&(e=e<<8^e>>>24^c<<24,c=c<<1^283*(c>>7))),i[a]=i[a-r]^e}for(let e=0;a;e++,a--){const t=i[3&e?a:a-4];o[e]=a<=4||e<4?t:s[0][n[t>>>24]]^s[1][n[t>>16&255]]^s[2][n[t>>8&255]]^s[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],s=t[4],r=[],a=[];let i,o,c,l;for(let e=0;e<256;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let u=i=0;!n[u];u^=o||1,i=a[i]||1){let a=i^i<<1^i<<2^i<<3^i<<4;a=a>>8^255&a^99,n[u]=a,s[a]=u,l=r[c=r[o=r[u]]];let f=16843009*l^65537*c^257*o^16843008*u,d=257*r[a]^16843008*a;for(let n=0;n<4;n++)e[n][u]=d=d<<24^d>>>8,t[n][a]=f=f<<24^f>>>8}for(let n=0;n<5;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new f(\"invalid aes block size\");const n=this._key[t],s=n.length/4-2,r=[0,0,0,0],a=this._tables[t],i=a[0],o=a[1],c=a[2],l=a[3],u=a[4];let d,h,p,w=e[0]^n[0],g=e[t?3:1]^n[1],m=e[2]^n[2],y=e[t?1:3]^n[3],b=4;for(let e=0;e<s;e++)d=i[w>>>24]^o[g>>16&255]^c[m>>8&255]^l[255&y]^n[b],h=i[g>>>24]^o[m>>16&255]^c[y>>8&255]^l[255&w]^n[b+1],p=i[m>>>24]^o[y>>16&255]^c[w>>8&255]^l[255&g]^n[b+2],y=i[y>>>24]^o[w>>16&255]^c[g>>8&255]^l[255&m]^n[b+3],b+=4,w=d,g=h,m=p;for(let e=0;e<4;e++)r[t?3&-e:e]=u[w>>>24]<<24^u[g>>16&255]<<16^u[m>>8&255]<<8^u[255&y]^n[b++],d=w,w=g,g=m,m=y,y=d;return r}}},pe={getRandomValues(e){const t=new p(e.buffer),n=e=>{let t=987654321;const n=4294967295;return function(){t=36969*(65535&t)+(t>>16)&n;return(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(a.random()>.5?1:-1)}};for(let s,r=0;r<e.length;r+=4){const e=n(4294967296*(s||a.random()));s=987654071*e(),t[r/4]=4294967296*e()|0}return e}},we={ctrGladman:class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,s=255&e;255===t?(t=0,255===n?(n=0,255===s?s=0:++s):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=s}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let s;if(!(s=t.length))return[];const r=ue.bitLength(t);for(let r=0;r<s;r+=4){this.incCounter(n);const s=e.encrypt(n);t[r]^=s[0],t[r+1]^=s[1],t[r+2]^=s[2],t[r+3]^=s[3]}return ue.clamp(t,r)}}},ge={importKey:e=>new ge.hmacSha1(fe.bytes.toBits(e)),pbkdf2(e,t,n,s){if(n=n||1e4,s<0||n<0)throw new f(\"invalid params to pbkdf2\");const r=1+(s>>5)<<2;let a,i,o,c,l;const u=new ArrayBuffer(r),d=new w(u);let h=0;const p=ue;for(t=fe.bytes.toBits(t),l=1;h<(r||1);l++){for(a=i=e.encrypt(p.concat(t,[l])),o=1;o<n;o++)for(i=e.encrypt(i),c=0;c<i.length;c++)a[c]^=i[c];for(o=0;h<(r||1)&&o<a.length;o++)d.setInt32(h,a[o]),h+=4}return u.slice(0,s/8)},hmacSha1:class{constructor(e){const t=this,n=t._hash=de.sha1,s=[[],[]];t._baseHash=[new n,new n];const r=t._baseHash[0].blockSize/32;e.length>r&&(e=(new n).update(e).finalize());for(let t=0;t<r;t++)s[0][t]=909522486^e[t],s[1][t]=1549556828^e[t];t._baseHash[0].update(s[0]),t._baseHash[1].update(s[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new f(\"encrypt on already updated hmac called!\");return this.update(e),this.digest(e)}}},me=typeof z!=Z&&typeof z.getRandomValues==G,ye=\"Invalid password\",be=\"Invalid signature\",ze=\"zipjs-abort-check-password\";function Se(e){return me?z.getRandomValues(e):pe.getRandomValues(e)}const ve=16,ke={name:\"PBKDF2\"},xe=t.assign({hash:{name:\"HMAC\"}},ke),De=t.assign({iterations:1e3,hash:{name:\"SHA-1\"}},ke),_e=[\"deriveBits\"],Ce=[8,12,16],Fe=[16,24,32],Te=10,Ee=[0,0,0,0],Ae=typeof z!=Z,We=Ae&&z.subtle,Ue=Ae&&typeof We!=Z,Re=fe.bytes,Ne=he.aes,He=we.ctrGladman,Pe=ge.hmacSha1;let qe=Ae&&Ue&&typeof We.importKey==G,Be=Ae&&Ue&&typeof We.deriveBits==G;class Ie extends v{constructor({password:e,rawPassword:n,signed:s,encryptionStrength:r,checkPasswordOnly:a}){super({start(){t.assign(this,{ready:new m(e=>this.resolveReady=e),password:Ve(e,n),signed:s,strength:r-1,pending:new d})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:i,ready:o}=n;s?(await async function(e,t,n,s){const r=await Oe(e,t,n,$e(s,0,Ce[t])),a=$e(s,Ce[t]);if(r[0]!=a[0]||r[1]!=a[1])throw new f(ye)}(n,r,s,$e(e,0,Ce[r]+2)),e=$e(e,Ce[r]+2),a?t.error(new f(ze)):i()):await o;const c=new d(e.length-Te-(e.length-Te)%ve);t.enqueue(Le(n,e,c,0,Te,!0))},async flush(e){const{signed:t,ctr:n,hmac:s,pending:r,ready:a}=this;if(s&&n){await a;const i=$e(r,0,r.length-Te),o=$e(r,r.length-Te);let c=new d;if(i.length){const e=Ge(Re,i);s.update(e);const t=n.update(e);c=Ze(Re,t)}if(t){const e=$e(Ze(Re,s.digest()),0,Te);for(let t=0;t<Te;t++)if(e[t]!=o[t])throw new f(be)}e.enqueue(c)}}})}}class Me extends v{constructor({password:e,rawPassword:n,encryptionStrength:s}){let r;super({start(){t.assign(this,{ready:new m(e=>this.resolveReady=e),password:Ve(e,n),strength:s-1,pending:new d})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:a,ready:i}=n;let o=new d;s?(o=await async function(e,t,n){const s=Se(new d(Ce[t])),r=await Oe(e,t,n,s);return Ke(s,r)}(n,r,s),a()):await i;const c=new d(o.length+e.length-e.length%ve);c.set(o,0),t.enqueue(Le(n,e,c,o.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:a}=this;if(n&&t){await a;let i=new d;if(s.length){const e=t.update(Ge(Re,s));n.update(e),i=Ze(Re,e)}r.signature=Ze(Re,n.digest()).slice(0,Te),e.enqueue(Ke(i,r.signature))}}}),r=this}}function Le(e,t,n,s,r,a){const{ctr:i,hmac:o,pending:c}=e,l=t.length-r;let u;for(c.length&&(t=Ke(c,t),n=function(e,t){if(t&&t>e.length){const n=e;(e=new d(t)).set(n,0)}return e}(n,l-l%ve)),u=0;u<=l-ve;u+=ve){const e=Ge(Re,$e(t,u,u+ve));a&&o.update(e);const r=i.update(e);a||o.update(r),n.set(Ze(Re,r),u+s)}return e.pending=$e(t,u),n}async function Oe(n,s,r,a){n.password=null;const i=await async function(e,t,n,s,r){if(!qe)return ge.importKey(t);try{return await We.importKey(e,t,n,s,r)}catch(e){return qe=!1,ge.importKey(t)}}(\"raw\",r,xe,!1,_e),o=await async function(e,t,n){if(!Be)return ge.pbkdf2(t,e.salt,De.iterations,n);try{return await We.deriveBits(e,t,n)}catch(s){return Be=!1,ge.pbkdf2(t,e.salt,De.iterations,n)}}(t.assign({salt:a},De),i,8*(2*Fe[s]+2)),c=new d(o),l=Ge(Re,$e(c,0,Fe[s])),u=Ge(Re,$e(c,Fe[s],2*Fe[s])),f=$e(c,2*Fe[s]);return t.assign(n,{keys:{key:l,authentication:u,passwordVerification:f},ctr:new He(new Ne(l),e.from(Ee)),hmac:new Pe(u)}),f}function Ve(e,t){return t===$?le(e):t}function Ke(e,t){let n=e;return e.length+t.length&&(n=new d(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function $e(e,t,n){return e.subarray(t,n)}function Ze(e,t){return e.fromBits(t)}function Ge(e,t){return e.toBits(t)}const je=12;class Je extends v{constructor({password:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){t.assign(this,{password:e,passwordVerification:n}),et(this,e)},transform(e,t){const n=this;if(n.password){const t=Ye(n,e.subarray(0,je));if(n.password=null,t[11]!=n.passwordVerification)throw new f(ye);e=e.subarray(je)}s?t.error(new f(ze)):t.enqueue(Ye(n,e))}})}}class Xe extends v{constructor({password:e,passwordVerification:n}){super({start(){t.assign(this,{password:e,passwordVerification:n}),et(this,e)},transform(e,t){const n=this;let s,r;if(n.password){n.password=null;const t=Se(new d(je));t[11]=n.passwordVerification,s=new d(e.length+t.length),s.set(Qe(n,t),0),r=je}else s=new d(e.length),r=0;s.set(Qe(n,e),r),t.enqueue(s)}})}}function Ye(e,t){const n=new d(t.length);for(let s=0;s<t.length;s++)n[s]=nt(e)^t[s],tt(e,n[s]);return n}function Qe(e,t){const n=new d(t.length);for(let s=0;s<t.length;s++)n[s]=nt(e)^t[s],tt(e,t[s]);return n}function et(e,n){const s=[305419896,591751049,878082192];t.assign(e,{keys:s,crcKey0:new oe(s[0]),crcKey2:new oe(s[2])});for(let t=0;t<n.length;t++)tt(e,n.charCodeAt(t))}function tt(e,t){let[n,s,r]=e.keys;e.crcKey0.append([t]),n=~e.crcKey0.get(),s=rt(a.imul(rt(s+st(n)),134775813)+1),e.crcKey2.append([s>>>24]),r=~e.crcKey2.get(),e.keys=[n,s,r]}function nt(e){const t=2|e.keys[2];return st(a.imul(t,1^t)>>>8)}function st(e){return 255&e}function rt(e){return 4294967295&e}const at=\"deflate-raw\";class it extends v{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:s}){super({});const{compressed:r,encrypted:a,useCompressionStream:i,zipCrypto:o,signed:c,level:l}=e,u=this;let f,d,h=ct(super.readable);a&&!o||!c||(f=new ce,h=ft(h,f)),r&&(h=ut(h,i,{level:l,chunkSize:t},s,n)),a&&(o?h=ft(h,new Xe(e)):(d=new Me(e),h=ft(h,d))),lt(u,h,()=>{let e;a&&!o&&(e=d.signature),a&&!o||!c||(e=new w(f.value.buffer).getUint32(0)),u.signature=e})}}class ot extends v{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:s}){super({});const{zipCrypto:r,encrypted:a,signed:i,signature:o,compressed:c,useCompressionStream:l}=e;let u,d,h=ct(super.readable);a&&(r?h=ft(h,new Je(e)):(d=new Ie(e),h=ft(h,d))),c&&(h=ut(h,l,{chunkSize:t},s,n)),a&&!r||!i||(u=new ce,h=ft(h,u)),lt(this,h,()=>{if((!a||r)&&i){const e=new w(u.value.buffer);if(o!=e.getUint32(0,!1))throw new f(be)}})}}function ct(e){return ft(e,new v({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function lt(e,n,s){n=ft(n,new v({flush:s})),t.defineProperty(e,\"readable\",{get:()=>n})}function ut(e,t,n,s,r){try{e=ft(e,new(t&&s?s:r)(at,n))}catch(s){if(!t)return e;try{e=ft(e,new r(at,n))}catch(t){return e}}return e}function ft(e,t){return e.pipeThrough(t)}const dt=\"message\",ht=\"start\",pt=\"pull\",wt=\"data\",gt=\"close\",mt=\"deflate\",yt=\"inflate\";class bt extends v{constructor(e,n){super({});const s=this,{codecType:r}=e;let a;r.startsWith(mt)?a=it:r.startsWith(yt)&&(a=ot);let i=0,o=0;const c=new a(e,n),l=super.readable,u=new v({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){t.assign(s,{inputSize:o})}}),f=new v({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){const{signature:e}=c;t.assign(s,{signature:e,outputSize:i,inputSize:o})}});t.defineProperty(s,\"readable\",{get:()=>l.pipeThrough(u).pipeThrough(c).pipeThrough(f)})}}class zt extends v{constructor(e){let t;super({transform:function n(s,r){if(t){const e=new d(t.length+s.length);e.set(t),e.set(s,t.length),s=e,t=null}s.length>e?(r.enqueue(s.slice(0,e)),n(s.slice(e),r)):t=s},flush(e){t&&t.length&&e.enqueue(t)}})}}let St=typeof F!=Z;class vt{constructor(e,{readable:n,writable:s},{options:r,config:a,streamOptions:i,useWebWorkers:o,transferStreams:c,scripts:l},u){const{signal:f}=i;return t.assign(e,{busy:!0,readable:n.pipeThrough(new zt(a.chunkSize)).pipeThrough(new kt(n,i),{signal:f}),writable:s,options:t.assign({},r),scripts:l,transferStreams:c,terminate:()=>new m(t=>{const{worker:n,busy:s}=e;n?(s?e.resolveTerminated=t:(n.terminate(),t()),e.interface=null):t()}),onTaskFinished(){const{resolveTerminated:t}=e;t&&(e.resolveTerminated=null,e.terminated=!0,e.worker.terminate(),t()),e.busy=!1,u(e)}}),(o&&St?_t:Dt)(e,a)}}class kt extends v{constructor(e,{onstart:t,onprogress:n,size:s,onend:r}){let a=0;super({async start(){t&&await xt(t,s)},async transform(e,t){a+=e.length,n&&await xt(n,a,s),t.enqueue(e)},async flush(){e.size=a,r&&await xt(r,a)}})}}async function xt(e,...t){try{await e(...t)}catch(e){}}function Dt(e,t){return{run:()=>async function({options:e,readable:t,writable:n,onTaskFinished:s},r){try{const s=new bt(e,r);await t.pipeThrough(s).pipeTo(n,{preventClose:!0,preventAbort:!0});const{signature:a,inputSize:i,outputSize:o}=s;return{signature:a,inputSize:i,outputSize:o}}finally{s()}}(e,t)}}function _t(e,n){const{baseURL:s,chunkSize:r}=n;if(!e.interface){let a;try{a=function(e,n,s){const r={type:\"module\"};let a,i;typeof e==G&&(e=e());try{a=new u(e,n)}catch(t){a=e}if(Ct)try{i=new F(a)}catch(e){Ct=!1,i=new F(a,r)}else i=new F(a,r);return i.addEventListener(dt,e=>async function({data:e},n){const{type:s,value:r,messageId:a,result:i,error:o}=e,{reader:c,writer:l,resolveResult:u,rejectResult:h,onTaskFinished:p}=n;try{if(o){const{message:e,stack:n,code:s,name:r}=o,a=new f(e);t.assign(a,{stack:n,code:s,name:r}),w(a)}else{if(s==pt){const{value:e,done:t}=await c.read();Tt({type:wt,value:e,done:t,messageId:a},n)}s==wt&&(await l.ready,await l.write(new d(r)),Tt({type:\"ack\",messageId:a},n)),s==gt&&w(null,i)}}catch(o){Tt({type:gt,messageId:a},n),w(o)}function w(e,t){e?h(e):u(t),l&&l.releaseLock(),p()}}(e,s)),i}(e.scripts[0],s,e)}catch(t){return St=!1,Dt(e,n)}t.assign(e,{worker:a,interface:{run:()=>async function(e,n){let s,r;const a=new m((e,t)=>{s=e,r=t});t.assign(e,{reader:null,writer:null,resolveResult:s,rejectResult:r,result:a});const{readable:i,options:o,scripts:c}=e,{writable:l,closed:u}=function(e){let t;const n=new m(e=>t=e),s=new x({async write(t){const n=e.getWriter();await n.ready,await n.write(t),n.releaseLock()},close(){t()},abort:t=>e.getWriter().abort(t)});return{writable:s,closed:n}}(e.writable),f=Tt({type:ht,scripts:c.slice(1),options:o,config:n,readable:i,writable:l},e);f||t.assign(e,{reader:i.getReader(),writer:l.getWriter()});const d=await a;f||await l.getWriter().close();return await u,d}(e,{chunkSize:r})}})}return e.interface}let Ct=!0,Ft=!0;function Tt(e,{worker:t,writer:n,onTaskFinished:s,transferStreams:r}){try{let{value:n,readable:s,writable:a}=e;const i=[];if(n&&(n.byteLength<n.buffer.byteLength?e.value=n.buffer.slice(0,n.byteLength):e.value=n.buffer,i.push(e.value)),r&&Ft?(s&&i.push(s),a&&i.push(a)):e.readable=e.writable=null,i.length)try{return t.postMessage(e,i),!0}catch(n){Ft=!1,e.readable=e.writable=null,t.postMessage(e)}else t.postMessage(e)}catch(e){throw n&&n.releaseLock(),s(),e}}let Et=[];const At=[];let Wt=0;async function Ut(e,t){const{options:n,config:r}=t,{transferStreams:a,useWebWorkers:i,useCompressionStream:o,codecType:c,compressed:l,signed:u,encrypted:f}=n,{workerScripts:d,maxWorkers:h}=r;t.transferStreams=a||a===$;const p=!(l||u||f||t.transferStreams);return t.useWebWorkers=!p&&(i||i===$&&r.useWebWorkers),t.scripts=t.useWebWorkers&&d?d[c]:[],n.useCompressionStream=o||o===$&&r.useCompressionStream,(await async function(){const n=Et.find(e=>!e.busy);if(n)return Rt(n),new vt(n,e,t,w);if(Et.length<h){const n={indexWorker:Wt};return Wt++,Et.push(n),new vt(n,e,t,w)}return new m(n=>At.push({resolve:n,stream:e,workerOptions:t}))}()).run();function w(e){if(At.length){const[{resolve:t,stream:n,workerOptions:s}]=At.splice(0,1);t(new vt(e,n,s,w))}else e.worker?(Rt(e),function(e,t){const{config:n}=t,{terminateWorkerTimeout:r}=n;s.isFinite(r)&&r>=0&&(e.terminated?e.terminated=!1:e.terminateTimeout=setTimeout(async()=>{Et=Et.filter(t=>t!=e);try{await e.terminate()}catch(e){}},r))}(e,t)):Et=Et.filter(t=>t!=e)}}function Rt(e){const{terminateTimeout:t}=e;t&&(clearTimeout(t),e.terminateTimeout=null)}async function Nt(){await m.allSettled(Et.map(e=>(Rt(e),e.terminate())))}const Ht=\"HTTP error \",Pt=\"HTTP Range not supported\",qt=\"Writer iterator completed too soon\",Bt=\"Range\",It=\"GET\",Mt=\"bytes\",Lt=65536,Ot=\"writable\";class Vt{constructor(){this.size=0}init(){this.initialized=!0}}class Kt extends Vt{get readable(){const e=this,{chunkSize:t=Lt}=e,n=new k({start(){this.chunkOffset=0},async pull(s){const{offset:r=0,size:i,diskNumberStart:o}=n,{chunkOffset:c}=this;s.enqueue(await vn(e,r+c,a.min(t,i-c),o)),c+t>i?s.close():this.chunkOffset+=t}});return n}}class $t extends Vt{constructor(){super();const e=this,n=new x({write:t=>e.writeUint8Array(t)});t.defineProperty(e,Ot,{get:()=>n})}writeUint8Array(){}}class Zt extends Kt{constructor(e){super();let n=e.length;for(;\"=\"==e.charAt(n-1);)n--;const s=e.indexOf(\",\")+1;t.assign(this,{dataURI:e,dataStart:s,size:a.floor(.75*(n-s))})}readUint8Array(e,t){const{dataStart:n,dataURI:s}=this,r=new d(t),i=4*a.floor(e/3),o=atob(s.substring(i+n,4*a.ceil((e+t)/3)+n)),c=e-3*a.floor(i/4);for(let e=c;e<c+t;e++)r[e-c]=o.charCodeAt(e);return r}}class Gt extends $t{constructor(e){super(),t.assign(this,{data:\"data:\"+(e||\"\")+\";base64,\",pending:[]})}writeUint8Array(e){const t=this;let s=0,r=t.pending;const i=t.pending.length;for(t.pending=\"\",s=0;s<3*a.floor((i+e.length)/3)-i;s++)r+=n.fromCharCode(e[s]);for(;s<e.length;s++)t.pending+=n.fromCharCode(e[s]);r.length>2?t.data+=S(r):t.pending=r}getData(){return this.data+S(this.pending)}}class jt extends Kt{constructor(e){super(),t.assign(this,{blob:e,size:e.size})}async readUint8Array(e,t){const n=this,s=e+t,r=e||s<n.size?n.blob.slice(e,s):n.blob;let a=await r.arrayBuffer();return a.byteLength>t&&(a=a.slice(e,s)),new d(a)}}class Jt extends Vt{constructor(e){super();const n=new v,s=[];e&&s.push([\"Content-Type\",e]),t.defineProperty(this,Ot,{get:()=>n.writable}),this.blob=new l(n.readable,{headers:s}).blob()}getData(){return this.blob}}class Xt extends jt{constructor(e){super(new g([e],{type:\"text/plain\"}))}}class Yt extends Jt{constructor(e){super(e),t.assign(this,{encoding:e,utf8:!e||\"utf-8\"==e.toLowerCase()})}async getData(){const{encoding:e,utf8:n}=this,s=await super.getData();if(s.text&&n)return s.text();{const n=new FileReader;return new m((r,a)=>{t.assign(n,{onload:({target:e})=>r(e.result),onerror:()=>a(n.error)}),n.readAsText(s,e)})}}}class Qt extends Kt{constructor(e,t){super(),tn(this,e,t)}async init(){await nn(this,fn,on),super.init()}readUint8Array(e,t){return sn(this,e,t,fn,on)}}class en extends Kt{constructor(e,t){super(),tn(this,e,t)}async init(){await nn(this,dn,cn),super.init()}readUint8Array(e,t){return sn(this,e,t,dn,cn)}}function tn(e,n,s){const{preventHeadRequest:r,useRangeHeader:a,forceRangeRequests:i,combineSizeEocd:o}=s;delete(s=t.assign({},s)).preventHeadRequest,delete s.useRangeHeader,delete s.forceRangeRequests,delete s.combineSizeEocd,delete s.useXHR,t.assign(e,{url:n,options:s,preventHeadRequest:r,useRangeHeader:a,forceRangeRequests:i,combineSizeEocd:o})}async function nn(e,t,n){const{url:r,preventHeadRequest:a,useRangeHeader:i,forceRangeRequests:o,combineSizeEocd:c}=e;if(function(e){const{baseURL:t}=Q(),{protocol:n}=new u(e,t);return\"http:\"==n||\"https:\"==n}(r)&&(i||o)&&(void 0===a||a)){const r=await t(It,e,rn(e,c?-22:void 0));if(!o&&r.headers.get(\"Accept-Ranges\")!=Mt)throw new f(Pt);{let a;c&&(e.eocdCache=new d(await r.arrayBuffer()));const i=r.headers.get(\"Content-Range\");if(i){const e=i.trim().split(/\\s*\\/\\s*/);if(e.length){const t=e[1];t&&\"*\"!=t&&(a=s(t))}}a===$?await un(e,t,n):e.size=a}}else await un(e,t,n)}async function sn(e,t,n,s,r){const{useRangeHeader:a,forceRangeRequests:i,eocdCache:o,size:c,options:l}=e;if(a||i){if(o&&t==c-q&&n==q)return o;const r=await s(It,e,rn(e,t,n));if(206!=r.status)throw new f(Pt);return new d(await r.arrayBuffer())}{const{data:s}=e;return s||await r(e,l),new d(e.data.subarray(t,t+n))}}function rn(e,n=0,s=1){return t.assign({},an(e),{[Bt]:Mt+\"=\"+(n<0?n:n+\"-\"+(n+s-1))})}function an({options:e}){const{headers:n}=e;if(n)return Symbol.iterator in n?t.fromEntries(n):n}async function on(e){await ln(e,fn)}async function cn(e){await ln(e,dn)}async function ln(e,t){const n=await t(It,e,an(e));e.data=new d(await n.arrayBuffer()),e.size||(e.size=e.data.length)}async function un(e,t,n){if(e.preventHeadRequest)await n(e,e.options);else{const r=(await t(\"HEAD\",e,an(e))).headers.get(\"Content-Length\");r?e.size=s(r):await n(e,e.options)}}async function fn(e,{options:n,url:s},r){const a=await fetch(s,t.assign({},n,{method:e,headers:r}));if(a.status<400)return a;throw 416==a.status?new f(Pt):new f(Ht+(a.statusText||a.status))}function dn(e,{url:n},s){return new m((r,a)=>{const i=new XMLHttpRequest;if(i.addEventListener(\"load\",()=>{if(i.status<400){const e=[];i.getAllResponseHeaders().trim().split(/[\\r\\n]+/).forEach(t=>{const n=t.trim().split(/\\s*:\\s*/);n[0]=n[0].trim().replace(/^[a-z]|-[a-z]/g,e=>e.toUpperCase()),e.push(n)}),r({status:i.status,arrayBuffer:()=>i.response,headers:new o(e)})}else a(416==i.status?new f(Pt):new f(Ht+(i.statusText||i.status)))},!1),i.addEventListener(\"error\",e=>a(e.detail?e.detail.error:new f(\"Network error\")),!1),i.open(e,n),s)for(const e of t.entries(s))i.setRequestHeader(e[0],e[1]);i.responseType=\"arraybuffer\",i.send()})}class hn extends Kt{constructor(e,n={}){super(),t.assign(this,{url:e,reader:n.useXHR?new en(e,n):new Qt(e,n)})}set size(e){}get size(){return this.reader.size}async init(){await this.reader.init(),super.init()}readUint8Array(e,t){return this.reader.readUint8Array(e,t)}}class pn extends hn{constructor(e,t={}){t.useRangeHeader=!0,super(e,t)}}class wn extends Kt{constructor(e){super(),t.assign(this,{array:e,size:e.length})}readUint8Array(e,t){return this.array.slice(e,e+t)}}class gn extends $t{init(e=0){t.assign(this,{offset:0,array:new d(e)}),super.init()}writeUint8Array(e){const t=this;if(t.offset+e.length>t.array.length){const n=t.array;t.array=new d(n.length+e.length),t.array.set(n)}t.array.set(e,t.offset),t.offset+=e.length}getData(){return this.array}}class mn extends Kt{constructor(e){super(),this.readers=e}async init(){const e=this,{readers:t}=e;e.lastDiskNumber=0,e.lastDiskOffset=0,await m.all(t.map(async(n,s)=>{await n.init(),s!=t.length-1&&(e.lastDiskOffset+=n.size),e.size+=n.size})),super.init()}async readUint8Array(e,t,n=0){const s=this,{readers:r}=this;let i,o=n;-1==o&&(o=r.length-1);let c=e;for(;c>=r[o].size;)c-=r[o].size,o++;const l=r[o],u=l.size;if(c+t<=u)i=await vn(l,c,t);else{const r=u-c;i=new d(t),i.set(await vn(l,c,r)),i.set(await s.readUint8Array(e+r,t-r,n),r)}return s.lastDiskNumber=a.max(o,s.lastDiskNumber),i}}class yn extends Vt{constructor(e,n=4294967295){super();const s=this;let r,a,i;t.assign(s,{diskNumber:0,diskOffset:0,size:0,maxSize:n,availableSize:n});const o=new x({async write(t){const{availableSize:n}=s;if(i)t.length>=n?(await c(t.slice(0,n)),await l(),s.diskOffset+=r.size,s.diskNumber++,i=null,await this.write(t.slice(n))):await c(t);else{const{value:n,done:o}=await e.next();if(o&&!n)throw new f(qt);r=n,r.size=0,r.maxSize&&(s.maxSize=r.maxSize),s.availableSize=s.maxSize,await bn(r),a=n.writable,i=a.getWriter(),await this.write(t)}},async close(){await i.ready,await l()}});async function c(e){const t=e.length;t&&(await i.ready,await i.write(e),r.size+=t,s.size+=t,s.availableSize-=t)}async function l(){a.size=r.size,await i.close()}t.defineProperty(s,Ot,{get:()=>o})}}async function bn(e,t){if(!e.init||e.initialized)return m.resolve();await e.init(t)}function zn(t){return e.isArray(t)&&(t=new mn(t)),t instanceof k&&(t={readable:t}),t}function Sn(e){e.writable===$&&typeof e.next==G&&(e=new yn(e)),e instanceof x&&(e={writable:e});const{writable:n}=e;return n.size===$&&(n.size=0),e instanceof yn||t.assign(e,{diskNumber:0,diskOffset:0,availableSize:1/0,maxSize:1/0}),e}function vn(e,t,n,s){return e.readUint8Array(t,n,s)}const kn=mn,xn=yn,Dn=\"\\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \".split(\"\"),_n=256==Dn.length;function Cn(e,t){return t&&\"cp437\"==t.trim().toLowerCase()?function(e){if(_n){let t=\"\";for(let n=0;n<e.length;n++)t+=Dn[e[n]];return t}return(new b).decode(e)}(e):new b(t).decode(e)}const Fn=\"filename\",Tn=\"rawFilename\",En=\"comment\",An=\"rawComment\",Wn=\"uncompressedSize\",Un=\"compressedSize\",Rn=\"offset\",Nn=\"diskNumberStart\",Hn=\"lastModDate\",Pn=\"rawLastModDate\",qn=\"lastAccessDate\",Bn=\"rawLastAccessDate\",In=\"creationDate\",Mn=\"rawCreationDate\",Ln=\"internalFileAttribute\",On=\"externalFileAttribute\",Vn=\"msDosCompatible\",Kn=\"zip64\",$n=[Fn,Tn,Un,Wn,Hn,Pn,En,An,qn,In,Rn,Nn,Nn,Ln,On,Vn,Kn,\"directory\",\"bitFlag\",\"encrypted\",\"signature\",\"filenameUTF8\",\"commentUTF8\",\"compressionMethod\",\"version\",\"versionMadeBy\",\"extraField\",\"rawExtraField\",\"extraFieldZip64\",\"extraFieldUnicodePath\",\"extraFieldUnicodeComment\",\"extraFieldAES\",\"extraFieldNTFS\",\"extraFieldExtendedTimestamp\"];class Zn{constructor(e){$n.forEach(t=>this[t]=e[t])}}const Gn=\"File format is not recognized\",jn=\"End of central directory not found\",Jn=\"End of Zip64 central directory locator not found\",Xn=\"Central directory header not found\",Yn=\"Local file header not found\",Qn=\"Zip64 extra field not found\",es=\"File contains encrypted entry\",ts=\"Encryption method not supported\",ns=\"Compression method not supported\",ss=\"Split zip file\",rs=\"utf-8\",as=\"cp437\",is=[[Wn,T],[Un,T],[Rn,T],[Nn,E]],os={[E]:{getValue:bs,bytes:4},[T]:{getValue:zs,bytes:8}};class cs{constructor(e,n={}){t.assign(this,{reader:zn(e),options:n,config:Q()})}async*getEntriesGenerator(e={}){const n=this;let{reader:s}=n;const{config:r}=n;if(await bn(s),s.size!==$&&s.readUint8Array||(s=new jt(await new l(s.readable).blob()),await bn(s)),s.size<q)throw new f(Gn);s.chunkSize=ee(r);const i=await async function(e,t,n,s,r){const i=new d(4);!function(e,t,n){e.setUint32(t,n,!0)}(Ss(i),0,t);const o=s+r;return await c(s)||await c(a.min(o,n));async function c(t){const r=n-t,a=await vn(e,r,t);for(let e=a.length-s;e>=0;e--)if(a[e]==i[0]&&a[e+1]==i[1]&&a[e+2]==i[2]&&a[e+3]==i[3])return{offset:r+e,buffer:a.slice(e,e+s).buffer}}}(s,N,s.size,q,1048560);if(!i){throw bs(Ss(await vn(s,0,4)))==W?new f(ss):new f(jn)}const o=Ss(i);let c=bs(o,12),u=bs(o,16);const h=i.offset,p=ys(o,20),w=h+q+p;let g=ys(o,4);const m=s.lastDiskNumber||0;let y=ys(o,6),b=ys(o,8),z=0,S=0;if(u==T||c==T||b==E||y==E){const e=Ss(await vn(s,i.offset-20,20));if(bs(e,0)==P){u=zs(e,8);let t=await vn(s,u,56,-1),n=Ss(t);const r=i.offset-20-56;if(bs(n,0)!=H&&u!=r){const e=u;u=r,z=u-e,t=await vn(s,u,56,-1),n=Ss(t)}if(bs(n,0)!=H)throw new f(Jn);g==E&&(g=bs(n,16)),y==E&&(y=bs(n,20)),b==E&&(b=zs(n,32)),c==T&&(c=zs(n,40)),u-=c}}if(u>=s.size&&(z=s.size-u-c-q,u=s.size-c-q),m!=g)throw new f(ss);if(u<0)throw new f(Gn);let v=0,k=await vn(s,u,c,y),x=Ss(k);if(c){const e=i.offset-c;if(bs(x,v)!=R&&u!=e){const t=u;u=e,z+=u-t,k=await vn(s,u,c,y),x=Ss(k)}}const D=i.offset-u-(s.lastDiskOffset||0);if(c!=D&&D>=0&&(c=D,k=await vn(s,u,c,y),x=Ss(k)),u<0||u>=s.size)throw new f(Gn);const _=ps(n,e,\"filenameEncoding\"),C=ps(n,e,\"commentEncoding\");for(let i=0;i<b;i++){const o=new us(s,r,n.options);if(bs(x,v)!=R)throw new f(Xn);fs(o,x,v+6);const c=Boolean(o.bitFlag.languageEncodingFlag),l=v+46,u=l+o.filenameLength,d=u+o.extraFieldLength,h=ys(x,v+4),p=!(0&h),w=k.subarray(l,u),g=ys(x,v+32),m=d+g,y=k.subarray(d,m),D=c,F=c,T=p&&!(16&~ms(x,v+38)),E=bs(x,v+42)+z;t.assign(o,{versionMadeBy:h,msDosCompatible:p,compressedSize:0,uncompressedSize:0,commentLength:g,directory:T,offset:E,diskNumberStart:ys(x,v+34),internalFileAttribute:ys(x,v+36),externalFileAttribute:bs(x,v+38),rawFilename:w,filenameUTF8:D,commentUTF8:F,rawExtraField:k.subarray(u,d)});const A=ps(n,e,\"decodeText\")||Cn,W=D?rs:_||as,U=F?rs:C||as;let N=A(w,W);N===$&&(N=Cn(w,W));let H=A(y,U);H===$&&(H=Cn(y,U)),t.assign(o,{rawComment:y,filename:N,comment:H,directory:T||N.endsWith(O)}),S=a.max(E,S),await ds(o,o,x,v+6);const P=new Zn(o);P.getData=(e,t)=>o.getData(e,P,t),v=m;const{onprogress:q}=e;if(q)try{await q(i+1,b,new Zn(o))}catch(e){}yield P}const F=ps(n,e,\"extractPrependedData\"),A=ps(n,e,\"extractAppendedData\");return F&&(n.prependedData=S>0?await vn(s,0,S):new d),n.comment=p?await vn(s,h+q,p):new d,A&&(n.appendedData=w<s.size?await vn(s,w,s.size-w):new d),!0}async getEntries(e={}){const t=[];for await(const n of this.getEntriesGenerator(e))t.push(n);return t}async close(){}}class ls{constructor(e={}){const{readable:t,writable:n}=new v,s=new cs(t,e).getEntriesGenerator();this.readable=new k({async pull(e){const{done:t,value:n}=await s.next();if(t)return e.close();const r={...n,readable:function(){const{readable:e,writable:t}=new v;if(n.getData)return n.getData(t),e}()};delete r.getData,e.enqueue(r)}}),this.writable=n}}class us{constructor(e,n,s){t.assign(this,{reader:e,config:n,options:s})}async getData(e,n,s={}){const r=this,{reader:a,offset:i,diskNumberStart:o,extraFieldAES:c,compressionMethod:l,config:u,bitFlag:h,signature:p,rawLastModDate:w,uncompressedSize:g,compressedSize:m}=r,y=n.localDirectory={},b=Ss(await vn(a,i,30,o));let z=ps(r,s,\"password\"),S=ps(r,s,\"rawPassword\");if(z=z&&z.length&&z,S=S&&S.length&&S,c&&99!=c.originalCompressionMethod)throw new f(ns);if(0!=l&&8!=l)throw new f(ns);if(bs(b,0)!=A)throw new f(Yn);fs(y,b,4),y.rawExtraField=y.extraFieldLength?await vn(a,i+30+y.filenameLength,y.extraFieldLength,o):new d,await ds(r,y,b,4,!0),t.assign(n,{lastAccessDate:y.lastAccessDate,creationDate:y.creationDate});const v=r.encrypted&&y.encrypted,k=v&&!c;if(v){if(!k&&c.strength===$)throw new f(ts);if(!z&&!S)throw new f(es)}const D=i+30+y.filenameLength+y.extraFieldLength,_=m,C=a.readable;t.assign(C,{diskNumberStart:o,offset:D,size:_});const F=ps(r,s,\"signal\"),T=ps(r,s,\"checkPasswordOnly\");T&&(e=new x),e=Sn(e),await bn(e,g);const{writable:E}=e,{onstart:W,onprogress:U,onend:R}=s,N={options:{codecType:yt,password:z,rawPassword:S,zipCrypto:k,encryptionStrength:c&&c.strength,signed:ps(r,s,\"checkSignature\"),passwordVerification:k&&(h.dataDescriptor?w>>>8&255:p>>>24&255),signature:p,compressed:0!=l,encrypted:v,useWebWorkers:ps(r,s,\"useWebWorkers\"),useCompressionStream:ps(r,s,\"useCompressionStream\"),transferStreams:ps(r,s,\"transferStreams\"),checkPasswordOnly:T},config:u,streamOptions:{signal:F,size:_,onstart:W,onprogress:U,onend:R}};let H=0;try{({outputSize:H}=await Ut({readable:C,writable:E},N))}catch(e){if(!T||e.message!=ze)throw e}finally{const e=ps(r,s,\"preventClose\");E.size+=H,e||E.locked||await E.getWriter().close()}return T?$:e.getData?e.getData():E}}function fs(e,n,s){const r=e.rawBitFlag=ys(n,s+2),a=!(1&~r),i=bs(n,s+6);t.assign(e,{encrypted:a,version:ys(n,s),bitFlag:{level:(6&r)>>1,dataDescriptor:!(8&~r),languageEncodingFlag:(r&L)==L},rawLastModDate:i,lastModDate:ws(i),filenameLength:ys(n,s+22),extraFieldLength:ys(n,s+24)})}async function ds(e,n,s,r,a){const{rawExtraField:c}=n,l=n.extraField=new o,u=Ss(new d(c));let h=0;try{for(;h<c.length;){const e=ys(u,h),t=ys(u,h+2);l.set(e,{type:e,data:c.slice(h+4,h+4+t)}),h+=4+t}}catch(e){}const p=ys(s,r+4);t.assign(n,{signature:bs(s,r+10),uncompressedSize:bs(s,r+18),compressedSize:bs(s,r+14)});const w=l.get(1);w&&(!function(e,t){t.zip64=!0;const n=Ss(e.data),s=is.filter(([e,n])=>t[e]==n);for(let r=0,a=0;r<s.length;r++){const[i,o]=s[r];if(t[i]==o){const s=os[o];t[i]=e[i]=s.getValue(n,a),a+=s.bytes}else if(e[i])throw new f(Qn)}}(w,n),n.extraFieldZip64=w);const g=l.get(28789);g&&(await hs(g,Fn,Tn,n,e),n.extraFieldUnicodePath=g);const m=l.get(25461);m&&(await hs(m,En,An,n,e),n.extraFieldUnicodeComment=m);const y=l.get(39169);y?(!function(e,n,s){const r=Ss(e.data),a=ms(r,4);t.assign(e,{vendorVersion:ms(r,0),vendorId:ms(r,2),strength:a,originalCompressionMethod:s,compressionMethod:ys(r,5)}),n.compressionMethod=e.compressionMethod}(y,n,p),n.extraFieldAES=y):n.compressionMethod=p;const b=l.get(10);b&&(!function(e,n){const s=Ss(e.data);let r,a=4;try{for(;a<e.data.length&&!r;){const t=ys(s,a),n=ys(s,a+2);1==t&&(r=e.data.slice(a+4,a+4+n)),a+=4+n}}catch(e){}try{if(r&&24==r.length){const s=Ss(r),a=s.getBigUint64(0,!0),i=s.getBigUint64(8,!0),o=s.getBigUint64(16,!0);t.assign(e,{rawLastModDate:a,rawLastAccessDate:i,rawCreationDate:o});const c=gs(a),l=gs(i),u={lastModDate:c,lastAccessDate:l,creationDate:gs(o)};t.assign(e,u),t.assign(n,u)}}catch(e){}}(b,n),n.extraFieldNTFS=b);const z=l.get(I);z&&(!function(e,t,n){const s=Ss(e.data),r=ms(s,0),a=[],o=[];n?(1&~r||(a.push(Hn),o.push(Pn)),2&~r||(a.push(qn),o.push(Bn)),4&~r||(a.push(In),o.push(Mn))):e.data.length>=5&&(a.push(Hn),o.push(Pn));let c=1;a.forEach((n,r)=>{if(e.data.length>=c+4){const a=bs(s,c);t[n]=e[n]=new i(1e3*a);const l=o[r];e[l]=a}c+=4})}(z,n,a),n.extraFieldExtendedTimestamp=z);const S=l.get(6534);S&&(n.extraFieldUSDZ=S)}async function hs(e,n,s,r,a){const i=Ss(e.data),o=new oe;o.append(a[s]);const c=Ss(new d(4));c.setUint32(0,o.get(),!0);const l=bs(i,1);t.assign(e,{version:ms(i,0),[n]:Cn(e.data.subarray(5)),valid:!a.bitFlag.languageEncodingFlag&&l==bs(c,0)}),e.valid&&(r[n]=e[n],r[n+\"UTF8\"]=!0)}function ps(e,t,n){return t[n]===$?e.options[n]:t[n]}function ws(e){const t=(4294901760&e)>>16,n=65535&e;try{return new i(1980+((65024&t)>>9),((480&t)>>5)-1,31&t,(63488&n)>>11,(2016&n)>>5,2*(31&n),0)}catch(e){}}function gs(e){return new i(s(e/r(1e4)-r(116444736e5)))}function ms(e,t){return e.getUint8(t)}function ys(e,t){return e.getUint16(t,!0)}function bs(e,t){return e.getUint32(t,!0)}function zs(e,t){return s(e.getBigUint64(t,!0))}function Ss(e){return new w(e.buffer)}const vs=\"File already exists\",ks=\"Zip file comment exceeds 64KB\",xs=\"File entry comment exceeds 64KB\",Ds=\"File entry name exceeds 64KB\",_s=\"Version exceeds 65535\",Cs=\"The strength must equal 1, 2, or 3\",Fs=\"Extra field type exceeds 65535\",Ts=\"Extra field data exceeds 64KB\",Es=\"Zip64 is not supported (make sure 'keepOrder' is set to 'true')\",As=new d([7,0,2,0,65,69,3,0,0]);let Ws=0;const Us=[];class Rs{constructor(e,n={}){const s=(e=Sn(e)).availableSize!==$&&e.availableSize>0&&e.availableSize!==1/0&&e.maxSize!==$&&e.maxSize>0&&e.maxSize!==1/0;t.assign(this,{writer:e,addSplitZipSignature:s,options:n,config:Q(),files:new o,filenames:new c,offset:e.writable.size,pendingEntriesSize:0,pendingAddFileCalls:new c,bufferedWrites:0})}async add(n=\"\",s,o={}){const c=this,{pendingAddFileCalls:u,config:g}=c;let y;Ws<g.maxWorkers?Ws++:await new m(e=>Us.push(e));try{if(n=n.trim(),c.filenames.has(n))throw new f(vs);return c.filenames.add(n),y=async function(n,s,o,c){s=s.trim(),c.directory&&!s.endsWith(O)?s+=O:c.directory=s.endsWith(O);const u=qs(n,c,\"encodeText\",le);let g=u(s);g===$&&(g=le(s));if(Ks(g)>E)throw new f(Ds);const y=c.comment||\"\";let b=u(y);b===$&&(b=le(y));if(Ks(b)>E)throw new f(xs);const z=qs(n,c,\"version\",20);if(z>E)throw new f(_s);const S=qs(n,c,\"versionMadeBy\",20);if(S>E)throw new f(_s);const k=qs(n,c,Hn,new i),x=qs(n,c,qn),D=qs(n,c,In),_=qs(n,c,Vn,!0),C=qs(n,c,Ln,0),F=qs(n,c,On,0),R=qs(n,c,\"password\"),N=qs(n,c,\"rawPassword\"),H=qs(n,c,\"encryptionStrength\",3),P=qs(n,c,\"zipCrypto\"),q=qs(n,c,\"extendedTimestamp\",!0),Z=qs(n,c,\"keepOrder\",!0),G=qs(n,c,\"level\"),j=qs(n,c,\"useWebWorkers\"),J=qs(n,c,\"bufferedWrite\"),X=qs(n,c,\"dataDescriptorSignature\",!1),Y=qs(n,c,\"signal\"),Q=qs(n,c,\"useCompressionStream\");let te=qs(n,c,\"dataDescriptor\",!0),ne=qs(n,c,Kn);if(R!==$&&H!==$&&(H<1||H>3))throw new f(Cs);let se=new d;const{extraField:re}=c;if(re){let e=0,t=0;re.forEach(t=>e+=4+Ks(t)),se=new d(e),re.forEach((e,n)=>{if(n>E)throw new f(Fs);if(Ks(e)>E)throw new f(Ts);Os(se,new h([n]),t),Os(se,new h([Ks(e)]),t+2),Os(se,e,t+4),t+=4+Ks(e)})}let ae=0,ie=0,oe=0;const ce=!0===ne;o&&(o=zn(o),await bn(o),o.size===$?(te=!0,(ne||ne===$)&&(ne=!0,oe=ae=4294967296)):(oe=o.size,ae=function(e){return e+5*(a.floor(e/16383)+1)}(oe)));const{diskOffset:ue,diskNumber:fe,maxSize:de}=n.writer,he=ce||oe>T,pe=ce||ae>T,we=ce||n.offset+n.pendingEntriesSize-ue>T,ge=qs(n,c,\"supportZip64SplitFile\",!0),me=ge&&ce||fe+a.ceil(n.pendingEntriesSize/de)>E;if(we||he||pe||me){if(!1===ne||!Z)throw new f(Es);ne=!0}ne=ne||!1,c=t.assign({},c,{rawFilename:g,rawComment:b,version:z,versionMadeBy:S,lastModDate:k,lastAccessDate:x,creationDate:D,rawExtraField:se,zip64:ne,zip64UncompressedSize:he,zip64CompressedSize:pe,zip64Offset:we,zip64DiskNumberStart:me,password:R,rawPassword:N,level:Q||n.config.CompressionStream!==$||n.config.CompressionStreamNative!==$?G:0,useWebWorkers:j,encryptionStrength:H,extendedTimestamp:q,zipCrypto:P,bufferedWrite:J,keepOrder:Z,dataDescriptor:te,dataDescriptorSignature:X,signal:Y,msDosCompatible:_,internalFileAttribute:C,externalFileAttribute:F,useCompressionStream:Q});const ye=function(e){const{rawFilename:t,lastModDate:n,lastAccessDate:s,creationDate:r,rawPassword:i,password:o,level:c,zip64:l,zipCrypto:u,dataDescriptor:f,directory:h,rawExtraField:w,encryptionStrength:g,extendedTimestamp:m}=e,y=0!==c&&!h,b=Boolean(o&&Ks(o)||i&&Ks(i));let z,S,v,k,x=e.version;if(b&&!u){z=new d(Ks(As)+2);const e=Vs(z);Is(e,0,B),Os(z,As,2),Bs(e,8,g)}else z=new d;if(m){v=new d(9+(s?4:0)+(r?4:0));const e=Vs(v);Is(e,0,I),Is(e,2,Ks(v)-4),k=1+(s?2:0)+(r?4:0),Bs(e,4,k);let t=5;Ms(e,t,a.floor(n.getTime()/1e3)),t+=4,s&&(Ms(e,t,a.floor(s.getTime()/1e3)),t+=4),r&&Ms(e,t,a.floor(r.getTime()/1e3));try{S=new d(36);const e=Vs(S),t=Ps(n);Is(e,0,10),Is(e,2,32),Is(e,8,1),Is(e,10,24),Ls(e,12,t),Ls(e,20,Ps(s)||t),Ls(e,28,Ps(r)||t)}catch(e){S=new d}}else S=v=new d;let D=L;f&&(D|=8);let _=0;y&&(_=8);l&&(x=x>45?x:45);b&&(D|=1,u||(x=x>51?x:51,_=99,y&&(z[9]=8)));const C=new d(26),F=Vs(C);Is(F,0,x),Is(F,2,D),Is(F,4,_);const T=new p(1),E=Vs(T);let W;W=n<K?K:n>V?V:n;Is(E,0,(W.getHours()<<6|W.getMinutes())<<5|W.getSeconds()/2),Is(E,2,(W.getFullYear()-1980<<4|W.getMonth()+1)<<5|W.getDate());const U=T[0];Ms(F,6,U),Is(F,22,Ks(t));const R=Ks(z,v,S,w);Is(F,24,R);const N=new d(30+Ks(t)+R);return Ms(Vs(N),0,A),Os(N,C,4),Os(N,t,30),Os(N,z,30+Ks(t)),Os(N,v,30+Ks(t,z)),Os(N,S,30+Ks(t,z,v)),Os(N,w,30+Ks(t,z,v,S)),{localHeaderArray:N,headerArray:C,headerView:F,lastModDate:n,rawLastModDate:U,encrypted:b,compressed:y,version:x,compressionMethod:_,extraFieldExtendedTimestampFlag:k,rawExtraFieldExtendedTimestamp:v,rawExtraFieldNTFS:S,rawExtraFieldAES:z,extraFieldLength:R}}(c),be=function(e){const{zip64:t,dataDescriptor:n,dataDescriptorSignature:s}=e;let r,a=new d,i=0;n&&(a=new d(t?s?24:20:s?16:12),r=Vs(a),s&&(i=4,Ms(r,0,U)));return{dataDescriptorArray:a,dataDescriptorView:r,dataDescriptorOffset:i}}(c),ze=Ks(ye.localHeaderArray,be.dataDescriptorArray);ie=ze+ae,n.options.usdz&&(ie+=ie+64);let Se;n.pendingEntriesSize+=ie;try{Se=await async function(n,s,a,i,o){const{files:c,writer:u}=n,{keepOrder:h,dataDescriptor:p,signal:g}=o,{headerInfo:y}=i,{usdz:b}=n.options,z=e.from(c.values()).pop();let S,k,x,D,_,C,F,E={};c.set(s,E);try{let e;h&&(e=z&&z.lock,A()),!(o.bufferedWrite||n.writerLocked||n.bufferedWrites&&h)&&p||b?(C=u,await U()):(C=new v,F=new l(C.readable).blob(),C.writable.size=0,S=!0,n.bufferedWrites++,await bn(u)),await bn(C);const{writable:m}=u;let{diskOffset:y}=u;if(n.addSplitZipSignature){delete n.addSplitZipSignature;const e=new d(4);Ms(Vs(e),0,W),await Hs(m,e),n.offset+=4}b&&function(e,t){const{headerInfo:n}=e;let{localHeaderArray:s,extraFieldLength:r}=n,a=Vs(s),i=64-(t+Ks(s))%64;i<4&&(i+=64);const o=new d(i),c=Vs(o);Is(c,0,M),Is(c,2,i-2);const l=s;n.localHeaderArray=s=new d(Ks(l)+i),Os(s,l),Os(s,o,Ks(l)),a=Vs(s),Is(a,28,r+i),e.metadataSize+=i}(i,n.offset-y),S||(await e,await R(m));const{diskNumber:k}=u;if(_=!0,E.diskNumberStart=k,E=await async function(e,n,{diskNumberStart:s,lock:a},i,o,c){const{headerInfo:l,dataDescriptorInfo:u,metadataSize:f}=i,{localHeaderArray:h,headerArray:p,lastModDate:w,rawLastModDate:g,encrypted:m,compressed:y,version:b,compressionMethod:z,rawExtraFieldExtendedTimestamp:S,extraFieldExtendedTimestampFlag:v,rawExtraFieldNTFS:k,rawExtraFieldAES:x}=l,{dataDescriptorArray:D}=u,{rawFilename:_,lastAccessDate:C,creationDate:F,password:E,rawPassword:A,level:W,zip64:U,zip64UncompressedSize:R,zip64CompressedSize:N,zip64Offset:H,zip64DiskNumberStart:P,zipCrypto:q,dataDescriptor:B,directory:I,versionMadeBy:M,rawComment:L,rawExtraField:O,useWebWorkers:V,onstart:K,onprogress:Z,onend:G,signal:j,encryptionStrength:J,extendedTimestamp:X,msDosCompatible:Y,internalFileAttribute:Q,externalFileAttribute:te,useCompressionStream:ne}=c,se={lock:a,versionMadeBy:M,zip64:U,directory:Boolean(I),filenameUTF8:!0,rawFilename:_,commentUTF8:!0,rawComment:L,rawExtraFieldExtendedTimestamp:S,rawExtraFieldNTFS:k,rawExtraFieldAES:x,rawExtraField:O,extendedTimestamp:X,msDosCompatible:Y,internalFileAttribute:Q,externalFileAttribute:te,diskNumberStart:s};let re,ae=0,ie=0;const{writable:oe}=n;if(e){e.chunkSize=ee(o),await Hs(oe,h);const t=e.readable,n=t.size=e.size,s={options:{codecType:mt,level:W,rawPassword:A,password:E,encryptionStrength:J,zipCrypto:m&&q,passwordVerification:m&&q&&g>>8&255,signed:!0,compressed:y,encrypted:m,useWebWorkers:V,useCompressionStream:ne,transferStreams:!1},config:o,streamOptions:{signal:j,size:n,onstart:K,onprogress:Z,onend:G}},r=await Ut({readable:t,writable:oe},s);ie=r.inputSize,ae=r.outputSize,re=r.signature,oe.size+=ie}else await Hs(oe,h);let ce;if(U){let e=4;R&&(e+=8),N&&(e+=8),H&&(e+=8),P&&(e+=4),ce=new d(e)}else ce=new d;(function(e,t){const{signature:n,rawExtraFieldZip64:s,compressedSize:a,uncompressedSize:i,headerInfo:o,dataDescriptorInfo:c}=e,{headerView:l,encrypted:u}=o,{dataDescriptorView:f,dataDescriptorOffset:d}=c,{zip64:h,zip64UncompressedSize:p,zip64CompressedSize:w,zipCrypto:g,dataDescriptor:m}=t;u&&!g||n===$||(Ms(l,10,n),m&&Ms(f,d,n));if(h){const e=Vs(s);Is(e,0,1),Is(e,2,Ks(s)-4);let t=4;p&&(Ms(l,18,T),Ls(e,t,r(i)),t+=8),w&&(Ms(l,14,T),Ls(e,t,r(a))),m&&(Ls(f,d+4,r(a)),Ls(f,d+12,r(i)))}else Ms(l,14,a),Ms(l,18,i),m&&(Ms(f,d+4,a),Ms(f,d+8,i))})({signature:re,rawExtraFieldZip64:ce,compressedSize:ae,uncompressedSize:ie,headerInfo:l,dataDescriptorInfo:u},c),B&&await Hs(oe,D);return t.assign(se,{uncompressedSize:ie,compressedSize:ae,lastModDate:w,rawLastModDate:g,creationDate:F,lastAccessDate:C,encrypted:m,size:f+ae,compressionMethod:z,version:b,headerArray:p,signature:re,rawExtraFieldZip64:ce,extraFieldExtendedTimestampFlag:v,zip64UncompressedSize:R,zip64CompressedSize:N,zip64Offset:H,zip64DiskNumberStart:P}),se}(a,C,E,i,n.config,o),_=!1,c.set(s,E),E.filename=s,S){await C.writable.getWriter().close();let t=await F;await e,await U(),D=!0,p||(t=await async function(e,t,n,{zipCrypto:s}){let r;r=await t.slice(0,26).arrayBuffer(),26!=r.byteLength&&(r=r.slice(0,26));const a=new w(r);e.encrypted&&!s||Ms(a,14,e.signature);e.zip64?(Ms(a,18,T),Ms(a,22,T)):(Ms(a,18,e.compressedSize),Ms(a,22,e.uncompressedSize));return await Hs(n,new d(r)),t.slice(r.byteLength)}(E,t,m,o)),await R(m),E.diskNumberStart=u.diskNumber,y=u.diskOffset,await t.stream().pipeTo(m,{preventClose:!0,preventAbort:!0,signal:g}),m.size+=t.size,D=!1}if(E.offset=n.offset-y,E.zip64)!function(e,t){const{rawExtraFieldZip64:n,offset:s,diskNumberStart:a}=e,{zip64UncompressedSize:i,zip64CompressedSize:o,zip64Offset:c,zip64DiskNumberStart:l}=t,u=Vs(n);let f=4;i&&(f+=8);o&&(f+=8);c&&(Ls(u,f,r(s)),f+=8);l&&Ms(u,f,a)}(E,o);else if(E.offset>T)throw new f(Es);return n.offset+=E.size,E}catch(e){if(S&&D||!S&&_){if(n.hasCorruptedEntries=!0,e)try{e.corruptedEntry=!0}catch(e){}S?n.offset+=C.writable.size:n.offset=C.writable.size}throw c.delete(s),e}finally{S&&n.bufferedWrites--,x&&x(),k&&k()}function A(){E.lock=new m(e=>x=e)}async function U(){n.writerLocked=!0;const{lockWriter:e}=n;n.lockWriter=new m(e=>k=()=>{n.writerLocked=!1,e()}),await e}async function R(e){Ks(y.localHeaderArray)>u.availableSize&&(u.availableSize=0,await Hs(e,new d))}}(n,s,o,{headerInfo:ye,dataDescriptorInfo:be,metadataSize:ze},c)}finally{n.pendingEntriesSize-=ie}return t.assign(Se,{name:s,comment:y,extraField:re}),new Zn(Se)}(c,n,s,o),u.add(y),await y}catch(e){throw c.filenames.delete(n),e}finally{u.delete(y);const e=Us.shift();e?e():Ws--}}async close(t=new d,n={}){const{pendingAddFileCalls:s,writer:i}=this,{writable:o}=i;for(;s.size;)await m.allSettled(e.from(s));await async function(t,n,s){const{files:i,writer:o}=t,{diskOffset:c,writable:l}=o;let{diskNumber:u}=o,h=0,p=0,w=t.offset-c,g=i.size;for(const[,e]of i){const{rawFilename:t,rawExtraFieldZip64:n,rawExtraFieldAES:s,rawComment:r,rawExtraFieldNTFS:i,rawExtraField:o,extendedTimestamp:c,extraFieldExtendedTimestampFlag:l,lastModDate:u}=e;let f;if(c){f=new d(9);const e=Vs(f);Is(e,0,I),Is(e,2,5),Bs(e,4,l),Ms(e,5,a.floor(u.getTime()/1e3))}else f=new d;e.rawExtraFieldCDExtendedTimestamp=f,p+=46+Ks(t,r,n,s,i,f,o)}const m=new d(p),y=Vs(m);await bn(o);let b=0;for(const[t,n]of e.from(i.values()).entries()){const{offset:e,rawFilename:r,rawExtraFieldZip64:a,rawExtraFieldAES:c,rawExtraFieldCDExtendedTimestamp:u,rawExtraFieldNTFS:f,rawExtraField:d,rawComment:p,versionMadeBy:w,headerArray:g,directory:z,zip64:S,zip64UncompressedSize:v,zip64CompressedSize:k,zip64DiskNumberStart:x,zip64Offset:D,msDosCompatible:_,internalFileAttribute:C,externalFileAttribute:F,diskNumberStart:A,uncompressedSize:W,compressedSize:U}=n,N=Ks(a,c,u,f,d);Ms(y,h,R),Is(y,h+4,w);const H=Vs(g);v||Ms(H,18,W),k||Ms(H,14,U),Os(m,g,h+6),Is(y,h+30,N),Is(y,h+32,Ks(p)),Is(y,h+34,S&&x?E:A),Is(y,h+36,C),F?Ms(y,h+38,F):z&&_&&Bs(y,h+38,16),Ms(y,h+42,S&&D?T:e),Os(m,r,h+46),Os(m,a,h+46+Ks(r)),Os(m,c,h+46+Ks(r,a)),Os(m,u,h+46+Ks(r,a,c)),Os(m,f,h+46+Ks(r,a,c,u)),Os(m,d,h+46+Ks(r,a,c,u,f)),Os(m,p,h+46+Ks(r)+N);const P=46+Ks(r,p)+N;if(h-b>o.availableSize&&(o.availableSize=0,await Hs(l,m.slice(b,h)),b=h),h+=P,s.onprogress)try{await s.onprogress(t+1,i.size,new Zn(n))}catch(e){}}await Hs(l,b?m.slice(b):m);let z=o.diskNumber;const{availableSize:S}=o;S<q&&z++;let v=qs(t,s,\"zip64\");if(w>T||p>T||g>E||z>E){if(!1===v)throw new f(Es);v=!0}const k=new d(v?98:q),x=Vs(k);if(h=0,v){Ms(x,0,H),Ls(x,4,r(44)),Is(x,12,45),Is(x,14,45),Ms(x,16,z),Ms(x,20,u),Ls(x,24,r(g)),Ls(x,32,r(g)),Ls(x,40,r(p)),Ls(x,48,r(w)),Ms(x,56,P),Ls(x,64,r(w)+r(p)),Ms(x,72,z+1);qs(t,s,\"supportZip64SplitFile\",!0)&&(z=E,u=E),g=E,w=T,p=T,h+=76}Ms(x,h,N),Is(x,h+4,z),Is(x,h+6,u),Is(x,h+8,g),Is(x,h+10,g),Ms(x,h+12,p),Ms(x,h+16,w);const D=Ks(n);if(D){if(!(D<=E))throw new f(ks);Is(x,h+20,D)}await Hs(l,k),D&&await Hs(l,n)}(this,t,n);return qs(this,n,\"preventClose\")||await o.getWriter().close(),i.getData?i.getData():o}}class Ns{constructor(e={}){const{readable:t,writable:n}=new v;this.readable=t,this.zipWriter=new Rs(n,e)}transform(e){const{readable:t,writable:n}=new v({flush:()=>{this.zipWriter.close()}});return this.zipWriter.add(e,t),{readable:this.readable,writable:n}}writable(e){const{readable:t,writable:n}=new v;return this.zipWriter.add(e,t),n}close(e=void 0,t={}){return this.zipWriter.close(e,t)}}async function Hs(e,t){const n=e.getWriter();try{await n.ready,e.size+=Ks(t),await n.write(t)}finally{n.releaseLock()}}function Ps(e){if(e)return(r(e.getTime())+r(116444736e5))*r(1e4)}function qs(e,t,n,s){const r=t[n]===$?e.options[n]:t[n];return r===$?s:r}function Bs(e,t,n){e.setUint8(t,n)}function Is(e,t,n){e.setUint16(t,n,!0)}function Ms(e,t,n){e.setUint32(t,n,!0)}function Ls(e,t,n){e.setBigUint64(t,n,!0)}function Os(e,t,n){e.set(t,n)}function Vs(e){return new w(e.buffer)}function Ks(...e){let t=0;return e.forEach(e=>e&&(t+=e.length)),t}let $s;try{$s=import.meta.url}catch(e){}te({baseURL:$s}),function(e){const t=()=>u.createObjectURL(new g(['const{Array:e,Object:t,Number:n,Math:s,Error:r,Uint8Array:a,Uint16Array:i,Uint32Array:o,Int32Array:l,Map:c,DataView:h,Promise:f,TextEncoder:u,crypto:p,postMessage:d,TransformStream:g,ReadableStream:w,WritableStream:y,CompressionStream:v,DecompressionStream:b}=self,m=void 0,_=\"undefined\",S=\"function\";class k{constructor(e){return class extends g{constructor(t,n){const s=new e(n);super({transform(e,t){t.enqueue(s.append(e))},flush(e){const t=s.flush();t&&e.enqueue(t)}})}}}}const z=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;z[e]=t}class D{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,s=0|e.length;s>n;n++)t=t>>>8^z[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class C extends g{constructor(){let e;const t=new D;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new a(4);new h(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const x={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],s=x.getPartial(n);return 32===s?e.concat(t):x._shiftRight(t,s,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+x.getPartial(n)},clamp(e,t){if(32*e.length<t)return e;const n=(e=e.slice(0,s.ceil(t/32))).length;return t&=31,n>0&&t&&(e[n-1]=x.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>s.round(e/1099511627776)||32,_shiftRight(e,t,n,s){for(void 0===s&&(s=[]);t>=32;t-=32)s.push(n),n=0;if(0===t)return s.concat(e);for(let r=0;r<e.length;r++)s.push(n|e[r]>>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=x.getPartial(r);return s.push(x.partial(t+a&31,t+a>32?n:s.pop(),1)),s}},I={bytes:{fromBits(e){const t=x.bitLength(e)/8,n=new a(t);let s;for(let r=0;t>r;r++)3&r||(s=e[r/4]),n[r]=s>>>24,s<<=8;return n},toBits(e){const t=[];let n,s=0;for(n=0;n<e.length;n++)s=s<<8|e[n],3&~n||(t.push(s),s=0);return 3&n&&t.push(x.partial(8*(3&n),s)),t}}},T=class{constructor(e){const t=this;t.blockSize=512,t._init=[1732584193,4023233417,2562383102,271733878,3285377520],t._key=[1518500249,1859775393,2400959708,3395469782],e?(t._h=e._h.slice(0),t._buffer=e._buffer.slice(0),t._length=e._length):t.reset()}reset(){const e=this;return e._h=e._init.slice(0),e._buffer=[],e._length=0,e}update(e){const t=this;\"string\"==typeof e&&(e=I.utf8String.toBits(e));const n=t._buffer=x.concat(t._buffer,e),s=t._length,a=t._length=s+x.bitLength(e);if(a>9007199254740991)throw new r(\"Cannot hash more than 2^53 - 1 bits\");const i=new o(n);let l=0;for(let e=t.blockSize+s-(t.blockSize+s&t.blockSize-1);a>=e;e+=t.blockSize)t._block(i.subarray(16*l,16*(l+1))),l+=1;return n.splice(0,16*l),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=x.concat(t,[x.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(s.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,s){return e>19?e>39?e>59?e>79?void 0:t^n^s:t&n|t&s|n&s:t^n^s:t&n|~t&s}_S(e,t){return t<<e|t>>>32-e}_block(t){const n=this,r=n._h,a=e(80);for(let e=0;16>e;e++)a[e]=t[e];let i=r[0],o=r[1],l=r[2],c=r[3],h=r[4];for(let e=0;79>=e;e++){16>e||(a[e]=n._S(1,a[e-3]^a[e-8]^a[e-14]^a[e-16]));const t=n._S(5,i)+n._f(e,o,l,c)+h+a[e]+n._key[s.floor(e/20)]|0;h=c,c=l,l=n._S(30,o),o=i,i=t}r[0]=r[0]+i|0,r[1]=r[1]+o|0,r[2]=r[2]+l|0,r[3]=r[3]+c|0,r[4]=r[4]+h|0}},A={getRandomValues(e){const t=new o(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(s.random()>.5?1:-1))};for(let r,a=0;a<e.length;a+=4){const e=n(4294967296*(r||s.random()));r=987654071*e(),t[a/4]=4294967296*e()|0}return e}},q={importKey:e=>new q.hmacSha1(I.bytes.toBits(e)),pbkdf2(e,t,n,s){if(n=n||1e4,0>s||0>n)throw new r(\"invalid params to pbkdf2\");const a=1+(s>>5)<<2;let i,o,l,c,f;const u=new ArrayBuffer(a),p=new h(u);let d=0;const g=x;for(t=I.bytes.toBits(t),f=1;(a||1)>d;f++){for(i=o=e.encrypt(g.concat(t,[f])),l=1;n>l;l++)for(o=e.encrypt(o),c=0;c<o.length;c++)i[c]^=o[c];for(l=0;(a||1)>d&&l<i.length;l++)p.setInt32(d,i[l]),d+=4}return u.slice(0,s/8)},hmacSha1:class{constructor(e){const t=this,n=t._hash=T,s=[[],[]];t._baseHash=[new n,new n];const r=t._baseHash[0].blockSize/32;e.length>r&&(e=(new n).update(e).finalize());for(let t=0;r>t;t++)s[0][t]=909522486^e[t],s[1][t]=1549556828^e[t];t._baseHash[0].update(s[0]),t._baseHash[1].update(s[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new r(\"encrypt on already updated hmac called!\");return this.update(e),this.digest(e)}}},R=typeof p!=_&&typeof p.getRandomValues==S,H=\"Invalid password\",P=\"Invalid signature\",B=\"zipjs-abort-check-password\";function K(e){return R?p.getRandomValues(e):A.getRandomValues(e)}const V=16,E={name:\"PBKDF2\"},U=t.assign({hash:{name:\"HMAC\"}},E),W=t.assign({iterations:1e3,hash:{name:\"SHA-1\"}},E),M=[\"deriveBits\"],N=[8,12,16],O=[16,24,32],F=10,L=[0,0,0,0],j=typeof p!=_,G=j&&p.subtle,X=j&&typeof G!=_,J=I.bytes,Q=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],s=t._tables[1],a=e.length;let i,o,l,c=1;if(4!==a&&6!==a&&8!==a)throw new r(\"invalid aes key size\");for(t._key=[o=e.slice(0),l=[]],i=a;4*a+28>i;i++){let e=o[i-1];(i%a==0||8===a&&i%a==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],i%a==0&&(e=e<<8^e>>>24^c<<24,c=c<<1^283*(c>>7))),o[i]=o[i-a]^e}for(let e=0;i;e++,i--){const t=o[3&e?i:i-4];l[e]=4>=i||4>e?t:s[0][n[t>>>24]]^s[1][n[t>>16&255]]^s[2][n[t>>8&255]]^s[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],s=t[4],r=[],a=[];let i,o,l,c;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let h=i=0;!n[h];h^=o||1,i=a[i]||1){let a=i^i<<1^i<<2^i<<3^i<<4;a=a>>8^255&a^99,n[h]=a,s[a]=h,c=r[l=r[o=r[h]]];let f=16843009*c^65537*l^257*o^16843008*h,u=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][h]=u=u<<24^u>>>8,t[n][a]=f=f<<24^f>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new r(\"invalid aes block size\");const n=this._key[t],s=n.length/4-2,a=[0,0,0,0],i=this._tables[t],o=i[0],l=i[1],c=i[2],h=i[3],f=i[4];let u,p,d,g=e[0]^n[0],w=e[t?3:1]^n[1],y=e[2]^n[2],v=e[t?1:3]^n[3],b=4;for(let e=0;s>e;e++)u=o[g>>>24]^l[w>>16&255]^c[y>>8&255]^h[255&v]^n[b],p=o[w>>>24]^l[y>>16&255]^c[v>>8&255]^h[255&g]^n[b+1],d=o[y>>>24]^l[v>>16&255]^c[g>>8&255]^h[255&w]^n[b+2],v=o[v>>>24]^l[g>>16&255]^c[w>>8&255]^h[255&y]^n[b+3],b+=4,g=u,w=p,y=d;for(let e=0;4>e;e++)a[t?3&-e:e]=f[g>>>24]<<24^f[w>>16&255]<<16^f[y>>8&255]<<8^f[255&v]^n[b++],u=g,g=w,w=y,y=v,v=u;return a}},Y=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,s=255&e;255===t?(t=0,255===n?(n=0,255===s?s=0:++s):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=s}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let s;if(!(s=t.length))return[];const r=x.bitLength(t);for(let r=0;s>r;r+=4){this.incCounter(n);const s=e.encrypt(n);t[r]^=s[0],t[r+1]^=s[1],t[r+2]^=s[2],t[r+3]^=s[3]}return x.clamp(t,r)}},Z=q.hmacSha1;let $=j&&X&&typeof G.importKey==S,ee=j&&X&&typeof G.deriveBits==S;class te extends g{constructor({password:e,rawPassword:n,signed:s,encryptionStrength:i,checkPasswordOnly:o}){super({start(){t.assign(this,{ready:new f((e=>this.resolveReady=e)),password:ae(e,n),signed:s,strength:i-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:i,resolveReady:l,ready:c}=n;s?(await(async(e,t,n,s)=>{const a=await re(e,t,n,oe(s,0,N[t])),i=oe(s,N[t]);if(a[0]!=i[0]||a[1]!=i[1])throw new r(H)})(n,i,s,oe(e,0,N[i]+2)),e=oe(e,N[i]+2),o?t.error(new r(B)):l()):await c;const h=new a(e.length-F-(e.length-F)%V);t.enqueue(se(n,e,h,0,F,!0))},async flush(e){const{signed:t,ctr:n,hmac:s,pending:i,ready:o}=this;if(s&&n){await o;const l=oe(i,0,i.length-F),c=oe(i,i.length-F);let h=new a;if(l.length){const e=ce(J,l);s.update(e);const t=n.update(e);h=le(J,t)}if(t){const e=oe(le(J,s.digest()),0,F);for(let t=0;F>t;t++)if(e[t]!=c[t])throw new r(P)}e.enqueue(h)}}})}}class ne extends g{constructor({password:e,rawPassword:n,encryptionStrength:s}){let r;super({start(){t.assign(this,{ready:new f((e=>this.resolveReady=e)),password:ae(e,n),strength:s-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:i,ready:o}=n;let l=new a;s?(l=await(async(e,t,n)=>{const s=K(new a(N[t]));return ie(s,await re(e,t,n,s))})(n,r,s),i()):await o;const c=new a(l.length+e.length-e.length%V);c.set(l,0),t.enqueue(se(n,e,c,l.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:i}=this;if(n&&t){await i;let o=new a;if(s.length){const e=t.update(ce(J,s));n.update(e),o=le(J,e)}r.signature=le(J,n.digest()).slice(0,F),e.enqueue(ie(o,r.signature))}}}),r=this}}function se(e,t,n,s,r,i){const{ctr:o,hmac:l,pending:c}=e,h=t.length-r;let f;for(c.length&&(t=ie(c,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new a(t)).set(n,0)}return e})(n,h-h%V)),f=0;h-V>=f;f+=V){const e=ce(J,oe(t,f,f+V));i&&l.update(e);const r=o.update(e);i||l.update(r),n.set(le(J,r),f+s)}return e.pending=oe(t,f),n}async function re(n,s,r,i){n.password=null;const o=await(async(e,t,n,s,r)=>{if(!$)return q.importKey(t);try{return await G.importKey(\"raw\",t,n,!1,r)}catch(e){return $=!1,q.importKey(t)}})(0,r,U,0,M),l=await(async(e,t,n)=>{if(!ee)return q.pbkdf2(t,e.salt,W.iterations,n);try{return await G.deriveBits(e,t,n)}catch(s){return ee=!1,q.pbkdf2(t,e.salt,W.iterations,n)}})(t.assign({salt:i},W),o,8*(2*O[s]+2)),c=new a(l),h=ce(J,oe(c,0,O[s])),f=ce(J,oe(c,O[s],2*O[s])),u=oe(c,2*O[s]);return t.assign(n,{keys:{key:h,authentication:f,passwordVerification:u},ctr:new Y(new Q(h),e.from(L)),hmac:new Z(f)}),u}function ae(e,t){return t===m?(e=>{if(typeof u==_){const t=new a((e=unescape(encodeURIComponent(e))).length);for(let n=0;n<t.length;n++)t[n]=e.charCodeAt(n);return t}return(new u).encode(e)})(e):t}function ie(e,t){let n=e;return e.length+t.length&&(n=new a(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function oe(e,t,n){return e.subarray(t,n)}function le(e,t){return e.fromBits(t)}function ce(e,t){return e.toBits(t)}class he extends g{constructor({password:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;if(n.password){const t=ue(n,e.subarray(0,12));if(n.password=null,t[11]!=n.passwordVerification)throw new r(H);e=e.subarray(12)}s?t.error(new r(B)):t.enqueue(ue(n,e))}})}}class fe extends g{constructor({password:e,passwordVerification:n}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;let s,r;if(n.password){n.password=null;const t=K(new a(12));t[11]=n.passwordVerification,s=new a(e.length+t.length),s.set(pe(n,t),0),r=12}else s=new a(e.length),r=0;s.set(pe(n,e),r),t.enqueue(s)}})}}function ue(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,n[s]);return n}function pe(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,t[s]);return n}function de(e,n){const s=[305419896,591751049,878082192];t.assign(e,{keys:s,crcKey0:new D(s[0]),crcKey2:new D(s[2])});for(let t=0;t<n.length;t++)ge(e,n.charCodeAt(t))}function ge(e,t){let[n,r,a]=e.keys;e.crcKey0.append([t]),n=~e.crcKey0.get(),r=ve(s.imul(ve(r+ye(n)),134775813)+1),e.crcKey2.append([r>>>24]),a=~e.crcKey2.get(),e.keys=[n,r,a]}function we(e){const t=2|e.keys[2];return ye(s.imul(t,1^t)>>>8)}function ye(e){return 255&e}function ve(e){return 4294967295&e}const be=\"deflate-raw\";class me extends g{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:s}){super({});const{compressed:r,encrypted:a,useCompressionStream:i,zipCrypto:o,signed:l,level:c}=e,f=this;let u,p,d=Se(super.readable);a&&!o||!l||(u=new C,d=De(d,u)),r&&(d=ze(d,i,{level:c,chunkSize:t},s,n)),a&&(o?d=De(d,new fe(e)):(p=new ne(e),d=De(d,p))),ke(f,d,(()=>{let e;a&&!o&&(e=p.signature),a&&!o||!l||(e=new h(u.value.buffer).getUint32(0)),f.signature=e}))}}class _e extends g{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:s}){super({});const{zipCrypto:a,encrypted:i,signed:o,signature:l,compressed:c,useCompressionStream:f}=e;let u,p,d=Se(super.readable);i&&(a?d=De(d,new he(e)):(p=new te(e),d=De(d,p))),c&&(d=ze(d,f,{chunkSize:t},s,n)),i&&!a||!o||(u=new C,d=De(d,u)),ke(this,d,(()=>{if((!i||a)&&o){const e=new h(u.value.buffer);if(l!=e.getUint32(0,!1))throw new r(P)}}))}}function Se(e){return De(e,new g({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function ke(e,n,s){n=De(n,new g({flush:s})),t.defineProperty(e,\"readable\",{get:()=>n})}function ze(e,t,n,s,r){try{e=De(e,new(t&&s?s:r)(be,n))}catch(s){if(!t)return e;try{e=De(e,new r(be,n))}catch(t){return e}}return e}function De(e,t){return e.pipeThrough(t)}const Ce=\"data\",xe=\"close\";class Ie extends g{constructor(e,n){super({});const s=this,{codecType:r}=e;let a;r.startsWith(\"deflate\")?a=me:r.startsWith(\"inflate\")&&(a=_e);let i=0,o=0;const l=new a(e,n),c=super.readable,h=new g({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){t.assign(s,{inputSize:o})}}),f=new g({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){const{signature:e}=l;t.assign(s,{signature:e,outputSize:i,inputSize:o})}});t.defineProperty(s,\"readable\",{get:()=>c.pipeThrough(h).pipeThrough(l).pipeThrough(f)})}}class Te extends g{constructor(e){let t;super({transform:function n(s,r){if(t){const e=new a(t.length+s.length);e.set(t),e.set(s,t.length),s=e,t=null}s.length>e?(r.enqueue(s.slice(0,e)),n(s.slice(e),r)):t=s},flush(e){t&&t.length&&e.enqueue(t)}})}}const Ae=new c,qe=new c;let Re,He=0,Pe=!0;async function Be(e){try{const{options:t,scripts:s,config:r}=e;if(s&&s.length)try{Pe?importScripts.apply(m,s):await Ke(s)}catch(e){Pe=!1,await Ke(s)}self.initCodec&&self.initCodec(),r.CompressionStreamNative=self.CompressionStream,r.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(r.CompressionStream=new k(self.Deflate)),self.Inflate&&(r.DecompressionStream=new k(self.Inflate));const a={highWaterMark:1},i=e.readable||new w({async pull(e){const t=new f((e=>Ae.set(He,e)));Ve({type:\"pull\",messageId:He}),He=(He+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await t;e.enqueue(s),r&&e.close()}},a),o=e.writable||new y({async write(e){let t;const s=new f((e=>t=e));qe.set(He,t),Ve({type:Ce,value:e,messageId:He}),He=(He+1)%n.MAX_SAFE_INTEGER,await s}},a),l=new Ie(t,r);Re=new AbortController;const{signal:c}=Re;await i.pipeThrough(l).pipeThrough(new Te(r.chunkSize)).pipeTo(o,{signal:c,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{signature:h,inputSize:u,outputSize:p}=l;Ve({type:xe,result:{signature:h,inputSize:u,outputSize:p}})}catch(e){Ee(e)}}async function Ke(e){for(const t of e)await import(t)}function Ve(e){let{value:t}=e;if(t)if(t.length)try{t=new a(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Ee(e=new r(\"Unknown error\")){const{message:t,stack:n,code:s,name:a}=e;d({error:{message:t,stack:n,code:s,name:a}})}addEventListener(\"message\",(({data:e})=>{const{type:t,messageId:n,value:s,done:r}=e;try{if(\"start\"==t&&Be(e),t==Ce){const e=Ae.get(n);Ae.delete(n),e({value:new a(s),done:r})}if(\"ack\"==t){const e=qe.get(n);qe.delete(n),e()}t==xe&&Re.abort()}catch(e){Ee(e)}}));var Ue=a,We=i,Me=l,Ne=new Ue([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Oe=new Ue([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Fe=new Ue([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Le=(e,t)=>{for(var n=new We(31),s=0;31>s;++s)n[s]=t+=1<<e[s-1];var r=new Me(n[30]);for(s=1;30>s;++s)for(var a=n[s];a<n[s+1];++a)r[a]=a-n[s]<<5|s;return{b:n,r:r}},je=Le(Ne,2),Ge=je.b,Xe=je.r;Ge[28]=258,Xe[258]=28;for(var Je=Le(Oe,0),Qe=Je.b,Ye=Je.r,Ze=new We(32768),$e=0;32768>$e;++$e){var et=(43690&$e)>>1|(21845&$e)<<1;et=(61680&(et=(52428&et)>>2|(13107&et)<<2))>>4|(3855&et)<<4,Ze[$e]=((65280&et)>>8|(255&et)<<8)>>1}var tt=(e,t,n)=>{for(var s=e.length,r=0,a=new We(t);s>r;++r)e[r]&&++a[e[r]-1];var i,o=new We(t);for(r=1;t>r;++r)o[r]=o[r-1]+a[r-1]<<1;if(n){i=new We(1<<t);var l=15-t;for(r=0;s>r;++r)if(e[r])for(var c=r<<4|e[r],h=t-e[r],f=o[e[r]-1]++<<h,u=f|(1<<h)-1;u>=f;++f)i[Ze[f]>>l]=c}else for(i=new We(s),r=0;s>r;++r)e[r]&&(i[r]=Ze[o[e[r]-1]++]>>15-e[r]);return i},nt=new Ue(288);for($e=0;144>$e;++$e)nt[$e]=8;for($e=144;256>$e;++$e)nt[$e]=9;for($e=256;280>$e;++$e)nt[$e]=7;for($e=280;288>$e;++$e)nt[$e]=8;var st=new Ue(32);for($e=0;32>$e;++$e)st[$e]=5;var rt=tt(nt,9,0),at=tt(nt,9,1),it=tt(st,5,0),ot=tt(st,5,1),lt=e=>{for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},ct=(e,t,n)=>{var s=t/8|0;return(e[s]|e[s+1]<<8)>>(7&t)&n},ht=(e,t)=>{var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},ft=e=>(e+7)/8|0,ut=(e,t,n)=>((null==t||0>t)&&(t=0),(null==n||n>e.length)&&(n=e.length),new Ue(e.subarray(t,n))),pt=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],dt=(e,t,n)=>{var s=new r(t||pt[e]);if(s.code=e,r.captureStackTrace&&r.captureStackTrace(s,dt),!n)throw s;return s},gt=(e,t,n)=>{n<<=7&t;var s=t/8|0;e[s]|=n,e[s+1]|=n>>8},wt=(e,t,n)=>{n<<=7&t;var s=t/8|0;e[s]|=n,e[s+1]|=n>>8,e[s+2]|=n>>16},yt=(e,t)=>{for(var n=[],s=0;s<e.length;++s)e[s]&&n.push({s:s,f:e[s]});var r=n.length,a=n.slice();if(!r)return{t:zt,l:0};if(1==r){var i=new Ue(n[0].s+1);return i[n[0].s]=1,{t:i,l:1}}n.sort(((e,t)=>e.f-t.f)),n.push({s:-1,f:25001});var o=n[0],l=n[1],c=0,h=1,f=2;for(n[0]={s:-1,f:o.f+l.f,l:o,r:l};h!=r-1;)o=n[n[c].f<n[f].f?c++:f++],l=n[c!=h&&n[c].f<n[f].f?c++:f++],n[h++]={s:-1,f:o.f+l.f,l:o,r:l};var u=a[0].s;for(s=1;r>s;++s)a[s].s>u&&(u=a[s].s);var p=new We(u+1),d=vt(n[h-1],p,0);if(d>t){s=0;var g=0,w=d-t,y=1<<w;for(a.sort(((e,t)=>p[t.s]-p[e.s]||e.f-t.f));r>s;++s){var v=a[s].s;if(p[v]<=t)break;g+=y-(1<<d-p[v]),p[v]=t}for(g>>=w;g>0;){var b=a[s].s;p[b]<t?g-=1<<t-p[b]++-1:++s}for(;s>=0&&g;--s){var m=a[s].s;p[m]==t&&(--p[m],++g)}d=t}return{t:new Ue(p),l:d}},vt=(e,t,n)=>-1==e.s?s.max(vt(e.l,t,n+1),vt(e.r,t,n+1)):t[e.s]=n,bt=e=>{for(var t=e.length;t&&!e[--t];);for(var n=new We(++t),s=0,r=e[0],a=1,i=e=>{n[s++]=e},o=1;t>=o;++o)if(e[o]==r&&o!=t)++a;else{if(!r&&a>2){for(;a>138;a-=138)i(32754);a>2&&(i(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(i(r),--a;a>6;a-=6)i(8304);a>2&&(i(a-3<<5|8208),a=0)}for(;a--;)i(r);a=1,r=e[o]}return{c:n.subarray(0,s),n:t}},mt=(e,t)=>{for(var n=0,s=0;s<t.length;++s)n+=e[s]*t[s];return n},_t=(e,t,n)=>{var s=n.length,r=ft(t+2);e[r]=255&s,e[r+1]=s>>8,e[r+2]=255^e[r],e[r+3]=255^e[r+1];for(var a=0;s>a;++a)e[r+a+4]=n[a];return 8*(r+4+s)},St=(e,t,n,s,r,a,i,o,l,c,h)=>{gt(t,h++,n),++r[256];for(var f=yt(r,15),u=f.t,p=f.l,d=yt(a,15),g=d.t,w=d.l,y=bt(u),v=y.c,b=y.n,m=bt(g),_=m.c,S=m.n,k=new We(19),z=0;z<v.length;++z)++k[31&v[z]];for(z=0;z<_.length;++z)++k[31&_[z]];for(var D=yt(k,7),C=D.t,x=D.l,I=19;I>4&&!C[Fe[I-1]];--I);var T,A,q,R,H=c+5<<3,P=mt(r,nt)+mt(a,st)+i,B=mt(r,u)+mt(a,g)+i+14+3*I+mt(k,C)+2*k[16]+3*k[17]+7*k[18];if(l>=0&&P>=H&&B>=H)return _t(t,h,e.subarray(l,l+c));if(gt(t,h,1+(P>B)),h+=2,P>B){T=tt(u,p,0),A=u,q=tt(g,w,0),R=g;var K=tt(C,x,0);for(gt(t,h,b-257),gt(t,h+5,S-1),gt(t,h+10,I-4),h+=14,z=0;I>z;++z)gt(t,h+3*z,C[Fe[z]]);h+=3*I;for(var V=[v,_],E=0;2>E;++E){var U=V[E];for(z=0;z<U.length;++z){var W=31&U[z];gt(t,h,K[W]),h+=C[W],W>15&&(gt(t,h,U[z]>>5&127),h+=U[z]>>12)}}}else T=rt,A=nt,q=it,R=st;for(z=0;o>z;++z){var M=s[z];if(M>255){wt(t,h,T[257+(W=M>>18&31)]),h+=A[W+257],W>7&&(gt(t,h,M>>23&31),h+=Ne[W]);var N=31&M;wt(t,h,q[N]),h+=R[N],N>3&&(wt(t,h,M>>5&8191),h+=Oe[N])}else wt(t,h,T[M]),h+=A[M]}return wt(t,h,T[256]),h+A[256]},kt=new Me([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),zt=new Ue(0),Dt=function(){function e(e,t){if(\"function\"==typeof e&&(t=e,e={}),this.ondata=t,this.o=e||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new Ue(98304),this.o.dictionary){var n=this.o.dictionary.subarray(-32768);this.b.set(n,32768-n.length),this.s.i=32768-n.length}}return e.prototype.p=function(e,t){this.ondata(((e,t,n,r,a)=>{if(!a&&(a={l:1},t.dictionary)){var i=t.dictionary.subarray(-32768),o=new Ue(i.length+e.length);o.set(i),o.set(e,i.length),e=o,a.w=i.length}return((e,t,n,r,a,i)=>{var o=i.z||e.length,l=new Ue(0+o+5*(1+s.ceil(o/7e3))+0),c=l.subarray(0,l.length-0),h=i.l,f=7&(i.r||0);if(t){f&&(c[0]=i.r>>3);for(var u=kt[t-1],p=u>>13,d=8191&u,g=(1<<n)-1,w=i.p||new We(32768),y=i.h||new We(g+1),v=s.ceil(n/3),b=2*v,m=t=>(e[t]^e[t+1]<<v^e[t+2]<<b)&g,_=new Me(25e3),S=new We(288),k=new We(32),z=0,D=0,C=i.i||0,x=0,I=i.w||0,T=0;o>C+2;++C){var A=m(C),q=32767&C,R=y[A];if(w[q]=R,y[A]=q,C>=I){var H=o-C;if((z>7e3||x>24576)&&(H>423||!h)){f=St(e,c,0,_,S,k,D,x,T,C-T,f),x=z=D=0,T=C;for(var P=0;286>P;++P)S[P]=0;for(P=0;30>P;++P)k[P]=0}var B=2,K=0,V=d,E=q-R&32767;if(H>2&&A==m(C-E))for(var U=s.min(p,H)-1,W=s.min(32767,C),M=s.min(258,H);W>=E&&--V&&q!=R;){if(e[C+B]==e[C+B-E]){for(var N=0;M>N&&e[C+N]==e[C+N-E];++N);if(N>B){if(B=N,K=E,N>U)break;var O=s.min(E,N-2),F=0;for(P=0;O>P;++P){var L=C-E+P&32767,j=L-w[L]&32767;j>F&&(F=j,R=L)}}}E+=(q=R)-(R=w[q])&32767}if(K){_[x++]=268435456|Xe[B]<<18|Ye[K];var G=31&Xe[B],X=31&Ye[K];D+=Ne[G]+Oe[X],++S[257+G],++k[X],I=C+B,++z}else _[x++]=e[C],++S[e[C]]}}for(C=s.max(C,I);o>C;++C)_[x++]=e[C],++S[e[C]];f=St(e,c,h,_,S,k,D,x,T,C-T,f),h||(i.r=7&f|c[f/8|0]<<3,f-=7,i.h=y,i.p=w,i.i=C,i.w=I)}else{for(C=i.w||0;o+h>C;C+=65535){var J=C+65535;o>J||(c[f/8|0]=h,J=o),f=_t(c,f+1,e.subarray(C,J))}i.i=o}return ut(l,0,0+ft(f)+0)})(e,null==t.level?6:t.level,null==t.mem?a.l?s.ceil(1.5*s.max(8,s.min(13,s.log(e.length)))):20:12+t.mem,0,0,a)})(e,this.o,0,0,this.s),t)},e.prototype.push=function(e,t){this.ondata||dt(5),this.s.l&&dt(4);var n=e.length+this.s.z;if(n>this.b.length){if(n>2*this.b.length-32768){var s=new Ue(-32768&n);s.set(this.b.subarray(0,this.s.z)),this.b=s}var r=this.b.length-this.s.z;this.b.set(e.subarray(0,r),this.s.z),this.s.z=this.b.length,this.p(this.b,!1),this.b.set(this.b.subarray(-32768)),this.b.set(e.subarray(r),32768),this.s.z=e.length-r+32768,this.s.i=32766,this.s.w=32768}else this.b.set(e,this.s.z),this.s.z+=e.length;this.s.l=1&t,(this.s.z>this.s.w+8191||t)&&(this.p(this.b,t||!1),this.s.w=this.s.i,this.s.i-=2)},e.prototype.flush=function(){this.ondata||dt(5),this.s.l&&dt(4),this.p(this.b,!1),this.s.w=this.s.i,this.s.i-=2},e}(),Ct=function(){function e(e,t){\"function\"==typeof e&&(t=e,e={}),this.ondata=t;var n=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:n?n.length:0},this.o=new Ue(32768),this.p=new Ue(0),n&&this.o.set(n)}return e.prototype.e=function(e){if(this.ondata||dt(5),this.d&&dt(4),this.p.length){if(e.length){var t=new Ue(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,n=((e,t,n)=>{var r=e.length;if(!r||t.f&&!t.l)return n||new Ue(0);var a=!n,i=a||2!=t.i,o=t.i;a&&(n=new Ue(3*r));var l=e=>{var t=n.length;if(e>t){var r=new Ue(s.max(2*t,e));r.set(n),n=r}},c=t.f||0,h=t.p||0,f=t.b||0,u=t.l,p=t.d,d=t.m,g=t.n,w=8*r;do{if(!u){c=ct(e,h,1);var y=ct(e,h+1,3);if(h+=3,!y){var v=e[(T=ft(h)+4)-4]|e[T-3]<<8,b=T+v;if(b>r){o&&dt(0);break}i&&l(f+v),n.set(e.subarray(T,b),f),t.b=f+=v,t.p=h=8*b,t.f=c;continue}if(1==y)u=at,p=ot,d=9,g=5;else if(2==y){var m=ct(e,h,31)+257,_=ct(e,h+10,15)+4,S=m+ct(e,h+5,31)+1;h+=14;for(var k=new Ue(S),z=new Ue(19),D=0;_>D;++D)z[Fe[D]]=ct(e,h+3*D,7);h+=3*_;var C=lt(z),x=(1<<C)-1,I=tt(z,C,1);for(D=0;S>D;){var T,A=I[ct(e,h,x)];if(h+=15&A,16>(T=A>>4))k[D++]=T;else{var q=0,R=0;for(16==T?(R=3+ct(e,h,3),h+=2,q=k[D-1]):17==T?(R=3+ct(e,h,7),h+=3):18==T&&(R=11+ct(e,h,127),h+=7);R--;)k[D++]=q}}var H=k.subarray(0,m),P=k.subarray(m);d=lt(H),g=lt(P),u=tt(H,d,1),p=tt(P,g,1)}else dt(1);if(h>w){o&&dt(0);break}}i&&l(f+131072);for(var B=(1<<d)-1,K=(1<<g)-1,V=h;;V=h){var E=(q=u[ht(e,h)&B])>>4;if((h+=15&q)>w){o&&dt(0);break}if(q||dt(2),256>E)n[f++]=E;else{if(256==E){V=h,u=null;break}var U=E-254;if(E>264){var W=Ne[D=E-257];U=ct(e,h,(1<<W)-1)+Ge[D],h+=W}var M=p[ht(e,h)&K],N=M>>4;if(M||dt(3),h+=15&M,P=Qe[N],N>3&&(W=Oe[N],P+=ht(e,h)&(1<<W)-1,h+=W),h>w){o&&dt(0);break}i&&l(f+131072);var O=f+U;if(P>f){var F=0-P,L=s.min(P,O);for(0>F+f&&dt(3);L>f;++f)n[f]=(void 0)[F+f]}for(;O>f;++f)n[f]=n[f-P]}}t.l=u,t.p=V,t.b=f,t.f=c,u&&(c=1,t.m=d,t.d=p,t.n=g)}while(!c);return f!=n.length&&a?ut(n,0,f):n.subarray(0,f)})(this.p,this.s,this.o);this.ondata(ut(n,t,this.s.b),this.d),this.o=ut(n,this.s.b-32768),this.s.b=this.o.length,this.p=ut(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),xt=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{xt.decode(zt,{stream:!0})}catch(e){}function It(e,n,s){return class{constructor(r){const i=this;var o,l;o=r,l=\"level\",(typeof t.hasOwn===S?t.hasOwn(o,l):o.hasOwnProperty(l))&&r.level===m&&delete r.level,i.codec=new e(t.assign({},n,r)),s(i.codec,(e=>{if(i.pendingData){const t=i.pendingData;i.pendingData=new a(t.length+e.length);const{pendingData:n}=i;n.set(t,0),n.set(e,t.length)}else i.pendingData=new a(e)}))}append(e){return this.codec.push(e),r(this)}flush(){return this.codec.push(new a,!0),r(this)}};function r(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new a}}const{Deflate:Tt,Inflate:At}=((e,t={},n)=>({Deflate:It(e.Deflate,t.deflate,n),Inflate:It(e.Inflate,t.inflate,n)}))({Deflate:Dt,Inflate:Ct},m,((e,t)=>e.ondata=t));self.initCodec=()=>{self.Deflate=Tt,self.Inflate=At};\\n'],{type:\"text/javascript\"}));e({workerScripts:{inflate:[t],deflate:[t]}})}(te);export{jt as BlobReader,Jt as BlobWriter,Zt as Data64URIReader,Gt as Data64URIWriter,Gn as ERR_BAD_FORMAT,Xn as ERR_CENTRAL_DIRECTORY_NOT_FOUND,vs as ERR_DUPLICATED_NAME,es as ERR_ENCRYPTED,Jn as ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,jn as ERR_EOCDR_NOT_FOUND,Qn as ERR_EXTRAFIELD_ZIP64_NOT_FOUND,Pt as ERR_HTTP_RANGE,ks as ERR_INVALID_COMMENT,Cs as ERR_INVALID_ENCRYPTION_STRENGTH,xs as ERR_INVALID_ENTRY_COMMENT,Ds as ERR_INVALID_ENTRY_NAME,Ts as ERR_INVALID_EXTRAFIELD_DATA,Fs as ERR_INVALID_EXTRAFIELD_TYPE,ye as ERR_INVALID_PASSWORD,be as ERR_INVALID_SIGNATURE,_s as ERR_INVALID_VERSION,qt as ERR_ITERATOR_COMPLETED_TOO_SOON,Yn as ERR_LOCAL_FILE_HEADER_NOT_FOUND,ss as ERR_SPLIT_ZIP_FILE,ns as ERR_UNSUPPORTED_COMPRESSION,ts as ERR_UNSUPPORTED_ENCRYPTION,Es as ERR_UNSUPPORTED_FORMAT,pn as HttpRangeReader,hn as HttpReader,Kt as Reader,mn as SplitDataReader,yn as SplitDataWriter,kn as SplitZipReader,xn as SplitZipWriter,Xt as TextReader,Yt as TextWriter,wn as Uint8ArrayReader,gn as Uint8ArrayWriter,$t as Writer,cs as ZipReader,ls as ZipReaderStream,Rs as ZipWriter,Ns as ZipWriterStream,te as configure,se as getMimeType,zn as initReader,re as initShimAsyncCodec,bn as initStream,Sn as initWriter,vn as readUint8Array,Nt as terminateWorkers};\n"
  },
  {
    "path": "lib/single-file.js",
    "content": "!function(n,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?e(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],e):e((n=\"undefined\"!=typeof globalThis?globalThis:n||self).singlefile={})}(this,function(n){\"use strict\";var e=\"undefined\"!=typeof document?document.currentScript:null;const{Array:t,Object:a,String:o,Number:i,BigInt:r,Math:s,Date:l,Map:c,Set:d,Response:m,URL:h,Error:p,Uint8Array:u,Uint16Array:g,Uint32Array:w,DataView:b,Blob:f,Promise:y,TextEncoder:k,TextDecoder:v,crypto:S,btoa:j,TransformStream:x,ReadableStream:C,WritableStream:A,CompressionStream:L,DecompressionStream:z,navigator:T,Worker:E}=globalThis,R=4294967295,I=65535,D=67324752,M=134695760,P=M,N=33639248,_=101010256,B=101075792,O=117853008,F=22,U=39169,q=21589,H=6534,W=2048,G=\"/\",V=new l(2107,11,31),K=new l(1980,0,1),J=void 0,Y=\"undefined\",Z=\"function\";class ${constructor(n){return class extends x{constructor(e,t){const a=new n(t);super({transform(n,e){e.enqueue(a.append(n))},flush(n){const e=a.flush();e&&n.enqueue(e)}})}}}}let X=2;try{typeof T!=Y&&T.hardwareConcurrency&&(X=T.hardwareConcurrency)}catch(n){}const Q={chunkSize:524288,maxWorkers:X,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,workerScripts:J,CompressionStreamNative:typeof L!=Y&&L,DecompressionStreamNative:typeof z!=Y&&z},nn=a.assign({},Q);function en(){return nn}function tn(n){return s.max(n.chunkSize,64)}function an(n){const{baseURL:e,chunkSize:a,maxWorkers:o,terminateWorkerTimeout:i,useCompressionStream:r,useWebWorkers:s,Deflate:l,Inflate:c,CompressionStream:d,DecompressionStream:m,workerScripts:h}=n;if(on(\"baseURL\",e),on(\"chunkSize\",a),on(\"maxWorkers\",o),on(\"terminateWorkerTimeout\",i),on(\"useCompressionStream\",r),on(\"useWebWorkers\",s),l&&(nn.CompressionStream=new $(l)),c&&(nn.DecompressionStream=new $(c)),on(\"CompressionStream\",d),on(\"DecompressionStream\",m),h!==J){const{deflate:n,inflate:e}=h;if((n||e)&&(nn.workerScripts||(nn.workerScripts={})),n){if(!t.isArray(n))throw new p(\"workerScripts.deflate must be an array\");nn.workerScripts.deflate=n}if(e){if(!t.isArray(e))throw new p(\"workerScripts.inflate must be an array\");nn.workerScripts.inflate=e}}}function on(n,e){e!==J&&(nn[n]=e)}function rn(n,e,t){return class{constructor(o){const i=this;var r,s;r=o,s=\"level\",(typeof a.hasOwn===Z?a.hasOwn(r,s):r.hasOwnProperty(s))&&o.level===J&&delete o.level,i.codec=new n(a.assign({},e,o)),t(i.codec,n=>{if(i.pendingData){const e=i.pendingData;i.pendingData=new u(e.length+n.length);const{pendingData:t}=i;t.set(e,0),t.set(n,e.length)}else i.pendingData=new u(n)})}append(n){return this.codec.push(n),o(this)}flush(){return this.codec.push(new u,!0),o(this)}};function o(n){if(n.pendingData){const e=n.pendingData;return n.pendingData=null,e}return new u}}const sn=[];for(let n=0;n<256;n++){let e=n;for(let n=0;n<8;n++)1&e?e=e>>>1^3988292384:e>>>=1;sn[n]=e}class ln{constructor(n){this.crc=n||-1}append(n){let e=0|this.crc;for(let t=0,a=0|n.length;t<a;t++)e=e>>>8^sn[255&(e^n[t])];this.crc=e}get(){return~this.crc}}class cn extends x{constructor(){let n;const e=new ln;super({transform(n,t){e.append(n),t.enqueue(n)},flush(){const t=new u(4);new b(t.buffer).setUint32(0,e.get()),n.value=t}}),n=this}}function dn(n){if(typeof k==Y){n=unescape(encodeURIComponent(n));const e=new u(n.length);for(let t=0;t<e.length;t++)e[t]=n.charCodeAt(t);return e}return(new k).encode(n)}const mn={concat(n,e){if(0===n.length||0===e.length)return n.concat(e);const t=n[n.length-1],a=mn.getPartial(t);return 32===a?n.concat(e):mn._shiftRight(e,a,0|t,n.slice(0,n.length-1))},bitLength(n){const e=n.length;if(0===e)return 0;const t=n[e-1];return 32*(e-1)+mn.getPartial(t)},clamp(n,e){if(32*n.length<e)return n;const t=(n=n.slice(0,s.ceil(e/32))).length;return e&=31,t>0&&e&&(n[t-1]=mn.partial(e,n[t-1]&2147483648>>e-1,1)),n},partial:(n,e,t)=>32===n?e:(t?0|e:e<<32-n)+1099511627776*n,getPartial:n=>s.round(n/1099511627776)||32,_shiftRight(n,e,t,a){for(void 0===a&&(a=[]);e>=32;e-=32)a.push(t),t=0;if(0===e)return a.concat(n);for(let o=0;o<n.length;o++)a.push(t|n[o]>>>e),t=n[o]<<32-e;const o=n.length?n[n.length-1]:0,i=mn.getPartial(o);return a.push(mn.partial(e+i&31,e+i>32?t:a.pop(),1)),a}},hn={bytes:{fromBits(n){const e=mn.bitLength(n)/8,t=new u(e);let a;for(let o=0;o<e;o++)3&o||(a=n[o/4]),t[o]=a>>>24,a<<=8;return t},toBits(n){const e=[];let t,a=0;for(t=0;t<n.length;t++)a=a<<8|n[t],3&~t||(e.push(a),a=0);return 3&t&&e.push(mn.partial(8*(3&t),a)),e}}},pn={sha1:class{constructor(n){const e=this;e.blockSize=512,e._init=[1732584193,4023233417,2562383102,271733878,3285377520],e._key=[1518500249,1859775393,2400959708,3395469782],n?(e._h=n._h.slice(0),e._buffer=n._buffer.slice(0),e._length=n._length):e.reset()}reset(){const n=this;return n._h=n._init.slice(0),n._buffer=[],n._length=0,n}update(n){const e=this;\"string\"==typeof n&&(n=hn.utf8String.toBits(n));const t=e._buffer=mn.concat(e._buffer,n),a=e._length,o=e._length=a+mn.bitLength(n);if(o>9007199254740991)throw new p(\"Cannot hash more than 2^53 - 1 bits\");const i=new w(t);let r=0;for(let n=e.blockSize+a-(e.blockSize+a&e.blockSize-1);n<=o;n+=e.blockSize)e._block(i.subarray(16*r,16*(r+1))),r+=1;return t.splice(0,16*r),e}finalize(){const n=this;let e=n._buffer;const t=n._h;e=mn.concat(e,[mn.partial(1,1)]);for(let n=e.length+2;15&n;n++)e.push(0);for(e.push(s.floor(n._length/4294967296)),e.push(0|n._length);e.length;)n._block(e.splice(0,16));return n.reset(),t}_f(n,e,t,a){return n<=19?e&t|~e&a:n<=39?e^t^a:n<=59?e&t|e&a|t&a:n<=79?e^t^a:void 0}_S(n,e){return e<<n|e>>>32-n}_block(n){const e=this,a=e._h,o=t(80);for(let e=0;e<16;e++)o[e]=n[e];let i=a[0],r=a[1],l=a[2],c=a[3],d=a[4];for(let n=0;n<=79;n++){n>=16&&(o[n]=e._S(1,o[n-3]^o[n-8]^o[n-14]^o[n-16]));const t=e._S(5,i)+e._f(n,r,l,c)+d+o[n]+e._key[s.floor(n/20)]|0;d=c,c=l,l=e._S(30,r),r=i,i=t}a[0]=a[0]+i|0,a[1]=a[1]+r|0,a[2]=a[2]+l|0,a[3]=a[3]+c|0,a[4]=a[4]+d|0}}},un={aes:class{constructor(n){const e=this;e._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],e._tables[0][0][0]||e._precompute();const t=e._tables[0][4],a=e._tables[1],o=n.length;let i,r,s,l=1;if(4!==o&&6!==o&&8!==o)throw new p(\"invalid aes key size\");for(e._key=[r=n.slice(0),s=[]],i=o;i<4*o+28;i++){let n=r[i-1];(i%o===0||8===o&&i%o===4)&&(n=t[n>>>24]<<24^t[n>>16&255]<<16^t[n>>8&255]<<8^t[255&n],i%o===0&&(n=n<<8^n>>>24^l<<24,l=l<<1^283*(l>>7))),r[i]=r[i-o]^n}for(let n=0;i;n++,i--){const e=r[3&n?i:i-4];s[n]=i<=4||n<4?e:a[0][t[e>>>24]]^a[1][t[e>>16&255]]^a[2][t[e>>8&255]]^a[3][t[255&e]]}}encrypt(n){return this._crypt(n,0)}decrypt(n){return this._crypt(n,1)}_precompute(){const n=this._tables[0],e=this._tables[1],t=n[4],a=e[4],o=[],i=[];let r,s,l,c;for(let n=0;n<256;n++)i[(o[n]=n<<1^283*(n>>7))^n]=n;for(let d=r=0;!t[d];d^=s||1,r=i[r]||1){let i=r^r<<1^r<<2^r<<3^r<<4;i=i>>8^255&i^99,t[d]=i,a[i]=d,c=o[l=o[s=o[d]]];let m=16843009*c^65537*l^257*s^16843008*d,h=257*o[i]^16843008*i;for(let t=0;t<4;t++)n[t][d]=h=h<<24^h>>>8,e[t][i]=m=m<<24^m>>>8}for(let t=0;t<5;t++)n[t]=n[t].slice(0),e[t]=e[t].slice(0)}_crypt(n,e){if(4!==n.length)throw new p(\"invalid aes block size\");const t=this._key[e],a=t.length/4-2,o=[0,0,0,0],i=this._tables[e],r=i[0],s=i[1],l=i[2],c=i[3],d=i[4];let m,h,u,g=n[0]^t[0],w=n[e?3:1]^t[1],b=n[2]^t[2],f=n[e?1:3]^t[3],y=4;for(let n=0;n<a;n++)m=r[g>>>24]^s[w>>16&255]^l[b>>8&255]^c[255&f]^t[y],h=r[w>>>24]^s[b>>16&255]^l[f>>8&255]^c[255&g]^t[y+1],u=r[b>>>24]^s[f>>16&255]^l[g>>8&255]^c[255&w]^t[y+2],f=r[f>>>24]^s[g>>16&255]^l[w>>8&255]^c[255&b]^t[y+3],y+=4,g=m,w=h,b=u;for(let n=0;n<4;n++)o[e?3&-n:n]=d[g>>>24]<<24^d[w>>16&255]<<16^d[b>>8&255]<<8^d[255&f]^t[y++],m=g,g=w,w=b,b=f,f=m;return o}}},gn={getRandomValues(n){const e=new w(n.buffer),t=n=>{let e=987654321;const t=4294967295;return function(){e=36969*(65535&e)+(e>>16)&t;return(((e<<16)+(n=18e3*(65535&n)+(n>>16)&t)&t)/4294967296+.5)*(s.random()>.5?1:-1)}};for(let a,o=0;o<n.length;o+=4){const n=t(4294967296*(a||s.random()));a=987654071*n(),e[o/4]=4294967296*n()|0}return n}},wn={ctrGladman:class{constructor(n,e){this._prf=n,this._initIv=e,this._iv=e}reset(){this._iv=this._initIv}update(n){return this.calculate(this._prf,n,this._iv)}incWord(n){if(255&~(n>>24))n+=1<<24;else{let e=n>>16&255,t=n>>8&255,a=255&n;255===e?(e=0,255===t?(t=0,255===a?a=0:++a):++t):++e,n=0,n+=e<<16,n+=t<<8,n+=a}return n}incCounter(n){0===(n[0]=this.incWord(n[0]))&&(n[1]=this.incWord(n[1]))}calculate(n,e,t){let a;if(!(a=e.length))return[];const o=mn.bitLength(e);for(let o=0;o<a;o+=4){this.incCounter(t);const a=n.encrypt(t);e[o]^=a[0],e[o+1]^=a[1],e[o+2]^=a[2],e[o+3]^=a[3]}return mn.clamp(e,o)}}},bn={importKey:n=>new bn.hmacSha1(hn.bytes.toBits(n)),pbkdf2(n,e,t,a){if(t=t||1e4,a<0||t<0)throw new p(\"invalid params to pbkdf2\");const o=1+(a>>5)<<2;let i,r,s,l,c;const d=new ArrayBuffer(o),m=new b(d);let h=0;const u=mn;for(e=hn.bytes.toBits(e),c=1;h<(o||1);c++){for(i=r=n.encrypt(u.concat(e,[c])),s=1;s<t;s++)for(r=n.encrypt(r),l=0;l<r.length;l++)i[l]^=r[l];for(s=0;h<(o||1)&&s<i.length;s++)m.setInt32(h,i[s]),h+=4}return d.slice(0,a/8)},hmacSha1:class{constructor(n){const e=this,t=e._hash=pn.sha1,a=[[],[]];e._baseHash=[new t,new t];const o=e._baseHash[0].blockSize/32;n.length>o&&(n=(new t).update(n).finalize());for(let e=0;e<o;e++)a[0][e]=909522486^n[e],a[1][e]=1549556828^n[e];e._baseHash[0].update(a[0]),e._baseHash[1].update(a[1]),e._resultHash=new t(e._baseHash[0])}reset(){const n=this;n._resultHash=new n._hash(n._baseHash[0]),n._updated=!1}update(n){this._updated=!0,this._resultHash.update(n)}digest(){const n=this,e=n._resultHash.finalize(),t=new n._hash(n._baseHash[1]).update(e).finalize();return n.reset(),t}encrypt(n){if(this._updated)throw new p(\"encrypt on already updated hmac called!\");return this.update(n),this.digest(n)}}},fn=typeof S!=Y&&typeof S.getRandomValues==Z,yn=\"Invalid password\",kn=\"Invalid signature\",vn=\"zipjs-abort-check-password\";function Sn(n){return fn?S.getRandomValues(n):gn.getRandomValues(n)}const jn=16,xn={name:\"PBKDF2\"},Cn=a.assign({hash:{name:\"HMAC\"}},xn),An=a.assign({iterations:1e3,hash:{name:\"SHA-1\"}},xn),Ln=[\"deriveBits\"],zn=[8,12,16],Tn=[16,24,32],En=10,Rn=[0,0,0,0],In=typeof S!=Y,Dn=In&&S.subtle,Mn=In&&typeof Dn!=Y,Pn=hn.bytes,Nn=un.aes,_n=wn.ctrGladman,Bn=bn.hmacSha1;let On=In&&Mn&&typeof Dn.importKey==Z,Fn=In&&Mn&&typeof Dn.deriveBits==Z;class Un extends x{constructor({password:n,rawPassword:e,signed:t,encryptionStrength:o,checkPasswordOnly:i}){super({start(){a.assign(this,{ready:new y(n=>this.resolveReady=n),password:Gn(n,e),signed:t,strength:o-1,pending:new u})},async transform(n,e){const t=this,{password:a,strength:o,resolveReady:r,ready:s}=t;a?(await async function(n,e,t,a){const o=await Wn(n,e,t,Kn(a,0,zn[e])),i=Kn(a,zn[e]);if(o[0]!=i[0]||o[1]!=i[1])throw new p(yn)}(t,o,a,Kn(n,0,zn[o]+2)),n=Kn(n,zn[o]+2),i?e.error(new p(vn)):r()):await s;const l=new u(n.length-En-(n.length-En)%jn);e.enqueue(Hn(t,n,l,0,En,!0))},async flush(n){const{signed:e,ctr:t,hmac:a,pending:o,ready:i}=this;if(a&&t){await i;const r=Kn(o,0,o.length-En),s=Kn(o,o.length-En);let l=new u;if(r.length){const n=Yn(Pn,r);a.update(n);const e=t.update(n);l=Jn(Pn,e)}if(e){const n=Kn(Jn(Pn,a.digest()),0,En);for(let e=0;e<En;e++)if(n[e]!=s[e])throw new p(kn)}n.enqueue(l)}}})}}class qn extends x{constructor({password:n,rawPassword:e,encryptionStrength:t}){let o;super({start(){a.assign(this,{ready:new y(n=>this.resolveReady=n),password:Gn(n,e),strength:t-1,pending:new u})},async transform(n,e){const t=this,{password:a,strength:o,resolveReady:i,ready:r}=t;let s=new u;a?(s=await async function(n,e,t){const a=Sn(new u(zn[e])),o=await Wn(n,e,t,a);return Vn(a,o)}(t,o,a),i()):await r;const l=new u(s.length+n.length-n.length%jn);l.set(s,0),e.enqueue(Hn(t,n,l,s.length,0))},async flush(n){const{ctr:e,hmac:t,pending:a,ready:i}=this;if(t&&e){await i;let r=new u;if(a.length){const n=e.update(Yn(Pn,a));t.update(n),r=Jn(Pn,n)}o.signature=Jn(Pn,t.digest()).slice(0,En),n.enqueue(Vn(r,o.signature))}}}),o=this}}function Hn(n,e,t,a,o,i){const{ctr:r,hmac:s,pending:l}=n,c=e.length-o;let d;for(l.length&&(e=Vn(l,e),t=function(n,e){if(e&&e>n.length){const t=n;(n=new u(e)).set(t,0)}return n}(t,c-c%jn)),d=0;d<=c-jn;d+=jn){const n=Yn(Pn,Kn(e,d,d+jn));i&&s.update(n);const o=r.update(n);i||s.update(o),t.set(Jn(Pn,o),d+a)}return n.pending=Kn(e,d),t}async function Wn(n,e,o,i){n.password=null;const r=await async function(n,e,t,a,o){if(!On)return bn.importKey(e);try{return await Dn.importKey(n,e,t,a,o)}catch(n){return On=!1,bn.importKey(e)}}(\"raw\",o,Cn,!1,Ln),s=await async function(n,e,t){if(!Fn)return bn.pbkdf2(e,n.salt,An.iterations,t);try{return await Dn.deriveBits(n,e,t)}catch(a){return Fn=!1,bn.pbkdf2(e,n.salt,An.iterations,t)}}(a.assign({salt:i},An),r,8*(2*Tn[e]+2)),l=new u(s),c=Yn(Pn,Kn(l,0,Tn[e])),d=Yn(Pn,Kn(l,Tn[e],2*Tn[e])),m=Kn(l,2*Tn[e]);return a.assign(n,{keys:{key:c,authentication:d,passwordVerification:m},ctr:new _n(new Nn(c),t.from(Rn)),hmac:new Bn(d)}),m}function Gn(n,e){return e===J?dn(n):e}function Vn(n,e){let t=n;return n.length+e.length&&(t=new u(n.length+e.length),t.set(n,0),t.set(e,n.length)),t}function Kn(n,e,t){return n.subarray(e,t)}function Jn(n,e){return n.fromBits(e)}function Yn(n,e){return n.toBits(e)}const Zn=12;class $n extends x{constructor({password:n,passwordVerification:e,checkPasswordOnly:t}){super({start(){a.assign(this,{password:n,passwordVerification:e}),ee(this,n)},transform(n,e){const a=this;if(a.password){const e=Qn(a,n.subarray(0,Zn));if(a.password=null,e[11]!=a.passwordVerification)throw new p(yn);n=n.subarray(Zn)}t?e.error(new p(vn)):e.enqueue(Qn(a,n))}})}}class Xn extends x{constructor({password:n,passwordVerification:e}){super({start(){a.assign(this,{password:n,passwordVerification:e}),ee(this,n)},transform(n,e){const t=this;let a,o;if(t.password){t.password=null;const e=Sn(new u(Zn));e[11]=t.passwordVerification,a=new u(n.length+e.length),a.set(ne(t,e),0),o=Zn}else a=new u(n.length),o=0;a.set(ne(t,n),o),e.enqueue(a)}})}}function Qn(n,e){const t=new u(e.length);for(let a=0;a<e.length;a++)t[a]=ae(n)^e[a],te(n,t[a]);return t}function ne(n,e){const t=new u(e.length);for(let a=0;a<e.length;a++)t[a]=ae(n)^e[a],te(n,e[a]);return t}function ee(n,e){const t=[305419896,591751049,878082192];a.assign(n,{keys:t,crcKey0:new ln(t[0]),crcKey2:new ln(t[2])});for(let t=0;t<e.length;t++)te(n,e.charCodeAt(t))}function te(n,e){let[t,a,o]=n.keys;n.crcKey0.append([e]),t=~n.crcKey0.get(),a=ie(s.imul(ie(a+oe(t)),134775813)+1),n.crcKey2.append([a>>>24]),o=~n.crcKey2.get(),n.keys=[t,a,o]}function ae(n){const e=2|n.keys[2];return oe(s.imul(e,1^e)>>>8)}function oe(n){return 255&n}function ie(n){return 4294967295&n}const re=\"deflate-raw\";class se extends x{constructor(n,{chunkSize:e,CompressionStream:t,CompressionStreamNative:a}){super({});const{compressed:o,encrypted:i,useCompressionStream:r,zipCrypto:s,signed:l,level:c}=n,d=this;let m,h,p=ce(super.readable);i&&!s||!l||(m=new cn,p=he(p,m)),o&&(p=me(p,r,{level:c,chunkSize:e},a,t)),i&&(s?p=he(p,new Xn(n)):(h=new qn(n),p=he(p,h))),de(d,p,()=>{let n;i&&!s&&(n=h.signature),i&&!s||!l||(n=new b(m.value.buffer).getUint32(0)),d.signature=n})}}class le extends x{constructor(n,{chunkSize:e,DecompressionStream:t,DecompressionStreamNative:a}){super({});const{zipCrypto:o,encrypted:i,signed:r,signature:s,compressed:l,useCompressionStream:c}=n;let d,m,h=ce(super.readable);i&&(o?h=he(h,new $n(n)):(m=new Un(n),h=he(h,m))),l&&(h=me(h,c,{chunkSize:e},a,t)),i&&!o||!r||(d=new cn,h=he(h,d)),de(this,h,()=>{if((!i||o)&&r){const n=new b(d.value.buffer);if(s!=n.getUint32(0,!1))throw new p(kn)}})}}function ce(n){return he(n,new x({transform(n,e){n&&n.length&&e.enqueue(n)}}))}function de(n,e,t){e=he(e,new x({flush:t})),a.defineProperty(n,\"readable\",{get:()=>e})}function me(n,e,t,a,o){try{n=he(n,new(e&&a?a:o)(re,t))}catch(a){if(!e)return n;try{n=he(n,new o(re,t))}catch(e){return n}}return n}function he(n,e){return n.pipeThrough(e)}const pe=\"message\",ue=\"start\",ge=\"pull\",we=\"data\",be=\"close\",fe=\"deflate\",ye=\"inflate\";class ke extends x{constructor(n,e){super({});const t=this,{codecType:o}=n;let i;o.startsWith(fe)?i=se:o.startsWith(ye)&&(i=le);let r=0,s=0;const l=new i(n,e),c=super.readable,d=new x({transform(n,e){n&&n.length&&(s+=n.length,e.enqueue(n))},flush(){a.assign(t,{inputSize:s})}}),m=new x({transform(n,e){n&&n.length&&(r+=n.length,e.enqueue(n))},flush(){const{signature:n}=l;a.assign(t,{signature:n,outputSize:r,inputSize:s})}});a.defineProperty(t,\"readable\",{get:()=>c.pipeThrough(d).pipeThrough(l).pipeThrough(m)})}}class ve extends x{constructor(n){let e;super({transform:function t(a,o){if(e){const n=new u(e.length+a.length);n.set(e),n.set(a,e.length),a=n,e=null}a.length>n?(o.enqueue(a.slice(0,n)),t(a.slice(n),o)):e=a},flush(n){e&&e.length&&n.enqueue(e)}})}}let Se=typeof E!=Y;class je{constructor(n,{readable:e,writable:t},{options:o,config:i,streamOptions:r,useWebWorkers:s,transferStreams:l,scripts:c},d){const{signal:m}=r;return a.assign(n,{busy:!0,readable:e.pipeThrough(new ve(i.chunkSize)).pipeThrough(new xe(e,r),{signal:m}),writable:t,options:a.assign({},o),scripts:c,transferStreams:l,terminate:()=>new y(e=>{const{worker:t,busy:a}=n;t?(a?n.resolveTerminated=e:(t.terminate(),e()),n.interface=null):e()}),onTaskFinished(){const{resolveTerminated:e}=n;e&&(n.resolveTerminated=null,n.terminated=!0,n.worker.terminate(),e()),n.busy=!1,d(n)}}),(s&&Se?Le:Ae)(n,i)}}class xe extends x{constructor(n,{onstart:e,onprogress:t,size:a,onend:o}){let i=0;super({async start(){e&&await Ce(e,a)},async transform(n,e){i+=n.length,t&&await Ce(t,i,a),e.enqueue(n)},async flush(){n.size=i,o&&await Ce(o,i)}})}}async function Ce(n,...e){try{await n(...e)}catch(n){}}function Ae(n,e){return{run:()=>async function({options:n,readable:e,writable:t,onTaskFinished:a},o){try{const a=new ke(n,o);await e.pipeThrough(a).pipeTo(t,{preventClose:!0,preventAbort:!0});const{signature:i,inputSize:r,outputSize:s}=a;return{signature:i,inputSize:r,outputSize:s}}finally{a()}}(n,e)}}function Le(n,e){const{baseURL:t,chunkSize:o}=e;if(!n.interface){let i;try{i=function(n,e,t){const o={type:\"module\"};let i,r;typeof n==Z&&(n=n());try{i=new h(n,e)}catch(e){i=n}if(ze)try{r=new E(i)}catch(n){ze=!1,r=new E(i,o)}else r=new E(i,o);return r.addEventListener(pe,n=>async function({data:n},e){const{type:t,value:o,messageId:i,result:r,error:s}=n,{reader:l,writer:c,resolveResult:d,rejectResult:m,onTaskFinished:h}=e;try{if(s){const{message:n,stack:e,code:t,name:o}=s,i=new p(n);a.assign(i,{stack:e,code:t,name:o}),g(i)}else{if(t==ge){const{value:n,done:t}=await l.read();Ee({type:we,value:n,done:t,messageId:i},e)}t==we&&(await c.ready,await c.write(new u(o)),Ee({type:\"ack\",messageId:i},e)),t==be&&g(null,r)}}catch(s){Ee({type:be,messageId:i},e),g(s)}function g(n,e){n?m(n):d(e),c&&c.releaseLock(),h()}}(n,t)),r}(n.scripts[0],t,n)}catch(t){return Se=!1,Ae(n,e)}a.assign(n,{worker:i,interface:{run:()=>async function(n,e){let t,o;const i=new y((n,e)=>{t=n,o=e});a.assign(n,{reader:null,writer:null,resolveResult:t,rejectResult:o,result:i});const{readable:r,options:s,scripts:l}=n,{writable:c,closed:d}=function(n){let e;const t=new y(n=>e=n),a=new A({async write(e){const t=n.getWriter();await t.ready,await t.write(e),t.releaseLock()},close(){e()},abort:e=>n.getWriter().abort(e)});return{writable:a,closed:t}}(n.writable),m=Ee({type:ue,scripts:l.slice(1),options:s,config:e,readable:r,writable:c},n);m||a.assign(n,{reader:r.getReader(),writer:c.getWriter()});const h=await i;m||await c.getWriter().close();return await d,h}(n,{chunkSize:o})}})}return n.interface}let ze=!0,Te=!0;function Ee(n,{worker:e,writer:t,onTaskFinished:a,transferStreams:o}){try{let{value:t,readable:a,writable:i}=n;const r=[];if(t&&(t.byteLength<t.buffer.byteLength?n.value=t.buffer.slice(0,t.byteLength):n.value=t.buffer,r.push(n.value)),o&&Te?(a&&r.push(a),i&&r.push(i)):n.readable=n.writable=null,r.length)try{return e.postMessage(n,r),!0}catch(t){Te=!1,n.readable=n.writable=null,e.postMessage(n)}else e.postMessage(n)}catch(n){throw t&&t.releaseLock(),a(),n}}let Re=[];const Ie=[];let De=0;async function Me(n,e){const{options:t,config:a}=e,{transferStreams:o,useWebWorkers:r,useCompressionStream:s,codecType:l,compressed:c,signed:d,encrypted:m}=t,{workerScripts:h,maxWorkers:p}=a;e.transferStreams=o||o===J;const u=!(c||d||m||e.transferStreams);return e.useWebWorkers=!u&&(r||r===J&&a.useWebWorkers),e.scripts=e.useWebWorkers&&h?h[l]:[],t.useCompressionStream=s||s===J&&a.useCompressionStream,(await async function(){const t=Re.find(n=>!n.busy);if(t)return Pe(t),new je(t,n,e,g);if(Re.length<p){const t={indexWorker:De};return De++,Re.push(t),new je(t,n,e,g)}return new y(t=>Ie.push({resolve:t,stream:n,workerOptions:e}))}()).run();function g(n){if(Ie.length){const[{resolve:e,stream:t,workerOptions:a}]=Ie.splice(0,1);e(new je(n,t,a,g))}else n.worker?(Pe(n),function(n,e){const{config:t}=e,{terminateWorkerTimeout:a}=t;i.isFinite(a)&&a>=0&&(n.terminated?n.terminated=!1:n.terminateTimeout=setTimeout(async()=>{Re=Re.filter(e=>e!=n);try{await n.terminate()}catch(n){}},a))}(n,e)):Re=Re.filter(e=>e!=n)}}function Pe(n){const{terminateTimeout:e}=n;e&&(clearTimeout(e),n.terminateTimeout=null)}const Ne=\"HTTP error \",_e=\"HTTP Range not supported\",Be=\"Writer iterator completed too soon\",Oe=\"Range\",Fe=\"GET\",Ue=\"bytes\",qe=65536,He=\"writable\";class We{constructor(){this.size=0}init(){this.initialized=!0}}class Ge extends We{get readable(){const n=this,{chunkSize:e=qe}=n,t=new C({start(){this.chunkOffset=0},async pull(a){const{offset:o=0,size:i,diskNumberStart:r}=t,{chunkOffset:l}=this;a.enqueue(await wt(n,o+l,s.min(e,i-l),r)),l+e>i?a.close():this.chunkOffset+=e}});return t}}class Ve extends We{constructor(){super();const n=this,e=new A({write:e=>n.writeUint8Array(e)});a.defineProperty(n,He,{get:()=>e})}writeUint8Array(){}}class Ke extends Ge{constructor(n){super(),a.assign(this,{blob:n,size:n.size})}async readUint8Array(n,e){const t=this,a=n+e,o=n||a<t.size?t.blob.slice(n,a):t.blob;let i=await o.arrayBuffer();return i.byteLength>e&&(i=i.slice(n,a)),new u(i)}}class Je extends We{constructor(n){super();const e=new x,t=[];n&&t.push([\"Content-Type\",n]),a.defineProperty(this,He,{get:()=>e.writable}),this.blob=new m(e.readable,{headers:t}).blob()}getData(){return this.blob}}class Ye extends Ke{constructor(n){super(new f([n],{type:\"text/plain\"}))}}class Ze extends Ge{constructor(n,e){super(),Xe(this,n,e)}async init(){await Qe(this,st,at),super.init()}readUint8Array(n,e){return nt(this,n,e,st,at)}}class $e extends Ge{constructor(n,e){super(),Xe(this,n,e)}async init(){await Qe(this,lt,ot),super.init()}readUint8Array(n,e){return nt(this,n,e,lt,ot)}}function Xe(n,e,t){const{preventHeadRequest:o,useRangeHeader:i,forceRangeRequests:r,combineSizeEocd:s}=t;delete(t=a.assign({},t)).preventHeadRequest,delete t.useRangeHeader,delete t.forceRangeRequests,delete t.combineSizeEocd,delete t.useXHR,a.assign(n,{url:e,options:t,preventHeadRequest:o,useRangeHeader:i,forceRangeRequests:r,combineSizeEocd:s})}async function Qe(n,e,t){const{url:a,preventHeadRequest:o,useRangeHeader:r,forceRangeRequests:s,combineSizeEocd:l}=n;if(function(n){const{baseURL:e}=en(),{protocol:t}=new h(n,e);return\"http:\"==t||\"https:\"==t}(a)&&(r||s)&&(void 0===o||o)){const a=await e(Fe,n,et(n,l?-22:void 0));if(!s&&a.headers.get(\"Accept-Ranges\")!=Ue)throw new p(_e);{let o;l&&(n.eocdCache=new u(await a.arrayBuffer()));const r=a.headers.get(\"Content-Range\");if(r){const n=r.trim().split(/\\s*\\/\\s*/);if(n.length){const e=n[1];e&&\"*\"!=e&&(o=i(e))}}o===J?await rt(n,e,t):n.size=o}}else await rt(n,e,t)}async function nt(n,e,t,a,o){const{useRangeHeader:i,forceRangeRequests:r,eocdCache:s,size:l,options:c}=n;if(i||r){if(s&&e==l-F&&t==F)return s;const o=await a(Fe,n,et(n,e,t));if(206!=o.status)throw new p(_e);return new u(await o.arrayBuffer())}{const{data:a}=n;return a||await o(n,c),new u(n.data.subarray(e,e+t))}}function et(n,e=0,t=1){return a.assign({},tt(n),{[Oe]:Ue+\"=\"+(e<0?e:e+\"-\"+(e+t-1))})}function tt({options:n}){const{headers:e}=n;if(e)return Symbol.iterator in e?a.fromEntries(e):e}async function at(n){await it(n,st)}async function ot(n){await it(n,lt)}async function it(n,e){const t=await e(Fe,n,tt(n));n.data=new u(await t.arrayBuffer()),n.size||(n.size=n.data.length)}async function rt(n,e,t){if(n.preventHeadRequest)await t(n,n.options);else{const a=(await e(\"HEAD\",n,tt(n))).headers.get(\"Content-Length\");a?n.size=i(a):await t(n,n.options)}}async function st(n,{options:e,url:t},o){const i=await fetch(t,a.assign({},e,{method:n,headers:o}));if(i.status<400)return i;throw 416==i.status?new p(_e):new p(Ne+(i.statusText||i.status))}function lt(n,{url:e},t){return new y((o,i)=>{const r=new XMLHttpRequest;if(r.addEventListener(\"load\",()=>{if(r.status<400){const n=[];r.getAllResponseHeaders().trim().split(/[\\r\\n]+/).forEach(e=>{const t=e.trim().split(/\\s*:\\s*/);t[0]=t[0].trim().replace(/^[a-z]|-[a-z]/g,n=>n.toUpperCase()),n.push(t)}),o({status:r.status,arrayBuffer:()=>r.response,headers:new c(n)})}else i(416==r.status?new p(_e):new p(Ne+(r.statusText||r.status)))},!1),r.addEventListener(\"error\",n=>i(n.detail?n.detail.error:new p(\"Network error\")),!1),r.open(n,e),t)for(const n of a.entries(t))r.setRequestHeader(n[0],n[1]);r.responseType=\"arraybuffer\",r.send()})}class ct extends Ge{constructor(n,e={}){super(),a.assign(this,{url:n,reader:e.useXHR?new $e(n,e):new Ze(n,e)})}set size(n){}get size(){return this.reader.size}async init(){await this.reader.init(),super.init()}readUint8Array(n,e){return this.reader.readUint8Array(n,e)}}class dt extends Ve{init(n=0){a.assign(this,{offset:0,array:new u(n)}),super.init()}writeUint8Array(n){const e=this;if(e.offset+n.length>e.array.length){const t=e.array;e.array=new u(t.length+n.length),e.array.set(t)}e.array.set(n,e.offset),e.offset+=n.length}getData(){return this.array}}class mt extends Ge{constructor(n){super(),this.readers=n}async init(){const n=this,{readers:e}=n;n.lastDiskNumber=0,n.lastDiskOffset=0,await y.all(e.map(async(t,a)=>{await t.init(),a!=e.length-1&&(n.lastDiskOffset+=t.size),n.size+=t.size})),super.init()}async readUint8Array(n,e,t=0){const a=this,{readers:o}=this;let i,r=t;-1==r&&(r=o.length-1);let l=n;for(;l>=o[r].size;)l-=o[r].size,r++;const c=o[r],d=c.size;if(l+e<=d)i=await wt(c,l,e);else{const o=d-l;i=new u(e),i.set(await wt(c,l,o)),i.set(await a.readUint8Array(n+o,e-o,t),o)}return a.lastDiskNumber=s.max(r,a.lastDiskNumber),i}}class ht extends We{constructor(n,e=4294967295){super();const t=this;let o,i,r;a.assign(t,{diskNumber:0,diskOffset:0,size:0,maxSize:e,availableSize:e});const s=new A({async write(e){const{availableSize:a}=t;if(r)e.length>=a?(await l(e.slice(0,a)),await c(),t.diskOffset+=o.size,t.diskNumber++,r=null,await this.write(e.slice(a))):await l(e);else{const{value:a,done:s}=await n.next();if(s&&!a)throw new p(Be);o=a,o.size=0,o.maxSize&&(t.maxSize=o.maxSize),t.availableSize=t.maxSize,await pt(o),i=a.writable,r=i.getWriter(),await this.write(e)}},async close(){await r.ready,await c()}});async function l(n){const e=n.length;e&&(await r.ready,await r.write(n),o.size+=e,t.size+=e,t.availableSize-=e)}async function c(){i.size=o.size,await r.close()}a.defineProperty(t,He,{get:()=>s})}}async function pt(n,e){if(!n.init||n.initialized)return y.resolve();await n.init(e)}function ut(n){return t.isArray(n)&&(n=new mt(n)),n instanceof C&&(n={readable:n}),n}function gt(n){n.writable===J&&typeof n.next==Z&&(n=new ht(n)),n instanceof A&&(n={writable:n});const{writable:e}=n;return e.size===J&&(e.size=0),n instanceof ht||a.assign(n,{diskNumber:0,diskOffset:0,availableSize:1/0,maxSize:1/0}),n}function wt(n,e,t,a){return n.readUint8Array(e,t,a)}const bt=mt,ft=ht,yt=\"\\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \".split(\"\"),kt=256==yt.length;function vt(n,e){return e&&\"cp437\"==e.trim().toLowerCase()?function(n){if(kt){let e=\"\";for(let t=0;t<n.length;t++)e+=yt[n[t]];return e}return(new v).decode(n)}(n):new v(e).decode(n)}const St=\"filename\",jt=\"rawFilename\",xt=\"comment\",Ct=\"rawComment\",At=\"uncompressedSize\",Lt=\"compressedSize\",zt=\"offset\",Tt=\"diskNumberStart\",Et=\"lastModDate\",Rt=\"rawLastModDate\",It=\"lastAccessDate\",Dt=\"rawLastAccessDate\",Mt=\"creationDate\",Pt=\"rawCreationDate\",Nt=\"internalFileAttribute\",_t=\"externalFileAttribute\",Bt=\"msDosCompatible\",Ot=\"zip64\",Ft=[St,jt,Lt,At,Et,Rt,xt,Ct,It,Mt,zt,Tt,Tt,Nt,_t,Bt,Ot,\"directory\",\"bitFlag\",\"encrypted\",\"signature\",\"filenameUTF8\",\"commentUTF8\",\"compressionMethod\",\"version\",\"versionMadeBy\",\"extraField\",\"rawExtraField\",\"extraFieldZip64\",\"extraFieldUnicodePath\",\"extraFieldUnicodeComment\",\"extraFieldAES\",\"extraFieldNTFS\",\"extraFieldExtendedTimestamp\"];class Ut{constructor(n){Ft.forEach(e=>this[e]=n[e])}}const qt=\"File format is not recognized\",Ht=\"End of central directory not found\",Wt=\"End of Zip64 central directory locator not found\",Gt=\"Central directory header not found\",Vt=\"Local file header not found\",Kt=\"Zip64 extra field not found\",Jt=\"File contains encrypted entry\",Yt=\"Encryption method not supported\",Zt=\"Compression method not supported\",$t=\"Split zip file\",Xt=\"utf-8\",Qt=\"cp437\",na=[[At,R],[Lt,R],[zt,R],[Tt,I]],ea={[I]:{getValue:ha,bytes:4},[R]:{getValue:pa,bytes:8}};class ta{constructor(n,e={}){a.assign(this,{reader:ut(n),options:e,config:en()})}async*getEntriesGenerator(n={}){const e=this;let{reader:t}=e;const{config:o}=e;if(await pt(t),t.size!==J&&t.readUint8Array||(t=new Ke(await new m(t.readable).blob()),await pt(t)),t.size<F)throw new p(qt);t.chunkSize=tn(o);const i=await async function(n,e,t,a,o){const i=new u(4);!function(n,e,t){n.setUint32(e,t,!0)}(ua(i),0,e);const r=a+o;return await l(a)||await l(s.min(r,t));async function l(e){const o=t-e,r=await wt(n,o,e);for(let n=r.length-a;n>=0;n--)if(r[n]==i[0]&&r[n+1]==i[1]&&r[n+2]==i[2]&&r[n+3]==i[3])return{offset:o+n,buffer:r.slice(n,n+a).buffer}}}(t,_,t.size,F,1048560);if(!i){throw ha(ua(await wt(t,0,4)))==M?new p($t):new p(Ht)}const r=ua(i);let l=ha(r,12),c=ha(r,16);const d=i.offset,h=ma(r,20),g=d+F+h;let w=ma(r,4);const b=t.lastDiskNumber||0;let f=ma(r,6),y=ma(r,8),k=0,v=0;if(c==R||l==R||y==I||f==I){const n=ua(await wt(t,i.offset-20,20));if(ha(n,0)==O){c=pa(n,8);let e=await wt(t,c,56,-1),a=ua(e);const o=i.offset-20-56;if(ha(a,0)!=B&&c!=o){const n=c;c=o,k=c-n,e=await wt(t,c,56,-1),a=ua(e)}if(ha(a,0)!=B)throw new p(Wt);w==I&&(w=ha(a,16)),f==I&&(f=ha(a,20)),y==I&&(y=pa(a,32)),l==R&&(l=pa(a,40)),c-=l}}if(c>=t.size&&(k=t.size-c-l-F,c=t.size-l-F),b!=w)throw new p($t);if(c<0)throw new p(qt);let S=0,j=await wt(t,c,l,f),x=ua(j);if(l){const n=i.offset-l;if(ha(x,S)!=N&&c!=n){const e=c;c=n,k+=c-e,j=await wt(t,c,l,f),x=ua(j)}}const C=i.offset-c-(t.lastDiskOffset||0);if(l!=C&&C>=0&&(l=C,j=await wt(t,c,l,f),x=ua(j)),c<0||c>=t.size)throw new p(qt);const A=sa(e,n,\"filenameEncoding\"),L=sa(e,n,\"commentEncoding\");for(let i=0;i<y;i++){const r=new aa(t,o,e.options);if(ha(x,S)!=N)throw new p(Gt);oa(r,x,S+6);const l=Boolean(r.bitFlag.languageEncodingFlag),c=S+46,d=c+r.filenameLength,m=d+r.extraFieldLength,h=ma(x,S+4),u=!(0&h),g=j.subarray(c,d),w=ma(x,S+32),b=m+w,f=j.subarray(m,b),C=l,z=l,T=u&&!(16&~da(x,S+38)),E=ha(x,S+42)+k;a.assign(r,{versionMadeBy:h,msDosCompatible:u,compressedSize:0,uncompressedSize:0,commentLength:w,directory:T,offset:E,diskNumberStart:ma(x,S+34),internalFileAttribute:ma(x,S+36),externalFileAttribute:ha(x,S+38),rawFilename:g,filenameUTF8:C,commentUTF8:z,rawExtraField:j.subarray(d,m)});const R=sa(e,n,\"decodeText\")||vt,I=C?Xt:A||Qt,D=z?Xt:L||Qt;let M=R(g,I);M===J&&(M=vt(g,I));let P=R(f,D);P===J&&(P=vt(f,D)),a.assign(r,{rawComment:f,filename:M,comment:P,directory:T||M.endsWith(G)}),v=s.max(E,v),await ia(r,r,x,S+6);const _=new Ut(r);_.getData=(n,e)=>r.getData(n,_,e),S=b;const{onprogress:B}=n;if(B)try{await B(i+1,y,new Ut(r))}catch(n){}yield _}const z=sa(e,n,\"extractPrependedData\"),T=sa(e,n,\"extractAppendedData\");return z&&(e.prependedData=v>0?await wt(t,0,v):new u),e.comment=h?await wt(t,d+F,h):new u,T&&(e.appendedData=g<t.size?await wt(t,g,t.size-g):new u),!0}async getEntries(n={}){const e=[];for await(const t of this.getEntriesGenerator(n))e.push(t);return e}async close(){}}class aa{constructor(n,e,t){a.assign(this,{reader:n,config:e,options:t})}async getData(n,e,t={}){const o=this,{reader:i,offset:r,diskNumberStart:s,extraFieldAES:l,compressionMethod:c,config:d,bitFlag:m,signature:h,rawLastModDate:g,uncompressedSize:w,compressedSize:b}=o,f=e.localDirectory={},y=ua(await wt(i,r,30,s));let k=sa(o,t,\"password\"),v=sa(o,t,\"rawPassword\");if(k=k&&k.length&&k,v=v&&v.length&&v,l&&99!=l.originalCompressionMethod)throw new p(Zt);if(0!=c&&8!=c)throw new p(Zt);if(ha(y,0)!=D)throw new p(Vt);oa(f,y,4),f.rawExtraField=f.extraFieldLength?await wt(i,r+30+f.filenameLength,f.extraFieldLength,s):new u,await ia(o,f,y,4,!0),a.assign(e,{lastAccessDate:f.lastAccessDate,creationDate:f.creationDate});const S=o.encrypted&&f.encrypted,j=S&&!l;if(S){if(!j&&l.strength===J)throw new p(Yt);if(!k&&!v)throw new p(Jt)}const x=r+30+f.filenameLength+f.extraFieldLength,C=b,L=i.readable;a.assign(L,{diskNumberStart:s,offset:x,size:C});const z=sa(o,t,\"signal\"),T=sa(o,t,\"checkPasswordOnly\");T&&(n=new A),n=gt(n),await pt(n,w);const{writable:E}=n,{onstart:R,onprogress:I,onend:M}=t,P={options:{codecType:ye,password:k,rawPassword:v,zipCrypto:j,encryptionStrength:l&&l.strength,signed:sa(o,t,\"checkSignature\"),passwordVerification:j&&(m.dataDescriptor?g>>>8&255:h>>>24&255),signature:h,compressed:0!=c,encrypted:S,useWebWorkers:sa(o,t,\"useWebWorkers\"),useCompressionStream:sa(o,t,\"useCompressionStream\"),transferStreams:sa(o,t,\"transferStreams\"),checkPasswordOnly:T},config:d,streamOptions:{signal:z,size:C,onstart:R,onprogress:I,onend:M}};let N=0;try{({outputSize:N}=await Me({readable:L,writable:E},P))}catch(n){if(!T||n.message!=vn)throw n}finally{const n=sa(o,t,\"preventClose\");E.size+=N,n||E.locked||await E.getWriter().close()}return T?J:n.getData?n.getData():E}}function oa(n,e,t){const o=n.rawBitFlag=ma(e,t+2),i=!(1&~o),r=ha(e,t+6);a.assign(n,{encrypted:i,version:ma(e,t),bitFlag:{level:(6&o)>>1,dataDescriptor:!(8&~o),languageEncodingFlag:(o&W)==W},rawLastModDate:r,lastModDate:la(r),filenameLength:ma(e,t+22),extraFieldLength:ma(e,t+24)})}async function ia(n,e,t,o,i){const{rawExtraField:r}=e,s=e.extraField=new c,d=ua(new u(r));let m=0;try{for(;m<r.length;){const n=ma(d,m),e=ma(d,m+2);s.set(n,{type:n,data:r.slice(m+4,m+4+e)}),m+=4+e}}catch(n){}const h=ma(t,o+4);a.assign(e,{signature:ha(t,o+10),uncompressedSize:ha(t,o+18),compressedSize:ha(t,o+14)});const g=s.get(1);g&&(!function(n,e){e.zip64=!0;const t=ua(n.data),a=na.filter(([n,t])=>e[n]==t);for(let o=0,i=0;o<a.length;o++){const[r,s]=a[o];if(e[r]==s){const a=ea[s];e[r]=n[r]=a.getValue(t,i),i+=a.bytes}else if(n[r])throw new p(Kt)}}(g,e),e.extraFieldZip64=g);const w=s.get(28789);w&&(await ra(w,St,jt,e,n),e.extraFieldUnicodePath=w);const b=s.get(25461);b&&(await ra(b,xt,Ct,e,n),e.extraFieldUnicodeComment=b);const f=s.get(39169);f?(!function(n,e,t){const o=ua(n.data),i=da(o,4);a.assign(n,{vendorVersion:da(o,0),vendorId:da(o,2),strength:i,originalCompressionMethod:t,compressionMethod:ma(o,5)}),e.compressionMethod=n.compressionMethod}(f,e,h),e.extraFieldAES=f):e.compressionMethod=h;const y=s.get(10);y&&(!function(n,e){const t=ua(n.data);let o,i=4;try{for(;i<n.data.length&&!o;){const e=ma(t,i),a=ma(t,i+2);1==e&&(o=n.data.slice(i+4,i+4+a)),i+=4+a}}catch(n){}try{if(o&&24==o.length){const t=ua(o),i=t.getBigUint64(0,!0),r=t.getBigUint64(8,!0),s=t.getBigUint64(16,!0);a.assign(n,{rawLastModDate:i,rawLastAccessDate:r,rawCreationDate:s});const l=ca(i),c=ca(r),d={lastModDate:l,lastAccessDate:c,creationDate:ca(s)};a.assign(n,d),a.assign(e,d)}}catch(n){}}(y,e),e.extraFieldNTFS=y);const k=s.get(q);k&&(!function(n,e,t){const a=ua(n.data),o=da(a,0),i=[],r=[];t?(1&~o||(i.push(Et),r.push(Rt)),2&~o||(i.push(It),r.push(Dt)),4&~o||(i.push(Mt),r.push(Pt))):n.data.length>=5&&(i.push(Et),r.push(Rt));let s=1;i.forEach((t,o)=>{if(n.data.length>=s+4){const i=ha(a,s);e[t]=n[t]=new l(1e3*i);const c=r[o];n[c]=i}s+=4})}(k,e,i),e.extraFieldExtendedTimestamp=k);const v=s.get(6534);v&&(e.extraFieldUSDZ=v)}async function ra(n,e,t,o,i){const r=ua(n.data),s=new ln;s.append(i[t]);const l=ua(new u(4));l.setUint32(0,s.get(),!0);const c=ha(r,1);a.assign(n,{version:da(r,0),[e]:vt(n.data.subarray(5)),valid:!i.bitFlag.languageEncodingFlag&&c==ha(l,0)}),n.valid&&(o[e]=n[e],o[e+\"UTF8\"]=!0)}function sa(n,e,t){return e[t]===J?n.options[t]:e[t]}function la(n){const e=(4294901760&n)>>16,t=65535&n;try{return new l(1980+((65024&e)>>9),((480&e)>>5)-1,31&e,(63488&t)>>11,(2016&t)>>5,2*(31&t),0)}catch(n){}}function ca(n){return new l(i(n/r(1e4)-r(116444736e5)))}function da(n,e){return n.getUint8(e)}function ma(n,e){return n.getUint16(e,!0)}function ha(n,e){return n.getUint32(e,!0)}function pa(n,e){return i(n.getBigUint64(e,!0))}function ua(n){return new b(n.buffer)}const ga=\"File already exists\",wa=\"Zip file comment exceeds 64KB\",ba=\"File entry comment exceeds 64KB\",fa=\"File entry name exceeds 64KB\",ya=\"Version exceeds 65535\",ka=\"The strength must equal 1, 2, or 3\",va=\"Extra field type exceeds 65535\",Sa=\"Extra field data exceeds 64KB\",ja=\"Zip64 is not supported (make sure 'keepOrder' is set to 'true')\",xa=new u([7,0,2,0,65,69,3,0,0]);let Ca=0;const Aa=[];class La{constructor(n,e={}){const t=(n=gt(n)).availableSize!==J&&n.availableSize>0&&n.availableSize!==1/0&&n.maxSize!==J&&n.maxSize>0&&n.maxSize!==1/0;a.assign(this,{writer:n,addSplitZipSignature:t,options:e,config:en(),files:new c,filenames:new d,offset:n.writable.size,pendingEntriesSize:0,pendingAddFileCalls:new d,bufferedWrites:0})}async add(n=\"\",e,o={}){const i=this,{pendingAddFileCalls:c,config:d}=i;let h;Ca<d.maxWorkers?Ca++:await new y(n=>Aa.push(n));try{if(n=n.trim(),i.filenames.has(n))throw new p(ga);return i.filenames.add(n),h=async function(n,e,o,i){e=e.trim(),i.directory&&!e.endsWith(G)?e+=G:i.directory=e.endsWith(G);const c=Ea(n,i,\"encodeText\",dn);let d=c(e);d===J&&(d=dn(e));if(_a(d)>I)throw new p(fa);const h=i.comment||\"\";let f=c(h);f===J&&(f=dn(h));if(_a(f)>I)throw new p(ba);const k=Ea(n,i,\"version\",20);if(k>I)throw new p(ya);const v=Ea(n,i,\"versionMadeBy\",20);if(v>I)throw new p(ya);const S=Ea(n,i,Et,new l),j=Ea(n,i,It),C=Ea(n,i,Mt),A=Ea(n,i,Bt,!0),L=Ea(n,i,Nt,0),z=Ea(n,i,_t,0),T=Ea(n,i,\"password\"),E=Ea(n,i,\"rawPassword\"),N=Ea(n,i,\"encryptionStrength\",3),_=Ea(n,i,\"zipCrypto\"),B=Ea(n,i,\"extendedTimestamp\",!0),O=Ea(n,i,\"keepOrder\",!0),F=Ea(n,i,\"level\"),Y=Ea(n,i,\"useWebWorkers\"),Z=Ea(n,i,\"bufferedWrite\"),$=Ea(n,i,\"dataDescriptorSignature\",!1),X=Ea(n,i,\"signal\"),Q=Ea(n,i,\"useCompressionStream\");let nn=Ea(n,i,\"dataDescriptor\",!0),en=Ea(n,i,Ot);if(T!==J&&N!==J&&(N<1||N>3))throw new p(ka);let an=new u;const{extraField:on}=i;if(on){let n=0,e=0;on.forEach(e=>n+=4+_a(e)),an=new u(n),on.forEach((n,t)=>{if(t>I)throw new p(va);if(_a(n)>I)throw new p(Sa);Pa(an,new g([t]),e),Pa(an,new g([_a(n)]),e+2),Pa(an,n,e+4),e+=4+_a(n)})}let rn=0,sn=0,ln=0;const cn=!0===en;o&&(o=ut(o),await pt(o),o.size===J?(nn=!0,(en||en===J)&&(en=!0,ln=rn=4294967296)):(ln=o.size,rn=function(n){return n+5*(s.floor(n/16383)+1)}(ln)));const{diskOffset:mn,diskNumber:hn,maxSize:pn}=n.writer,un=cn||ln>R,gn=cn||rn>R,wn=cn||n.offset+n.pendingEntriesSize-mn>R,bn=Ea(n,i,\"supportZip64SplitFile\",!0),fn=bn&&cn||hn+s.ceil(n.pendingEntriesSize/pn)>I;if(wn||un||gn||fn){if(!1===en||!O)throw new p(ja);en=!0}en=en||!1,i=a.assign({},i,{rawFilename:d,rawComment:f,version:k,versionMadeBy:v,lastModDate:S,lastAccessDate:j,creationDate:C,rawExtraField:an,zip64:en,zip64UncompressedSize:un,zip64CompressedSize:gn,zip64Offset:wn,zip64DiskNumberStart:fn,password:T,rawPassword:E,level:Q||n.config.CompressionStream!==J||n.config.CompressionStreamNative!==J?F:0,useWebWorkers:Y,encryptionStrength:N,extendedTimestamp:B,zipCrypto:_,bufferedWrite:Z,keepOrder:O,dataDescriptor:nn,dataDescriptorSignature:$,signal:X,msDosCompatible:A,internalFileAttribute:L,externalFileAttribute:z,useCompressionStream:Q});const yn=function(n){const{rawFilename:e,lastModDate:t,lastAccessDate:a,creationDate:o,rawPassword:i,password:r,level:l,zip64:c,zipCrypto:d,dataDescriptor:m,directory:h,rawExtraField:p,encryptionStrength:g,extendedTimestamp:b}=n,f=0!==l&&!h,y=Boolean(r&&_a(r)||i&&_a(i));let k,v,S,j,x=n.version;if(y&&!d){k=new u(_a(xa)+2);const n=Na(k);Ia(n,0,U),Pa(k,xa,2),Ra(n,8,g)}else k=new u;if(b){S=new u(9+(a?4:0)+(o?4:0));const n=Na(S);Ia(n,0,q),Ia(n,2,_a(S)-4),j=1+(a?2:0)+(o?4:0),Ra(n,4,j);let e=5;Da(n,e,s.floor(t.getTime()/1e3)),e+=4,a&&(Da(n,e,s.floor(a.getTime()/1e3)),e+=4),o&&Da(n,e,s.floor(o.getTime()/1e3));try{v=new u(36);const n=Na(v),e=Ta(t);Ia(n,0,10),Ia(n,2,32),Ia(n,8,1),Ia(n,10,24),Ma(n,12,e),Ma(n,20,Ta(a)||e),Ma(n,28,Ta(o)||e)}catch(n){v=new u}}else v=S=new u;let C=W;m&&(C|=8);let A=0;f&&(A=8);c&&(x=x>45?x:45);y&&(C|=1,d||(x=x>51?x:51,A=99,f&&(k[9]=8)));const L=new u(26),z=Na(L);Ia(z,0,x),Ia(z,2,C),Ia(z,4,A);const T=new w(1),E=Na(T);let R;R=t<K?K:t>V?V:t;Ia(E,0,(R.getHours()<<6|R.getMinutes())<<5|R.getSeconds()/2),Ia(E,2,(R.getFullYear()-1980<<4|R.getMonth()+1)<<5|R.getDate());const I=T[0];Da(z,6,I),Ia(z,22,_a(e));const M=_a(k,S,v,p);Ia(z,24,M);const P=new u(30+_a(e)+M);return Da(Na(P),0,D),Pa(P,L,4),Pa(P,e,30),Pa(P,k,30+_a(e)),Pa(P,S,30+_a(e,k)),Pa(P,v,30+_a(e,k,S)),Pa(P,p,30+_a(e,k,S,v)),{localHeaderArray:P,headerArray:L,headerView:z,lastModDate:t,rawLastModDate:I,encrypted:y,compressed:f,version:x,compressionMethod:A,extraFieldExtendedTimestampFlag:j,rawExtraFieldExtendedTimestamp:S,rawExtraFieldNTFS:v,rawExtraFieldAES:k,extraFieldLength:M}}(i),kn=function(n){const{zip64:e,dataDescriptor:t,dataDescriptorSignature:a}=n;let o,i=new u,r=0;t&&(i=new u(e?a?24:20:a?16:12),o=Na(i),a&&(r=4,Da(o,0,P)));return{dataDescriptorArray:i,dataDescriptorView:o,dataDescriptorOffset:r}}(i),vn=_a(yn.localHeaderArray,kn.dataDescriptorArray);sn=vn+rn,n.options.usdz&&(sn+=sn+64);let Sn;n.pendingEntriesSize+=sn;try{Sn=await async function(n,e,o,i,s){const{files:l,writer:c}=n,{keepOrder:d,dataDescriptor:h,signal:g}=s,{headerInfo:w}=i,{usdz:f}=n.options,k=t.from(l.values()).pop();let v,S,j,C,A,L,z,T={};l.set(e,T);try{let t;d&&(t=k&&k.lock,E()),!(s.bufferedWrite||n.writerLocked||n.bufferedWrites&&d)&&h||f?(L=c,await I()):(L=new x,z=new m(L.readable).blob(),L.writable.size=0,v=!0,n.bufferedWrites++,await pt(c)),await pt(L);const{writable:w}=c;let{diskOffset:y}=c;if(n.addSplitZipSignature){delete n.addSplitZipSignature;const e=new u(4);Da(Na(e),0,M),await za(w,e),n.offset+=4}f&&function(n,e){const{headerInfo:t}=n;let{localHeaderArray:a,extraFieldLength:o}=t,i=Na(a),r=64-(e+_a(a))%64;r<4&&(r+=64);const s=new u(r),l=Na(s);Ia(l,0,H),Ia(l,2,r-2);const c=a;t.localHeaderArray=a=new u(_a(c)+r),Pa(a,c),Pa(a,s,_a(c)),i=Na(a),Ia(i,28,o+r),n.metadataSize+=r}(i,n.offset-y),v||(await t,await D(w));const{diskNumber:S}=c;if(A=!0,T.diskNumberStart=S,T=await async function(n,e,{diskNumberStart:t,lock:o},i,s,l){const{headerInfo:c,dataDescriptorInfo:d,metadataSize:m}=i,{localHeaderArray:h,headerArray:p,lastModDate:g,rawLastModDate:w,encrypted:b,compressed:f,version:y,compressionMethod:k,rawExtraFieldExtendedTimestamp:v,extraFieldExtendedTimestampFlag:S,rawExtraFieldNTFS:j,rawExtraFieldAES:x}=c,{dataDescriptorArray:C}=d,{rawFilename:A,lastAccessDate:L,creationDate:z,password:T,rawPassword:E,level:I,zip64:D,zip64UncompressedSize:M,zip64CompressedSize:P,zip64Offset:N,zip64DiskNumberStart:_,zipCrypto:B,dataDescriptor:O,directory:F,versionMadeBy:U,rawComment:q,rawExtraField:H,useWebWorkers:W,onstart:G,onprogress:V,onend:K,signal:Y,encryptionStrength:Z,extendedTimestamp:$,msDosCompatible:X,internalFileAttribute:Q,externalFileAttribute:nn,useCompressionStream:en}=l,an={lock:o,versionMadeBy:U,zip64:D,directory:Boolean(F),filenameUTF8:!0,rawFilename:A,commentUTF8:!0,rawComment:q,rawExtraFieldExtendedTimestamp:v,rawExtraFieldNTFS:j,rawExtraFieldAES:x,rawExtraField:H,extendedTimestamp:$,msDosCompatible:X,internalFileAttribute:Q,externalFileAttribute:nn,diskNumberStart:t};let on,rn=0,sn=0;const{writable:ln}=e;if(n){n.chunkSize=tn(s),await za(ln,h);const e=n.readable,t=e.size=n.size,a={options:{codecType:fe,level:I,rawPassword:E,password:T,encryptionStrength:Z,zipCrypto:b&&B,passwordVerification:b&&B&&w>>8&255,signed:!0,compressed:f,encrypted:b,useWebWorkers:W,useCompressionStream:en,transferStreams:!1},config:s,streamOptions:{signal:Y,size:t,onstart:G,onprogress:V,onend:K}},o=await Me({readable:e,writable:ln},a);sn=o.inputSize,rn=o.outputSize,on=o.signature,ln.size+=sn}else await za(ln,h);let cn;if(D){let n=4;M&&(n+=8),P&&(n+=8),N&&(n+=8),_&&(n+=4),cn=new u(n)}else cn=new u;(function(n,e){const{signature:t,rawExtraFieldZip64:a,compressedSize:o,uncompressedSize:i,headerInfo:s,dataDescriptorInfo:l}=n,{headerView:c,encrypted:d}=s,{dataDescriptorView:m,dataDescriptorOffset:h}=l,{zip64:p,zip64UncompressedSize:u,zip64CompressedSize:g,zipCrypto:w,dataDescriptor:b}=e;d&&!w||t===J||(Da(c,10,t),b&&Da(m,h,t));if(p){const n=Na(a);Ia(n,0,1),Ia(n,2,_a(a)-4);let e=4;u&&(Da(c,18,R),Ma(n,e,r(i)),e+=8),g&&(Da(c,14,R),Ma(n,e,r(o))),b&&(Ma(m,h+4,r(o)),Ma(m,h+12,r(i)))}else Da(c,14,o),Da(c,18,i),b&&(Da(m,h+4,o),Da(m,h+8,i))})({signature:on,rawExtraFieldZip64:cn,compressedSize:rn,uncompressedSize:sn,headerInfo:c,dataDescriptorInfo:d},l),O&&await za(ln,C);return a.assign(an,{uncompressedSize:sn,compressedSize:rn,lastModDate:g,rawLastModDate:w,creationDate:z,lastAccessDate:L,encrypted:b,size:m+rn,compressionMethod:k,version:y,headerArray:p,signature:on,rawExtraFieldZip64:cn,extraFieldExtendedTimestampFlag:S,zip64UncompressedSize:M,zip64CompressedSize:P,zip64Offset:N,zip64DiskNumberStart:_}),an}(o,L,T,i,n.config,s),A=!1,l.set(e,T),T.filename=e,v){await L.writable.getWriter().close();let n=await z;await t,await I(),C=!0,h||(n=await async function(n,e,t,{zipCrypto:a}){let o;o=await e.slice(0,26).arrayBuffer(),26!=o.byteLength&&(o=o.slice(0,26));const i=new b(o);n.encrypted&&!a||Da(i,14,n.signature);n.zip64?(Da(i,18,R),Da(i,22,R)):(Da(i,18,n.compressedSize),Da(i,22,n.uncompressedSize));return await za(t,new u(o)),e.slice(o.byteLength)}(T,n,w,s)),await D(w),T.diskNumberStart=c.diskNumber,y=c.diskOffset,await n.stream().pipeTo(w,{preventClose:!0,preventAbort:!0,signal:g}),w.size+=n.size,C=!1}if(T.offset=n.offset-y,T.zip64)!function(n,e){const{rawExtraFieldZip64:t,offset:a,diskNumberStart:o}=n,{zip64UncompressedSize:i,zip64CompressedSize:s,zip64Offset:l,zip64DiskNumberStart:c}=e,d=Na(t);let m=4;i&&(m+=8);s&&(m+=8);l&&(Ma(d,m,r(a)),m+=8);c&&Da(d,m,o)}(T,s);else if(T.offset>R)throw new p(ja);return n.offset+=T.size,T}catch(t){if(v&&C||!v&&A){if(n.hasCorruptedEntries=!0,t)try{t.corruptedEntry=!0}catch(n){}v?n.offset+=L.writable.size:n.offset=L.writable.size}throw l.delete(e),t}finally{v&&n.bufferedWrites--,j&&j(),S&&S()}function E(){T.lock=new y(n=>j=n)}async function I(){n.writerLocked=!0;const{lockWriter:e}=n;n.lockWriter=new y(e=>S=()=>{n.writerLocked=!1,e()}),await e}async function D(n){_a(w.localHeaderArray)>c.availableSize&&(c.availableSize=0,await za(n,new u))}}(n,e,o,{headerInfo:yn,dataDescriptorInfo:kn,metadataSize:vn},i)}finally{n.pendingEntriesSize-=sn}return a.assign(Sn,{name:e,comment:h,extraField:on}),new Ut(Sn)}(i,n,e,o),c.add(h),await h}catch(e){throw i.filenames.delete(n),e}finally{c.delete(h);const n=Aa.shift();n?n():Ca--}}async close(n=new u,e={}){const{pendingAddFileCalls:a,writer:o}=this,{writable:i}=o;for(;a.size;)await y.allSettled(t.from(a));await async function(n,e,a){const{files:o,writer:i}=n,{diskOffset:l,writable:c}=i;let{diskNumber:d}=i,m=0,h=0,g=n.offset-l,w=o.size;for(const[,n]of o){const{rawFilename:e,rawExtraFieldZip64:t,rawExtraFieldAES:a,rawComment:o,rawExtraFieldNTFS:i,rawExtraField:r,extendedTimestamp:l,extraFieldExtendedTimestampFlag:c,lastModDate:d}=n;let m;if(l){m=new u(9);const n=Na(m);Ia(n,0,q),Ia(n,2,5),Ra(n,4,c),Da(n,5,s.floor(d.getTime()/1e3))}else m=new u;n.rawExtraFieldCDExtendedTimestamp=m,h+=46+_a(e,o,t,a,i,m,r)}const b=new u(h),f=Na(b);await pt(i);let y=0;for(const[n,e]of t.from(o.values()).entries()){const{offset:t,rawFilename:r,rawExtraFieldZip64:s,rawExtraFieldAES:l,rawExtraFieldCDExtendedTimestamp:d,rawExtraFieldNTFS:h,rawExtraField:p,rawComment:u,versionMadeBy:g,headerArray:w,directory:k,zip64:v,zip64UncompressedSize:S,zip64CompressedSize:j,zip64DiskNumberStart:x,zip64Offset:C,msDosCompatible:A,internalFileAttribute:L,externalFileAttribute:z,diskNumberStart:T,uncompressedSize:E,compressedSize:D}=e,M=_a(s,l,d,h,p);Da(f,m,N),Ia(f,m+4,g);const P=Na(w);S||Da(P,18,E),j||Da(P,14,D),Pa(b,w,m+6),Ia(f,m+30,M),Ia(f,m+32,_a(u)),Ia(f,m+34,v&&x?I:T),Ia(f,m+36,L),z?Da(f,m+38,z):k&&A&&Ra(f,m+38,16),Da(f,m+42,v&&C?R:t),Pa(b,r,m+46),Pa(b,s,m+46+_a(r)),Pa(b,l,m+46+_a(r,s)),Pa(b,d,m+46+_a(r,s,l)),Pa(b,h,m+46+_a(r,s,l,d)),Pa(b,p,m+46+_a(r,s,l,d,h)),Pa(b,u,m+46+_a(r)+M);const _=46+_a(r,u)+M;if(m-y>i.availableSize&&(i.availableSize=0,await za(c,b.slice(y,m)),y=m),m+=_,a.onprogress)try{await a.onprogress(n+1,o.size,new Ut(e))}catch(n){}}await za(c,y?b.slice(y):b);let k=i.diskNumber;const{availableSize:v}=i;v<F&&k++;let S=Ea(n,a,\"zip64\");if(g>R||h>R||w>I||k>I){if(!1===S)throw new p(ja);S=!0}const j=new u(S?98:F),x=Na(j);if(m=0,S){Da(x,0,B),Ma(x,4,r(44)),Ia(x,12,45),Ia(x,14,45),Da(x,16,k),Da(x,20,d),Ma(x,24,r(w)),Ma(x,32,r(w)),Ma(x,40,r(h)),Ma(x,48,r(g)),Da(x,56,O),Ma(x,64,r(g)+r(h)),Da(x,72,k+1);Ea(n,a,\"supportZip64SplitFile\",!0)&&(k=I,d=I),w=I,g=R,h=R,m+=76}Da(x,m,_),Ia(x,m+4,k),Ia(x,m+6,d),Ia(x,m+8,w),Ia(x,m+10,w),Da(x,m+12,h),Da(x,m+16,g);const C=_a(e);if(C){if(!(C<=I))throw new p(wa);Ia(x,m+20,C)}await za(c,j),C&&await za(c,e)}(this,n,e);return Ea(this,e,\"preventClose\")||await i.getWriter().close(),o.getData?o.getData():i}}async function za(n,e){const t=n.getWriter();try{await t.ready,n.size+=_a(e),await t.write(e)}finally{t.releaseLock()}}function Ta(n){if(n)return(r(n.getTime())+r(116444736e5))*r(1e4)}function Ea(n,e,t,a){const o=e[t]===J?n.options[t]:e[t];return o===J?a:o}function Ra(n,e,t){n.setUint8(e,t)}function Ia(n,e,t){n.setUint16(e,t,!0)}function Da(n,e,t){n.setUint32(e,t,!0)}function Ma(n,e,t){n.setBigUint64(e,t,!0)}function Pa(n,e,t){n.set(e,t)}function Na(n){return new b(n.buffer)}function _a(...n){let e=0;return n.forEach(n=>n&&(e+=n.length)),e}let Ba;try{Ba=\"undefined\"==typeof document&&\"undefined\"==typeof location?require(\"url\").pathToFileURL(__filename).href:\"undefined\"==typeof document?location.href:e&&\"SCRIPT\"===e.tagName.toUpperCase()&&e.src||new URL(\"single-file.js\",document.baseURI).href}catch(n){}an({baseURL:Ba}),function(n){const e=()=>h.createObjectURL(new f(['const{Array:e,Object:t,Number:n,Math:s,Error:r,Uint8Array:a,Uint16Array:i,Uint32Array:o,Int32Array:l,Map:c,DataView:h,Promise:f,TextEncoder:u,crypto:p,postMessage:d,TransformStream:g,ReadableStream:w,WritableStream:y,CompressionStream:v,DecompressionStream:b}=self,m=void 0,_=\"undefined\",S=\"function\";class k{constructor(e){return class extends g{constructor(t,n){const s=new e(n);super({transform(e,t){t.enqueue(s.append(e))},flush(e){const t=s.flush();t&&e.enqueue(t)}})}}}}const z=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;z[e]=t}class D{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,s=0|e.length;s>n;n++)t=t>>>8^z[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class C extends g{constructor(){let e;const t=new D;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new a(4);new h(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const x={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],s=x.getPartial(n);return 32===s?e.concat(t):x._shiftRight(t,s,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+x.getPartial(n)},clamp(e,t){if(32*e.length<t)return e;const n=(e=e.slice(0,s.ceil(t/32))).length;return t&=31,n>0&&t&&(e[n-1]=x.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>s.round(e/1099511627776)||32,_shiftRight(e,t,n,s){for(void 0===s&&(s=[]);t>=32;t-=32)s.push(n),n=0;if(0===t)return s.concat(e);for(let r=0;r<e.length;r++)s.push(n|e[r]>>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=x.getPartial(r);return s.push(x.partial(t+a&31,t+a>32?n:s.pop(),1)),s}},I={bytes:{fromBits(e){const t=x.bitLength(e)/8,n=new a(t);let s;for(let r=0;t>r;r++)3&r||(s=e[r/4]),n[r]=s>>>24,s<<=8;return n},toBits(e){const t=[];let n,s=0;for(n=0;n<e.length;n++)s=s<<8|e[n],3&~n||(t.push(s),s=0);return 3&n&&t.push(x.partial(8*(3&n),s)),t}}},T=class{constructor(e){const t=this;t.blockSize=512,t._init=[1732584193,4023233417,2562383102,271733878,3285377520],t._key=[1518500249,1859775393,2400959708,3395469782],e?(t._h=e._h.slice(0),t._buffer=e._buffer.slice(0),t._length=e._length):t.reset()}reset(){const e=this;return e._h=e._init.slice(0),e._buffer=[],e._length=0,e}update(e){const t=this;\"string\"==typeof e&&(e=I.utf8String.toBits(e));const n=t._buffer=x.concat(t._buffer,e),s=t._length,a=t._length=s+x.bitLength(e);if(a>9007199254740991)throw new r(\"Cannot hash more than 2^53 - 1 bits\");const i=new o(n);let l=0;for(let e=t.blockSize+s-(t.blockSize+s&t.blockSize-1);a>=e;e+=t.blockSize)t._block(i.subarray(16*l,16*(l+1))),l+=1;return n.splice(0,16*l),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=x.concat(t,[x.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(s.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,s){return e>19?e>39?e>59?e>79?void 0:t^n^s:t&n|t&s|n&s:t^n^s:t&n|~t&s}_S(e,t){return t<<e|t>>>32-e}_block(t){const n=this,r=n._h,a=e(80);for(let e=0;16>e;e++)a[e]=t[e];let i=r[0],o=r[1],l=r[2],c=r[3],h=r[4];for(let e=0;79>=e;e++){16>e||(a[e]=n._S(1,a[e-3]^a[e-8]^a[e-14]^a[e-16]));const t=n._S(5,i)+n._f(e,o,l,c)+h+a[e]+n._key[s.floor(e/20)]|0;h=c,c=l,l=n._S(30,o),o=i,i=t}r[0]=r[0]+i|0,r[1]=r[1]+o|0,r[2]=r[2]+l|0,r[3]=r[3]+c|0,r[4]=r[4]+h|0}},A={getRandomValues(e){const t=new o(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(s.random()>.5?1:-1))};for(let r,a=0;a<e.length;a+=4){const e=n(4294967296*(r||s.random()));r=987654071*e(),t[a/4]=4294967296*e()|0}return e}},q={importKey:e=>new q.hmacSha1(I.bytes.toBits(e)),pbkdf2(e,t,n,s){if(n=n||1e4,0>s||0>n)throw new r(\"invalid params to pbkdf2\");const a=1+(s>>5)<<2;let i,o,l,c,f;const u=new ArrayBuffer(a),p=new h(u);let d=0;const g=x;for(t=I.bytes.toBits(t),f=1;(a||1)>d;f++){for(i=o=e.encrypt(g.concat(t,[f])),l=1;n>l;l++)for(o=e.encrypt(o),c=0;c<o.length;c++)i[c]^=o[c];for(l=0;(a||1)>d&&l<i.length;l++)p.setInt32(d,i[l]),d+=4}return u.slice(0,s/8)},hmacSha1:class{constructor(e){const t=this,n=t._hash=T,s=[[],[]];t._baseHash=[new n,new n];const r=t._baseHash[0].blockSize/32;e.length>r&&(e=(new n).update(e).finalize());for(let t=0;r>t;t++)s[0][t]=909522486^e[t],s[1][t]=1549556828^e[t];t._baseHash[0].update(s[0]),t._baseHash[1].update(s[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new r(\"encrypt on already updated hmac called!\");return this.update(e),this.digest(e)}}},R=typeof p!=_&&typeof p.getRandomValues==S,H=\"Invalid password\",P=\"Invalid signature\",B=\"zipjs-abort-check-password\";function K(e){return R?p.getRandomValues(e):A.getRandomValues(e)}const V=16,E={name:\"PBKDF2\"},U=t.assign({hash:{name:\"HMAC\"}},E),W=t.assign({iterations:1e3,hash:{name:\"SHA-1\"}},E),M=[\"deriveBits\"],N=[8,12,16],O=[16,24,32],F=10,L=[0,0,0,0],j=typeof p!=_,G=j&&p.subtle,X=j&&typeof G!=_,J=I.bytes,Q=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],s=t._tables[1],a=e.length;let i,o,l,c=1;if(4!==a&&6!==a&&8!==a)throw new r(\"invalid aes key size\");for(t._key=[o=e.slice(0),l=[]],i=a;4*a+28>i;i++){let e=o[i-1];(i%a==0||8===a&&i%a==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],i%a==0&&(e=e<<8^e>>>24^c<<24,c=c<<1^283*(c>>7))),o[i]=o[i-a]^e}for(let e=0;i;e++,i--){const t=o[3&e?i:i-4];l[e]=4>=i||4>e?t:s[0][n[t>>>24]]^s[1][n[t>>16&255]]^s[2][n[t>>8&255]]^s[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],s=t[4],r=[],a=[];let i,o,l,c;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let h=i=0;!n[h];h^=o||1,i=a[i]||1){let a=i^i<<1^i<<2^i<<3^i<<4;a=a>>8^255&a^99,n[h]=a,s[a]=h,c=r[l=r[o=r[h]]];let f=16843009*c^65537*l^257*o^16843008*h,u=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][h]=u=u<<24^u>>>8,t[n][a]=f=f<<24^f>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new r(\"invalid aes block size\");const n=this._key[t],s=n.length/4-2,a=[0,0,0,0],i=this._tables[t],o=i[0],l=i[1],c=i[2],h=i[3],f=i[4];let u,p,d,g=e[0]^n[0],w=e[t?3:1]^n[1],y=e[2]^n[2],v=e[t?1:3]^n[3],b=4;for(let e=0;s>e;e++)u=o[g>>>24]^l[w>>16&255]^c[y>>8&255]^h[255&v]^n[b],p=o[w>>>24]^l[y>>16&255]^c[v>>8&255]^h[255&g]^n[b+1],d=o[y>>>24]^l[v>>16&255]^c[g>>8&255]^h[255&w]^n[b+2],v=o[v>>>24]^l[g>>16&255]^c[w>>8&255]^h[255&y]^n[b+3],b+=4,g=u,w=p,y=d;for(let e=0;4>e;e++)a[t?3&-e:e]=f[g>>>24]<<24^f[w>>16&255]<<16^f[y>>8&255]<<8^f[255&v]^n[b++],u=g,g=w,w=y,y=v,v=u;return a}},Y=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,s=255&e;255===t?(t=0,255===n?(n=0,255===s?s=0:++s):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=s}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let s;if(!(s=t.length))return[];const r=x.bitLength(t);for(let r=0;s>r;r+=4){this.incCounter(n);const s=e.encrypt(n);t[r]^=s[0],t[r+1]^=s[1],t[r+2]^=s[2],t[r+3]^=s[3]}return x.clamp(t,r)}},Z=q.hmacSha1;let $=j&&X&&typeof G.importKey==S,ee=j&&X&&typeof G.deriveBits==S;class te extends g{constructor({password:e,rawPassword:n,signed:s,encryptionStrength:i,checkPasswordOnly:o}){super({start(){t.assign(this,{ready:new f((e=>this.resolveReady=e)),password:ae(e,n),signed:s,strength:i-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:i,resolveReady:l,ready:c}=n;s?(await(async(e,t,n,s)=>{const a=await re(e,t,n,oe(s,0,N[t])),i=oe(s,N[t]);if(a[0]!=i[0]||a[1]!=i[1])throw new r(H)})(n,i,s,oe(e,0,N[i]+2)),e=oe(e,N[i]+2),o?t.error(new r(B)):l()):await c;const h=new a(e.length-F-(e.length-F)%V);t.enqueue(se(n,e,h,0,F,!0))},async flush(e){const{signed:t,ctr:n,hmac:s,pending:i,ready:o}=this;if(s&&n){await o;const l=oe(i,0,i.length-F),c=oe(i,i.length-F);let h=new a;if(l.length){const e=ce(J,l);s.update(e);const t=n.update(e);h=le(J,t)}if(t){const e=oe(le(J,s.digest()),0,F);for(let t=0;F>t;t++)if(e[t]!=c[t])throw new r(P)}e.enqueue(h)}}})}}class ne extends g{constructor({password:e,rawPassword:n,encryptionStrength:s}){let r;super({start(){t.assign(this,{ready:new f((e=>this.resolveReady=e)),password:ae(e,n),strength:s-1,pending:new a})},async transform(e,t){const n=this,{password:s,strength:r,resolveReady:i,ready:o}=n;let l=new a;s?(l=await(async(e,t,n)=>{const s=K(new a(N[t]));return ie(s,await re(e,t,n,s))})(n,r,s),i()):await o;const c=new a(l.length+e.length-e.length%V);c.set(l,0),t.enqueue(se(n,e,c,l.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:i}=this;if(n&&t){await i;let o=new a;if(s.length){const e=t.update(ce(J,s));n.update(e),o=le(J,e)}r.signature=le(J,n.digest()).slice(0,F),e.enqueue(ie(o,r.signature))}}}),r=this}}function se(e,t,n,s,r,i){const{ctr:o,hmac:l,pending:c}=e,h=t.length-r;let f;for(c.length&&(t=ie(c,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new a(t)).set(n,0)}return e})(n,h-h%V)),f=0;h-V>=f;f+=V){const e=ce(J,oe(t,f,f+V));i&&l.update(e);const r=o.update(e);i||l.update(r),n.set(le(J,r),f+s)}return e.pending=oe(t,f),n}async function re(n,s,r,i){n.password=null;const o=await(async(e,t,n,s,r)=>{if(!$)return q.importKey(t);try{return await G.importKey(\"raw\",t,n,!1,r)}catch(e){return $=!1,q.importKey(t)}})(0,r,U,0,M),l=await(async(e,t,n)=>{if(!ee)return q.pbkdf2(t,e.salt,W.iterations,n);try{return await G.deriveBits(e,t,n)}catch(s){return ee=!1,q.pbkdf2(t,e.salt,W.iterations,n)}})(t.assign({salt:i},W),o,8*(2*O[s]+2)),c=new a(l),h=ce(J,oe(c,0,O[s])),f=ce(J,oe(c,O[s],2*O[s])),u=oe(c,2*O[s]);return t.assign(n,{keys:{key:h,authentication:f,passwordVerification:u},ctr:new Y(new Q(h),e.from(L)),hmac:new Z(f)}),u}function ae(e,t){return t===m?(e=>{if(typeof u==_){const t=new a((e=unescape(encodeURIComponent(e))).length);for(let n=0;n<t.length;n++)t[n]=e.charCodeAt(n);return t}return(new u).encode(e)})(e):t}function ie(e,t){let n=e;return e.length+t.length&&(n=new a(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function oe(e,t,n){return e.subarray(t,n)}function le(e,t){return e.fromBits(t)}function ce(e,t){return e.toBits(t)}class he extends g{constructor({password:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;if(n.password){const t=ue(n,e.subarray(0,12));if(n.password=null,t[11]!=n.passwordVerification)throw new r(H);e=e.subarray(12)}s?t.error(new r(B)):t.enqueue(ue(n,e))}})}}class fe extends g{constructor({password:e,passwordVerification:n}){super({start(){t.assign(this,{password:e,passwordVerification:n}),de(this,e)},transform(e,t){const n=this;let s,r;if(n.password){n.password=null;const t=K(new a(12));t[11]=n.passwordVerification,s=new a(e.length+t.length),s.set(pe(n,t),0),r=12}else s=new a(e.length),r=0;s.set(pe(n,e),r),t.enqueue(s)}})}}function ue(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,n[s]);return n}function pe(e,t){const n=new a(t.length);for(let s=0;s<t.length;s++)n[s]=we(e)^t[s],ge(e,t[s]);return n}function de(e,n){const s=[305419896,591751049,878082192];t.assign(e,{keys:s,crcKey0:new D(s[0]),crcKey2:new D(s[2])});for(let t=0;t<n.length;t++)ge(e,n.charCodeAt(t))}function ge(e,t){let[n,r,a]=e.keys;e.crcKey0.append([t]),n=~e.crcKey0.get(),r=ve(s.imul(ve(r+ye(n)),134775813)+1),e.crcKey2.append([r>>>24]),a=~e.crcKey2.get(),e.keys=[n,r,a]}function we(e){const t=2|e.keys[2];return ye(s.imul(t,1^t)>>>8)}function ye(e){return 255&e}function ve(e){return 4294967295&e}const be=\"deflate-raw\";class me extends g{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:s}){super({});const{compressed:r,encrypted:a,useCompressionStream:i,zipCrypto:o,signed:l,level:c}=e,f=this;let u,p,d=Se(super.readable);a&&!o||!l||(u=new C,d=De(d,u)),r&&(d=ze(d,i,{level:c,chunkSize:t},s,n)),a&&(o?d=De(d,new fe(e)):(p=new ne(e),d=De(d,p))),ke(f,d,(()=>{let e;a&&!o&&(e=p.signature),a&&!o||!l||(e=new h(u.value.buffer).getUint32(0)),f.signature=e}))}}class _e extends g{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:s}){super({});const{zipCrypto:a,encrypted:i,signed:o,signature:l,compressed:c,useCompressionStream:f}=e;let u,p,d=Se(super.readable);i&&(a?d=De(d,new he(e)):(p=new te(e),d=De(d,p))),c&&(d=ze(d,f,{chunkSize:t},s,n)),i&&!a||!o||(u=new C,d=De(d,u)),ke(this,d,(()=>{if((!i||a)&&o){const e=new h(u.value.buffer);if(l!=e.getUint32(0,!1))throw new r(P)}}))}}function Se(e){return De(e,new g({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function ke(e,n,s){n=De(n,new g({flush:s})),t.defineProperty(e,\"readable\",{get:()=>n})}function ze(e,t,n,s,r){try{e=De(e,new(t&&s?s:r)(be,n))}catch(s){if(!t)return e;try{e=De(e,new r(be,n))}catch(t){return e}}return e}function De(e,t){return e.pipeThrough(t)}const Ce=\"data\",xe=\"close\";class Ie extends g{constructor(e,n){super({});const s=this,{codecType:r}=e;let a;r.startsWith(\"deflate\")?a=me:r.startsWith(\"inflate\")&&(a=_e);let i=0,o=0;const l=new a(e,n),c=super.readable,h=new g({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){t.assign(s,{inputSize:o})}}),f=new g({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){const{signature:e}=l;t.assign(s,{signature:e,outputSize:i,inputSize:o})}});t.defineProperty(s,\"readable\",{get:()=>c.pipeThrough(h).pipeThrough(l).pipeThrough(f)})}}class Te extends g{constructor(e){let t;super({transform:function n(s,r){if(t){const e=new a(t.length+s.length);e.set(t),e.set(s,t.length),s=e,t=null}s.length>e?(r.enqueue(s.slice(0,e)),n(s.slice(e),r)):t=s},flush(e){t&&t.length&&e.enqueue(t)}})}}const Ae=new c,qe=new c;let Re,He=0,Pe=!0;async function Be(e){try{const{options:t,scripts:s,config:r}=e;if(s&&s.length)try{Pe?importScripts.apply(m,s):await Ke(s)}catch(e){Pe=!1,await Ke(s)}self.initCodec&&self.initCodec(),r.CompressionStreamNative=self.CompressionStream,r.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(r.CompressionStream=new k(self.Deflate)),self.Inflate&&(r.DecompressionStream=new k(self.Inflate));const a={highWaterMark:1},i=e.readable||new w({async pull(e){const t=new f((e=>Ae.set(He,e)));Ve({type:\"pull\",messageId:He}),He=(He+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await t;e.enqueue(s),r&&e.close()}},a),o=e.writable||new y({async write(e){let t;const s=new f((e=>t=e));qe.set(He,t),Ve({type:Ce,value:e,messageId:He}),He=(He+1)%n.MAX_SAFE_INTEGER,await s}},a),l=new Ie(t,r);Re=new AbortController;const{signal:c}=Re;await i.pipeThrough(l).pipeThrough(new Te(r.chunkSize)).pipeTo(o,{signal:c,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{signature:h,inputSize:u,outputSize:p}=l;Ve({type:xe,result:{signature:h,inputSize:u,outputSize:p}})}catch(e){Ee(e)}}async function Ke(e){for(const t of e)await import(t)}function Ve(e){let{value:t}=e;if(t)if(t.length)try{t=new a(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Ee(e=new r(\"Unknown error\")){const{message:t,stack:n,code:s,name:a}=e;d({error:{message:t,stack:n,code:s,name:a}})}addEventListener(\"message\",(({data:e})=>{const{type:t,messageId:n,value:s,done:r}=e;try{if(\"start\"==t&&Be(e),t==Ce){const e=Ae.get(n);Ae.delete(n),e({value:new a(s),done:r})}if(\"ack\"==t){const e=qe.get(n);qe.delete(n),e()}t==xe&&Re.abort()}catch(e){Ee(e)}}));var Ue=a,We=i,Me=l,Ne=new Ue([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Oe=new Ue([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Fe=new Ue([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Le=(e,t)=>{for(var n=new We(31),s=0;31>s;++s)n[s]=t+=1<<e[s-1];var r=new Me(n[30]);for(s=1;30>s;++s)for(var a=n[s];a<n[s+1];++a)r[a]=a-n[s]<<5|s;return{b:n,r:r}},je=Le(Ne,2),Ge=je.b,Xe=je.r;Ge[28]=258,Xe[258]=28;for(var Je=Le(Oe,0),Qe=Je.b,Ye=Je.r,Ze=new We(32768),$e=0;32768>$e;++$e){var et=(43690&$e)>>1|(21845&$e)<<1;et=(61680&(et=(52428&et)>>2|(13107&et)<<2))>>4|(3855&et)<<4,Ze[$e]=((65280&et)>>8|(255&et)<<8)>>1}var tt=(e,t,n)=>{for(var s=e.length,r=0,a=new We(t);s>r;++r)e[r]&&++a[e[r]-1];var i,o=new We(t);for(r=1;t>r;++r)o[r]=o[r-1]+a[r-1]<<1;if(n){i=new We(1<<t);var l=15-t;for(r=0;s>r;++r)if(e[r])for(var c=r<<4|e[r],h=t-e[r],f=o[e[r]-1]++<<h,u=f|(1<<h)-1;u>=f;++f)i[Ze[f]>>l]=c}else for(i=new We(s),r=0;s>r;++r)e[r]&&(i[r]=Ze[o[e[r]-1]++]>>15-e[r]);return i},nt=new Ue(288);for($e=0;144>$e;++$e)nt[$e]=8;for($e=144;256>$e;++$e)nt[$e]=9;for($e=256;280>$e;++$e)nt[$e]=7;for($e=280;288>$e;++$e)nt[$e]=8;var st=new Ue(32);for($e=0;32>$e;++$e)st[$e]=5;var rt=tt(nt,9,0),at=tt(nt,9,1),it=tt(st,5,0),ot=tt(st,5,1),lt=e=>{for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},ct=(e,t,n)=>{var s=t/8|0;return(e[s]|e[s+1]<<8)>>(7&t)&n},ht=(e,t)=>{var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},ft=e=>(e+7)/8|0,ut=(e,t,n)=>((null==t||0>t)&&(t=0),(null==n||n>e.length)&&(n=e.length),new Ue(e.subarray(t,n))),pt=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],dt=(e,t,n)=>{var s=new r(t||pt[e]);if(s.code=e,r.captureStackTrace&&r.captureStackTrace(s,dt),!n)throw s;return s},gt=(e,t,n)=>{n<<=7&t;var s=t/8|0;e[s]|=n,e[s+1]|=n>>8},wt=(e,t,n)=>{n<<=7&t;var s=t/8|0;e[s]|=n,e[s+1]|=n>>8,e[s+2]|=n>>16},yt=(e,t)=>{for(var n=[],s=0;s<e.length;++s)e[s]&&n.push({s:s,f:e[s]});var r=n.length,a=n.slice();if(!r)return{t:zt,l:0};if(1==r){var i=new Ue(n[0].s+1);return i[n[0].s]=1,{t:i,l:1}}n.sort(((e,t)=>e.f-t.f)),n.push({s:-1,f:25001});var o=n[0],l=n[1],c=0,h=1,f=2;for(n[0]={s:-1,f:o.f+l.f,l:o,r:l};h!=r-1;)o=n[n[c].f<n[f].f?c++:f++],l=n[c!=h&&n[c].f<n[f].f?c++:f++],n[h++]={s:-1,f:o.f+l.f,l:o,r:l};var u=a[0].s;for(s=1;r>s;++s)a[s].s>u&&(u=a[s].s);var p=new We(u+1),d=vt(n[h-1],p,0);if(d>t){s=0;var g=0,w=d-t,y=1<<w;for(a.sort(((e,t)=>p[t.s]-p[e.s]||e.f-t.f));r>s;++s){var v=a[s].s;if(p[v]<=t)break;g+=y-(1<<d-p[v]),p[v]=t}for(g>>=w;g>0;){var b=a[s].s;p[b]<t?g-=1<<t-p[b]++-1:++s}for(;s>=0&&g;--s){var m=a[s].s;p[m]==t&&(--p[m],++g)}d=t}return{t:new Ue(p),l:d}},vt=(e,t,n)=>-1==e.s?s.max(vt(e.l,t,n+1),vt(e.r,t,n+1)):t[e.s]=n,bt=e=>{for(var t=e.length;t&&!e[--t];);for(var n=new We(++t),s=0,r=e[0],a=1,i=e=>{n[s++]=e},o=1;t>=o;++o)if(e[o]==r&&o!=t)++a;else{if(!r&&a>2){for(;a>138;a-=138)i(32754);a>2&&(i(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(i(r),--a;a>6;a-=6)i(8304);a>2&&(i(a-3<<5|8208),a=0)}for(;a--;)i(r);a=1,r=e[o]}return{c:n.subarray(0,s),n:t}},mt=(e,t)=>{for(var n=0,s=0;s<t.length;++s)n+=e[s]*t[s];return n},_t=(e,t,n)=>{var s=n.length,r=ft(t+2);e[r]=255&s,e[r+1]=s>>8,e[r+2]=255^e[r],e[r+3]=255^e[r+1];for(var a=0;s>a;++a)e[r+a+4]=n[a];return 8*(r+4+s)},St=(e,t,n,s,r,a,i,o,l,c,h)=>{gt(t,h++,n),++r[256];for(var f=yt(r,15),u=f.t,p=f.l,d=yt(a,15),g=d.t,w=d.l,y=bt(u),v=y.c,b=y.n,m=bt(g),_=m.c,S=m.n,k=new We(19),z=0;z<v.length;++z)++k[31&v[z]];for(z=0;z<_.length;++z)++k[31&_[z]];for(var D=yt(k,7),C=D.t,x=D.l,I=19;I>4&&!C[Fe[I-1]];--I);var T,A,q,R,H=c+5<<3,P=mt(r,nt)+mt(a,st)+i,B=mt(r,u)+mt(a,g)+i+14+3*I+mt(k,C)+2*k[16]+3*k[17]+7*k[18];if(l>=0&&P>=H&&B>=H)return _t(t,h,e.subarray(l,l+c));if(gt(t,h,1+(P>B)),h+=2,P>B){T=tt(u,p,0),A=u,q=tt(g,w,0),R=g;var K=tt(C,x,0);for(gt(t,h,b-257),gt(t,h+5,S-1),gt(t,h+10,I-4),h+=14,z=0;I>z;++z)gt(t,h+3*z,C[Fe[z]]);h+=3*I;for(var V=[v,_],E=0;2>E;++E){var U=V[E];for(z=0;z<U.length;++z){var W=31&U[z];gt(t,h,K[W]),h+=C[W],W>15&&(gt(t,h,U[z]>>5&127),h+=U[z]>>12)}}}else T=rt,A=nt,q=it,R=st;for(z=0;o>z;++z){var M=s[z];if(M>255){wt(t,h,T[257+(W=M>>18&31)]),h+=A[W+257],W>7&&(gt(t,h,M>>23&31),h+=Ne[W]);var N=31&M;wt(t,h,q[N]),h+=R[N],N>3&&(wt(t,h,M>>5&8191),h+=Oe[N])}else wt(t,h,T[M]),h+=A[M]}return wt(t,h,T[256]),h+A[256]},kt=new Me([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),zt=new Ue(0),Dt=function(){function e(e,t){if(\"function\"==typeof e&&(t=e,e={}),this.ondata=t,this.o=e||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new Ue(98304),this.o.dictionary){var n=this.o.dictionary.subarray(-32768);this.b.set(n,32768-n.length),this.s.i=32768-n.length}}return e.prototype.p=function(e,t){this.ondata(((e,t,n,r,a)=>{if(!a&&(a={l:1},t.dictionary)){var i=t.dictionary.subarray(-32768),o=new Ue(i.length+e.length);o.set(i),o.set(e,i.length),e=o,a.w=i.length}return((e,t,n,r,a,i)=>{var o=i.z||e.length,l=new Ue(0+o+5*(1+s.ceil(o/7e3))+0),c=l.subarray(0,l.length-0),h=i.l,f=7&(i.r||0);if(t){f&&(c[0]=i.r>>3);for(var u=kt[t-1],p=u>>13,d=8191&u,g=(1<<n)-1,w=i.p||new We(32768),y=i.h||new We(g+1),v=s.ceil(n/3),b=2*v,m=t=>(e[t]^e[t+1]<<v^e[t+2]<<b)&g,_=new Me(25e3),S=new We(288),k=new We(32),z=0,D=0,C=i.i||0,x=0,I=i.w||0,T=0;o>C+2;++C){var A=m(C),q=32767&C,R=y[A];if(w[q]=R,y[A]=q,C>=I){var H=o-C;if((z>7e3||x>24576)&&(H>423||!h)){f=St(e,c,0,_,S,k,D,x,T,C-T,f),x=z=D=0,T=C;for(var P=0;286>P;++P)S[P]=0;for(P=0;30>P;++P)k[P]=0}var B=2,K=0,V=d,E=q-R&32767;if(H>2&&A==m(C-E))for(var U=s.min(p,H)-1,W=s.min(32767,C),M=s.min(258,H);W>=E&&--V&&q!=R;){if(e[C+B]==e[C+B-E]){for(var N=0;M>N&&e[C+N]==e[C+N-E];++N);if(N>B){if(B=N,K=E,N>U)break;var O=s.min(E,N-2),F=0;for(P=0;O>P;++P){var L=C-E+P&32767,j=L-w[L]&32767;j>F&&(F=j,R=L)}}}E+=(q=R)-(R=w[q])&32767}if(K){_[x++]=268435456|Xe[B]<<18|Ye[K];var G=31&Xe[B],X=31&Ye[K];D+=Ne[G]+Oe[X],++S[257+G],++k[X],I=C+B,++z}else _[x++]=e[C],++S[e[C]]}}for(C=s.max(C,I);o>C;++C)_[x++]=e[C],++S[e[C]];f=St(e,c,h,_,S,k,D,x,T,C-T,f),h||(i.r=7&f|c[f/8|0]<<3,f-=7,i.h=y,i.p=w,i.i=C,i.w=I)}else{for(C=i.w||0;o+h>C;C+=65535){var J=C+65535;o>J||(c[f/8|0]=h,J=o),f=_t(c,f+1,e.subarray(C,J))}i.i=o}return ut(l,0,0+ft(f)+0)})(e,null==t.level?6:t.level,null==t.mem?a.l?s.ceil(1.5*s.max(8,s.min(13,s.log(e.length)))):20:12+t.mem,0,0,a)})(e,this.o,0,0,this.s),t)},e.prototype.push=function(e,t){this.ondata||dt(5),this.s.l&&dt(4);var n=e.length+this.s.z;if(n>this.b.length){if(n>2*this.b.length-32768){var s=new Ue(-32768&n);s.set(this.b.subarray(0,this.s.z)),this.b=s}var r=this.b.length-this.s.z;this.b.set(e.subarray(0,r),this.s.z),this.s.z=this.b.length,this.p(this.b,!1),this.b.set(this.b.subarray(-32768)),this.b.set(e.subarray(r),32768),this.s.z=e.length-r+32768,this.s.i=32766,this.s.w=32768}else this.b.set(e,this.s.z),this.s.z+=e.length;this.s.l=1&t,(this.s.z>this.s.w+8191||t)&&(this.p(this.b,t||!1),this.s.w=this.s.i,this.s.i-=2)},e.prototype.flush=function(){this.ondata||dt(5),this.s.l&&dt(4),this.p(this.b,!1),this.s.w=this.s.i,this.s.i-=2},e}(),Ct=function(){function e(e,t){\"function\"==typeof e&&(t=e,e={}),this.ondata=t;var n=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:n?n.length:0},this.o=new Ue(32768),this.p=new Ue(0),n&&this.o.set(n)}return e.prototype.e=function(e){if(this.ondata||dt(5),this.d&&dt(4),this.p.length){if(e.length){var t=new Ue(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,n=((e,t,n)=>{var r=e.length;if(!r||t.f&&!t.l)return n||new Ue(0);var a=!n,i=a||2!=t.i,o=t.i;a&&(n=new Ue(3*r));var l=e=>{var t=n.length;if(e>t){var r=new Ue(s.max(2*t,e));r.set(n),n=r}},c=t.f||0,h=t.p||0,f=t.b||0,u=t.l,p=t.d,d=t.m,g=t.n,w=8*r;do{if(!u){c=ct(e,h,1);var y=ct(e,h+1,3);if(h+=3,!y){var v=e[(T=ft(h)+4)-4]|e[T-3]<<8,b=T+v;if(b>r){o&&dt(0);break}i&&l(f+v),n.set(e.subarray(T,b),f),t.b=f+=v,t.p=h=8*b,t.f=c;continue}if(1==y)u=at,p=ot,d=9,g=5;else if(2==y){var m=ct(e,h,31)+257,_=ct(e,h+10,15)+4,S=m+ct(e,h+5,31)+1;h+=14;for(var k=new Ue(S),z=new Ue(19),D=0;_>D;++D)z[Fe[D]]=ct(e,h+3*D,7);h+=3*_;var C=lt(z),x=(1<<C)-1,I=tt(z,C,1);for(D=0;S>D;){var T,A=I[ct(e,h,x)];if(h+=15&A,16>(T=A>>4))k[D++]=T;else{var q=0,R=0;for(16==T?(R=3+ct(e,h,3),h+=2,q=k[D-1]):17==T?(R=3+ct(e,h,7),h+=3):18==T&&(R=11+ct(e,h,127),h+=7);R--;)k[D++]=q}}var H=k.subarray(0,m),P=k.subarray(m);d=lt(H),g=lt(P),u=tt(H,d,1),p=tt(P,g,1)}else dt(1);if(h>w){o&&dt(0);break}}i&&l(f+131072);for(var B=(1<<d)-1,K=(1<<g)-1,V=h;;V=h){var E=(q=u[ht(e,h)&B])>>4;if((h+=15&q)>w){o&&dt(0);break}if(q||dt(2),256>E)n[f++]=E;else{if(256==E){V=h,u=null;break}var U=E-254;if(E>264){var W=Ne[D=E-257];U=ct(e,h,(1<<W)-1)+Ge[D],h+=W}var M=p[ht(e,h)&K],N=M>>4;if(M||dt(3),h+=15&M,P=Qe[N],N>3&&(W=Oe[N],P+=ht(e,h)&(1<<W)-1,h+=W),h>w){o&&dt(0);break}i&&l(f+131072);var O=f+U;if(P>f){var F=0-P,L=s.min(P,O);for(0>F+f&&dt(3);L>f;++f)n[f]=(void 0)[F+f]}for(;O>f;++f)n[f]=n[f-P]}}t.l=u,t.p=V,t.b=f,t.f=c,u&&(c=1,t.m=d,t.d=p,t.n=g)}while(!c);return f!=n.length&&a?ut(n,0,f):n.subarray(0,f)})(this.p,this.s,this.o);this.ondata(ut(n,t,this.s.b),this.d),this.o=ut(n,this.s.b-32768),this.s.b=this.o.length,this.p=ut(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),xt=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{xt.decode(zt,{stream:!0})}catch(e){}function It(e,n,s){return class{constructor(r){const i=this;var o,l;o=r,l=\"level\",(typeof t.hasOwn===S?t.hasOwn(o,l):o.hasOwnProperty(l))&&r.level===m&&delete r.level,i.codec=new e(t.assign({},n,r)),s(i.codec,(e=>{if(i.pendingData){const t=i.pendingData;i.pendingData=new a(t.length+e.length);const{pendingData:n}=i;n.set(t,0),n.set(e,t.length)}else i.pendingData=new a(e)}))}append(e){return this.codec.push(e),r(this)}flush(){return this.codec.push(new a,!0),r(this)}};function r(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new a}}const{Deflate:Tt,Inflate:At}=((e,t={},n)=>({Deflate:It(e.Deflate,t.deflate,n),Inflate:It(e.Inflate,t.inflate,n)}))({Deflate:Dt,Inflate:Ct},m,((e,t)=>e.ondata=t));self.initCodec=()=>{self.Deflate=Tt,self.Inflate=At};\\n'],{type:\"text/javascript\"}));n({workerScripts:{inflate:[e],deflate:[e]}})}(an);var Oa=Object.freeze({__proto__:null,BlobReader:Ke,BlobWriter:Je,Data64URIReader:class extends Ge{constructor(n){super();let e=n.length;for(;\"=\"==n.charAt(e-1);)e--;const t=n.indexOf(\",\")+1;a.assign(this,{dataURI:n,dataStart:t,size:s.floor(.75*(e-t))})}readUint8Array(n,e){const{dataStart:t,dataURI:a}=this,o=new u(e),i=4*s.floor(n/3),r=atob(a.substring(i+t,4*s.ceil((n+e)/3)+t)),l=n-3*s.floor(i/4);for(let n=l;n<l+e;n++)o[n-l]=r.charCodeAt(n);return o}},Data64URIWriter:class extends Ve{constructor(n){super(),a.assign(this,{data:\"data:\"+(n||\"\")+\";base64,\",pending:[]})}writeUint8Array(n){const e=this;let t=0,a=e.pending;const i=e.pending.length;for(e.pending=\"\",t=0;t<3*s.floor((i+n.length)/3)-i;t++)a+=o.fromCharCode(n[t]);for(;t<n.length;t++)e.pending+=o.fromCharCode(n[t]);a.length>2?e.data+=j(a):e.pending=a}getData(){return this.data+j(this.pending)}},ERR_BAD_FORMAT:qt,ERR_CENTRAL_DIRECTORY_NOT_FOUND:Gt,ERR_DUPLICATED_NAME:ga,ERR_ENCRYPTED:Jt,ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND:Wt,ERR_EOCDR_NOT_FOUND:Ht,ERR_EXTRAFIELD_ZIP64_NOT_FOUND:Kt,ERR_HTTP_RANGE:_e,ERR_INVALID_COMMENT:wa,ERR_INVALID_ENCRYPTION_STRENGTH:ka,ERR_INVALID_ENTRY_COMMENT:ba,ERR_INVALID_ENTRY_NAME:fa,ERR_INVALID_EXTRAFIELD_DATA:Sa,ERR_INVALID_EXTRAFIELD_TYPE:va,ERR_INVALID_PASSWORD:yn,ERR_INVALID_SIGNATURE:kn,ERR_INVALID_VERSION:ya,ERR_ITERATOR_COMPLETED_TOO_SOON:Be,ERR_LOCAL_FILE_HEADER_NOT_FOUND:Vt,ERR_SPLIT_ZIP_FILE:$t,ERR_UNSUPPORTED_COMPRESSION:Zt,ERR_UNSUPPORTED_ENCRYPTION:Yt,ERR_UNSUPPORTED_FORMAT:ja,HttpRangeReader:class extends ct{constructor(n,e={}){e.useRangeHeader=!0,super(n,e)}},HttpReader:ct,Reader:Ge,SplitDataReader:mt,SplitDataWriter:ht,SplitZipReader:bt,SplitZipWriter:ft,TextReader:Ye,TextWriter:class extends Je{constructor(n){super(n),a.assign(this,{encoding:n,utf8:!n||\"utf-8\"==n.toLowerCase()})}async getData(){const{encoding:n,utf8:e}=this,t=await super.getData();if(t.text&&e)return t.text();{const e=new FileReader;return new y((o,i)=>{a.assign(e,{onload:({target:n})=>o(n.result),onerror:()=>i(e.error)}),e.readAsText(t,n)})}}},Uint8ArrayReader:class extends Ge{constructor(n){super(),a.assign(this,{array:n,size:n.length})}readUint8Array(n,e){return this.array.slice(n,n+e)}},Uint8ArrayWriter:dt,Writer:Ve,ZipReader:ta,ZipReaderStream:class{constructor(n={}){const{readable:e,writable:t}=new x,a=new ta(e,n).getEntriesGenerator();this.readable=new C({async pull(n){const{done:e,value:t}=await a.next();if(e)return n.close();const o={...t,readable:function(){const{readable:n,writable:e}=new x;if(t.getData)return t.getData(e),n}()};delete o.getData,n.enqueue(o)}}),this.writable=t}},ZipWriter:La,ZipWriterStream:class{constructor(n={}){const{readable:e,writable:t}=new x;this.readable=e,this.zipWriter=new La(t,n)}transform(n){const{readable:e,writable:t}=new x({flush:()=>{this.zipWriter.close()}});return this.zipWriter.add(n,e),{readable:this.readable,writable:t}}writable(n){const{readable:e,writable:t}=new x;return this.zipWriter.add(n,e),t}close(n=void 0,e={}){return this.zipWriter.close(n,e)}},configure:an,getMimeType:function(){return\"application/octet-stream\"},initReader:ut,initShimAsyncCodec:function(n,e={},t){return{Deflate:rn(n.Deflate,e.deflate,t),Inflate:rn(n.Inflate,e.inflate,t)}},initStream:pt,initWriter:gt,readUint8Array:wt,terminateWorkers:async function(){await y.allSettled(Re.map(n=>(Pe(n),n.terminate())))}});async function Fa(n,{password:e,prompt:t=()=>{},zipOptions:a={useWebWorkers:!0},noBlobURL:o}={}){const i={gif:\"image/gif\",jpg:\"image/jpeg\",png:\"image/png\",tif:\"image/tiff\",tiff:\"image/tiff\",bmp:\"image/bmp\",ico:\"image/vnd.microsoft.icon\",webp:\"image/webp\",svg:\"image/svg+xml\",avi:\"video/x-msvideo\",ogv:\"video/ogg\",mp4:\"video/mp4\",mpeg:\"video/mpeg\",ts:\"video/mp2t\",webm:\"video/webm\",\"3gp\":\"video/3gpp\",\"3g2\":\"video/3gpp\",mp3:\"audio/mpeg\",oga:\"audio/ogg\",mid:\"audio/midi\",midi:\"audio/midi\",opus:\"audio/opus\",wav:\"audio/wav\",weba:\"audio/webm\",heif:\"image/heif\",heic:\"image/heic\",avif:\"image/avif\",apng:\"image/apng\",mov:\"video/quicktime\",otf:\"font/otf\",ttf:\"font/ttf\",woff:\"font/woff\",woff2:\"font/woff2\",eot:\"application/vnd.ms-fontobject\",pdf:\"application/pdf\"},r=/stylesheet_[0-9]+\\.css/,s=/scripts\\/[0-9]+\\.js/,l=/^([0-9_]+\\/)?index\\.html$/,c=/index\\.html$/,d=/frames\\//,m=/^frames\\/\\d+\\/index.html/,h=/manifest\\.json$/,p=\";charset=utf-8\",u=/([{}()^$&.*?/+|[\\\\\\\\]|\\]|-)/g;let g;zip.configure(a),n.readUint8Array?g=n:(Array.isArray(n)&&(n=new Blob([new Uint8Array(n)])),g=new zip.BlobReader(n));const w=new zip.ZipReader(g),b=await w.getEntries(),f={password:e};let y,k,v,S=[],j=[],x=[];await Promise.all(b.map(async n=>{const{filename:e}=n;let a,l,m,h;const u={};if(!f.password&&n.encrypted&&(f.password=t(\"Please enter the password to view the page\")),e.match(c)||e.match(r)||e.match(s))e.match(c)?j.push(u):x.push(u),a=new zip.TextWriter,m=n.uncompressedSize>0?await n.getData(a,f):\"\",e.match(c)?h=\"text/html\"+p:e.match(r)?h=\"text/css\"+p:e.match(s)&&(h=\"text/javascript\"+p);else{S.push(u);const t=e.match(/\\.([^.]+)/);if(h=t&&t[1]&&i[t[1]]?i[t[1]]:\"application/octet-stream\",e.match(d)||o)l=await n.getData(new zip.Data64URIWriter(h),f);else{const e=await n.getData(new zip.BlobWriter(h),f);l=URL.createObjectURL(e)}}const g=n.filename.match(/^([0-9_]+\\/)?(.*)$/)[2];let w=\"\";const b=e.match(/(.*\\/)[^/]+$/);b&&b[1]&&(w=b[1]),Object.assign(u,{prefixPath:w,filename:n.filename,name:g,url:n.comment,content:l,mimeType:h,textContent:m,parentResources:[]})})),await w.close(),j.sort(L),x.sort(function(n,e){const t=n.filename.length-e.filename.length;return t||n.filename.localeCompare(e.filename)}),S=S.sort(L).concat(...x).concat(...j);for(const n of S){const{filename:e,prefixPath:t}=n;let{textContent:a}=n;void 0!==a&&(e.match(l)&&(k=a),e.match(s)||(S.forEach(e=>{const{filename:o,parentResources:i,content:r}=e;if(o.startsWith(t)&&o!=n.filename){const s=o.substring(t.length);s.match(h)||a.includes(s)&&(i.push(n.filename),void 0===e.textContent&&(a=A(a,s,r)))}}),n.textContent=a))}for(const n of S){let{textContent:e,prefixPath:t,filename:a}=n;if(void 0!==e){if(!a.match(s)){const o=a;for(const n of S){const{filename:a}=n;if(a.startsWith(t)&&a!=o){const o=a.substring(t.length);if(!o.match(h)){-1!=e.indexOf(o)&&(n.content=await C(n),e=A(e,o,n.content))}}}n.textContent=e,n.content=await C(n)}a.match(l)&&(y=e,v=n.url)}}return{docContent:y,origDocContent:k,resources:S,url:v};async function C(n){return n.filename.match(d)&&!n.filename.match(m)||o?await async function(n,e){const t=new FileReader;return t.readAsDataURL(new Blob([n],{type:e})),new Promise((n,e)=>{t.onload=()=>n(t.result.replace(p,\"\")),t.onerror=e})}(n.textContent,n.mimeType):URL.createObjectURL(new Blob([n.textContent],{type:n.mimeType}))}function A(n,e,t){if(\"function\"==typeof n.replaceAll)return n.replaceAll(e,t);{const a=new RegExp(e.replace(u,\"\\\\$1\"),\"g\");return n.replace(a,t)}}function L(n,e){const t=e.filename.length-n.filename.length;return t||e.filename.localeCompare(n.filename)}}async function Ua(n,e,{disableFramePointerEvents:t}={}){e=(e=e.replace(/<noscript/gi,\"<template disabled-noscript\")).replaceAll(/<\\/noscript/gi,\"</template\");const a=(new DOMParser).parseFromString(e,\"text/html\");t&&a.querySelectorAll(\"iframe\").forEach(n=>{const e=\"pointer-events\";n.style.setProperty(\"-sf-\"+e,n.style.getPropertyValue(e),n.style.getPropertyPriority(e)),n.style.setProperty(e,\"none\",\"important\")}),n.open(),n.write(function(n){const e=n.doctype;let t=\"\";e&&(t=\"<!DOCTYPE \"+e.nodeName,e.publicId?(t+=' PUBLIC \"'+e.publicId+'\"',e.systemId&&(t+=' \"'+e.systemId+'\"')):e.systemId&&(t+=' SYSTEM \"'+e.systemId+'\"'),e.internalSubset&&(t+=\" [\"+e.internalSubset+\"]\"),t+=\"> \");return t}(a)),n.write(a.documentElement.outerHTML),n.close(),n.querySelectorAll(\"template[disabled-noscript]\").forEach(e=>{const t=n.createElement(\"noscript\");e.removeAttribute(\"disabled-noscript\"),Array.from(e.attributes).forEach(n=>t.setAttribute(n.name,n.value)),t.textContent=e.innerHTML,e.parentElement.replaceChild(t,e)}),n.documentElement.setAttribute(\"data-sfz\",\"\"),n.querySelectorAll(\"link[rel*=icon]\").forEach(n=>n.replaceWith(n.cloneNode(!0)))}const{Blob:qa,fetch:Ha,TextEncoder:Wa,DOMParser:Ga}=globalThis,Va=[\".jpg\",\".jpeg\",\".png\",\".avi\",\".apng\",\".pdf\",\".woff2\",\".mp4\",\".mp3\",\".ogg\",\".webp\",\".webm\",\".avi\",\".mpeg\",\".ts\",\".ogv\",\".heif\",\".heic\"],Ka=[[\"<noscript>\",\"</noscript>\"],[\"<noframes>\",\"</noframes>\"],[\"<noembed>\",\"</noembed>\"],[\"<script type=sfz-data>\",\"<\\/script>\"],[\"<style type=sfz-data>\",\"</style>\"],[\"<iframe>\",\"</iframe>\"],[\"<xmp>\",\"</xmp>\"],[\"<plaintext>\",\"</plaintext>\"]],Ja=[[\"\\x3c!--\",\"--\\x3e\"],...Ka],Ya=[[/<noscript/i,/<\\/noscript>/i],[/<noframes/i,/<\\/noframes>/i],[/<noembed/i,/<\\/noembed>/i],[/<script/i,/<\\/script>/i],[/<style/i,/<\\/style>/i],[/<iframe/i,/<\\/iframe>/i],[/<xmp/i,/<\\/xmp>/i],[/<plaintext/i,/<\\/plaintext>/i]],Za=[[/<!--/i,/-->/i],...Ya],$a=new Uint32Array(256).map((n,e)=>{let t=e;for(let n=0;n<8;n++)t=1&t?3988292384^t>>>1:t>>>1;return t}),Xa=globalThis.browser;async function Qa(n,e,t=new Date){let a;e.zipScript?a=e.zipScript:Xa&&Xa.runtime&&Xa.runtime.getURL&&(an({workerScripts:{deflate:[\"/lib/single-file-z-worker.js\"]}}),a=await(await Ha(Xa.runtime.getURL(\"/lib/single-file-zip.min.js\"))).text());const o=new dt;let i,r,s,l;if(o.init(),o.writable.size=0,e.embeddedImage){e.embeddedImage=Array.from(e.embeddedImage);const t=e.embeddedImage.slice(33,e.embeddedImage.length-12);if(await ro(o.writable,e.embeddedImage.slice(0,33)),e.selfExtractingArchive){const a=t.reduce((n,e)=>n+String.fromCharCode(e),\"\"),i=Za.findIndex(n=>!a.match(n[1]));let r;[r,l]=-1==i?[\"\",\"\"]:Ja[i];const s=ao(n,e,r),c=new Uint8Array([...eo(s.length+4),116,69,88,116,80,78,71,0,...s]);await ro(o.writable,c),await ro(o.writable,no(c,4))}else if(e.embeddedPdf){const n=new Uint8Array([...eo(e.embeddedPdf.length+4),116,69,88,116,80,68,70,0,...new Uint8Array(e.embeddedPdf)]);await ro(o.writable,n),await ro(o.writable,no(n,4))}await ro(o.writable,t),await ro(o.writable,new Uint8Array(4)),s=o.offset,await ro(o.writable,new Uint8Array([116,69,88,116,90,73,80,0])),e.selfExtractingArchive&&await ro(o.writable,(new Wa).encode(l))}e.selfExtractingArchive?i=await async function(n,e,t,a){let o=\"\";a.embeddedImage||await ro(e.writable,ao(n,a));o+=\"<div id=sfz-wait-message>Please wait...</div>\",a.extractDataFromPage||(o+=\"<div id=sfz-error-message><strong>Error</strong>: Cannot open the page from the filesystem.\",o+=\"<ul style='line-height:20px;'>\",o+=\"<li style='margin-bottom:10px'><strong>Chrome/Edge/Brave</strong>: Install <a href='https://www.getsinglefile.com'>SingleFile</a> and enable the option \\\"Allow access to file URLs\\\" in the details page of the extension.</li>\",o+='<li><strong>Safari</strong>: Select \"Security > Disable Local File Restrictions\" in the \"Develop > Developer settings\" menu.</li></ul></div>');if(a.insertTextBody){const e=(new Ga).parseFromString(n.content,\"text/html\");e.body.querySelectorAll(\"style, script, noscript\").forEach(n=>n.remove());let t=\"\";a.extractDataFromPage&&(t+=oo(n)+\"\\n\\n\"),t+=e.body.innerText,e.body.querySelectorAll(\"single-file-note\").forEach(n=>{const e=n.querySelector(\"template\");if(e){const n=(new Ga).parseFromString(e.innerHTML,\"text/html\");t+=\"\\n\"+n.body.querySelector(\"textarea\").value}}),t=t.replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\\n +/g,\"\\n\").replace(/\\n\\n\\n+/g,\"\\n\\n\").trim(),o+=\"\\n<main hidden>\\n\"+t+\"\\n</main>\\n\"}const i={insertEmbeddedImage:Boolean(a.embeddedImage),insertEmbeddedScreenshotImage:Boolean(a.embeddedScreenshotImage)};t=\"<script>\"+t+\"document.currentScript.remove();globalThis.bootstrap=(()=>{let bootstrapStarted;return async content=>{if (bootstrapStarted) return bootstrapStarted; bootstrapStarted = (\"+Fa.toString().replace(/\\n|\\t/g,\"\")+\")(content,{prompt}).then(({docContent}) => \"+Ua.toString().replace(/\\n|\\t/g,\"\")+\"(document,docContent,\"+JSON.stringify(i)+\"));return bootstrapStarted;}})();(\"+co.toString().replace(/\\n|\\t/g,\"\")+')().then(globalThis.bootstrap).then(() => document.dispatchEvent(new CustomEvent(\"single-file-display-infobar\"))).catch(()=>{});<\\/script>',o+=t;let r=\"\";if(a.extractDataFromPage&&a.extraDataSize){const n=\"<sfz-extra-data></sfz-extra-data>\";r+=n+new Array(a.extraDataSize-n.length).fill(\" \").join(\"\")}o+=r;const s=a.extractDataFromPageTags?a.extractDataFromPageTags[0]:\"\\x3c!--\";o+=s;const l=s.length+r.length;return await ro(e.writable,(new Wa).encode(o)),l}(n,o,a,e):!e.embeddedImage&&e.embeddedPdf&&await ro(o.writable,new Uint8Array(e.embeddedPdf));const c=new La(o,{bufferedWrite:!0,keepOrder:!0,lastModDate:t}),d=o.offset;n.url=e.url,n.archiveTime=(new Date).toISOString(),await so(c,n,{password:e.password,disableCompression:e.disableCompression},e.createRootDirectory?String(Date.now())+\"_\"+(e.tabId||0)+\"/\":\"\",e.url);const m=await c.close(null,{preventClose:!0});if(e.selfExtractingArchive){const a=[],i=[];if(e.extractDataFromPage){if(!e.extractDataFromPageTags){let a=\"\";m.slice(d).forEach(n=>a+=String.fromCharCode(n));if(a.match(/<!--/i)||a.match(/-->/i))return io(a,n,e,t)}for(let n=d;n<m.length;n++)13==m[n]&&(10==m[n+1]?a.push(n-d):i.push(n-d))}let s=\"\";e.preventAppendedData||(e.extractDataFromPageTags?s+=e.extractDataFromPageTags[1]:s+=\"--\\x3e\");const l=e.preventAppendedData||e.embeddedImage?\"\":\"</body></html>\";if(e.extractDataFromPage){const o=new Uint32Array(a.length+i.length+2);if(o.set(new Uint32Array([a.length]),0),o.set(new Uint32Array(a),1),o.set(new Uint32Array([i.length]),a.length+1),o.set(new Uint32Array(i),a.length+2),r=\"<sfz-extra-data>\"+function(n){const e=new Uint8Array(n),t=e.length,a=[],o=[],i=65535,r=130,s=64,l=new Map;let c=0;for(;c<t;){let n=0,s=0;if(c+2<t){const a=e[c]<<16|e[c+1]<<8|e[c+2],o=l.get(a)||[];for(let a=o.length-1;a>=0;a--){const l=o[a],d=c-l;if(d<=0||d>i)continue;let m=0;for(;m<r&&c+m<t&&e[l+m]===e[c+m];)m++;if(m>n&&m>=3&&(n=m,s=d,n===r))break}}if(n>=3){o.length&&d();let e=n,t=0;for(;e>0;){const n=Math.min(e,r);a.push(128|n-3&127),a.push(s>>8&255),a.push(255&s),e-=n,t+=n}const i=c;for(let n=i;n<i+t;n++)m(n);c+=t}else o.push(e[c]),m(c),c++,127===o.length&&d()}o.length&&d();return function(n){let e=\"\";const t=n.length;let a=0;for(;a+2<t;a+=3){const t=n[a]<<16|n[a+1]<<8|n[a+2];e+=mo[t>>18&63]+mo[t>>12&63]+mo[t>>6&63]+mo[63&t]}const o=t-a;if(1===o){const t=n[a]<<16;e+=mo[t>>18&63]+mo[t>>12&63]+\"==\"}else if(2===o){const t=n[a]<<16|n[a+1]<<8;e+=mo[t>>18&63]+mo[t>>12&63]+mo[t>>6&63]+\"=\"}return e}(new Uint8Array(a));function d(){for(;o.length;){const n=Math.min(127,o.length);a.push(n);for(let e=0;e<n;e++)a.push(o.shift())}}function m(n){if(n+2<t){const t=e[n]<<16|e[n+1]<<8|e[n+2],a=l.get(t)||[];a.push(n),a.length>s&&a.shift(),l.set(t,a)}}}(o.buffer)+\"</sfz-extra-data>\",e.preventAppendedData||r.length>65535-l.length-(e.embeddedImage?12:0)){if(!e.extraDataSize)return e.extraDataSize=Math.floor(1.001*r.length),Qa(n,e,t)}else{if(e.extraDataSize)return e.extraDataSize=void 0,Qa(n,e,t);s+=r}}s+=l,await ro(o.writable,(new Wa).encode(s))}await o.writable.close();const h=await o.getData();if(e.extractDataFromPage&&void 0!==e.extraDataSize){if(!(e.extraDataSize>=r.length))return e.extraData=r,e.extraDataSize=Math.floor(1.001*r.length),Qa(n,e,t);h.set(Array.from(r).map(n=>n.charCodeAt(0)),d-i)}return e.embeddedImage?(h.set(eo(o.offset-s-4),s-4),new qa([h,no(h,s),new Uint8Array(e.embeddedImage.slice(e.embeddedImage.length-12))],{type:\"application/octet-stream\"})):new qa([h],{type:\"application/octet-stream\"})}function no(n,e=0){const t=new Uint8Array(4);let a=-1;for(;e<n.length;e++)a=a>>>8^$a[255&(a^n[e])];return a^=-1,to(t,a),t}function eo(n){const e=new Uint8Array(4);return to(e,n),e}function to(n,e){n[0]=e>>24,n[1]=e>>16,n[2]=e>>8,n[3]=e}function ao(n,e,t=\"\"){let a=\"\";!e.includeBOM||e.extractDataFromPage||e.embeddedImage||(a+=\"\\ufeff\"),a+=e.embeddedImage?\"\":n.doctype,a+=\"<html data-sfz>\",a+=n.comment&&!e.embeddedImage?\"\\x3c!--\"+n.comment+\"--\\x3e\":\"\";a+=\"<meta charset=\"+(e.extractDataFromPage?\"windows-1252\":\"utf-8\")+\">\";const o=function(n,e){let t=\"\";const a=e.extractDataFromPage?\"\":oo(n);t+=\"<title>\"+a+\"</title>\",e.insertCanonicalLink&&(t+='<link rel=canonical href=\"'+e.url+'\">');e.insertMetaNoIndex&&(t+=\"<meta name=robots content=noindex>\");n.viewport&&(t+=\"<meta name=viewport content=\"+JSON.stringify(n.viewport)+\">\");if(e.insertMetaCSP){const n=\"default-src 'none';connect-src 'self' data: blob:;font-src 'self' data: blob:;img-src 'self' data: blob:;style-src 'self' 'unsafe-inline' data: blob:;frame-src 'self' data: blob:;media-src 'self' data: blob:;script-src 'self' 'unsafe-inline' data: blob:;object-src 'self' data: blob:\";t+=`<meta http-equiv=content-security-policy content=${JSON.stringify(n)}>`}return t+=\"<style>@keyframes display-wait-message{0%{opacity:0}100%{opacity:1}};body{color:transparent};div{color:initial}body>:not(#sfz-wait-message,#sfz-error-message){display:none}</style>\",t+=\"<body hidden>\",t}(n,e);let i;if(e.embeddedPdf){const n=e.embeddedPdf.reduce((n,e)=>n+String.fromCharCode(e),\"\"),r=Za.findIndex(e=>!n.match(e[1])),[s,l]=-1==r?[\"\",\"\"]:Ja[r],c=(new Wa).encode(a+s),d=(new Wa).encode(l+o+t);i=new Uint8Array(c.length+d.length+e.embeddedPdf.length),i.set(c),i.set(e.embeddedPdf,c.length),i.set(d,c.length+e.embeddedPdf.length)}else i=(new Wa).encode(a+o+t);return i}function oo(n){return n.title.replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")||\"\"}function io(n,e,t,a,o=0){const i=Ya[o];return n.match(i[0])||n.match(i[1])?o<Ka.length-1?io(n,e,t,a,o+1):(t.extractDataFromPage=!1,Qa(e,t,a)):(t.extractDataFromPageTags=Ka[o],Qa(e,t,a))}async function ro(n,e){const t=n.getWriter();await t.ready,n.size+=e.length,await t.write(e),t.releaseLock()}async function so(n,e,t,a,o){const i={};for(const n of Object.keys(e.resources))for(const a of e.resources[n])a.password=t.password,a.url&&!a.url.startsWith(\"data:\")&&(i[a.name]=a.url);const r=JSON.stringify({originalUrl:e.url,title:e.title,archiveTime:e.archiveTime,indexFilename:\"index.html\",resources:i},null,2);await Promise.all([Promise.all([lo(n,a,{name:\"index.html\",extension:\".html\",content:e.content,url:o,password:t.password},t.disableCompression),lo(n,a,{name:\"manifest.json\",extension:\".json\",content:r,password:t.password},t.disableCompression)]),Promise.all(Object.keys(e.resources).map(async o=>Promise.all(e.resources[o].map(e=>\"frames\"==o?so(n,e,t,a+e.name,e.url):lo(n,a,e,t.disableCompression)))))])}async function lo(n,e,t,a){const o=\"string\"==typeof t.content?new Ye(t.content):new Ke(new qa([new Uint8Array(t.content)])),i={comment:t.url&&t.url.startsWith(\"data:\")?\"data:\":t.url,password:t.password,bufferedWrite:!0};(Va.includes(t.extension)||a)&&(i.level=0),await n.add(e+t.name,o,i)}async function co(){const n=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",{Blob:e,XMLHttpRequest:t,document:a,zip:o,location:i}=globalThis,r=new Map([[65533,0],[8364,128],[8218,130],[402,131],[8222,132],[8230,133],[8224,134],[8225,135],[710,136],[8240,137],[352,138],[8249,139],[338,140],[381,142],[8216,145],[8217,146],[8220,147],[8221,148],[8226,149],[8211,150],[8212,151],[732,152],[8482,153],[353,154],[8250,155],[339,156],[382,158],[376,159]]);return new Promise((l,c)=>{let d=!1;!function m(){const h=new t;h.responseType=\"blob\",h.open(\"GET\",\"\"),h.onerror=async()=>{if(d)s(\"sfz-error-message\",2),c();else try{await function(n){return new Promise(e=>{\"complete\"===n.readyState||\"interactive\"===n.readyState?e():n.addEventListener(\"DOMContentLoaded\",()=>e())})}(a),a.body.querySelectorAll(\"meta, style\").forEach(n=>a.head.appendChild(n));const t=function(){const t=a.querySelector(\"sfz-extra-data\");if(t){let a=t.nextSibling;a=a&&a.nodeType==Node.TEXT_NODE&&a.nextSibling?a.nextSibling:t.previousSibling;const o=[];let{textContent:i}=a;for(let n=0;n<i.length;n++){const e=i.charCodeAt(n);o.push(e>255?r.get(e):e)}const s=new Uint32Array(function(e){e=function(e){const t=(e=String(e).replace(/[^A-Za-z0-9+/=]/g,\"\")).length,a=[];for(let o=0;o<t;o+=4){const t=n.indexOf(e[o])<<18|n.indexOf(e[o+1])<<12|(63&n.indexOf(e[o+2]))<<6|63&n.indexOf(e[o+3]);a.push(t>>16&255),\"=\"!==e[o+2]&&a.push(t>>8&255),\"=\"!==e[o+3]&&a.push(255&t)}return new Uint8Array(a)}(e);let t=new Uint8Array(1024),a=0;for(let n=0;n<e.length;){const i=e[n++];if(128&i){const r=3+(127&i),s=e[n++]<<8|e[n++],l=a-s;o(a+r);for(let n=0;n<r;n++)t[a++]=t[l+n]}else{const r=i;o(a+r);for(let o=0;o<r&&n<e.length;o++)t[a++]=e[n++]}}return new Uint8Array(t.buffer.slice(0,a));function o(n){if(t.length<n){let e=2*t.length;for(;e<n;)e*=2;const o=new Uint8Array(e);o.set(t.subarray(0,a)),t=o}}}(t.textContent).buffer),l=s[0],c=s.slice(1,1+l),d=s[1+l],m=s.slice(2+l,2+l+d);return c.forEach(n=>o.splice(n,1,13,10)),m.forEach(n=>o[n]=13),new e([new Uint8Array(o)],{type:\"application/octet-stream\"})}throw new Error(\"Extra zip data data not found\")}();s(\"sfz-wait-message\",2),l(t)}catch{s(\"sfz-error-message\",2),c()}},h.send(),h.onreadystatechange=()=>{if(2===h.readyState&&200===h.status&&!d){d=!0;const n=\"bytes\"===h.getResponseHeader(\"Accept-Ranges\");h.abort(),s(\"sfz-wait-message\",2),n?l(new o.HttpRangeReader(i.href,{useXHR:!0,combineSizeEocd:!0})):m()}},d&&(h.onload=()=>l(h.response))}()});function s(n,e=0){const t=a.getElementById(n);t&&(Array.from(a.body.childNodes).forEach(e=>{e.id!=n&&e.remove()}),a.body.hidden=!1,t.style=\"opacity: 0; animation: 0s linear \"+e+\"s display-wait-message 1 normal forwards\")}}const mo=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";var ho=Object.freeze({__proto__:null,process:Qa});const po=\"single-file-load-image\",uo=\"single-file-image-loaded\",go=\"_singleFile_fontFaces\",wo=\"_singleFile_worklets\",bo=globalThis.CustomEvent,fo=globalThis.document,yo=globalThis.Document,ko=globalThis.JSON,vo=globalThis.MutationObserver;let So,jo;function xo(){fo instanceof yo&&(fo.addEventListener(\"single-file-new-font-face\",n=>{const e=n.detail,t=Object.assign({},e);delete t.src,So.set(ko.stringify(t),e)}),fo.addEventListener(\"single-file-delete-font\",n=>{const e=n.detail,t=Object.assign({},e);delete t.src,So.delete(ko.stringify(t))}),fo.addEventListener(\"single-file-clear-fonts\",()=>So=new Map),fo.addEventListener(\"single-file-new-worklet\",n=>{const e=n.detail;jo.set(e.moduleURL,e)}))}function Co(){return Array.from(So.values())}function Ao(){return Array.from(jo.values())}function Lo(n){n.loadDeferredImagesBlockCookies&&fo.dispatchEvent(new bo(\"single-file-block-cookies-start\")),n.loadDeferredImagesBlockStorage&&fo.dispatchEvent(new bo(\"single-file-block-storage-start\")),n.loadDeferredImagesDispatchScrollEvent&&fo.dispatchEvent(new bo(\"single-file-dispatch-scroll-event-start\")),n.loadDeferredImagesKeepZoomLevel?fo.dispatchEvent(new bo(\"single-file-load-deferred-images-keep-zoom-level-start\")):fo.dispatchEvent(new bo(\"single-file-load-deferred-images-start\"))}function zo(n){n.loadDeferredImagesBlockCookies&&fo.dispatchEvent(new bo(\"single-file-block-cookies-end\")),n.loadDeferredImagesBlockStorage&&fo.dispatchEvent(new bo(\"single-file-block-storage-end\")),n.loadDeferredImagesDispatchScrollEvent&&fo.dispatchEvent(new bo(\"single-file-dispatch-scroll-event-end\")),n.loadDeferredImagesKeepZoomLevel?fo.dispatchEvent(new bo(\"single-file-load-deferred-images-keep-zoom-level-end\")):fo.dispatchEvent(new bo(\"single-file-load-deferred-images-end\"))}function To(n){n.loadDeferredImagesKeepZoomLevel?fo.dispatchEvent(new bo(\"single-file-load-deferred-images-keep-zoom-level-reset\")):fo.dispatchEvent(new bo(\"single-file-load-deferred-images-reset\"))}So=globalThis.window[go]?globalThis.window[go]:globalThis.window[go]=new Map,jo=globalThis.window[wo]?globalThis.window[wo]:globalThis.window[wo]=new Map,xo(),new vo(xo).observe(fo,{childList:!0});var Eo=Object.freeze({__proto__:null,IMAGE_LOADED_EVENT:uo,LOAD_IMAGE_EVENT:po,getFontsData:Co,getWorkletsData:Ao,loadDeferredImagesEnd:zo,loadDeferredImagesResetZoomLevel:To,loadDeferredImagesStart:Lo});const Ro=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",Io=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+Ro+\"?|(\"+Ro+\")|.)\",\"ig\");function Do(n){return n.replace(Io,(n,e,t)=>{const a=\"0x\"+e-65536;return a!=a||t?e:a<0?String.fromCharCode(a+65536):String.fromCharCode(a>>10|55296,1023&a|56320)})}var Mo=Object.freeze({__proto__:null,process:Do});const Po=\"single-file-\",No=\"Page saved with SingleFile\",_o=\"SingleFile\",Bo=\"_singleFile_waitForUserScript\",Oo=\"__frameTree__::\",Fo=\"singleFileDisabledNoscript\",Uo=\"single-file-infobar\";function qo(n,e,t){if(!n.querySelector(Uo)){let a;e.infobarContent?a=e.infobarContent.replace(/\\\\n/g,\"\\n\").replace(/\\\\t/g,\"\\t\"):e.saveDate&&(a=e.saveDate),a=a||\"No info\";const o=\"BODY\"==n.body.tagName?n.body:n.documentElement,i=function(n,e,t){const a=n.createElement(e);return t.appendChild(a),Array.from(getComputedStyle(a)).forEach(n=>a.style.setProperty(n,\"initial\",\"important\")),a}(n,Uo,o);let r;if(t)r=i.attachShadow({mode:\"open\"});else{const e=n.createElement(\"template\");e.setAttribute(\"shadowrootmode\",\"open\"),i.appendChild(e),r=e}const s=n.createElement(\"div\"),l=n.createElement(\"style\");if(l.textContent=\"\\n.infobar,\\n.infobar .infobar-icon,\\n.infobar .infobar-link-icon {\\n  min-inline-size: 28px;\\n  min-block-size: 28px;\\n  box-sizing: border-box;\\n}\\n\\n.infobar,\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  opacity: 0.7;\\n  transition: opacity 250ms;\\n}\\n\\n.infobar:hover,\\n.infobar .infobar-close-icon:hover,\\n.infobar .infobar-link-icon:hover {\\n  opacity: 1;\\n}\\n\\n.infobar,\\n.infobar-content {\\n  display: flex;\\n}\\n\\n.infobar {\\n  position: fixed;\\n  max-height: calc(100% - 32px);\\n  top: 16px;\\n  right: 16px;\\n  margin-inline-start: 16px;\\n  margin-block-end: 16px;\\n  color: #2d2d2d;\\n  background-color: #737373;\\n  border: 2px solid;\\n  border-color: #eee;\\n  border-radius: 16px;\\n  z-index: 2147483647;\\n  animation-name: flash;\\n  animation-duration: .5s;\\n  animation-timing-function: cubic-bezier(0.39, 0.58, 0.57, 1);\\n  animation-delay: 1s;\\n  animation-iteration-count: 2;\\n}\\n\\n.infobar:valid, .infobar:not(:focus-within):not(.infobar-focus) .infobar-content {\\n  display: none;\\n}\\n\\n.infobar:focus-within, .infobar.infobar-focus {\\n  background-color: #f9f9f9;\\n  border-color: #878787;\\n  border-radius: 8px;\\n  opacity: 1;\\n  transition-property: opacity, background-color, border-color, border-radius, color;\\n}\\n\\n.infobar-content {\\n  border: 2px solid;\\n  border-color: #f9f9f9;\\n  border-radius: 6px;\\n  background-color: #f9f9f9;\\n  overflow: auto;\\n}\\n\\n.infobar-content span {\\n  font-family: Arial, Helvetica, sans-serif;\\n  font-size: 14px;\\n  line-height: 18px;\\n  word-break: break-word;\\n  white-space: pre-wrap;\\n  margin-inline: 4px;\\n  margin-block: 4px;\\n}\\n\\n.infobar .infobar-icon,\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  cursor: pointer;\\n  background-position: center;\\n  background-repeat: no-repeat;\\n}\\n\\n.infobar .infobar-close-icon,\\n.infobar .infobar-link-icon {\\n  align-self: flex-start;\\n}\\n\\n.infobar .infobar-icon {\\n  position: absolute;\\n  min-inline-size: 24px;\\n  min-block-size: 24px;\\n}\\n\\n@keyframes flash {\\n  0%, 100% {\\n\\tbackground-color: #737373;\\n  }\\n  50% {\\n\\tbackground-color: #dd6a00;\\n  }\\n}\\n\\n.infobar:focus-within .infobar-icon, .infobar.infobar-focus .infobar-icon {\\n  z-index: -1;\\n  background-image: none;\\n  margin: 4px;\\n}\\n\\n.infobar .infobar-close-icon {\\n  min-inline-size: 22px;\\n  min-block-size: 22px;\\n}\\n\\n.infobar .infobar-icon {\\n  background-color: transparent;\\n  background-size: 70%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHADIRLMaOHwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAPUExURQAAAIqKioyNjY2OjvDw8L2y1DEAAAABdFJOUwBA5thmAAAAAWJLR0QB/wIt3gAAAGNJREFUSMdjYCAJsLi4OBCQx6/CBQwIGIDPCBcXAkYQUsACU+AwlBVQHg6Eg5pgZBGOboIJZugDFwRwoJECJCUOhJI1wZwzqmBUwagCuipgIqTABG9h7YIKaKGAURAFEF/6AQAO4HqSoDP8bgAAAABJRU5ErkJggg==);\\n}\\n\\n.infobar .infobar-link-icon {\\n  right: 4px;\\n  background-size: 60%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8H+DhhoQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJJJREFUOI3t070NRCEMA2CnYAOyDyPwpHj/Va7hJ3FzV7zy3ET5JIwoAF6Jk4wzAJAkzxAYG9YRTgB+24wBgKmfrGAKTcEfAY4KRlRoIeBTgKOCERVaCPgU4Khge2GqKOBTgKOCERVaAEC/4PNcnyoSWHpjqkhwKxbcig0Q6AorXYF/+A6eIYD1lVbwG/jdA6/kA2THRAURVubcAAAAAElFTkSuQmCC);\\n}\\n\\n.infobar .infobar-close-icon {\\n  appearance: none;\\n  background-size: 80%;\\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8VC4EQ6QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJtJREFUOI3NkrsBgCAMRLFwBPdxBArcfxXFkO8rbKWAAJfHJ9faf9vuYX/749T5NmShm3bEwbe2SxeuM4+2oxDL1cDoKtVUjRy+tH78Cv2CS+wIiQNC1AEhk4AQeUTMWUJMfUJMSEJMSEY8kIx4IONroaYAimNxsXp1PA7PxwfVL8QnowwoVC0lig07wDDVUjAdbAnjwtow/z/bDW7eI4M2KruJAAAAAElFTkSuQmCC);\\n}\\n\",e.infobarPositionAbsolute){l.textContent+=\".infobar { position: absolute; }\";\"static\"==getComputedStyle(o).position&&o.style.setProperty(\"position\",\"relative\",\"important\")}e.infobarPositionTop?l.textContent+=`.infobar { top: ${e.infobarPositionTop}; bottom: auto; }`:e.infobarPositionBottom&&(l.textContent+=`.infobar { bottom: ${e.infobarPositionBottom}; top: auto; }`),e.infobarPositionRight?l.textContent+=`.infobar { right: ${e.infobarPositionRight}; left: auto; }`:e.infobarPositionLeft&&(l.textContent+=`.infobar { left: ${e.infobarPositionLeft}; right: auto; }`),l.textContent=l.textContent.replace(/ {2}/g,\"\").replace(/\\n/g,\"\").replace(/: /g,\":\").replace(/, /g,\",\"),s.appendChild(l);const c=n.createElement(\"form\");c.classList.add(\"infobar\"),e.openInfobar&&c.classList.add(\"infobar-focus\"),s.appendChild(c);const d=n.createElement(\"span\");d.tabIndex=-1,d.classList.add(\"infobar-icon\"),c.appendChild(d);const m=n.createElement(\"span\");m.tabIndex=-1,m.classList.add(\"infobar-content\");const h=n.createElement(\"input\");h.type=\"checkbox\",h.required=!0,h.classList.add(\"infobar-close-icon\"),h.title=\"Close\",m.appendChild(h);const p=n.createElement(\"span\");p.textContent=a,m.appendChild(p);const u=n.createElement(\"a\");if(u.classList.add(\"infobar-link-icon\"),u.target=\"_blank\",u.rel=\"noopener noreferrer\",u.title=\"Open source URL: \"+e.saveUrl,u.href=e.saveUrl,m.appendChild(u),c.appendChild(m),t)r.appendChild(s);else{const e=n.createElement(\"script\");let t=Wo.toString()+\";\";t+=Ho.toString()+\";\",t+=\"(\"+Go.toString()+\")(document, \"+JSON.stringify(_o)+\");\",e.textContent=t,s.appendChild(e),r.innerHTML=s.outerHTML}}}function Ho(n,e=_o){const t=n.evaluate(\"//comment()\",n,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null);let a=t&&t.singleNodeValue;if(a&&a.nodeType==Node.COMMENT_NODE&&a.textContent.includes(e)){const n=a.textContent.split(\"\\n\"),[,,e,...t]=n,o=e.match(/^ url: (.*) ?$/),i=o&&o[1];if(i){let n,e;if(t.length&&(e=t[0].split(\"saved date: \")[1],e&&t.shift(),t.length>1)){let e=t[0].split(\"info: \")[1].trim();for(let n=1;n<t.length-1;n++)e+=\"\\n\"+t[n].trim();n=e.trim()}return{saveUrl:i,infobarContent:n,saveDate:e}}}}function Wo(n,{saveUrl:e,infobarContent:t,saveDate:a}){if(e){const o=n.querySelector(\"single-file-infobar\").shadowRoot;o.querySelector(\".infobar-content span\").textContent=t||a;const i=o.querySelector(\".infobar-content .infobar-link-icon\");i.href=e,i.title=\"Open source URL: \"+e}}function Go(n,e){const t=Ho(n,e);t&&t.saveUrl&&Wo(n,t)}const Vo=Po+\"on-before-capture\",Ko=Po+\"on-after-capture\",Jo=Po+\"request-get-adopted-stylesheets\",Yo=Po+\"response-get-adopted-stylesheets\",Zo=Po+\"unregister-request-get-adopted-stylesheets\",$o=Po+\"user-script-init\",Xo=\"data-\"+Po+\"removed-content\",Qo=\"data-\"+Po+\"hidden-content\",ni=\"data-\"+Po+\"kept-content\",ei=\"data-\"+Po+\"hidden-frame\",ti=\"data-\"+Po+\"preserved-space-element\",ai=\"data-\"+Po+\"shadow-root-element\",oi=\"data-\"+Po+\"win-id\",ii=\"data-\"+Po+\"image\",ri=\"data-\"+Po+\"poster\",si=\"data-\"+Po+\"video\",li=\"data-\"+Po+\"canvas\",ci=\"data-\"+Po+\"movable-style\",di=\"data-\"+Po+\"input-value\",mi=\"data-\"+Po+\"input-checked\",hi=\"data-\"+Po+\"lazy-loaded-src\",pi=\"data-\"+Po+\"stylesheet\",ui=\"data-\"+Po+\"disabled-noscript\",gi=\"data-\"+Po+\"selected-content\",wi=\"data-\"+Po+\"invalid-element\",bi=\"data-\"+Po+\"async-script\",fi=\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\",yi=[\"NOSCRIPT\",\"DISABLED-NOSCRIPT\",\"META\",\"LINK\",\"STYLE\",\"TITLE\",\"TEMPLATE\",\"SOURCE\",\"OBJECT\",\"SCRIPT\",\"HEAD\",\"BODY\"],ki=[\"SCRIPT\",\"NOSCRIPT\",\"META\",\"LINK\",\"TEMPLATE\"],vi=/^'(.*?)'$/,Si=/^\"(.*?)\"$/,ji={regular:\"400\",normal:\"400\",bold:\"700\",bolder:\"700\",lighter:\"100\"},xi=\"Archive processed by SingleFile\",Ci=\"single-file-ui-element\",Ai=Uo,Li=\"data:,\",zi=[\"~\",\"+\",\"?\",\"%\",\"*\",\":\",\"|\",'\"',\"<\",\">\",\"\\\\\\\\\",\"\\0-\u001f\",\"\"],Ti=[\"～\",\"＋\",\"？\",\"％\",\"＊\",\"：\",\"｜\",\"＂\",\"＜\",\"＞\",\"＼\"],Ei=\"data-sf-nesting-track-id\",Ri=(n,e,t)=>globalThis.addEventListener(n,e,t),Ii=globalThis.JSON,Di=globalThis.crypto,Mi=globalThis.TextEncoder,Pi=globalThis.Blob,Ni=globalThis.CustomEvent,_i=globalThis.MutationObserver,Bi=globalThis.URL,Oi=globalThis.DOMParser;function Fi(){Ri($o,({detail:n})=>globalThis[Bo]=async(e,t)=>{const a=Object.assign({},t);let o;delete a.win,delete a.doc,delete a.onprogress,delete a.frames,delete a.taskId,delete a._migratedTemplateFormat,delete a.woleetKey;try{o=\"jsonDetail\"==n?Ii.stringify({options:a}):{options:a}}catch(n){}const i=new Ni(e+\"-request\",{cancelable:!0,detail:o});let r;const s=new Promise(n=>{r=n,Ri(e+\"-response\",e=>{if(e.detail)try{const n=\"string\"==typeof e.detail?Ii.parse(e.detail):e.detail;n.options&&Object.assign(t,n.options)}catch(n){}n()})});(n=>{try{globalThis.dispatchEvent(n)}catch(n){}})(i),i.defaultPrevented?await s:r()}),new _i(Fi).observe(globalThis.document,{childList:!0})}function Ui(n){n.querySelectorAll(\"meta[http-equiv=refresh]\").forEach(n=>{n.removeAttribute(\"http-equiv\"),n.setAttribute(\"disabled-http-equiv\",\"refresh\")})}function qi(n,e,t){n.querySelectorAll(\"noscript:not([\"+ui+\"])\").forEach(n=>{n.setAttribute(ui,n.textContent),n.textContent=\"\"}),Ui(n),n.head&&n.head.querySelectorAll(fi).forEach(n=>n.hidden=!0),n.querySelectorAll(\"svg foreignObject\").forEach(n=>{const e=n.querySelectorAll(\"html > head > \"+fi+\", html > body > \"+fi);e.length&&(Array.from(n.childNodes).forEach(n=>n.remove()),e.forEach(e=>n.appendChild(e)))});const a=new Map;let o;e&&n.documentElement?(Hi(n),o=Gi(e,n,n.documentElement,t),t.moveStylesInHead&&n.querySelectorAll(\"body style, body ~ style\").forEach(n=>{const t=sr(e,n);t&&$i(n,t)&&(n.setAttribute(ci,\"\"),o.markedElements.push(n))})):o={canvases:[],images:[],posters:[],videos:[],usedFonts:[],shadowRoots:[],markedElements:[]};let i=\"\";if(n.referrer)try{i=new Bi(\"/\",new Bi(n.referrer).origin).href}catch(n){}return{canvases:o.canvases,fonts:Co(),worklets:Ao(),stylesheets:Qi(n),images:o.images,posters:o.posters,videos:o.videos,usedFonts:Array.from(o.usedFonts.values()),shadowRoots:o.shadowRoots,referrer:i,markedElements:o.markedElements,invalidElements:a,scrollPosition:{x:e.scrollX,y:e.scrollY},adoptedStyleSheets:Vi(n.adoptedStyleSheets)}}function Hi(n){!function n(e,t=0,a=\"\"){const o=a?`${a}.${t+1}`:`${t+1}`;e.setAttribute(Ei,o),Array.from(e.children).forEach((e,t)=>n(e,t,o))}(n.body);const e=cr(er(n)),t=i(n.body),a=i(e.body),o=new Set;function i(n){const e={};return function n(t){if(t.getAttribute){const a=t.getAttribute(Ei);a&&(e[a]=t),Array.from(t.children).forEach(n)}}(n),e}Object.keys(t).forEach(e=>{if(e in a){if((t[e].parentElement?.getAttribute(Ei)||null)!==(a[e]?.parentElement?.getAttribute(Ei)||null)){let a=t[e];for(;a&&a!==n.body;){const n=a.getAttribute(Ei);n&&o.add(n),a=a.parentElement}}}}),function n(e,t){const a=e.getAttribute(Ei);a&&!t.has(a)&&e.removeAttribute(Ei);Array.from(e.children).forEach(e=>n(e,t))}(n.body,o)}function Wi(n,e,t=!1){const a={};n.currentScript&&n.currentScript.remove(),function n(t){const o=t.getAttribute(e);o&&(a[o]=t);Array.from(t.children).forEach(n)}(n.body),Object.keys(a).forEach(n=>{const e=a[n],t=n.split(\".\");if(t.length>1){const n=t.slice(0,-1).join(\".\"),o=a[n];o&&e.parentElement!==o&&o.appendChild(e)}}),t||n.querySelectorAll(\"[\"+e+\"]\").forEach(n=>n.removeAttribute(e))}function Gi(n,e,t,a,o={usedFonts:new Map,canvases:[],images:[],posters:[],videos:[],shadowRoots:[],markedElements:[]},i=new Map,r){if(t.childNodes){Array.from(t.childNodes).filter(e=>e instanceof n.HTMLElement||e instanceof n.SVGElement||e instanceof globalThis.HTMLElement||e instanceof globalThis.SVGElement).forEach(t=>{let s,l,c;if(!a.autoSaveExternalSave&&(a.removeHiddenElements||a.removeUnusedFonts||a.compressHTML)&&(c=sr(n,t),(t instanceof n.HTMLElement||t instanceof globalThis.HTMLElement)&&a.removeHiddenElements&&(l=(r||t.closest(\"html > head\"))&&yi.includes(t.tagName.toUpperCase())||t.closest(\"details\"),l||(s=r||$i(t,c),s&&!ki.includes(t.tagName.toUpperCase())&&(t.setAttribute(Qo,\"\"),o.markedElements.push(t)))),!s)){if(a.compressHTML&&c){const n=c.getPropertyValue(\"white-space\");n&&n.startsWith(\"pre\")&&(t.setAttribute(ti,\"\"),o.markedElements.push(t))}a.removeUnusedFonts&&(Ki(c,a,o.usedFonts),Ki(sr(n,t,\":first-letter\"),a,o.usedFonts),Ki(sr(n,t,\":before\"),a,o.usedFonts),Ki(sr(n,t,\":after\"),a,o.usedFonts))}!function(n,e,t,a,o,i,r){const s=t.tagName&&t.tagName.toUpperCase();if(\"CANVAS\"==s)try{o.canvases.push({dataURI:t.toDataURL(\"image/png\"),backgroundColor:r.getPropertyValue(\"background-color\")}),t.setAttribute(li,o.canvases.length-1),o.markedElements.push(t)}catch(n){}if(\"IMG\"==s){const e={currentSrc:i?Li:a.loadDeferredImages&&t.getAttribute(hi)||t.currentSrc};if(o.images.push(e),t.setAttribute(ii,o.images.length-1),o.markedElements.push(t),t.removeAttribute(hi),r=r||sr(n,t)){e.size=function(n,e,t){let a=e.naturalWidth,o=e.naturalHeight;if(!a&&!o){const i=null==e.getAttribute(\"style\");if(t=t||sr(n,e)){let n,r,s,l,c,d,m,h,p=!1;if(\"content-box\"==t.getPropertyValue(\"box-sizing\")){const n=e.style.getPropertyValue(\"box-sizing\"),t=e.style.getPropertyPriority(\"box-sizing\"),a=e.clientWidth;e.style.setProperty(\"box-sizing\",\"border-box\",\"important\"),p=e.clientWidth!=a,n?e.style.setProperty(\"box-sizing\",n,t):e.style.removeProperty(\"box-sizing\")}n=nr(\"padding-left\",t),r=nr(\"padding-right\",t),s=nr(\"padding-top\",t),l=nr(\"padding-bottom\",t),p?(c=nr(\"border-left-width\",t),d=nr(\"border-right-width\",t),m=nr(\"border-top-width\",t),h=nr(\"border-bottom-width\",t)):c=d=m=h=0,a=Math.max(0,e.clientWidth-n-r-c-d),o=Math.max(0,e.clientHeight-s-l-m-h),i&&e.removeAttribute(\"style\")}}return{pxWidth:a,pxHeight:o}}(n,t,r);const a=r.getPropertyValue(\"box-shadow\"),o=r.getPropertyValue(\"background-image\");a&&\"none\"!=a||o&&\"none\"!=o||!(e.size.pxWidth>1||e.size.pxHeight>1)||(e.replaceable=!0,e.backgroundColor=r.getPropertyValue(\"background-color\"),e.objectFit=r.getPropertyValue(\"object-fit\"),e.boxSizing=r.getPropertyValue(\"box-sizing\"),e.objectPosition=r.getPropertyValue(\"object-position\"))}}if(\"VIDEO\"==s){const a=t.currentSrc;if(a&&!a.startsWith(\"blob:\")&&!a.startsWith(\"data:\")){const e=sr(n,t.parentNode);o.videos.push({positionParent:e&&e.getPropertyValue(\"position\"),src:a,size:{pxWidth:t.clientWidth,pxHeight:t.clientHeight,videoWidth:t.videoWidth,videoHeight:t.videoHeight},currentTime:t.currentTime}),t.setAttribute(si,o.videos.length-1)}if(!t.getAttribute(\"poster\")){const n=e.createElement(\"canvas\"),a=n.getContext(\"2d\");n.width=t.videoWidth,n.height=t.videoHeight;try{a.drawImage(t,0,0,n.width,n.height),o.posters.push(n.toDataURL(\"image/png\")),t.setAttribute(ri,o.posters.length-1),o.markedElements.push(t)}catch(n){}}}\"IFRAME\"==s&&i&&a.removeHiddenElements&&(t.setAttribute(ei,\"\"),o.markedElements.push(t));\"INPUT\"==s&&(\"password\"!=t.type&&(t.setAttribute(di,t.value),o.markedElements.push(t)),\"radio\"!=t.type&&\"checkbox\"!=t.type||(t.setAttribute(mi,t.checked),o.markedElements.push(t)));\"TEXTAREA\"==s&&(t.setAttribute(di,t.value),o.markedElements.push(t));\"SELECT\"==s&&t.querySelectorAll(\"option\").forEach(n=>{n.selected&&(n.setAttribute(di,\"\"),o.markedElements.push(n))});\"SCRIPT\"==s&&(t.async&&\"\"!=t.getAttribute(\"async\")&&\"async\"!=t.getAttribute(\"async\")&&(t.setAttribute(bi,\"\"),o.markedElements.push(t)),t.textContent=t.textContent.replace(/<\\/script>/gi,\"<\\\\/script>\"))}(n,e,t,a,o,s,c);const d=!(t instanceof n.SVGElement||t instanceof globalThis.SVGElement)&&Ji(t);if(d&&!t.classList.contains(Ci)&&t.tagName.toLowerCase()!=Ai){const r={};t.setAttribute(ai,o.shadowRoots.length),o.markedElements.push(t),o.shadowRoots.push(r);try{if(d.adoptedStyleSheets){const n=n=>r.adoptedStyleSheets=n.detail.adoptedStyleSheets;d.addEventListener(Yo,n),d.dispatchEvent(new Ni(Jo,{bubbles:!0})),r.adoptedStyleSheets||t.dispatchEvent(new Ni(Jo,{bubbles:!0})),d.removeEventListener(Yo,n)}}catch(n){}Gi(n,e,d,a,o,i,s),r.content=d.innerHTML,r.mode=d.mode,r.delegateFocus=d.delegatesFocus,r.clonable=d.clonable,r.serializable=d.serializable;try{d.adoptedStyleSheets&&void 0===d.adoptedStyleSheets.length&&d.dispatchEvent(new Ni(Zo,{bubbles:!0}))}catch(n){}}Gi(n,e,t,a,o,i,s),!a.autoSaveExternalSave&&a.removeHiddenElements&&r&&(l||\"\"==t.getAttribute(ni)?t.parentElement&&(t.parentElement.setAttribute(ni,\"\"),o.markedElements.push(t.parentElement)):s&&(t.setAttribute(Xo,\"\"),o.markedElements.push(t)))})}return o}function Vi(n,e=new Map){if(n){const t=[];for(const a of Array.from(n))if(e.has(a))t.push(e.get(a));else{let n=\"\";if(a&&a.cssRules)for(const e of a.cssRules)n+=e.cssText+\"\\n\";e.set(a,n),t.push(n)}return t}return[]}function Ki(n,e,t){if(n){const a=n.getPropertyValue(\"font-style\")||\"normal\";n.getPropertyValue(\"font-family\").split(\",\").forEach(o=>{if(o=Zi(o),!e.loadedFonts||e.loadedFonts.find(n=>Zi(n.family)==o&&n.style==a)){const e=ar(n.getPropertyValue(\"font-weight\")),i=n.getPropertyValue(\"font-variant\")||\"normal\",r=[o,e,a,i];t.set(Ii.stringify(r),[o,e,a,i])}})}}function Ji(n){const e=globalThis.chrome;if(n.openOrClosedShadowRoot)return n.openOrClosedShadowRoot;if(!(e&&e.dom&&e.dom.openOrClosedShadowRoot))return n.shadowRoot;try{return e.dom.openOrClosedShadowRoot(n)}catch(e){return n.shadowRoot}}function Yi(n,e,t){return qo(n,e,t)}function Zi(n=\"\"){return tr(Do(n.trim())).toLowerCase()}function $i(n,e){let t=!1;if(e){const a=e.getPropertyValue(\"display\"),o=e.getPropertyValue(\"opacity\"),i=e.getPropertyValue(\"visibility\");if(t=\"none\"==a,!t&&(\"0\"==o||\"hidden\"==i)&&n.getBoundingClientRect){const e=n.getBoundingClientRect();t=!e.width&&!e.height}}return Boolean(t)}function Xi(n,e,t){if(n.querySelectorAll(\"[\"+ui+\"]\").forEach(n=>{n.textContent=n.getAttribute(ui),n.removeAttribute(ui)}),n.querySelectorAll(\"meta[disabled-http-equiv]\").forEach(n=>{n.setAttribute(\"http-equiv\",n.getAttribute(\"disabled-http-equiv\")),n.removeAttribute(\"disabled-http-equiv\")}),n.head&&n.head.querySelectorAll(\"*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)\").forEach(n=>n.removeAttribute(\"hidden\")),!e){const t=[Xo,ei,Qo,ti,ii,ri,si,li,di,mi,ai,pi,bi];e=n.querySelectorAll(t.map(n=>\"[\"+n+\"]\").join(\",\"))}e.forEach(n=>{n.removeAttribute(Xo),n.removeAttribute(Qo),n.removeAttribute(ni),n.removeAttribute(ei),n.removeAttribute(ti),n.removeAttribute(ii),n.removeAttribute(ri),n.removeAttribute(si),n.removeAttribute(li),n.removeAttribute(di),n.removeAttribute(mi),n.removeAttribute(ai),n.removeAttribute(pi),n.removeAttribute(bi),n.removeAttribute(ci)}),t&&t.forEach((n,e)=>n.replaceWith(e))}function Qi(n){if(n){const e=[];return n.querySelectorAll(\"style\").forEach((t,a)=>{try{if(!t.sheet.disabled){const o=n.createElement(\"style\");o.textContent=t.textContent,n.body.appendChild(o);const i=o.sheet;o.remove();const r=Array.from(i.cssRules).map(n=>n.cssText).join(\"\\n\"),s=Array.from(t.sheet.cssRules).map(n=>n.cssText).join(\"\\n\");i&&r==s||(t.setAttribute(pi,a),e[a]=Array.from(t.sheet.cssRules).map(n=>n.cssText).join(\"\\n\"))}}catch(n){}}),e}}function nr(n,e){if(e.getPropertyValue(n).endsWith(\"px\"))return parseFloat(e.getPropertyValue(n))}function er(n){const e=n.doctype;let t=\"\";return e&&(t=\"<!DOCTYPE \"+e.nodeName,e.publicId?(t+=' PUBLIC \"'+e.publicId+'\"',e.systemId&&(t+=' \"'+e.systemId+'\"')):e.systemId&&(t+=' SYSTEM \"'+e.systemId+'\"'),e.internalSubset&&(t+=\" [\"+e.internalSubset+\"]\"),t+=\"> \"),t+n.documentElement.outerHTML}function tr(n){return(n=n.match(vi)?n.replace(vi,\"$1\"):n.replace(Si,\"$1\")).trim()}function ar(n){return ji[n.toLowerCase().trim()]||n}function or(n){return new Pi([n]).size}async function ir(n,e){try{return function(n){const e=[],t=new DataView(n);for(let n=0;n<t.byteLength;n+=4){const a=\"00000000\",o=(a+t.getUint32(n).toString(16)).slice(-a.length);e.push(o)}return e.join(\"\")}(await Di.subtle.digest(n,new Mi(\"utf-8\").encode(e)))}catch(n){return\"\"}}function rr(n){return n.flat?n.flat():n.reduce((n,e)=>n.concat(Array.isArray(e)?rr(e):e),[])}function sr(n,e,t){try{return n.getComputedStyle(e,t)}catch(n){}}function lr(n,e=zi,t=\"_\",a=Ti){return a.forEach((t,o)=>n=n.replace(new RegExp(\"[\"+e[o]+\"]+\",\"g\"),a[o])),e.forEach(e=>n=n.replace(new RegExp(\"[\"+e+\"]+\",\"g\"),t)),n=n.replace(/\\.\\.\\//g,\"\").replace(/^\\/+/,\"\").replace(/\\/+/g,\"/\").replace(/\\/$/,\"\").replace(/\\.$/,\"\").replace(/\\.\\//g,\".\"+t).replace(/\\/\\./g,\"/\"+t)}function cr(n,e){const t=(new Oi).parseFromString(n,\"text/html\");t.head||t.documentElement.insertBefore(t.createElement(\"HEAD\"),t.body);let a=t.querySelector(\"base\");return a&&a.getAttribute(\"href\")||(a&&a.remove(),a=t.createElement(\"base\"),a.setAttribute(\"href\",e),t.head.insertBefore(a,t.head.firstChild)),t}var dr=Object.freeze({__proto__:null,ASYNC_SCRIPT_ATTRIBUTE_NAME:bi,CANVAS_ATTRIBUTE_NAME:li,COMMENT_HEADER:No,COMMENT_HEADER_LEGACY:xi,EMPTY_RESOURCE:Li,HIDDEN_CONTENT_ATTRIBUTE_NAME:Qo,HIDDEN_FRAME_ATTRIBUTE_NAME:ei,IMAGE_ATTRIBUTE_NAME:ii,INFOBAR_TAGNAME:Ai,INPUT_CHECKED_ATTRIBUTE_NAME:mi,INPUT_VALUE_ATTRIBUTE_NAME:di,INVALID_ELEMENT_ATTRIBUTE_NAME:wi,LAZY_SRC_ATTRIBUTE_NAME:hi,MESSAGE_PREFIX:Oo,NESTING_TRACK_ID_ATTRIBUTE_NAME:Ei,NO_SCRIPT_PROPERTY_NAME:Fo,ON_AFTER_CAPTURE_EVENT_NAME:Ko,ON_BEFORE_CAPTURE_EVENT_NAME:Vo,POSTER_ATTRIBUTE_NAME:ri,PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME:ti,REMOVED_CONTENT_ATTRIBUTE_NAME:Xo,SELECTED_CONTENT_ATTRIBUTE_NAME:gi,SHADOW_ROOT_ATTRIBUTE_NAME:ai,SINGLE_FILE_UI_ELEMENT_CLASS:Ci,STYLESHEET_ATTRIBUTE_NAME:pi,STYLE_ATTRIBUTE_NAME:ci,VIDEO_ATTRIBUTE_NAME:si,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:Bo,WIN_ID_ATTRIBUTE_NAME:oi,appendInfobar:Yi,digest:ir,fixInvalidNesting:Wi,flatten:rr,getContentSize:or,getFontWeight:ar,getShadowRoot:Ji,getValidFilename:lr,initDoc:Ui,initUserScriptHandler:Fi,markInvalidNesting:Hi,normalizeFontFamily:Zi,parseDocContent:cr,postProcessDoc:Xi,preProcessDoc:qi,removeQuotes:tr,serialize:er});const mr={LAZY_SRC_ATTRIBUTE_NAME:hi,SINGLE_FILE_UI_ELEMENT_CLASS:Ci},hr=\"attributes\",pr=globalThis.browser,ur=globalThis.document,gr=globalThis.MutationObserver,wr=new Map;let br;async function fr(n){if(ur.documentElement){wr.clear();const e=ur.body?Math.max(ur.body.scrollHeight,ur.documentElement.scrollHeight):ur.documentElement.scrollHeight,t=ur.body?Math.max(ur.body.scrollWidth,ur.documentElement.scrollWidth):ur.documentElement.scrollWidth;if(e>globalThis.innerHeight||t>globalThis.innerWidth){const a=Math.max(e-1.5*globalThis.innerHeight,0),o=Math.max(t-1.5*globalThis.innerWidth,0);if(globalThis.scrollY<a||globalThis.scrollX<o)return function(n){return br=0,new Promise(async e=>{let t;const a=new Set,o=new gr(async e=>{if((e=e.filter(n=>n.type==hr)).length){e.filter(n=>{if(\"src\"==n.attributeName&&(n.target.setAttribute(mr.LAZY_SRC_ATTRIBUTE_NAME,n.target.src),n.target.addEventListener(\"load\",r)),\"src\"==n.attributeName||\"srcset\"==n.attributeName||n.target.tagName&&\"SOURCE\"==n.target.tagName.toUpperCase())return!n.target.classList||!n.target.classList.contains(mr.SINGLE_FILE_UI_ELEMENT_CLASS)}).length&&(t=!0,await vr(o,n,c),a.size||await kr(o,n,c))}});async function i(e){await jr(\"idleTimeout\",async()=>{t?br<10&&(br++,Cr(\"idleTimeout\"),await i(Math.max(500,e/2))):(Cr(\"loadTimeout\"),Cr(\"maxTimeout\"),Sr(o,n,c))},e,n.loadDeferredImagesNativeTimeout)}function r(n){const e=n.target;e.removeAttribute(mr.LAZY_SRC_ATTRIBUTE_NAME),e.removeEventListener(\"load\",r)}async function s(e){t=!0,await vr(o,n,c),await kr(o,n,c),e.detail&&a.add(e.detail)}async function l(e){await vr(o,n,c),await kr(o,n,c),a.delete(e.detail),a.size||await kr(o,n,c)}function c(n){o.disconnect(),ur.removeEventListener(po,s),ur.removeEventListener(uo,l),e(n)}await i(2*n.loadDeferredImagesMaxIdleTime),await vr(o,n,c),o.observe(ur,{subtree:!0,childList:!0,attributes:!0}),ur.addEventListener(po,s),ur.addEventListener(uo,l),Lo(n)})}(n)}}}function yr(n){To(n)}async function kr(n,e,t){await jr(\"loadTimeout\",()=>Sr(n,e,t),e.loadDeferredImagesMaxIdleTime,e.loadDeferredImagesNativeTimeout)}async function vr(n,e,t){await jr(\"maxTimeout\",async()=>{await Cr(\"loadTimeout\"),await Sr(n,e,t)},10*e.loadDeferredImagesMaxIdleTime,e.loadDeferredImagesNativeTimeout)}async function Sr(n,e,t){await Cr(\"idleTimeout\"),zo(e),await jr(\"endTimeout\",async()=>{await Cr(\"maxTimeout\"),t()},e.loadDeferredImagesMaxIdleTime/2,e.loadDeferredImagesNativeTimeout),n.disconnect()}async function jr(n,e,t,a){if(pr&&pr.runtime&&pr.runtime.sendMessage&&!a){if(!wr.get(n)||!wr.get(n).pending){const a={callback:e,pending:!0};wr.set(n,a);try{await pr.runtime.sendMessage({method:\"singlefile.lazyTimeout.setTimeout\",type:n,delay:t})}catch(a){xr(n,e,t)}a.pending=!1}}else xr(n,e,t)}function xr(n,e,t){const a=wr.get(n);a&&globalThis.clearTimeout(a),wr.set(n,e),globalThis.setTimeout(e,t)}async function Cr(n){if(pr&&pr.runtime&&pr.runtime.sendMessage)try{await pr.runtime.sendMessage({method:\"singlefile.lazyTimeout.clearTimeout\",type:n})}catch(e){Ar(n)}else Ar(n)}function Ar(n){const e=wr.get(n);wr.delete(n),e&&globalThis.clearTimeout(e)}pr&&pr.runtime&&pr.runtime.onMessage&&pr.runtime.onMessage.addListener&&pr.runtime.onMessage.addListener(n=>{if(\"singlefile.lazyTimeout.onTimeout\"==n.method){const e=wr.get(n.type);if(e){wr.delete(n.type);try{e.callback()}catch(e){Ar(n.type)}}}});var Lr=Object.freeze({__proto__:null,process:fr,resetZoomLevel:yr});const zr={ON_BEFORE_CAPTURE_EVENT_NAME:Vo,ON_AFTER_CAPTURE_EVENT_NAME:Ko,WIN_ID_ATTRIBUTE_NAME:oi,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:Bo,preProcessDoc:qi,serialize:er,postProcessDoc:Xi,getShadowRoot:Ji},Tr=\"singlefile.frameTree.initRequest\",Er=\"singlefile.frameTree.ackInitRequest\",Rr=\"singlefile.frameTree.cleanupRequest\",Ir=\"singlefile.frameTree.initResponse\",Dr=5e3,Mr=\".\",Pr=globalThis.window==globalThis.top,Nr=globalThis.browser,_r=globalThis.top,Br=globalThis.MessageChannel,Or=globalThis.document,Fr=globalThis.JSON,Ur=globalThis.MutationObserver,qr=globalThis.DOMParser;let Hr,Wr=globalThis.sessions;function Gr(){globalThis.addEventListener(\"message\",async n=>{if(\"string\"==typeof n.data&&n.data.startsWith(Oo)){n.preventDefault(),n.stopPropagation();const e=Fr.parse(n.data.substring(15));if(e.method==Tr)n.source&&es(n.source,{method:Er,windowId:e.windowId,sessionId:e.sessionId}),Pr||(globalThis.stop(),e.options.loadDeferredImages&&fr(e.options),await Kr(e));else if(e.method==Er)$r(\"requestTimeouts\",e.sessionId,e.windowId),Xr(e.sessionId,e.windowId);else if(e.method==Rr)Jr(e);else if(e.method==Ir&&Wr.get(e.sessionId)){n.ports[0].onmessage=n=>Yr(n.data)}}},!0)}function Vr(){return globalThis.crypto.getRandomValues(new Uint32Array(32)).join(\"\")}async function Kr(n){const e=n.sessionId;delete globalThis._singleFile_cleaningUp,Pr||(Hr=globalThis.frameId=n.windowId),Zr(Or,n.options,Hr,e),Pr||(ns({frames:[ts(Or,globalThis,Hr,n.options,n.scrolling)],sessionId:e,requestedFrameId:Or.documentElement.dataset.requestedFrameId&&Hr}),delete Or.documentElement.dataset.requestedFrameId)}function Jr(n){if(!globalThis._singleFile_cleaningUp){globalThis._singleFile_cleaningUp=!0;const e=n.sessionId;Qr(as(Or),n.windowId,e)}}function Yr(n){n.frames.forEach(e=>$r(\"responseTimeouts\",n.sessionId,e.windowId));const e=Wr.get(n.sessionId);if(e){n.requestedFrameId&&(e.requestedFrameId=n.requestedFrameId),n.frames.forEach(n=>{let t=e.frames.find(e=>n.windowId==e.windowId);t||(t={windowId:n.windowId},e.frames.push(t)),t.processed||(t.content=n.content,t.baseURI=n.baseURI,t.title=n.title,t.url=n.url,t.canvases=n.canvases,t.fonts=n.fonts,t.worklets=n.worklets,t.stylesheets=n.stylesheets,t.images=n.images,t.posters=n.posters,t.videos=n.videos,t.usedFonts=n.usedFonts,t.shadowRoots=n.shadowRoots,t.processed=n.processed,t.scrollPosition=n.scrollPosition,t.scrolling=n.scrolling,t.adoptedStyleSheets=n.adoptedStyleSheets)});e.frames.filter(n=>!n.processed).length||(e.frames=e.frames.sort((n,e)=>e.windowId.split(Mr).length-n.windowId.split(Mr).length),e.resolve&&(e.requestedFrameId&&e.frames.forEach(n=>{n.windowId==e.requestedFrameId&&(n.requestedFrame=!0)}),e.resolve(e.frames)))}}function Zr(n,e,t,a){const o=as(n);!function(n,e,t,a,o){const i=[];let r;Wr.get(o)?r=Wr.get(o).requestTimeouts:(r={},Wr.set(o,{requestTimeouts:r}));e.forEach((n,e)=>{const t=a+Mr+e;n.setAttribute(zr.WIN_ID_ATTRIBUTE_NAME,t),i.push({windowId:t})}),ns({frames:i,sessionId:o,requestedFrameId:n.documentElement.dataset.requestedFrameId&&a}),e.forEach((n,e)=>{const i=a+Mr+e;try{es(n.contentWindow,{method:Tr,windowId:i,sessionId:o,options:t,scrolling:n.scrolling})}catch(n){}r[i]=globalThis.setTimeout(()=>ns({frames:[{windowId:i,processed:!0}],sessionId:o}),Dr)}),delete n.documentElement.dataset.requestedFrameId}(n,o,e,t,a),o.length&&function(n,e,t,a,o){const i=[];e.forEach((n,e)=>{const r=a+Mr+e;let s,l;try{s=n.contentDocument,l=n.contentWindow,l.stop()}catch(n){}const c=n.getAttribute(\"srcdoc\");if(!s&&c){s=(new qr).parseFromString(c,\"text/html\"),l=globalThis}if(s)try{$r(\"requestTimeouts\",o,r),Zr(s,t,r,o),i.push(ts(s,l,r,t,n.scrolling))}catch(n){i.push({windowId:r,processed:!0})}}),ns({frames:i,sessionId:o,requestedFrameId:n.documentElement.dataset.requestedFrameId&&a}),delete n.documentElement.dataset.requestedFrameId}(n,o,e,t,a)}function $r(n,e,t){const a=Wr.get(e);if(a&&a[n]){const e=a[n][t];e&&(globalThis.clearTimeout(e),delete a[n][t])}}function Xr(n,e){const t=Wr.get(n);t&&t.responseTimeouts&&(t.responseTimeouts[e]=globalThis.setTimeout(()=>ns({frames:[{windowId:e,processed:!0}],sessionId:n}),1e4))}function Qr(n,e,t){n.forEach((n,a)=>{const o=e+Mr+a;n.removeAttribute(zr.WIN_ID_ATTRIBUTE_NAME);try{es(n.contentWindow,{method:Rr,windowId:o,sessionId:t})}catch(n){}}),n.forEach((n,a)=>{const o=e+Mr+a;let i;try{i=n.contentDocument}catch(n){}if(i)try{Qr(as(i),o,t)}catch(n){}})}function ns(n){n.method=Ir;try{_r.singlefile.processors.frameTree.initResponse(n)}catch(e){es(_r,n,!0)}}function es(n,e,t){if(n==_r&&Nr&&Nr.runtime&&Nr.runtime.sendMessage)Nr.runtime.sendMessage(e);else if(t){const t=new Br;n.postMessage(Oo+Fr.stringify({method:e.method,sessionId:e.sessionId}),\"*\",[t.port2]),t.port1.postMessage(e)}else n.postMessage(Oo+Fr.stringify(e),\"*\")}function ts(n,e,t,a,o){const i=zr.preProcessDoc(n,e,a),r=zr.serialize(n);zr.postProcessDoc(n,i.markedElements,i.invalidElements);return{windowId:t,content:r,baseURI:n.baseURI.split(\"#\")[0],url:n.documentURI,title:n.title,canvases:i.canvases,fonts:i.fonts,worklets:i.worklets,stylesheets:i.stylesheets,images:i.images,posters:i.posters,videos:i.videos,usedFonts:i.usedFonts,shadowRoots:i.shadowRoots,scrollPosition:i.scrollPosition,scrolling:o,adoptedStyleSheets:i.adoptedStyleSheets,processed:!0}}function as(n){let e=Array.from(n.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]'));return n.querySelectorAll(\"*\").forEach(n=>{const t=zr.getShadowRoot(n);t&&(e=e.concat(...as(t)))}),e}Wr||(Wr=globalThis.sessions=new Map),Pr&&(Hr=\"0\",Nr&&Nr.runtime&&Nr.runtime.onMessage&&Nr.runtime.onMessage.addListener&&Nr.runtime.onMessage.addListener(n=>n.method==Ir?(Yr(n),Promise.resolve({})):n.method==Er?($r(\"requestTimeouts\",n.sessionId,n.windowId),Xr(n.sessionId,n.windowId),Promise.resolve({})):void 0)),Gr(),Fi(),new Ur(Gr).observe(Or,{childList:!0});var os=Object.freeze({__proto__:null,TIMEOUT_INIT_REQUEST_MESSAGE:Dr,cleanup:function(n){Wr.delete(n),Jr({windowId:Hr,sessionId:n})},getAsync:function(n){const e=Vr();return n=Fr.parse(Fr.stringify(n)),new Promise(t=>{Wr.set(e,{frames:[],requestTimeouts:{},responseTimeouts:{},resolve:n=>{n.sessionId=e,t(n)}}),Kr({windowId:Hr,sessionId:e,options:n})})},getSync:function(n){const e=Vr();n=Fr.parse(Fr.stringify(n)),Wr.set(e,{frames:[],requestTimeouts:{},responseTimeouts:{}}),function(n){const e=n.sessionId;delete globalThis._singleFile_cleaningUp,Pr||(Hr=globalThis.frameId=n.windowId);Zr(Or,n.options,Hr,e),Pr||(ns({frames:[ts(Or,globalThis,Hr,n.options,n.scrolling)],sessionId:e,requestedFrameId:Or.documentElement.dataset.requestedFrameId&&Hr}),delete Or.documentElement.dataset.requestedFrameId)}({windowId:Hr,sessionId:e,options:n});const t=Wr.get(e).frames;return t.sessionId=e,t},initResponse:Yr}),is=Object.freeze({__proto__:null,compression:ho,frameTree:os,hooksFrames:Eo,lazy:Lr}),rs=Object.create,ss=Object.defineProperty,ls=Object.getOwnPropertyDescriptor,cs=Object.getOwnPropertyNames,ds=Object.getPrototypeOf,ms=Object.prototype.hasOwnProperty,hs=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ps=(n,e)=>{for(var t in e)ss(n,t,{get:e[t],enumerable:!0})},us=hs(n=>{var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");n.encode=function(n){if(0<=n&&n<e.length)return e[n];throw new TypeError(\"Must be between 0 and 63: \"+n)},n.decode=function(n){return 65<=n&&n<=90?n-65:97<=n&&n<=122?n-97+26:48<=n&&n<=57?n-48+52:43==n?62:47==n?63:-1}}),gs=hs(n=>{var e=us();n.encode=function(n){var t,a=\"\",o=function(n){return n<0?1+(-n<<1):0+(n<<1)}(n);do{t=31&o,(o>>>=5)>0&&(t|=32),a+=e.encode(t)}while(o>0);return a},n.decode=function(n,t,a){var o,i,r=n.length,s=0,l=0;do{if(t>=r)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(-1===(i=e.decode(n.charCodeAt(t++))))throw new Error(\"Invalid base64 digit: \"+n.charAt(t-1));o=!!(32&i),s+=(i&=31)<<l,l+=5}while(o);a.value=function(n){var e=n>>1;return 1&~n?e:-e}(s),a.rest=t}}),ws=hs(n=>{n.getArg=function(n,e,t){if(e in n)return n[e];if(3===arguments.length)return t;throw new Error('\"'+e+'\" is a required argument.')};var e=/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/,t=/^data:.+\\,.+$/;function a(n){var t=n.match(e);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}function o(n){var e=\"\";return n.scheme&&(e+=n.scheme+\":\"),e+=\"//\",n.auth&&(e+=n.auth+\"@\"),n.host&&(e+=n.host),n.port&&(e+=\":\"+n.port),n.path&&(e+=n.path),e}n.urlParse=a,n.urlGenerate=o;var i=function(n){var e=[];return function(t){for(var a=0;a<e.length;a++)if(e[a].input===t){var o=e[0];return e[0]=e[a],e[a]=o,e[0].result}var i=n(t);return e.unshift({input:t,result:i}),e.length>32&&e.pop(),i}}(function(e){var t=e,i=a(e);if(i){if(!i.path)return e;t=i.path}for(var r=n.isAbsolute(t),s=[],l=0,c=0;;){if(l=c,-1===(c=t.indexOf(\"/\",l))){s.push(t.slice(l));break}for(s.push(t.slice(l,c));c<t.length&&\"/\"===t[c];)c++}var d,m=0;for(c=s.length-1;c>=0;c--)\".\"===(d=s[c])?s.splice(c,1):\"..\"===d?m++:m>0&&(\"\"===d?(s.splice(c+1,m),m=0):(s.splice(c,2),m--));return\"\"===(t=s.join(\"/\"))&&(t=r?\"/\":\".\"),i?(i.path=t,o(i)):t});function r(n,e){\"\"===n&&(n=\".\"),\"\"===e&&(e=\".\");var r=a(e),s=a(n);if(s&&(n=s.path||\"/\"),r&&!r.scheme)return s&&(r.scheme=s.scheme),o(r);if(r||e.match(t))return e;if(s&&!s.host&&!s.path)return s.host=e,o(s);var l=\"/\"===e.charAt(0)?e:i(n.replace(/\\/+$/,\"\")+\"/\"+e);return s?(s.path=l,o(s)):l}n.normalize=i,n.join=r,n.isAbsolute=function(n){return\"/\"===n.charAt(0)||e.test(n)},n.relative=function(n,e){\"\"===n&&(n=\".\"),n=n.replace(/\\/$/,\"\");for(var t=0;0!==e.indexOf(n+\"/\");){var a=n.lastIndexOf(\"/\");if(a<0||(n=n.slice(0,a)).match(/^([^\\/]+:\\/)?\\/*$/))return e;++t}return Array(t+1).join(\"../\")+e.substr(n.length+1)};var s=!(\"__proto__\"in Object.create(null));function l(n){return n}function c(n){if(!n)return!1;var e=n.length;if(e<9||95!==n.charCodeAt(e-1)||95!==n.charCodeAt(e-2)||111!==n.charCodeAt(e-3)||116!==n.charCodeAt(e-4)||111!==n.charCodeAt(e-5)||114!==n.charCodeAt(e-6)||112!==n.charCodeAt(e-7)||95!==n.charCodeAt(e-8)||95!==n.charCodeAt(e-9))return!1;for(var t=e-10;t>=0;t--)if(36!==n.charCodeAt(t))return!1;return!0}function d(n,e){return n===e?0:null===n?1:null===e?-1:n>e?1:-1}n.toSetString=s?l:function(n){return c(n)?\"$\"+n:n},n.fromSetString=s?l:function(n){return c(n)?n.slice(1):n},n.compareByOriginalPositions=function(n,e,t){var a=d(n.source,e.source);return 0!==a||0!==(a=n.originalLine-e.originalLine)||(0!==(a=n.originalColumn-e.originalColumn)||t)||0!==(a=n.generatedColumn-e.generatedColumn)||0!==(a=n.generatedLine-e.generatedLine)?a:d(n.name,e.name)},n.compareByOriginalPositionsNoSource=function(n,e,t){var a;return 0!==(a=n.originalLine-e.originalLine)||(0!==(a=n.originalColumn-e.originalColumn)||t)||0!==(a=n.generatedColumn-e.generatedColumn)||0!==(a=n.generatedLine-e.generatedLine)?a:d(n.name,e.name)},n.compareByGeneratedPositionsDeflated=function(n,e,t){var a=n.generatedLine-e.generatedLine;return 0!==a||(0!==(a=n.generatedColumn-e.generatedColumn)||t)||0!==(a=d(n.source,e.source))||0!==(a=n.originalLine-e.originalLine)||0!==(a=n.originalColumn-e.originalColumn)?a:d(n.name,e.name)},n.compareByGeneratedPositionsDeflatedNoLine=function(n,e,t){var a=n.generatedColumn-e.generatedColumn;return 0!==a||t||0!==(a=d(n.source,e.source))||0!==(a=n.originalLine-e.originalLine)||0!==(a=n.originalColumn-e.originalColumn)?a:d(n.name,e.name)},n.compareByGeneratedPositionsInflated=function(n,e){var t=n.generatedLine-e.generatedLine;return 0!==t||0!==(t=n.generatedColumn-e.generatedColumn)||0!==(t=d(n.source,e.source))||0!==(t=n.originalLine-e.originalLine)||0!==(t=n.originalColumn-e.originalColumn)?t:d(n.name,e.name)},n.parseSourceMapInput=function(n){return JSON.parse(n.replace(/^\\)]}'[^\\n]*\\n/,\"\"))},n.computeSourceURL=function(n,e,t){if(e=e||\"\",n&&(\"/\"!==n[n.length-1]&&\"/\"!==e[0]&&(n+=\"/\"),e=n+e),t){var s=a(t);if(!s)throw new Error(\"sourceMapURL could not be parsed\");if(s.path){var l=s.path.lastIndexOf(\"/\");l>=0&&(s.path=s.path.substring(0,l+1))}e=r(o(s),e)}return i(e)}}),bs=hs(n=>{var e=ws(),t=Object.prototype.hasOwnProperty,a=typeof Map<\"u\";function o(){this._array=[],this._set=a?new Map:Object.create(null)}o.fromArray=function(n,e){for(var t=new o,a=0,i=n.length;a<i;a++)t.add(n[a],e);return t},o.prototype.size=function(){return a?this._set.size:Object.getOwnPropertyNames(this._set).length},o.prototype.add=function(n,o){var i=a?n:e.toSetString(n),r=a?this.has(n):t.call(this._set,i),s=this._array.length;(!r||o)&&this._array.push(n),r||(a?this._set.set(n,s):this._set[i]=s)},o.prototype.has=function(n){if(a)return this._set.has(n);var o=e.toSetString(n);return t.call(this._set,o)},o.prototype.indexOf=function(n){if(a){var o=this._set.get(n);if(o>=0)return o}else{var i=e.toSetString(n);if(t.call(this._set,i))return this._set[i]}throw new Error('\"'+n+'\" is not in the set.')},o.prototype.at=function(n){if(n>=0&&n<this._array.length)return this._array[n];throw new Error(\"No element indexed by \"+n)},o.prototype.toArray=function(){return this._array.slice()},n.ArraySet=o}),fs=hs(n=>{var e=ws();function t(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}t.prototype.unsortedForEach=function(n,e){this._array.forEach(n,e)},t.prototype.add=function(n){!function(n,t){var a=n.generatedLine,o=t.generatedLine,i=n.generatedColumn,r=t.generatedColumn;return o>a||o==a&&r>=i||e.compareByGeneratedPositionsInflated(n,t)<=0}(this._last,n)?(this._sorted=!1,this._array.push(n)):(this._last=n,this._array.push(n))},t.prototype.toArray=function(){return this._sorted||(this._array.sort(e.compareByGeneratedPositionsInflated),this._sorted=!0),this._array},n.MappingList=t}),ys=hs(n=>{var e=gs(),t=ws(),a=bs().ArraySet,o=fs().MappingList;function i(n){n||(n={}),this._file=t.getArg(n,\"file\",null),this._sourceRoot=t.getArg(n,\"sourceRoot\",null),this._skipValidation=t.getArg(n,\"skipValidation\",!1),this._sources=new a,this._names=new a,this._mappings=new o,this._sourcesContents=null}i.prototype._version=3,i.fromSourceMap=function(n){var e=n.sourceRoot,a=new i({file:n.file,sourceRoot:e});return n.eachMapping(function(n){var o={generated:{line:n.generatedLine,column:n.generatedColumn}};null!=n.source&&(o.source=n.source,null!=e&&(o.source=t.relative(e,o.source)),o.original={line:n.originalLine,column:n.originalColumn},null!=n.name&&(o.name=n.name)),a.addMapping(o)}),n.sources.forEach(function(o){var i=o;null!==e&&(i=t.relative(e,o)),a._sources.has(i)||a._sources.add(i);var r=n.sourceContentFor(o);null!=r&&a.setSourceContent(o,r)}),a},i.prototype.addMapping=function(n){var e=t.getArg(n,\"generated\"),a=t.getArg(n,\"original\",null),o=t.getArg(n,\"source\",null),i=t.getArg(n,\"name\",null);this._skipValidation||this._validateMapping(e,a,o,i),null!=o&&(o=String(o),this._sources.has(o)||this._sources.add(o)),null!=i&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:e.line,generatedColumn:e.column,originalLine:null!=a&&a.line,originalColumn:null!=a&&a.column,source:o,name:i})},i.prototype.setSourceContent=function(n,e){var a=n;null!=this._sourceRoot&&(a=t.relative(this._sourceRoot,a)),null!=e?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[t.toSetString(a)]=e):this._sourcesContents&&(delete this._sourcesContents[t.toSetString(a)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))},i.prototype.applySourceMap=function(n,e,o){var i=e;if(null==e){if(null==n.file)throw new Error('SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map\\'s \"file\" property. Both were omitted.');i=n.file}var r=this._sourceRoot;null!=r&&(i=t.relative(r,i));var s=new a,l=new a;this._mappings.unsortedForEach(function(e){if(e.source===i&&null!=e.originalLine){var a=n.originalPositionFor({line:e.originalLine,column:e.originalColumn});null!=a.source&&(e.source=a.source,null!=o&&(e.source=t.join(o,e.source)),null!=r&&(e.source=t.relative(r,e.source)),e.originalLine=a.line,e.originalColumn=a.column,null!=a.name&&(e.name=a.name))}var c=e.source;null!=c&&!s.has(c)&&s.add(c);var d=e.name;null!=d&&!l.has(d)&&l.add(d)},this),this._sources=s,this._names=l,n.sources.forEach(function(e){var a=n.sourceContentFor(e);null!=a&&(null!=o&&(e=t.join(o,e)),null!=r&&(e=t.relative(r,e)),this.setSourceContent(e,a))},this)},i.prototype._validateMapping=function(n,e,t,a){if(e&&\"number\"!=typeof e.line&&\"number\"!=typeof e.column)throw new Error(\"original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.\");if(!(n&&\"line\"in n&&\"column\"in n&&n.line>0&&n.column>=0)||e||t||a){if(n&&\"line\"in n&&\"column\"in n&&e&&\"line\"in e&&\"column\"in e&&n.line>0&&n.column>=0&&e.line>0&&e.column>=0&&t)return;throw new Error(\"Invalid mapping: \"+JSON.stringify({generated:n,source:t,original:e,name:a}))}},i.prototype._serializeMappings=function(){for(var n,a,o,i,r=0,s=1,l=0,c=0,d=0,m=0,h=\"\",p=this._mappings.toArray(),u=0,g=p.length;u<g;u++){if(n=\"\",(a=p[u]).generatedLine!==s)for(r=0;a.generatedLine!==s;)n+=\";\",s++;else if(u>0){if(!t.compareByGeneratedPositionsInflated(a,p[u-1]))continue;n+=\",\"}n+=e.encode(a.generatedColumn-r),r=a.generatedColumn,null!=a.source&&(i=this._sources.indexOf(a.source),n+=e.encode(i-m),m=i,n+=e.encode(a.originalLine-1-c),c=a.originalLine-1,n+=e.encode(a.originalColumn-l),l=a.originalColumn,null!=a.name&&(o=this._names.indexOf(a.name),n+=e.encode(o-d),d=o)),h+=n}return h},i.prototype._generateSourcesContent=function(n,e){return n.map(function(n){if(!this._sourcesContents)return null;null!=e&&(n=t.relative(e,n));var a=t.toSetString(n);return Object.prototype.hasOwnProperty.call(this._sourcesContents,a)?this._sourcesContents[a]:null},this)},i.prototype.toJSON=function(){var n={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return null!=this._file&&(n.file=this._file),null!=this._sourceRoot&&(n.sourceRoot=this._sourceRoot),this._sourcesContents&&(n.sourcesContent=this._generateSourcesContent(n.sources,n.sourceRoot)),n},i.prototype.toString=function(){return JSON.stringify(this.toJSON())},n.SourceMapGenerator=i}),ks={};ps(ks,{AtKeyword:()=>xs,BadString:()=>Ls,BadUrl:()=>Ts,CDC:()=>Ns,CDO:()=>Ps,Colon:()=>_s,Comma:()=>Os,Comment:()=>Vs,Delim:()=>Es,Dimension:()=>Ds,EOF:()=>vs,Function:()=>js,Hash:()=>Cs,Ident:()=>Ss,LeftCurlyBracket:()=>Ws,LeftParenthesis:()=>qs,LeftSquareBracket:()=>Fs,Number:()=>Rs,Percentage:()=>Is,RightCurlyBracket:()=>Gs,RightParenthesis:()=>Hs,RightSquareBracket:()=>Us,Semicolon:()=>Bs,String:()=>As,Url:()=>zs,WhiteSpace:()=>Ms});var vs=0,Ss=1,js=2,xs=3,Cs=4,As=5,Ls=6,zs=7,Ts=8,Es=9,Rs=10,Is=11,Ds=12,Ms=13,Ps=14,Ns=15,_s=16,Bs=17,Os=18,Fs=19,Us=20,qs=21,Hs=22,Ws=23,Gs=24,Vs=25;function Ks(n){return n>=48&&n<=57}function Js(n){return Ks(n)||n>=65&&n<=70||n>=97&&n<=102}function Ys(n){return n>=65&&n<=90}function Zs(n){return function(n){return Ys(n)||function(n){return n>=97&&n<=122}(n)}(n)||function(n){return n>=128}(n)||95===n}function $s(n){return Zs(n)||Ks(n)||45===n}function Xs(n){return n>=0&&n<=8||11===n||n>=14&&n<=31||127===n}function Qs(n){return 10===n||13===n||12===n}function nl(n){return Qs(n)||32===n||9===n}function el(n,e){return!(92!==n||Qs(e)||0===e)}function tl(n,e,t){return 45===n?Zs(e)||45===e||el(e,t):!!Zs(n)||92===n&&el(n,e)}function al(n,e,t){return 43===n||45===n?Ks(e)?2:46===e&&Ks(t)?3:0:46===n?Ks(e)?2:0:Ks(n)?1:0}function ol(n){return 65279===n||65534===n?1:0}var il=new Array(128),rl=130;for(let n=0;n<il.length;n++)il[n]=(nl(n)?rl:Ks(n)&&131)||Zs(n)&&132||Xs(n)&&133||n||128;function sl(n){return n<128?il[n]:132}function ll(n,e){return e<n.length?n.charCodeAt(e):0}function cl(n,e,t){return 13===t&&10===ll(n,e+1)?2:1}function dl(n,e,t){let a=n.charCodeAt(e);return Ys(a)&&(a|=32),a===t}function ml(n,e,t,a){if(t-e!==a.length||e<0||t>n.length)return!1;for(let o=e;o<t;o++){let t=a.charCodeAt(o-e),i=n.charCodeAt(o);if(Ys(i)&&(i|=32),i!==t)return!1}return!0}function hl(n,e){for(;e<n.length&&nl(n.charCodeAt(e));e++);return e}function pl(n,e){for(;e<n.length&&Ks(n.charCodeAt(e));e++);return e}function ul(n,e){if(Js(ll(n,(e+=2)-1))){for(let t=Math.min(n.length,e+5);e<t&&Js(ll(n,e));e++);let t=ll(n,e);nl(t)&&(e+=cl(n,e,t))}return e}function gl(n,e){for(;e<n.length;e++){let t=n.charCodeAt(e);if(!$s(t)){if(el(t,ll(n,e+1))){e=ul(n,e)-1;continue}break}}return e}function wl(n,e){let t=n.charCodeAt(e);if((43===t||45===t)&&(t=n.charCodeAt(e+=1)),Ks(t)&&(e=pl(n,e+1),t=n.charCodeAt(e)),46===t&&Ks(n.charCodeAt(e+1))&&(e=pl(n,e+=2)),dl(n,e,101)){let a=0;t=n.charCodeAt(e+1),(45===t||43===t)&&(a=1,t=n.charCodeAt(e+2)),Ks(t)&&(e=pl(n,e+1+a+1))}return e}function bl(n,e){for(;e<n.length;e++){let t=n.charCodeAt(e);if(41===t){e++;break}el(t,ll(n,e+1))&&(e=ul(n,e))}return e}function fl(n){if(1===n.length&&!Js(n.charCodeAt(0)))return n[0];let e=parseInt(n,16);return(0===e||e>=55296&&e<=57343||e>1114111)&&(e=65533),String.fromCodePoint(e)}var yl=[\"EOF-token\",\"ident-token\",\"function-token\",\"at-keyword-token\",\"hash-token\",\"string-token\",\"bad-string-token\",\"url-token\",\"bad-url-token\",\"delim-token\",\"number-token\",\"percentage-token\",\"dimension-token\",\"whitespace-token\",\"CDO-token\",\"CDC-token\",\"colon-token\",\"semicolon-token\",\"comma-token\",\"[-token\",\"]-token\",\"(-token\",\")-token\",\"{-token\",\"}-token\",\"comment-token\"];function kl(n=null,e){return null===n||n.length<e?new Uint32Array(Math.max(e+1024,16384)):n}function vl(n){let e=n.source,t=e.length,a=e.length>0?ol(e.charCodeAt(0)):0,o=kl(n.lines,t),i=kl(n.columns,t),r=n.startLine,s=n.startColumn;for(let n=a;n<t;n++){let a=e.charCodeAt(n);o[n]=r,i[n]=s++,(10===a||13===a||12===a)&&(13===a&&n+1<t&&10===e.charCodeAt(n+1)&&(n++,o[n]=r,i[n]=s),r++,s=1)}o[t]=r,i[t]=s,n.lines=o,n.columns=i,n.computed=!0}var Sl=class{constructor(n,e,t,a){this.setSource(n,e,t,a),this.lines=null,this.columns=null}setSource(n=\"\",e=0,t=1,a=1){this.source=n,this.startOffset=e,this.startLine=t,this.startColumn=a,this.computed=!1}getLocation(n,e){return this.computed||vl(this),{source:e,offset:this.startOffset+n,line:this.lines[n],column:this.columns[n]}}getLocationRange(n,e,t){return this.computed||vl(this),{source:t,start:{offset:this.startOffset+n,line:this.lines[n],column:this.columns[n]},end:{offset:this.startOffset+e,line:this.lines[e],column:this.columns[e]}}}},jl=16777215,xl=24,Cl=new Uint8Array(32);Cl[2]=22,Cl[21]=22,Cl[19]=20,Cl[23]=24;var Al=new Uint8Array(32);function Ll(n,e,t){return n<e?e:n>t?t:n}Al[2]=1,Al[21]=1,Al[19]=1,Al[23]=1,Al[22]=2,Al[20]=2,Al[24]=2;var zl=class{constructor(n,e){this.setSource(n,e)}reset(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset}setSource(n=\"\",e=()=>{}){let t=(n=String(n||\"\")).length,a=kl(this.offsetAndType,n.length+1),o=kl(this.balance,n.length+1),i=0,r=-1,s=0,l=n.length;this.offsetAndType=null,this.balance=null,o.fill(0),e(n,(n,e,t)=>{let c=i++;if(a[c]=n<<xl|t,-1===r&&(r=e),o[c]=l,n===s){let n=o[l];o[l]=c,l=n,s=Cl[a[n]>>xl]}else this.isBlockOpenerTokenType(n)&&(l=c,s=Cl[n])}),a[i]=0|t,o[i]=i;for(let n=0;n<i;n++){let e=o[n];if(e<=n){let t=o[e];t!==n&&(o[n]=t)}else e>i&&(o[n]=i)}this.source=n,this.firstCharOffset=-1===r?0:r,this.tokenCount=i,this.offsetAndType=a,this.balance=o,this.reset(),this.next()}lookupType(n){return(n+=this.tokenIndex)<this.tokenCount?this.offsetAndType[n]>>xl:0}lookupTypeNonSC(n){for(let e=this.tokenIndex;e<this.tokenCount;e++){let t=this.offsetAndType[e]>>xl;if(13!==t&&25!==t&&0===n--)return t}return 0}lookupOffset(n){return(n+=this.tokenIndex)<this.tokenCount?this.offsetAndType[n-1]&jl:this.source.length}lookupOffsetNonSC(n){for(let e=this.tokenIndex;e<this.tokenCount;e++){let t=this.offsetAndType[e]>>xl;if(13!==t&&25!==t&&0===n--)return e-this.tokenIndex}return 0}lookupValue(n,e){return(n+=this.tokenIndex)<this.tokenCount&&ml(this.source,this.offsetAndType[n-1]&jl,this.offsetAndType[n]&jl,e)}getTokenStart(n){return n===this.tokenIndex?this.tokenStart:n>0?n<this.tokenCount?this.offsetAndType[n-1]&jl:this.offsetAndType[this.tokenCount]&jl:this.firstCharOffset}getTokenEnd(n){return n===this.tokenIndex?this.tokenEnd:this.offsetAndType[Ll(n,0,this.tokenCount)]&jl}getTokenType(n){return n===this.tokenIndex?this.tokenType:this.offsetAndType[Ll(n,0,this.tokenCount)]>>xl}substrToCursor(n){return this.source.substring(n,this.tokenStart)}isBlockOpenerTokenType(n){return 1===Al[n]}isBlockCloserTokenType(n){return 2===Al[n]}getBlockTokenPairIndex(n){let e=this.getTokenType(n);if(1===Al[e]){let t=this.balance[n],a=this.getTokenType(t);return Cl[e]===a?t:-1}if(2===Al[e]){let t=this.balance[n],a=this.getTokenType(t);return Cl[a]===e?t:-1}return-1}isBalanceEdge(n){return this.balance[this.tokenIndex]<n}isDelim(n,e){return e?9===this.lookupType(e)&&this.source.charCodeAt(this.lookupOffset(e))===n:9===this.tokenType&&this.source.charCodeAt(this.tokenStart)===n}skip(n){let e=this.tokenIndex+n;e<this.tokenCount?(this.tokenIndex=e,this.tokenStart=this.offsetAndType[e-1]&jl,e=this.offsetAndType[e],this.tokenType=e>>xl,this.tokenEnd=e&jl):(this.tokenIndex=this.tokenCount,this.next())}next(){let n=this.tokenIndex+1;n<this.tokenCount?(this.tokenIndex=n,this.tokenStart=this.tokenEnd,n=this.offsetAndType[n],this.tokenType=n>>xl,this.tokenEnd=n&jl):(this.eof=!0,this.tokenIndex=this.tokenCount,this.tokenType=0,this.tokenStart=this.tokenEnd=this.source.length)}skipSC(){for(;13===this.tokenType||25===this.tokenType;)this.next()}skipUntilBalanced(n,e){let t=n,a=0,o=0;n:for(;t<this.tokenCount&&(a=this.balance[t],!(a<n));t++)switch(o=t>0?this.offsetAndType[t-1]&jl:this.firstCharOffset,e(this.source.charCodeAt(o))){case 1:break n;case 2:t++;break n;default:this.isBlockOpenerTokenType(this.offsetAndType[t]>>xl)&&(t=a)}this.skip(t-this.tokenIndex)}forEachToken(n){for(let e=0,t=this.firstCharOffset;e<this.tokenCount;e++){let a=t,o=this.offsetAndType[e],i=o&jl;t=i,n(o>>xl,a,i,e)}}dump(){let n=new Array(this.tokenCount);return this.forEachToken((e,t,a,o)=>{n[o]={idx:o,type:yl[e],chunk:this.source.substring(t,a),balance:this.balance[o]}}),n}};function Tl(n,e){function t(e){return e<s?n.charCodeAt(e):0}function a(){return c=wl(n,c),tl(t(c),t(c+1),t(c+2))?(r=12,void(c=gl(n,c))):37===t(c)?(r=11,void c++):void(r=10)}function o(){let e=c;return c=gl(n,c),ml(n,e,c,\"url\")&&40===t(c)?(c=hl(n,c+1),34===t(c)||39===t(c)?(r=2,void(c=e+4)):void function(){for(r=7,c=hl(n,c);c<n.length;c++){let e=n.charCodeAt(c);switch(sl(e)){case 41:return void c++;case rl:return c=hl(n,c),41===t(c)||c>=n.length?void(c<n.length&&c++):(c=bl(n,c),void(r=8));case 34:case 39:case 40:case 133:return c=bl(n,c),void(r=8);case 92:if(el(e,t(c+1))){c=ul(n,c)-1;break}return c=bl(n,c),void(r=8)}}}()):40===t(c)?(r=2,void c++):void(r=1)}function i(e){for(e||(e=t(c++)),r=5;c<n.length;c++){let a=n.charCodeAt(c);switch(sl(a)){case e:return void c++;case rl:if(Qs(a))return c+=cl(n,c,a),void(r=6);break;case 92:if(c===n.length-1)break;let o=t(c+1);Qs(o)?c+=cl(n,c+1,o):el(a,o)&&(c=ul(n,c)-1)}}}let r,s=(n=String(n||\"\")).length,l=ol(t(0)),c=l;for(;c<s;){let s=n.charCodeAt(c);switch(sl(s)){case rl:r=13,c=hl(n,c+1);break;case 34:i();break;case 35:$s(t(c+1))||el(t(c+1),t(c+2))?(r=4,c=gl(n,c+1)):(r=9,c++);break;case 39:i();break;case 40:r=21,c++;break;case 41:r=22,c++;break;case 43:al(s,t(c+1),t(c+2))?a():(r=9,c++);break;case 44:r=18,c++;break;case 45:al(s,t(c+1),t(c+2))?a():45===t(c+1)&&62===t(c+2)?(r=15,c+=3):tl(s,t(c+1),t(c+2))?o():(r=9,c++);break;case 46:al(s,t(c+1),t(c+2))?a():(r=9,c++);break;case 47:42===t(c+1)?(r=25,c=n.indexOf(\"*/\",c+2),c=-1===c?n.length:c+2):(r=9,c++);break;case 58:r=16,c++;break;case 59:r=17,c++;break;case 60:33===t(c+1)&&45===t(c+2)&&45===t(c+3)?(r=14,c+=4):(r=9,c++);break;case 64:tl(t(c+1),t(c+2),t(c+3))?(r=3,c=gl(n,c+1)):(r=9,c++);break;case 91:r=19,c++;break;case 92:el(s,t(c+1))?o():(r=9,c++);break;case 93:r=20,c++;break;case 123:r=23,c++;break;case 125:r=24,c++;break;case 131:a();break;case 132:o();break;default:r=9,c++}e(r,l,l=c)}}var El=null,Rl=class n{static createItem(n){return{prev:null,next:null,data:n}}constructor(){this.head=null,this.tail=null,this.cursor=null}createItem(e){return n.createItem(e)}allocateCursor(n,e){let t;return null!==El?(t=El,El=El.cursor,t.prev=n,t.next=e,t.cursor=this.cursor):t={prev:n,next:e,cursor:this.cursor},this.cursor=t,t}releaseCursor(){let{cursor:n}=this;this.cursor=n.cursor,n.prev=null,n.next=null,n.cursor=El,El=n}updateCursors(n,e,t,a){let{cursor:o}=this;for(;null!==o;)o.prev===n&&(o.prev=e),o.next===t&&(o.next=a),o=o.cursor}*[Symbol.iterator](){for(let n=this.head;null!==n;n=n.next)yield n.data}get size(){let n=0;for(let e=this.head;null!==e;e=e.next)n++;return n}get isEmpty(){return null===this.head}get first(){return this.head&&this.head.data}get last(){return this.tail&&this.tail.data}fromArray(e){let t=null;this.head=null;for(let a of e){let e=n.createItem(a);null!==t?t.next=e:this.head=e,e.prev=t,t=e}return this.tail=t,this}toArray(){return[...this]}toJSON(){return[...this]}forEach(n,e=this){let t=this.allocateCursor(null,this.head);for(;null!==t.next;){let a=t.next;t.next=a.next,n.call(e,a.data,a,this)}this.releaseCursor()}forEachRight(n,e=this){let t=this.allocateCursor(this.tail,null);for(;null!==t.prev;){let a=t.prev;t.prev=a.prev,n.call(e,a.data,a,this)}this.releaseCursor()}reduce(n,e,t=this){let a,o=this.allocateCursor(null,this.head),i=e;for(;null!==o.next;)a=o.next,o.next=a.next,i=n.call(t,i,a.data,a,this);return this.releaseCursor(),i}reduceRight(n,e,t=this){let a,o=this.allocateCursor(this.tail,null),i=e;for(;null!==o.prev;)a=o.prev,o.prev=a.prev,i=n.call(t,i,a.data,a,this);return this.releaseCursor(),i}some(n,e=this){for(let t=this.head;null!==t;t=t.next)if(n.call(e,t.data,t,this))return!0;return!1}map(e,t=this){let a=new n;for(let n=this.head;null!==n;n=n.next)a.appendData(e.call(t,n.data,n,this));return a}filter(e,t=this){let a=new n;for(let n=this.head;null!==n;n=n.next)e.call(t,n.data,n,this)&&a.appendData(n.data);return a}nextUntil(n,e,t=this){if(null===n)return;let a=this.allocateCursor(null,n);for(;null!==a.next;){let n=a.next;if(a.next=n.next,e.call(t,n.data,n,this))break}this.releaseCursor()}prevUntil(n,e,t=this){if(null===n)return;let a=this.allocateCursor(n,null);for(;null!==a.prev;){let n=a.prev;if(a.prev=n.prev,e.call(t,n.data,n,this))break}this.releaseCursor()}clear(){this.head=null,this.tail=null}copy(){let e=new n;for(let n of this)e.appendData(n);return e}prepend(n){return this.updateCursors(null,n,this.head,n),null!==this.head?(this.head.prev=n,n.next=this.head):this.tail=n,this.head=n,this}prependData(e){return this.prepend(n.createItem(e))}append(n){return this.insert(n)}appendData(e){return this.insert(n.createItem(e))}insert(n,e=null){if(null!==e)if(this.updateCursors(e.prev,n,e,n),null===e.prev){if(this.head!==e)throw new Error(\"before doesn't belong to list\");this.head=n,e.prev=n,n.next=e,this.updateCursors(null,n)}else e.prev.next=n,n.prev=e.prev,e.prev=n,n.next=e;else this.updateCursors(this.tail,n,null,n),null!==this.tail?(this.tail.next=n,n.prev=this.tail):this.head=n,this.tail=n;return this}insertData(e,t){return this.insert(n.createItem(e),t)}remove(n){if(this.updateCursors(n,n.prev,n,n.next),null!==n.prev)n.prev.next=n.next;else{if(this.head!==n)throw new Error(\"item doesn't belong to list\");this.head=n.next}if(null!==n.next)n.next.prev=n.prev;else{if(this.tail!==n)throw new Error(\"item doesn't belong to list\");this.tail=n.prev}return n.prev=null,n.next=null,n}push(e){this.insert(n.createItem(e))}pop(){return null!==this.tail?this.remove(this.tail):null}unshift(e){this.prepend(n.createItem(e))}shift(){return null!==this.head?this.remove(this.head):null}prependList(n){return this.insertList(n,this.head)}appendList(n){return this.insertList(n)}insertList(n,e){return null===n.head||(null!=e?(this.updateCursors(e.prev,n.tail,e,n.head),null!==e.prev?(e.prev.next=n.head,n.head.prev=e.prev):this.head=n.head,e.prev=n.tail,n.tail.next=e):(this.updateCursors(this.tail,n.tail,null,n.head),null!==this.tail?(this.tail.next=n.head,n.head.prev=this.tail):this.head=n.head,this.tail=n.tail),n.head=null,n.tail=null),this}replace(n,e){\"head\"in e?this.insertList(e,n):this.insert(e,n),this.remove(n)}};function Il(n,e){let t=Object.create(SyntaxError.prototype),a=new Error;return Object.assign(t,{name:n,message:e,get stack(){return(a.stack||\"\").replace(/^(.+\\n){1,3}/,`${n}: ${e}\\n`)}})}var Dl=\"    \";function Ml({source:n,line:e,column:t,baseLine:a,baseColumn:o},i){function r(n,e){return s.slice(n,e).map((e,t)=>String(n+t+1).padStart(d)+\" |\"+e).join(\"\\n\")}let s=(\"\\n\".repeat(Math.max(a-1,0))+\" \".repeat(Math.max(o-1,0))+n).split(/\\r\\n?|\\n|\\f/),l=Math.max(1,e-i)-1,c=Math.min(e+i,s.length+1),d=Math.max(4,String(c).length)+1,m=0;(t+=3*(s[e-1].substr(0,t-1).match(/\\t/g)||[]).length)>100&&(m=t-60+3,t=58);for(let n=l;n<=c;n++)n>=0&&n<s.length&&(s[n]=s[n].replace(/\\t/g,Dl),s[n]=(m>0&&s[n].length>m?\"…\":\"\")+s[n].substr(m,98)+(s[n].length>m+100-1?\"…\":\"\"));return[r(l,e),new Array(t+d+2).join(\"-\")+\"^\",r(e,c)].filter(Boolean).join(\"\\n\").replace(/^(\\s+\\d+\\s+\\|\\n)+/,\"\").replace(/\\n(\\s+\\d+\\s+\\|)+$/,\"\")}function Pl(n,e,t,a,o,i=1,r=1){return Object.assign(Il(\"SyntaxError\",n),{source:e,offset:t,line:a,column:o,sourceFragment:n=>Ml({source:e,line:a,column:o,baseLine:i,baseColumn:r},isNaN(n)?0:n),get formattedMessage(){return`Parse error: ${n}\\n`+Ml({source:e,line:a,column:o,baseLine:i,baseColumn:r},2)}})}function Nl(n){let e=this.createList(),t=!1,a={recognizer:n};for(;!this.eof;){switch(this.tokenType){case 25:this.next();continue;case 13:t=!0,this.next();continue}let o=n.getNode.call(this,a);if(void 0===o)break;t&&(n.onWhiteSpace&&n.onWhiteSpace.call(this,o,e,a),t=!1),e.push(o)}return t&&n.onWhiteSpace&&n.onWhiteSpace.call(this,null,e,a),e}var _l=()=>{};function Bl(n){return function(){return this[n]()}}function Ol(n){let e=Object.create(null);for(let t of Object.keys(n)){let a=n[t],o=a.parse||a;o&&(e[t]=o)}return e}function Fl(n){let e=\"\",t=\"<unknown>\",a=!1,o=_l,i=!1,r=new Sl,s=Object.assign(new zl,function(n){let e={context:Object.create(null),features:Object.assign(Object.create(null),n.features),scope:Object.assign(Object.create(null),n.scope),atrule:Ol(n.atrule),pseudo:Ol(n.pseudo),node:Ol(n.node)};for(let[t,a]of Object.entries(n.parseContext))switch(typeof a){case\"function\":e.context[t]=a;break;case\"string\":e.context[t]=Bl(a)}return{config:e,...e,...e.node}}(n||{}),{parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Nl,consumeUntilBalanceEnd:()=>0,consumeUntilLeftCurlyBracket:n=>123===n?1:0,consumeUntilLeftCurlyBracketOrSemicolon:n=>123===n||59===n?1:0,consumeUntilExclamationMarkOrSemicolon:n=>33===n||59===n?1:0,consumeUntilSemicolonIncluded:n=>59===n?2:0,createList:()=>new Rl,createSingleNodeList:n=>(new Rl).appendData(n),getFirstListNode:n=>n&&n.first,getLastListNode:n=>n&&n.last,parseWithFallback(n,e){let t=this.tokenIndex;try{return n.call(this)}catch(n){if(i)throw n;this.skip(t-this.tokenIndex);let a=e.call(this);return i=!0,o(n,a),i=!1,a}},lookupNonWSType(n){let e;do{if(e=this.lookupType(n++),13!==e&&25!==e)return e}while(0!==e);return 0},charCodeAt:n=>n>=0&&n<e.length?e.charCodeAt(n):0,substring:(n,t)=>e.substring(n,t),substrToCursor(n){return this.source.substring(n,this.tokenStart)},cmpChar:(n,t)=>dl(e,n,t),cmpStr:(n,t,a)=>ml(e,n,t,a),consume(n){let e=this.tokenStart;return this.eat(n),this.substrToCursor(e)},consumeFunctionName(){let n=e.substring(this.tokenStart,this.tokenEnd-1);return this.eat(2),n},consumeNumber(n){let t=e.substring(this.tokenStart,wl(e,this.tokenStart));return this.eat(n),t},eat(n){if(this.tokenType!==n){let e=yl[n].slice(0,-6).replace(/-/g,\" \").replace(/^./,n=>n.toUpperCase()),t=`${/[[\\](){}]/.test(e)?`\"${e}\"`:e} is expected`,a=this.tokenStart;switch(n){case 1:2===this.tokenType||7===this.tokenType?(a=this.tokenEnd-1,t=\"Identifier is expected but function found\"):t=\"Identifier is expected\";break;case 4:this.isDelim(35)&&(this.next(),a++,t=\"Name is expected\");break;case 11:10===this.tokenType&&(a=this.tokenEnd,t=\"Percent sign is expected\")}this.error(t,a)}this.next()},eatIdent(n){(1!==this.tokenType||!1===this.lookupValue(0,n))&&this.error(`Identifier \"${n}\" is expected`),this.next()},eatDelim(n){this.isDelim(n)||this.error(`Delim \"${String.fromCharCode(n)}\" is expected`),this.next()},getLocation:(n,e)=>a?r.getLocationRange(n,e,t):null,getLocationFromList(n){if(a){let e=this.getFirstListNode(n),a=this.getLastListNode(n);return r.getLocationRange(null!==e?e.loc.start.offset-r.startOffset:this.tokenStart,null!==a?a.loc.end.offset-r.startOffset:this.tokenStart,t)}return null},error(n,t){let a=typeof t<\"u\"&&t<e.length?r.getLocation(t):this.eof?r.getLocation(function(n,e){for(;e>=0&&nl(n.charCodeAt(e));e--);return e+1}(e,e.length-1)):r.getLocation(this.tokenStart);throw new Pl(n||\"Unexpected input\",e,a.offset,a.line,a.column,r.startLine,r.startColumn)}});return Object.assign(function(n,l){e=n,l=l||{},s.setSource(e,Tl),r.setSource(e,l.offset,l.line,l.column),t=l.filename||\"<unknown>\",a=!!l.positions,o=\"function\"==typeof l.onParseError?l.onParseError:_l,i=!1,s.parseAtrulePrelude=!(\"parseAtrulePrelude\"in l)||!!l.parseAtrulePrelude,s.parseRulePrelude=!(\"parseRulePrelude\"in l)||!!l.parseRulePrelude,s.parseValue=!(\"parseValue\"in l)||!!l.parseValue,s.parseCustomProperty=\"parseCustomProperty\"in l&&!!l.parseCustomProperty;let{context:c=\"default\",onComment:d,onToken:m}=l;if(!(c in s.context))throw new Error(\"Unknown context `\"+c+\"`\");Array.isArray(m)?s.forEachToken((n,e,t)=>{m.push({type:n,start:e,end:t})}):\"function\"==typeof m&&s.forEachToken(m.bind({filename:t,source:e,tokenCount:s.tokenCount,getTokenType:n=>s.getTokenType(n),getTokenTypeName:n=>yl[s.getTokenType(n)],getTokenStart:n=>s.getTokenStart(n),getTokenEnd:n=>s.getTokenEnd(n),getTokenValue:n=>s.source.substring(s.getTokenStart(n),s.getTokenEnd(n)),substring:(n,e)=>s.source.substring(n,e),balance:s.balance.subarray(0,s.tokenCount+1),isBlockOpenerTokenType:s.isBlockOpenerTokenType,isBlockCloserTokenType:s.isBlockCloserTokenType,getBlockTokenPairIndex:n=>s.getBlockTokenPairIndex(n),getLocation:n=>r.getLocation(n,t),getRangeLocation:(n,e)=>r.getLocationRange(n,e,t)})),\"function\"==typeof d&&s.forEachToken((n,t,a)=>{if(25===n){let n=s.getLocation(t,a),o=ml(e,a-2,a,\"*/\")?e.slice(t+2,a-2):e.slice(t+2,a);d(o,n)}});let h=s.context[c].call(s,l);return s.eof||s.error(),h},{SyntaxError:Pl,config:s.config})}var Ul=((n,e,t)=>(t=null!=n?rs(ds(n)):{},((n,e,t,a)=>{if(e&&\"object\"==typeof e||\"function\"==typeof e)for(let o of cs(e))!ms.call(n,o)&&o!==t&&ss(n,o,{get:()=>e[o],enumerable:!(a=ls(e,o))||a.enumerable});return n})(ss(t,\"default\",{value:n,enumerable:!0}),n)))(ys()),ql=new Set([\"Atrule\",\"Selector\",\"Declaration\"]);var Hl={};ps(Hl,{safe:()=>Yl,spec:()=>Jl});var Wl=(n,e)=>{if(9===n&&(n=e),\"string\"==typeof n){let e=n.charCodeAt(0);return e>127?32768:e<<8}return n},Gl=[[1,1],[1,2],[1,7],[1,8],[1,\"-\"],[1,10],[1,11],[1,12],[1,15],[1,21],[3,1],[3,2],[3,7],[3,8],[3,\"-\"],[3,10],[3,11],[3,12],[3,15],[4,1],[4,2],[4,7],[4,8],[4,\"-\"],[4,10],[4,11],[4,12],[4,15],[12,1],[12,2],[12,7],[12,8],[12,\"-\"],[12,10],[12,11],[12,12],[12,15],[\"#\",1],[\"#\",2],[\"#\",7],[\"#\",8],[\"#\",\"-\"],[\"#\",10],[\"#\",11],[\"#\",12],[\"#\",15],[\"-\",1],[\"-\",2],[\"-\",7],[\"-\",8],[\"-\",\"-\"],[\"-\",10],[\"-\",11],[\"-\",12],[\"-\",15],[10,1],[10,2],[10,7],[10,8],[10,10],[10,11],[10,12],[10,\"%\"],[10,15],[\"@\",1],[\"@\",2],[\"@\",7],[\"@\",8],[\"@\",\"-\"],[\"@\",15],[\".\",10],[\".\",11],[\".\",12],[\"+\",10],[\"+\",11],[\"+\",12],[\"/\",\"*\"]],Vl=Gl.concat([[1,4],[12,4],[4,4],[3,21],[3,5],[3,16],[11,11],[11,12],[11,2],[11,\"-\"],[22,1],[22,2],[22,11],[22,12],[22,4],[22,\"-\"]]);function Kl(n){let e=new Set(n.map(([n,e])=>Wl(n)<<16|Wl(e)));return function(n,t,a){let o=Wl(t,a),i=a.charCodeAt(0);return(45===i&&1!==t&&2!==t&&15!==t||43===i?e.has(n<<16|i<<8):e.has(n<<16|o))&&this.emit(\" \",13,!0),o}}var Jl=Kl(Gl),Yl=Kl(Vl);function Zl(n,e){if(\"function\"==typeof e){let t=null;return void n.children.forEach(n=>{null!==t&&e.call(this,t),this.node(n),t=n})}n.children.forEach(this.node,this)}function $l(n){Tl(n,(e,t,a)=>{this.token(e,n.slice(t,a))})}function Xl(n){let e=new Map;for(let[t,a]of Object.entries(n.node))\"function\"==typeof(a.generate||a)&&e.set(t,a.generate||a);return function(n,t){let a=\"\",o=0,i={node(n){if(!e.has(n.type))throw new Error(\"Unknown node type: \"+n.type);e.get(n.type).call(r,n)},tokenBefore:Yl,token(n,e){o=this.tokenBefore(o,n,e),this.emit(e,n,!1),9===n&&92===e.charCodeAt(0)&&this.emit(\"\\n\",13,!0)},emit(n){a+=n},result:()=>a};t&&(\"function\"==typeof t.decorator&&(i=t.decorator(i)),t.sourceMap&&(i=function(n){let e=new Ul.SourceMapGenerator,t={line:1,column:0},a={line:0,column:0},o={line:1,column:0},i={generated:o},r=1,s=0,l=!1,c=n.node;n.node=function(n){if(n.loc&&n.loc.start&&ql.has(n.type)){let c=n.loc.start.line,d=n.loc.start.column-1;(a.line!==c||a.column!==d)&&(a.line=c,a.column=d,t.line=r,t.column=s,l&&(l=!1,(t.line!==o.line||t.column!==o.column)&&e.addMapping(i)),l=!0,e.addMapping({source:n.loc.source,original:a,generated:t}))}c.call(this,n),l&&ql.has(n.type)&&(o.line=r,o.column=s)};let d=n.emit;n.emit=function(n,e,t){for(let e=0;e<n.length;e++)10===n.charCodeAt(e)?(r++,s=0):s++;d(n,e,t)};let m=n.result;return n.result=function(){return l&&e.addMapping(i),{css:m(),map:e}},n}(i)),t.mode in Hl&&(i.tokenBefore=Hl[t.mode]));let r={node:n=>i.node(n),children:Zl,token:(n,e)=>i.token(n,e),tokenize:$l};return i.node(n),i.result()}}var{hasOwnProperty:Ql}=Object.prototype,nc=function(){};function ec(n){return\"function\"==typeof n?n:nc}function tc(n,e){return function(t,a,o){t.type===e&&n.call(this,t,a,o)}}function ac(n,e){let t=e.structure,a=[];for(let n in t){if(!1===Ql.call(t,n))continue;let e=t[n],o={name:n,type:!1,nullable:!1};Array.isArray(e)||(e=[e]);for(let n of e)null===n?o.nullable=!0:\"string\"==typeof n?o.type=\"node\":Array.isArray(n)&&(o.type=\"list\");o.type&&a.push(o)}return a.length?{context:e.walkContext,fields:a}:null}function oc(n,e){let t=n.fields.slice(),a=n.context,o=\"string\"==typeof a;return e&&t.reverse(),function(n,i,r,s){let l;o&&(l=i[a],i[a]=n);for(let a of t){let t=n[a.name];if(!a.nullable||t)if(\"list\"===a.type){if(e?t.reduceRight(s,!1):t.reduce(s,!1))return!0}else if(r(t))return!0}o&&(i[a]=l)}}function ic({StyleSheet:n,Atrule:e,Rule:t,Block:a,DeclarationList:o}){return{Atrule:{StyleSheet:n,Atrule:e,Rule:t,Block:a},Rule:{StyleSheet:n,Atrule:e,Rule:t,Block:a},Declaration:{StyleSheet:n,Atrule:e,Rule:t,Block:a,DeclarationList:o}}}function rc(n){let e=function(n){let e={};for(let t in n.node)if(Ql.call(n.node,t)){let a=n.node[t];if(!a.structure)throw new Error(\"Missed `structure` field in `\"+t+\"` node type definition\");e[t]=ac(0,a)}return e}(n),t={},a={},o=Symbol(\"break-walk\"),i=Symbol(\"skip-node\");for(let n in e)Ql.call(e,n)&&null!==e[n]&&(t[n]=oc(e[n],!1),a[n]=oc(e[n],!0));let r=ic(t),s=ic(a),l=function(n,l){function c(n,e,t){let a=d.call(u,n,e,t);return a===o||a!==i&&!!(h.hasOwnProperty(n.type)&&h[n.type](n,u,c,p)||m.call(u,n,e,t)===o)}let d=nc,m=nc,h=t,p=(n,e,t,a)=>n||c(e,t,a),u={break:o,skip:i,root:n,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if(\"function\"==typeof l)d=l;else if(l&&(d=ec(l.enter),m=ec(l.leave),l.reverse&&(h=a),l.visit)){if(r.hasOwnProperty(l.visit))h=l.reverse?s[l.visit]:r[l.visit];else if(!e.hasOwnProperty(l.visit))throw new Error(\"Bad value `\"+l.visit+\"` for `visit` option (should be: \"+Object.keys(e).sort().join(\", \")+\")\");d=tc(d,l.visit),m=tc(m,l.visit)}if(d===nc&&m===nc)throw new Error(\"Neither `enter` nor `leave` walker handler is set or both aren't a function\");c(n)};return l.break=o,l.skip=i,l.find=function(n,e){let t=null;return l(n,function(n,a,i){if(e.call(this,n,a,i))return t=n,o}),t},l.findLast=function(n,e){let t=null;return l(n,{reverse:!0,enter(n,a,i){if(e.call(this,n,a,i))return t=n,o}}),t},l.findAll=function(n,e){let t=[];return l(n,function(n,a,o){e.call(this,n,a,o)&&t.push(n)}),t},l}function sc(n){return n}function lc(n,e,t,a){let o;switch(n.type){case\"Group\":o=function(n,e,t,a){let o=\" \"===n.combinator||a?n.combinator:\" \"+n.combinator+\" \",i=n.terms.map(n=>lc(n,e,t,a)).join(o);return n.explicit||t?(a||\",\"===i[0]?\"[\":\"[ \")+i+(a?\"]\":\" ]\"):i}(n,e,t,a)+(n.disallowEmpty?\"!\":\"\");break;case\"Multiplier\":return lc(n.term,e,t,a)+e(function(n){let{min:e,max:t,comma:a}=n;return 0===e&&0===t?a?\"#?\":\"*\":0===e&&1===t?\"?\":1===e&&0===t?a?\"#\":\"+\":1===e&&1===t?\"\":(a?\"#\":\"\")+(e===t?\"{\"+e+\"}\":\"{\"+e+\",\"+(0!==t?t:\"\")+\"}\")}(n),n);case\"Boolean\":o=\"<boolean-expr[\"+lc(n.term,e,t,a)+\"]>\";break;case\"Type\":o=\"<\"+n.name+(n.opts?e(function(n){if(\"Range\"===n.type)return\" [\"+(null===n.min?\"-∞\":n.min)+\",\"+(null===n.max?\"∞\":n.max)+\"]\";throw new Error(\"Unknown node type `\"+n.type+\"`\")}(n.opts),n.opts):\"\")+\">\";break;case\"Property\":o=\"<'\"+n.name+\"'>\";break;case\"Keyword\":o=n.name;break;case\"AtKeyword\":o=\"@\"+n.name;break;case\"Function\":o=n.name+\"(\";break;case\"String\":case\"Token\":o=n.value;break;case\"Comma\":o=\",\";break;default:throw new Error(\"Unknown node type `\"+n.type+\"`\")}return e(o,n)}function cc(n,e){let t=sc,a=!1,o=!1;return\"function\"==typeof e?t=e:e&&(a=!!e.forceBraces,o=!!e.compact,\"function\"==typeof e.decorate&&(t=e.decorate)),lc(n,t,a,o)}var dc={offset:0,line:1,column:1};function mc(n,e){let t=n&&n.loc&&n.loc[e];return t?\"line\"in t?hc(t):t:null}function hc({offset:n,line:e,column:t},a){let o={offset:n,line:e,column:t};if(a){let n=a.split(/\\n|\\r\\n?|\\f/);o.offset+=a.length,o.line+=n.length-1,o.column=1===n.length?o.column+a.length:n.pop().length+1}return o}var pc=function(n,e){let t=Il(\"SyntaxReferenceError\",n+(e?\" `\"+e+\"`\":\"\"));return t.reference=e,t},uc=function(n,e,t,a){let o=Il(\"SyntaxMatchError\",n),{css:i,mismatchOffset:r,mismatchLength:s,start:l,end:c}=function(n,e){let t,a,o=n.tokens,i=n.longestMatch,r=i<o.length&&o[i].node||null,s=r!==e?r:null,l=0,c=0,d=0,m=\"\";for(let n=0;n<o.length;n++){let e=o[n].value;n===i&&(c=e.length,l=m.length),null!==s&&o[n].node===s&&(n<=i?d++:d=0),m+=e}return i===o.length||d>1?(t=mc(s||e,\"end\")||hc(dc,m),a=hc(t)):(t=mc(s,\"start\")||hc(mc(e,\"start\")||dc,m.slice(0,l)),a=mc(s,\"end\")||hc(t,m.substr(l,c))),{css:m,mismatchOffset:l,mismatchLength:c,start:t,end:a}}(a,t);return o.rawMessage=n,o.syntax=e?cc(e):\"<generic>\",o.css=i,o.mismatchOffset=r,o.mismatchLength=s,o.message=n+\"\\n  syntax: \"+o.syntax+\"\\n   value: \"+(i||\"<empty string>\")+\"\\n  --------\"+new Array(o.mismatchOffset+1).join(\"-\")+\"^\",Object.assign(o,l),o.loc={source:t&&t.loc&&t.loc.source||\"<unknown>\",start:l,end:c},o},gc=new Map,wc=new Map,bc=function(n){if(gc.has(n))return gc.get(n);let e=n.toLowerCase(),t=gc.get(e);if(void 0===t){let n=kc(e,0),a=n?\"\":vc(e,0);t=Object.freeze({basename:e.substr(a.length),name:e,prefix:a,vendor:a,custom:n})}return gc.set(n,t),t},fc=function(n){if(wc.has(n))return wc.get(n);let e=n,t=n[0];\"/\"===t?t=\"/\"===n[1]?\"//\":\"/\":\"_\"!==t&&\"*\"!==t&&\"$\"!==t&&\"#\"!==t&&\"+\"!==t&&\"&\"!==t&&(t=\"\");let a=kc(e,t.length);if(!a&&(e=e.toLowerCase(),wc.has(e))){let t=wc.get(e);return wc.set(n,t),t}let o=a?\"\":vc(e,t.length),i=e.substr(0,t.length+o.length),r=Object.freeze({basename:e.substr(i.length),name:e.substr(t.length),hack:t,vendor:o,prefix:i,custom:a});return wc.set(n,r),r},yc=vc;function kc(n,e){return e=e||0,n.length-e>=2&&45===n.charCodeAt(e)&&45===n.charCodeAt(e+1)}function vc(n,e){if(e=e||0,n.length-e>=3&&45===n.charCodeAt(e)&&45!==n.charCodeAt(e+1)){let t=n.indexOf(\"-\",e+2);if(-1!==t)return n.substring(e,t+1)}return\"\"}var Sc=[\"initial\",\"inherit\",\"unset\",\"revert\",\"revert-layer\"],jc=45,xc=!0;function Cc(n,e){return null!==n&&9===n.type&&n.value.charCodeAt(0)===e}function Ac(n,e,t){for(;null!==n&&(13===n.type||25===n.type);)n=t(++e);return e}function Lc(n,e,t,a){if(!n)return 0;let o=n.value.charCodeAt(e);if(43===o||o===jc){if(t)return 0;e++}for(;e<n.value.length;e++)if(!Ks(n.value.charCodeAt(e)))return 0;return a+1}function zc(n,e,t){let a=!1,o=Ac(n,e,t);if(null===(n=t(o)))return e;if(10!==n.type){if(!Cc(n,43)&&!Cc(n,jc))return e;if(a=!0,o=Ac(t(++o),o,t),null===(n=t(o))||10!==n.type)return 0}if(!a){let e=n.value.charCodeAt(0);if(43!==e&&e!==jc)return 0}return Lc(n,a?0:1,a,o)}function Tc(n,e){return null!==n&&9===n.type&&n.value.charCodeAt(0)===e}function Ec(n,e,t){let a=0;for(let o=e;o<n.value.length;o++){let i=n.value.charCodeAt(o);if(45===i&&t&&0!==a)return Ec(n,e+a+1,!1),6;if(!Js(i)||++a>6)return 0}return a}function Rc(n,e,t){if(!n)return 0;for(;Tc(t(e),63);){if(++n>6)return 0;e++}return e}var Ic=[\"calc(\",\"-moz-calc(\",\"-webkit-calc(\"],Dc=new Map([[2,22],[21,22],[19,20],[23,24]]);function Mc(n,e){return e<n.length?n.charCodeAt(e):0}function Pc(n,e){return ml(n,0,n.length,e)}function Nc(n,e){for(let t=0;t<e.length;t++)if(Pc(n,e[t]))return!0;return!1}function _c(n,e){return e===n.length-2&&(92===Mc(n,e)&&Ks(Mc(n,e+1)))}function Bc(n,e,t){if(n&&\"Range\"===n.type){let a=Number(void 0!==t&&t!==e.length?e.substr(0,t):e);if(isNaN(a)||null!==n.min&&a<n.min&&\"string\"!=typeof n.min||null!==n.max&&a>n.max&&\"string\"!=typeof n.max)return!0}return!1}function Oc(n){return function(e,t,a){return null===e?0:2===e.type&&Nc(e.value,Ic)?function(n,e){let t=0,a=[],o=0;n:do{switch(n.type){case 24:case 22:case 20:if(n.type!==t)break n;if(t=a.pop(),0===a.length){o++;break n}break;case 2:case 21:case 19:case 23:a.push(t),t=Dc.get(n.type)}o++}while(n=e(o));return o}(e,t):n(e,t,a)}}function Fc(n){return function(e){return null===e||e.type!==n?0:1}}function Uc(n){return null===n||1!==n.type||45!==Mc(n.value,0)||45!==Mc(n.value,1)?0:1}function qc(n){return n&&(n=new Set(n)),function(e,t,a){if(null===e||12!==e.type)return 0;let o=wl(e.value,0);if(null!==n){let t=e.value.indexOf(\"\\\\\",o),a=-1!==t&&_c(e.value,t)?e.value.substring(o,t):e.value.substr(o);if(!1===n.has(a.toLowerCase()))return 0}return Bc(a,e.value,o)?0:1}}function Hc(n){return\"function\"!=typeof n&&(n=function(){return 0}),function(e,t,a){return null!==e&&10===e.type&&0===Number(e.value)?1:n(e,t,a)}}var Wc={\"ident-token\":Fc(1),\"function-token\":Fc(2),\"at-keyword-token\":Fc(3),\"hash-token\":Fc(4),\"string-token\":Fc(5),\"bad-string-token\":Fc(6),\"url-token\":Fc(7),\"bad-url-token\":Fc(8),\"delim-token\":Fc(9),\"number-token\":Fc(10),\"percentage-token\":Fc(11),\"dimension-token\":Fc(12),\"whitespace-token\":Fc(13),\"CDO-token\":Fc(14),\"CDC-token\":Fc(15),\"colon-token\":Fc(16),\"semicolon-token\":Fc(17),\"comma-token\":Fc(18),\"[-token\":Fc(19),\"]-token\":Fc(20),\"(-token\":Fc(21),\")-token\":Fc(22),\"{-token\":Fc(23),\"}-token\":Fc(24)},Gc={string:Fc(5),ident:Fc(1),percentage:Oc(function(n,e,t){return null===n||11!==n.type||Bc(t,n.value,n.value.length-1)?0:1}),zero:Hc(),number:Oc(function(n,e,t){if(null===n)return 0;let a=wl(n.value,0);return a!==n.value.length&&!_c(n.value,a)||Bc(t,n.value,a)?0:1}),integer:Oc(function(n,e,t){if(null===n||10!==n.type)return 0;let a=43===Mc(n.value,0)||45===Mc(n.value,0)?1:0;for(;a<n.value.length;a++)if(!Ks(Mc(n.value,a)))return 0;return Bc(t,n.value,a)?0:1}),\"custom-ident\":function(n){if(null===n||1!==n.type)return 0;let e=n.value.toLowerCase();return Nc(e,Sc)||Pc(e,\"default\")?0:1},\"dashed-ident\":Uc,\"custom-property-name\":function(n){return Uc(n)&&\"--\"!==n.value?1:0},\"hex-color\":function(n){if(null===n||4!==n.type)return 0;let e=n.value.length;if(4!==e&&5!==e&&7!==e&&9!==e)return 0;for(let t=1;t<e;t++)if(!Js(Mc(n.value,t)))return 0;return 1},\"id-selector\":function(n){return null!==n&&4===n.type&&tl(Mc(n.value,1),Mc(n.value,2),Mc(n.value,3))?1:0},\"an-plus-b\":function(n,e){let t=0;if(!n)return 0;if(10===n.type)return Lc(n,0,false,t);if(1===n.type&&n.value.charCodeAt(0)===jc){if(!dl(n.value,1,110))return 0;switch(n.value.length){case 2:return zc(e(++t),t,e);case 3:return n.value.charCodeAt(2)!==jc?0:(t=Ac(e(++t),t,e),Lc(n=e(t),0,xc,t));default:return n.value.charCodeAt(2)!==jc?0:Lc(n,3,xc,t)}}else if(1===n.type||Cc(n,43)&&1===e(t+1).type){if(1!==n.type&&(n=e(++t)),null===n||!dl(n.value,0,110))return 0;switch(n.value.length){case 1:return zc(e(++t),t,e);case 2:return n.value.charCodeAt(1)!==jc?0:(t=Ac(e(++t),t,e),Lc(n=e(t),0,xc,t));default:return n.value.charCodeAt(1)!==jc?0:Lc(n,2,xc,t)}}else if(12===n.type){let a=n.value.charCodeAt(0),o=43===a||a===jc?1:0,i=o;for(;i<n.value.length&&Ks(n.value.charCodeAt(i));i++);return i!==o&&dl(n.value,i,110)?i+1===n.value.length?zc(e(++t),t,e):n.value.charCodeAt(i+1)!==jc?0:i+2===n.value.length?(t=Ac(e(++t),t,e),Lc(n=e(t),0,xc,t)):Lc(n,i+2,xc,t):0}return 0},urange:function(n,e){let t=0;if(null===n||1!==n.type||!dl(n.value,0,117)||null===(n=e(++t)))return 0;if(Tc(n,43))return null===(n=e(++t))?0:1===n.type?Rc(Ec(n,0,!0),++t,e):Tc(n,63)?Rc(1,++t,e):0;if(10===n.type){let a=Ec(n,1,!0);return 0===a?0:null===(n=e(++t))?t:12===n.type||10===n.type?function(n,e){return n.value.charCodeAt(0)===e}(n,45)&&Ec(n,1,!1)?t+1:0:Rc(a,t,e)}return 12===n.type?Rc(Ec(n,1,!0),++t,e):0},\"declaration-value\":function(n,e){if(!n)return 0;let t=0,a=[],o=0;n:do{switch(n.type){case 6:case 8:break n;case 24:case 22:case 20:if(n.type!==t)break n;t=a.pop();break;case 17:if(0===t)break n;break;case 9:if(0===t&&\"!\"===n.value)break n;break;case 2:case 21:case 19:case 23:a.push(t),t=Dc.get(n.type)}o++}while(n=e(o));return o},\"any-value\":function(n,e){if(!n)return 0;let t=0,a=[],o=0;n:do{switch(n.type){case 6:case 8:break n;case 24:case 22:case 20:if(n.type!==t)break n;t=a.pop();break;case 2:case 21:case 19:case 23:a.push(t),t=Dc.get(n.type)}o++}while(n=e(o));return o}};function Vc(n){let{angle:e,decibel:t,frequency:a,flex:o,length:i,resolution:r,semitones:s,time:l}=n||{};return{dimension:Oc(qc(null)),angle:Oc(qc(e)),decibel:Oc(qc(t)),frequency:Oc(qc(a)),flex:Oc(qc(o)),length:Oc(Hc(qc(i))),resolution:Oc(qc(r)),semitones:Oc(qc(s)),time:Oc(qc(l))}}var Kc={};ps(Kc,{angle:()=>Yc,decibel:()=>nd,flex:()=>Qc,frequency:()=>$c,length:()=>Jc,resolution:()=>Xc,semitones:()=>ed,time:()=>Zc});var Jc=[\"cm\",\"mm\",\"q\",\"in\",\"pt\",\"pc\",\"px\",\"em\",\"rem\",\"ex\",\"rex\",\"cap\",\"rcap\",\"ch\",\"rch\",\"ic\",\"ric\",\"lh\",\"rlh\",\"vw\",\"svw\",\"lvw\",\"dvw\",\"vh\",\"svh\",\"lvh\",\"dvh\",\"vi\",\"svi\",\"lvi\",\"dvi\",\"vb\",\"svb\",\"lvb\",\"dvb\",\"vmin\",\"svmin\",\"lvmin\",\"dvmin\",\"vmax\",\"svmax\",\"lvmax\",\"dvmax\",\"cqw\",\"cqh\",\"cqi\",\"cqb\",\"cqmin\",\"cqmax\"],Yc=[\"deg\",\"grad\",\"rad\",\"turn\"],Zc=[\"s\",\"ms\"],$c=[\"hz\",\"khz\"],Xc=[\"dpi\",\"dpcm\",\"dppx\",\"x\"],Qc=[\"fr\"],nd=[\"db\"],ed=[\"st\"],td={};function ad(n,e,t){return Object.assign(Il(\"SyntaxError\",n),{input:e,offset:t,rawMessage:n,message:n+\"\\n  \"+e+\"\\n--\"+new Array((t||e.length)+1).join(\"-\")+\"^\"})}ps(td,{SyntaxError:()=>ad,generate:()=>cc,parse:()=>Od,walk:()=>qd});var od=new Uint8Array(128).map((n,e)=>/[a-zA-Z0-9\\-]/.test(String.fromCharCode(e))?1:0),id=class{constructor(n){this.str=n,this.pos=0}charCodeAt(n){return n<this.str.length?this.str.charCodeAt(n):0}charCode(){return this.charCodeAt(this.pos)}isNameCharCode(n=this.charCode()){return n<128&&1===od[n]}nextCharCode(){return this.charCodeAt(this.pos+1)}nextNonWsCode(n){return this.charCodeAt(this.findWsEnd(n))}skipWs(){this.pos=this.findWsEnd(this.pos)}findWsEnd(n){for(;n<this.str.length;n++){let e=this.str.charCodeAt(n);if(13!==e&&10!==e&&12!==e&&32!==e&&9!==e)break}return n}substringToPos(n){return this.str.substring(this.pos,this.pos=n)}eat(n){this.charCode()!==n&&this.error(\"Expect `\"+String.fromCharCode(n)+\"`\"),this.pos++}peek(){return this.pos<this.str.length?this.str.charAt(this.pos++):\"\"}error(n){throw new ad(n,this.str,this.pos)}scanSpaces(){return this.substringToPos(this.findWsEnd(this.pos))}scanWord(){let n=this.pos;for(;n<this.str.length;n++){let e=this.str.charCodeAt(n);if(e>=128||0===od[e])break}return this.pos===n&&this.error(\"Expect a keyword\"),this.substringToPos(n)}scanNumber(){let n=this.pos;for(;n<this.str.length;n++){let e=this.str.charCodeAt(n);if(e<48||e>57)break}return this.pos===n&&this.error(\"Expect a number\"),this.substringToPos(n)}scanString(){let n=this.str.indexOf(\"'\",this.pos+1);return-1===n&&(this.pos=this.str.length,this.error(\"Expect an apostrophe\")),this.substringToPos(n+1)}},rd=9,sd=10,ld=12,cd=13,dd=32,md=33,hd=35,pd=38,ud=39,gd=40,wd=41,bd=42,fd=43,yd=44,kd=45,vd=60,Sd=62,jd=63,xd=64,Cd=91,Ad=93,Ld=123,zd=124,Td=125,Ed=8734,Rd={\" \":1,\"&&\":2,\"||\":3,\"|\":4};function Id(n){let e=null,t=null;return n.eat(Ld),n.skipWs(),e=n.scanNumber(n),n.skipWs(),n.charCode()===yd?(n.pos++,n.skipWs(),n.charCode()!==Td&&(t=n.scanNumber(n),n.skipWs())):t=e,n.eat(Td),{min:Number(e),max:t?Number(t):0}}function Dd(n,e){let t=function(n){let e=null,t=!1;switch(n.charCode()){case bd:n.pos++,e={min:0,max:0};break;case fd:n.pos++,e={min:1,max:0};break;case jd:n.pos++,e={min:0,max:1};break;case hd:n.pos++,t=!0,n.charCode()===Ld?e=Id(n):n.charCode()===jd?(n.pos++,e={min:0,max:0}):e={min:1,max:0};break;case Ld:e=Id(n);break;default:return null}return{type:\"Multiplier\",comma:t,min:e.min,max:e.max,term:null}}(n);return null!==t?(t.term=e,n.charCode()===hd&&n.charCodeAt(n.pos-1)===fd?Dd(n,t):t):e}function Md(n){let e=n.peek();return\"\"===e?null:Dd(n,{type:\"Token\",value:e})}function Pd(n){let e,t=null;if(n.eat(vd),e=n.scanWord(),\"boolean-expr\"===e){n.eat(Cd);let e=_d(n,Ad);return n.eat(Ad),n.eat(Sd),Dd(n,{type:\"Boolean\",term:1===e.terms.length?e.terms[0]:e})}return n.charCode()===gd&&n.nextCharCode()===wd&&(n.pos+=2,e+=\"()\"),n.charCodeAt(n.findWsEnd(n.pos))===Cd&&(n.skipWs(),t=function(n){let e=null,t=null,a=1;return n.eat(Cd),n.charCode()===kd&&(n.peek(),a=-1),-1==a&&n.charCode()===Ed?n.peek():(e=a*Number(n.scanNumber(n)),n.isNameCharCode()&&(e+=n.scanWord())),n.skipWs(),n.eat(yd),n.skipWs(),n.charCode()===Ed?n.peek():(a=1,n.charCode()===kd&&(n.peek(),a=-1),t=a*Number(n.scanNumber(n)),n.isNameCharCode()&&(t+=n.scanWord())),n.eat(Ad),{type:\"Range\",min:e,max:t}}(n)),n.eat(Sd),Dd(n,{type:\"Type\",name:e,opts:t})}function Nd(n,e){function t(n,e){return{type:\"Group\",terms:n,combinator:e,disallowEmpty:!1,explicit:!1}}let a;for(e=Object.keys(e).sort((n,e)=>Rd[n]-Rd[e]);e.length>0;){a=e.shift();let o=0,i=0;for(;o<n.length;o++){let e=n[o];\"Combinator\"===e.type&&(e.value===a?(-1===i&&(i=o-1),n.splice(o,1),o--):(-1!==i&&o-i>1&&(n.splice(i,o-i,t(n.slice(i,o),a)),o=i+1),i=-1))}-1!==i&&e.length&&n.splice(i,o-i,t(n.slice(i,o),a))}return a}function _d(n,e){let t,a=Object.create(null),o=[],i=null,r=n.pos;for(;n.charCode()!==e&&(t=Bd(n,e));)\"Spaces\"!==t.type&&(\"Combinator\"===t.type?((null===i||\"Combinator\"===i.type)&&(n.pos=r,n.error(\"Unexpected combinator\")),a[t.value]=!0):null!==i&&\"Combinator\"!==i.type&&(a[\" \"]=!0,o.push({type:\"Combinator\",value:\" \"})),o.push(t),i=t,r=n.pos);return null!==i&&\"Combinator\"===i.type&&(n.pos-=r,n.error(\"Unexpected combinator\")),{type:\"Group\",terms:o,combinator:Nd(o,a)||\" \",disallowEmpty:!1,explicit:!1}}function Bd(n,e){let t=n.charCode();switch(t){case Ad:break;case Cd:return Dd(n,function(n,e){let t;return n.eat(Cd),t=_d(n,e),n.eat(Ad),t.explicit=!0,n.charCode()===md&&(n.pos++,t.disallowEmpty=!0),t}(n,e));case vd:return n.nextCharCode()===ud?function(n){let e;return n.eat(vd),n.eat(ud),e=n.scanWord(),n.eat(ud),n.eat(Sd),Dd(n,{type:\"Property\",name:e})}(n):Pd(n);case zd:return{type:\"Combinator\",value:n.substringToPos(n.pos+(n.nextCharCode()===zd?2:1))};case pd:return n.pos++,n.eat(pd),{type:\"Combinator\",value:\"&&\"};case yd:return n.pos++,{type:\"Comma\"};case ud:return Dd(n,{type:\"String\",value:n.scanString()});case dd:case rd:case sd:case cd:case ld:return{type:\"Spaces\",value:n.scanSpaces()};case xd:return t=n.nextCharCode(),n.isNameCharCode(t)?(n.pos++,{type:\"AtKeyword\",name:n.scanWord()}):Md(n);case bd:case fd:case jd:case hd:case md:break;case Ld:if(t=n.nextCharCode(),t<48||t>57)return Md(n);break;default:return n.isNameCharCode(t)?function(n){let e=n.scanWord();return n.charCode()===gd?(n.pos++,{type:\"Function\",name:e}):Dd(n,{type:\"Keyword\",name:e})}(n):Md(n)}}function Od(n){let e=new id(n),t=_d(e);return e.pos!==n.length&&e.error(\"Unexpected input\"),1===t.terms.length&&\"Group\"===t.terms[0].type?t.terms[0]:t}var Fd=function(){};function Ud(n){return\"function\"==typeof n?n:Fd}function qd(n,e,t){let a=Fd,o=Fd;if(\"function\"==typeof e?a=e:e&&(a=Ud(e.enter),o=Ud(e.leave)),a===Fd&&o===Fd)throw new Error(\"Neither `enter` nor `leave` walker handler is set or both aren't a function\");!function n(e){switch(a.call(t,e),e.type){case\"Group\":e.terms.forEach(n);break;case\"Multiplier\":case\"Boolean\":n(e.term);break;case\"Type\":case\"Property\":case\"Keyword\":case\"AtKeyword\":case\"Function\":case\"String\":case\"Token\":case\"Comma\":break;default:throw new Error(\"Unknown type: \"+e.type)}o.call(t,e)}(n)}var Hd={decorator(n){let e=[],t=null;return{...n,node(e){let a=t;t=e,n.node.call(this,e),t=a},emit(n,a,o){e.push({type:a,value:n,node:o?null:t})},result:()=>e}}};function Wd(n,e){return\"string\"==typeof n?function(n){let e=[];return Tl(n,(t,a,o)=>e.push({type:t,value:n.slice(a,o),node:null})),e}(n):e.generate(n,Hd)}var Gd={type:\"Match\"},Vd={type:\"Mismatch\"},Kd={type:\"DisallowEmpty\"};function Jd(n,e,t){return e===Gd&&t===Vd||n===Gd&&e===Gd&&t===Gd?n:(\"If\"===n.type&&n.else===Vd&&e===Gd&&(e=n.then,n=n.match),{type:\"If\",match:n,then:e,else:t})}function Yd(n){return n.length>2&&40===n.charCodeAt(n.length-2)&&41===n.charCodeAt(n.length-1)}function Zd(n){return\"Keyword\"===n.type||\"AtKeyword\"===n.type||\"Function\"===n.type||\"Type\"===n.type&&Yd(n.name)}function $d(n,e=\" \",t=!1){return{type:\"Group\",terms:n,combinator:e,disallowEmpty:!1,explicit:t}}function Xd(n,e,t=new Set){if(!t.has(n))switch(t.add(n),n.type){case\"If\":n.match=Xd(n.match,e,t),n.then=Xd(n.then,e,t),n.else=Xd(n.else,e,t);break;case\"Type\":return e[n.name]||n}return n}function Qd(n,e,t){switch(n){case\" \":{let n=Gd;for(let t=e.length-1;t>=0;t--){n=Jd(e[t],n,Vd)}return n}case\"|\":{let n=Vd,t=null;for(let a=e.length-1;a>=0;a--){let o=e[a];if(Zd(o)&&(null===t&&a>0&&Zd(e[a-1])&&(t=Object.create(null),n=Jd({type:\"Enum\",map:t},Gd,n)),null!==t)){let n=(Yd(o.name)?o.name.slice(0,-1):o.name).toLowerCase();if(!(n in t)){t[n]=o;continue}}t=null,n=Jd(o,Gd,n)}return n}case\"&&\":{if(e.length>5)return{type:\"MatchOnce\",terms:e,all:!0};let t=Vd;for(let a=e.length-1;a>=0;a--){let o,i=e[a];o=e.length>1?Qd(n,e.filter(function(n){return n!==i}),!1):Gd,t=Jd(i,o,t)}return t}case\"||\":{if(e.length>5)return{type:\"MatchOnce\",terms:e,all:!1};let a=t?Gd:Vd;for(let t=e.length-1;t>=0;t--){let o,i=e[t];o=e.length>1?Qd(n,e.filter(function(n){return n!==i}),!0):Gd,a=Jd(i,o,a)}return a}}}function nm(n){if(\"function\"==typeof n)return{type:\"Generic\",fn:n};switch(n.type){case\"Group\":{let e=Qd(n.combinator,n.terms.map(nm),!1);return n.disallowEmpty&&(e=Jd(e,Kd,Vd)),e}case\"Multiplier\":return function(n){let e=Gd,t=nm(n.term);if(0===n.max)t=Jd(t,Kd,Vd),e=Jd(t,null,Vd),e.then=Jd(Gd,Gd,e),n.comma&&(e.then.else=Jd({type:\"Comma\",syntax:n},e,Vd));else for(let a=n.min||1;a<=n.max;a++)n.comma&&e!==Gd&&(e=Jd({type:\"Comma\",syntax:n},e,Vd)),e=Jd(t,Jd(Gd,Gd,e),Vd);if(0===n.min)e=Jd(Gd,Gd,e);else for(let a=0;a<n.min-1;a++)n.comma&&e!==Gd&&(e=Jd({type:\"Comma\",syntax:n},e,Vd)),e=Jd(t,e,Vd);return e}(n);case\"Boolean\":{let e=nm(n.term),t=nm($d([$d([{type:\"Keyword\",name:\"not\"},{type:\"Type\",name:\"!boolean-group\"}]),$d([{type:\"Type\",name:\"!boolean-group\"},$d([{type:\"Multiplier\",comma:!1,min:0,max:0,term:$d([{type:\"Keyword\",name:\"and\"},{type:\"Type\",name:\"!boolean-group\"}])},{type:\"Multiplier\",comma:!1,min:0,max:0,term:$d([{type:\"Keyword\",name:\"or\"},{type:\"Type\",name:\"!boolean-group\"}])}],\"|\")])],\"|\")),a=nm($d([{type:\"Type\",name:\"!term\"},$d([{type:\"Token\",value:\"(\"},{type:\"Type\",name:\"!self\"},{type:\"Token\",value:\")\"}]),{type:\"Type\",name:\"general-enclosed\"}],\"|\"));return Xd(a,{\"!term\":e,\"!self\":t}),Xd(t,{\"!boolean-group\":a}),t}case\"Type\":case\"Property\":return{type:n.type,name:n.name,syntax:n};case\"Keyword\":return{type:n.type,name:n.name.toLowerCase(),syntax:n};case\"AtKeyword\":return{type:n.type,name:\"@\"+n.name.toLowerCase(),syntax:n};case\"Function\":return{type:n.type,name:n.name.toLowerCase()+\"(\",syntax:n};case\"String\":return 3===n.value.length?{type:\"Token\",value:n.value.charAt(1),syntax:n}:{type:n.type,value:n.value.substr(1,n.value.length-2).replace(/\\\\'/g,\"'\"),syntax:n};case\"Token\":return{type:n.type,value:n.value,syntax:n};case\"Comma\":return{type:n.type,syntax:n};default:throw new Error(\"Unknown node type:\",n.type)}}function em(n,e){return\"string\"==typeof n&&(n=Od(n)),{type:\"MatchGraph\",match:nm(n),syntax:e||null,source:n}}var{hasOwnProperty:tm}=Object.prototype,am=\"Match\";function om(n,e){if(n.length!==e.length)return!1;for(let t=0;t<n.length;t++){let a=e.charCodeAt(t),o=n.charCodeAt(t);if(o>=65&&o<=90&&(o|=32),o!==a)return!1}return!0}function im(n){return null===n||(18===n.type||2===n.type||21===n.type||19===n.type||23===n.type||function(n){return 9===n.type&&\"?\"!==n.value}(n))}function rm(n){return null===n||(22===n.type||20===n.type||24===n.type||9===n.type&&\"/\"===n.value)}function sm(n,e,t){let a=function(n,e,t){function a(){do{f++,b=f<n.length?n[f]:null}while(null!==b&&(13===b.type||25===b.type))}function o(e){let t=f+e;return t<n.length?n[t]:null}function i(n,e){return{nextState:n,matchStack:k,syntaxStack:m,thenStack:h,tokenIndex:f,prev:e}}function r(n){h={nextState:n,matchStack:k,syntaxStack:m,prev:h}}function s(n){p=i(n,p)}function l(){k={type:1,syntax:e.syntax,token:b,prev:k},a(),u=null,f>y&&(y=f)}function c(){m={syntax:e.syntax,opts:e.syntax.opts||null!==m&&m.opts||null,prev:m},k={type:2,syntax:e.syntax,token:k.token,prev:k}}function d(){k=2===k.type?k.prev:{type:3,syntax:m.syntax,token:k.token,prev:k},m=m.prev}let m=null,h=null,p=null,u=null,g=0,w=null,b=null,f=-1,y=0,k={type:0,syntax:null,token:null,prev:null};for(a();null===w&&++g<15e3;)switch(e.type){case\"Match\":if(null===h){if(null!==b&&(f!==n.length-1||\"\\\\0\"!==b.value&&\"\\\\9\"!==b.value)){e=Vd;break}w=am;break}if((e=h.nextState)===Kd){if(h.matchStack===k){e=Vd;break}e=Gd}for(;h.syntaxStack!==m;)d();h=h.prev;break;case\"Mismatch\":if(null!==u&&!1!==u)(null===p||f>p.tokenIndex)&&(p=u,u=!1);else if(null===p){w=\"Mismatch\";break}e=p.nextState,h=p.thenStack,m=p.syntaxStack,k=p.matchStack,f=p.tokenIndex,b=f<n.length?n[f]:null,p=p.prev;break;case\"MatchGraph\":e=e.match;break;case\"If\":e.else!==Vd&&s(e.else),e.then!==Gd&&r(e.then),e=e.match;break;case\"MatchOnce\":e={type:\"MatchOnceBuffer\",syntax:e,index:0,mask:0};break;case\"MatchOnceBuffer\":{let n=e.syntax.terms;if(e.index===n.length){if(0===e.mask||e.syntax.all){e=Vd;break}e=Gd;break}if(e.mask===(1<<n.length)-1){e=Gd;break}for(;e.index<n.length;e.index++){let t=1<<e.index;if(!(e.mask&t)){s(e),r({type:\"AddMatchOnce\",syntax:e.syntax,mask:e.mask|t}),e=n[e.index++];break}}break}case\"AddMatchOnce\":e={type:\"MatchOnceBuffer\",syntax:e.syntax,index:0,mask:e.mask};break;case\"Enum\":if(null!==b){let n=b.value.toLowerCase();if(-1!==n.indexOf(\"\\\\\")&&(n=n.replace(/\\\\[09].*$/,\"\")),tm.call(e.map,n)){e=e.map[n];break}}e=Vd;break;case\"Generic\":{let n=null!==m?m.opts:null,t=f+Math.floor(e.fn(b,o,n));if(!isNaN(t)&&t>f){for(;f<t;)l();e=Gd}else e=Vd;break}case\"Type\":case\"Property\":{let n=\"Type\"===e.type?\"types\":\"properties\",a=tm.call(t,n)?t[n][e.name]:null;if(!a||!a.match)throw new Error(\"Bad syntax reference: \"+(\"Type\"===e.type?\"<\"+e.name+\">\":\"<'\"+e.name+\"'>\"));if(!1!==u&&null!==b&&\"Type\"===e.type&&(\"custom-ident\"===e.name&&1===b.type||\"length\"===e.name&&\"0\"===b.value)){null===u&&(u=i(e,p)),e=Vd;break}c(),e=a.matchRef||a.match;break}case\"Keyword\":{let n=e.name;if(null!==b){let t=b.value;if(-1!==t.indexOf(\"\\\\\")&&(t=t.replace(/\\\\[09].*$/,\"\")),om(t,n)){l(),e=Gd;break}}e=Vd;break}case\"AtKeyword\":case\"Function\":if(null!==b&&om(b.value,e.name)){l(),e=Gd;break}e=Vd;break;case\"Token\":if(null!==b&&b.value===e.value){l(),e=Gd;break}e=Vd;break;case\"Comma\":null!==b&&18===b.type?im(k.token)?e=Vd:(l(),e=rm(b)?Vd:Gd):e=im(k.token)||rm(b)?Gd:Vd;break;case\"String\":let a=\"\",g=f;for(;g<n.length&&a.length<e.value.length;g++)a+=n[g].value;if(om(a,e.value)){for(;f<g;)l();e=Gd}else e=Vd;break;default:throw new Error(\"Unknown node type: \"+e.type)}switch(w){case null:console.warn(\"[csstree-match] BREAK after 15000 iterations\"),w=\"Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)\",k=null;break;case am:for(;null!==m;)d();break;default:k=null}return{tokens:n,reason:w,iterations:g,match:k,longestMatch:y}}(n,e,t||{});if(null===a.match)return a;let o=a.match,i=a.match={syntax:e.syntax||null,match:[]},r=[i];for(o=function(n){let e=null,t=null,a=n;for(;null!==a;)t=a.prev,a.prev=e,e=a,a=t;return e}(o).prev;null!==o;){switch(o.type){case 2:i.match.push(i={syntax:o.syntax,match:[]}),r.push(i);break;case 3:r.pop(),i=r[r.length-1];break;default:i.match.push({syntax:o.syntax||null,token:o.token.value,node:o.token.node})}o=o.prev}return a}var lm={};function cm(n){function e(n){return null!==n&&(\"Type\"===n.type||\"Property\"===n.type||\"Keyword\"===n.type)}let t=null;return null!==this.matched&&function a(o){if(Array.isArray(o.match)){for(let n=0;n<o.match.length;n++)if(a(o.match[n]))return e(o.syntax)&&t.unshift(o.syntax),!0}else if(o.node===n)return t=e(o.syntax)?[o.syntax]:[],!0;return!1}(this.matched),t}function dm(n,e){return pm(this,n,n=>\"Type\"===n.type&&n.name===e)}function mm(n,e){return pm(this,n,n=>\"Property\"===n.type&&n.name===e)}function hm(n){return pm(this,n,n=>\"Keyword\"===n.type)}function pm(n,e,t){let a=cm.call(n,e);return null!==a&&a.some(t)}function um(n){return\"node\"in n?n.node:um(n.match[0])}function gm(n){return\"node\"in n?n.node:gm(n.match[n.match.length-1])}function wm(n,e,t,a,o){let i=[];return null!==t.matched&&function t(r){if(null!==r.syntax&&r.syntax.type===a&&r.syntax.name===o){let t=um(r),a=gm(r);n.syntax.walk(e,function(n,e,o){if(n===t){let n=new Rl;do{if(n.appendData(e.data),e.data===a)break;e=e.next}while(null!==e);i.push({parent:o,nodes:n})}})}Array.isArray(r.match)&&r.match.forEach(t)}(t.matched),i}ps(lm,{getTrace:()=>cm,isKeyword:()=>hm,isProperty:()=>mm,isType:()=>dm});var{hasOwnProperty:bm}=Object.prototype;function fm(n){return\"number\"==typeof n&&isFinite(n)&&Math.floor(n)===n&&n>=0}function ym(n){return!!n&&fm(n.offset)&&fm(n.line)&&fm(n.column)}function km(n,e){return function(t,a){if(!t||t.constructor!==Object)return a(t,\"Type of node should be an Object\");for(let o in t){let i=!0;if(!1!==bm.call(t,o)){if(\"type\"===o)t.type!==n&&a(t,\"Wrong node type `\"+t.type+\"`, expected `\"+n+\"`\");else if(\"loc\"===o){if(null===t.loc)continue;if(t.loc&&t.loc.constructor===Object)if(\"string\"!=typeof t.loc.source)o+=\".source\";else if(ym(t.loc.start)){if(ym(t.loc.end))continue;o+=\".end\"}else o+=\".start\";i=!1}else if(e.hasOwnProperty(o)){i=!1;for(let n=0;!i&&n<e[o].length;n++){let a=e[o][n];switch(a){case String:i=\"string\"==typeof t[o];break;case Boolean:i=\"boolean\"==typeof t[o];break;case null:i=null===t[o];break;default:\"string\"==typeof a?i=t[o]&&t[o].type===a:Array.isArray(a)&&(i=t[o]instanceof Rl)}}}else a(t,\"Unknown field `\"+o+\"` for \"+n+\" node type\");i||a(t,\"Bad value for `\"+n+\".\"+o+\"`\")}}for(let o in e)bm.call(e,o)&&!1===bm.call(t,o)&&a(t,\"Field `\"+n+\".\"+o+\"` is missed\")}}function vm(n,e){let t=[];for(let a=0;a<n.length;a++){let o=n[a];if(o===String||o===Boolean)t.push(o.name.toLowerCase());else if(null===o)t.push(\"null\");else if(\"string\"==typeof o)t.push(o);else{if(!Array.isArray(o))throw new Error(\"Wrong value `\"+o+\"` in `\"+e+\"` structure definition\");t.push(\"List<\"+(vm(o,e)||\"any\")+\">\")}}return t.join(\" | \")}function Sm(n,e){let t=e.structure,a={type:String,loc:!0},o={type:'\"'+n+'\"'};for(let e in t){if(!1===bm.call(t,e))continue;let i=a[e]=Array.isArray(t[e])?t[e].slice():[t[e]];o[e]=vm(i,n+\".\"+e)}return{docs:o,check:km(n,a)}}function jm(n,e,t){let a={};for(let o in n)n[o].syntax&&(a[o]=t?n[o].syntax:cc(n[o].syntax,{compact:e}));return a}function xm(n,e,t){let a={};for(let[o,i]of Object.entries(n))a[o]={prelude:i.prelude&&(t?i.prelude.syntax:cc(i.prelude.syntax,{compact:e})),descriptors:i.descriptors&&jm(i.descriptors,e,t)};return a}function Cm(n,e,t){return{matched:n,iterations:t,error:e,...lm}}function Am(n,e,t,a){let o,i=Wd(t,n.syntax);return function(n){for(let e=0;e<n.length;e++)if(\"var(\"===n[e].value.toLowerCase())return!0;return!1}(i)?Cm(null,new Error(\"Matching for a tree with var() is not supported\")):(a&&(o=sm(i,n.cssWideKeywordsSyntax,n)),a&&o.match||(o=sm(i,e.match,n),o.match)?Cm(o.match,null,o.iterations):Cm(null,new uc(o.reason,e.syntax,t,o),o.iterations))}var Lm=class{constructor(n,e,t){if(this.cssWideKeywords=Sc,this.syntax=e,this.generic=!1,this.units={...Kc},this.atrules=Object.create(null),this.properties=Object.create(null),this.types=Object.create(null),this.structure=t||function(n){let e={};if(n.node)for(let t in n.node)if(bm.call(n.node,t)){let a=n.node[t];if(!a.structure)throw new Error(\"Missed `structure` field in `\"+t+\"` node type definition\");e[t]=Sm(t,a)}return e}(n),n){if(n.cssWideKeywords&&(this.cssWideKeywords=n.cssWideKeywords),n.units)for(let e of Object.keys(Kc))Array.isArray(n.units[e])&&(this.units[e]=n.units[e]);if(n.types)for(let[e,t]of Object.entries(n.types))this.addType_(e,t);if(n.generic){this.generic=!0;for(let[n,e]of Object.entries(function(n){return{...Wc,...Gc,...Vc(n)}}(this.units)))this.addType_(n,e)}if(n.atrules)for(let[e,t]of Object.entries(n.atrules))this.addAtrule_(e,t);if(n.properties)for(let[e,t]of Object.entries(n.properties))this.addProperty_(e,t)}this.cssWideKeywordsSyntax=em(this.cssWideKeywords.join(\" |  \"))}checkStructure(n){function e(n,e){a.push({node:n,message:e})}let t=this.structure,a=[];return this.syntax.walk(n,function(n){t.hasOwnProperty(n.type)?t[n.type].check(n,e):e(n,\"Unknown node type `\"+n.type+\"`\")}),!!a.length&&a}createDescriptor(n,e,t,a=null){let o={type:e,name:t},i={type:e,name:t,parent:a,serializable:\"string\"==typeof n||n&&\"string\"==typeof n.type,syntax:null,match:null,matchRef:null};return\"function\"==typeof n?i.match=em(n,o):(\"string\"==typeof n?Object.defineProperty(i,\"syntax\",{get:()=>(Object.defineProperty(i,\"syntax\",{value:Od(n)}),i.syntax)}):i.syntax=n,Object.defineProperty(i,\"match\",{get:()=>(Object.defineProperty(i,\"match\",{value:em(i.syntax,o)}),i.match)}),\"Property\"===e&&Object.defineProperty(i,\"matchRef\",{get(){let n=i.syntax,e=function(n){let e=n.terms[0];return!1===n.explicit&&1===n.terms.length&&\"Multiplier\"===e.type&&!0===e.comma}(n)?em({...n,terms:[n.terms[0].term]},o):null;return Object.defineProperty(i,\"matchRef\",{value:e}),e}})),i}addAtrule_(n,e){e&&(this.atrules[n]={type:\"Atrule\",name:n,prelude:e.prelude?this.createDescriptor(e.prelude,\"AtrulePrelude\",n):null,descriptors:e.descriptors?Object.keys(e.descriptors).reduce((t,a)=>(t[a]=this.createDescriptor(e.descriptors[a],\"AtruleDescriptor\",a,n),t),Object.create(null)):null})}addProperty_(n,e){e&&(this.properties[n]=this.createDescriptor(e,\"Property\",n))}addType_(n,e){e&&(this.types[n]=this.createDescriptor(e,\"Type\",n))}checkAtruleName(n){if(!this.getAtrule(n))return new pc(\"Unknown at-rule\",\"@\"+n)}checkAtrulePrelude(n,e){let t=this.checkAtruleName(n);if(t)return t;let a=this.getAtrule(n);return!a.prelude&&e?new SyntaxError(\"At-rule `@\"+n+\"` should not contain a prelude\"):!a.prelude||e||Am(this,a.prelude,\"\",!1).matched?void 0:new SyntaxError(\"At-rule `@\"+n+\"` should contain a prelude\")}checkAtruleDescriptorName(n,e){let t=this.checkAtruleName(n);if(t)return t;let a=this.getAtrule(n),o=bc(e);return a.descriptors?a.descriptors[o.name]||a.descriptors[o.basename]?void 0:new pc(\"Unknown at-rule descriptor\",e):new SyntaxError(\"At-rule `@\"+n+\"` has no known descriptors\")}checkPropertyName(n){if(!this.getProperty(n))return new pc(\"Unknown property\",n)}matchAtrulePrelude(n,e){let t=this.checkAtrulePrelude(n,e);if(t)return Cm(null,t);let a=this.getAtrule(n);return a.prelude?Am(this,a.prelude,e||\"\",!1):Cm(null,null)}matchAtruleDescriptor(n,e,t){let a=this.checkAtruleDescriptorName(n,e);if(a)return Cm(null,a);let o=this.getAtrule(n),i=bc(e);return Am(this,o.descriptors[i.name]||o.descriptors[i.basename],t,!1)}matchDeclaration(n){return\"Declaration\"!==n.type?Cm(null,new Error(\"Not a Declaration node\")):this.matchProperty(n.property,n.value)}matchProperty(n,e){if(fc(n).custom)return Cm(null,new Error(\"Lexer matching doesn't applicable for custom properties\"));let t=this.checkPropertyName(n);return t?Cm(null,t):Am(this,this.getProperty(n),e,!0)}matchType(n,e){let t=this.getType(n);return t?Am(this,t,e,!1):Cm(null,new pc(\"Unknown type\",n))}match(n,e){return\"string\"==typeof n||n&&n.type?((\"string\"==typeof n||!n.match)&&(n=this.createDescriptor(n,\"Type\",\"anonymous\")),Am(this,n,e,!1)):Cm(null,new pc(\"Bad syntax\"))}findValueFragments(n,e,t,a){return wm(this,e,this.matchProperty(n,e),t,a)}findDeclarationValueFragments(n,e,t){return wm(this,n.value,this.matchDeclaration(n),e,t)}findAllFragments(n,e,t){let a=[];return this.syntax.walk(n,{visit:\"Declaration\",enter:n=>{a.push.apply(a,this.findDeclarationValueFragments(n,e,t))}}),a}getAtrule(n,e=!0){let t=bc(n);return(t.vendor&&e?this.atrules[t.name]||this.atrules[t.basename]:this.atrules[t.name])||null}getAtrulePrelude(n,e=!0){let t=this.getAtrule(n,e);return t&&t.prelude||null}getAtruleDescriptor(n,e){return this.atrules.hasOwnProperty(n)&&this.atrules.declarators&&this.atrules[n].declarators[e]||null}getProperty(n,e=!0){let t=fc(n);return(t.vendor&&e?this.properties[t.name]||this.properties[t.basename]:this.properties[t.name])||null}getType(n){return hasOwnProperty.call(this.types,n)?this.types[n]:null}validate(){function n(n,e){return e?`<${n}>`:`<'${n}'>`}function e(i,r,s,l){if(s.has(r))return s.get(r);s.set(r,!1),null!==l.syntax&&qd(l.syntax,function(l){if(\"Type\"!==l.type&&\"Property\"!==l.type)return;let c=\"Type\"===l.type?i.types:i.properties,d=\"Type\"===l.type?a:o;hasOwnProperty.call(c,l.name)?e(i,l.name,d,c[l.name])&&(t.push(`${n(r,s===a)} used broken syntax definition ${n(l.name,\"Type\"===l.type)}`),s.set(r,!0)):(t.push(`${n(r,s===a)} used missed syntax definition ${n(l.name,\"Type\"===l.type)}`),s.set(r,!0))},this)}let t=[],a=new Map,o=new Map;for(let n in this.types)e(this,n,a,this.types[n]);for(let n in this.properties)e(this,n,o,this.properties[n]);let i=[...a.keys()].filter(n=>a.get(n)),r=[...o.keys()].filter(n=>o.get(n));return i.length||r.length?{errors:t,types:i,properties:r}:null}dump(n,e){return{generic:this.generic,cssWideKeywords:this.cssWideKeywords,units:this.units,types:jm(this.types,!e,n),properties:jm(this.properties,!e,n),atrules:xm(this.atrules,!e,n)}}toString(){return JSON.stringify(this.dump())}};function zm(n,e){return\"string\"==typeof e&&/^\\s*\\|/.test(e)?\"string\"==typeof n?n+e:e.replace(/^\\s*\\|\\s*/,\"\"):e||null}function Tm(n,e){let t=Object.create(null);for(let a of Object.keys(n))e.includes(a)&&(t[a]=n[a]);return t}function Em(n,e,t){let a={...n};for(let[n,o]of Object.entries(e))a[n]={...a[n],...t?Tm(o,t):o};return a}function Rm(n,e){let t={...n};for(let[a,o]of Object.entries(e))switch(a){case\"generic\":t[a]=!!o;break;case\"cssWideKeywords\":t[a]=n[a]?[...n[a],...o]:o||[];break;case\"units\":t[a]={...n[a]};for(let[n,e]of Object.entries(o))t[a][n]=Array.isArray(e)?e:[];break;case\"atrules\":t[a]={...n[a]};for(let[n,e]of Object.entries(o)){let o=t[a][n]||{},i=t[a][n]={prelude:o.prelude||null,descriptors:{...o.descriptors}};if(e){i.prelude=e.prelude?zm(i.prelude,e.prelude):i.prelude||null;for(let[n,t]of Object.entries(e.descriptors||{}))i.descriptors[n]=t?zm(i.descriptors[n],t):null;Object.keys(i.descriptors).length||(i.descriptors=null)}}break;case\"types\":case\"properties\":t[a]={...n[a]};for(let[n,e]of Object.entries(o))t[a][n]=zm(t[a][n],e);break;case\"parseContext\":t[a]={...n[a],...o};break;case\"scope\":case\"features\":t[a]=Em(n[a],o);break;case\"atrule\":case\"pseudo\":t[a]=Em(n[a],o,[\"parse\"]);break;case\"node\":t[a]=Em(n[a],o,[\"name\",\"structure\",\"parse\",\"generate\",\"walkContext\"])}return t}function Im(n){let e=Fl(n),t=rc(n),a=Xl(n),{fromPlainObject:o,toPlainObject:i}=function(n){return{fromPlainObject:e=>(n(e,{enter(n){n.children&&!(n.children instanceof Rl)&&(n.children=(new Rl).fromArray(n.children))}}),e),toPlainObject:e=>(n(e,{leave(n){n.children&&n.children instanceof Rl&&(n.children=n.children.toArray())}}),e)}}(t),r={lexer:null,createLexer:n=>new Lm(n,r,r.lexer.structure),tokenize:Tl,parse:e,generate:a,walk:t,find:t.find,findLast:t.findLast,findAll:t.findAll,fromPlainObject:o,toPlainObject:i,fork(e){let t=Rm({},n);return Im(\"function\"==typeof e?e(t):Rm(t,e))}};return r.lexer=new Lm({generic:n.generic,cssWideKeywords:n.cssWideKeywords,units:n.units,types:n.types,atrules:n.atrules,properties:n.properties,node:n.node},r),r}var Dm=n=>Im(Rm({},n)),Mm={};ps(Mm,{AnPlusB:()=>Pm,Atrule:()=>Ym,AtrulePrelude:()=>ah,AttributeSelector:()=>ch,Block:()=>Sh,Brackets:()=>Dh,CDC:()=>Bh,CDO:()=>Hh,ClassSelector:()=>Jh,Combinator:()=>np,Comment:()=>cp,Condition:()=>wp,Declaration:()=>xp,DeclarationList:()=>qp,Dimension:()=>Yp,Feature:()=>nu,FeatureFunction:()=>ru,FeatureRange:()=>hu,Function:()=>ju,GeneralEnclosed:()=>Tu,Hash:()=>Mu,IdSelector:()=>Gu,Identifier:()=>Fu,Layer:()=>Zu,LayerList:()=>tg,MediaQuery:()=>sg,MediaQueryList:()=>hg,NestingSelector:()=>bg,Nth:()=>jg,Number:()=>zg,Operator:()=>Dg,Parentheses:()=>Bg,Percentage:()=>Hg,PseudoClassSelector:()=>Jg,PseudoElementSelector:()=>nw,Ratio:()=>rw,Raw:()=>pw,Rule:()=>yw,Scope:()=>Lw,Selector:()=>Iw,SelectorList:()=>_w,String:()=>Hw,StyleSheet:()=>nb,SupportsDeclaration:()=>lb,TypeSelector:()=>pb,UnicodeRange:()=>vb,Url:()=>Db,Value:()=>Kb,WhiteSpace:()=>Xb});var Pm={};ps(Pm,{generate:()=>Jm,name:()=>Gm,parse:()=>Km,structure:()=>Vm});var Nm=43,_m=45,Bm=110,Om=!0,Fm=!1;function Um(n,e){let t=this.tokenStart+n,a=this.charCodeAt(t);for((a===Nm||a===_m)&&(e&&this.error(\"Number sign is not allowed\"),t++);t<this.tokenEnd;t++)Ks(this.charCodeAt(t))||this.error(\"Integer is expected\",t)}function qm(n){return Um.call(this,0,n)}function Hm(n,e){if(!this.cmpChar(this.tokenStart+n,e)){let t=\"\";switch(e){case Bm:t=\"N is expected\";break;case _m:t=\"HyphenMinus is expected\"}this.error(t,this.tokenStart+n)}}function Wm(){let n=0,e=0,t=this.tokenType;for(;13===t||25===t;)t=this.lookupType(++n);if(10!==t){if(!this.isDelim(Nm,n)&&!this.isDelim(_m,n))return null;e=this.isDelim(Nm,n)?Nm:_m;do{t=this.lookupType(++n)}while(13===t||25===t);10!==t&&(this.skip(n),qm.call(this,Om))}return n>0&&this.skip(n),0===e&&(t=this.charCodeAt(this.tokenStart),t!==Nm&&t!==_m&&this.error(\"Number sign is expected\")),qm.call(this,0!==e),e===_m?\"-\"+this.consume(10):this.consume(10)}var Gm=\"AnPlusB\",Vm={a:[String,null],b:[String,null]};function Km(){let n=this.tokenStart,e=null,t=null;if(10===this.tokenType)qm.call(this,Fm),t=this.consume(10);else if(1===this.tokenType&&this.cmpChar(this.tokenStart,_m))switch(e=\"-1\",Hm.call(this,1,Bm),this.tokenEnd-this.tokenStart){case 2:this.next(),t=Wm.call(this);break;case 3:Hm.call(this,2,_m),this.next(),this.skipSC(),qm.call(this,Om),t=\"-\"+this.consume(10);break;default:Hm.call(this,2,_m),Um.call(this,3,Om),this.next(),t=this.substrToCursor(n+2)}else if(1===this.tokenType||this.isDelim(Nm)&&1===this.lookupType(1)){let a=0;switch(e=\"1\",this.isDelim(Nm)&&(a=1,this.next()),Hm.call(this,0,Bm),this.tokenEnd-this.tokenStart){case 1:this.next(),t=Wm.call(this);break;case 2:Hm.call(this,1,_m),this.next(),this.skipSC(),qm.call(this,Om),t=\"-\"+this.consume(10);break;default:Hm.call(this,1,_m),Um.call(this,2,Om),this.next(),t=this.substrToCursor(n+a+1)}}else if(12===this.tokenType){let a=this.charCodeAt(this.tokenStart),o=a===Nm||a===_m,i=this.tokenStart+o;for(;i<this.tokenEnd&&Ks(this.charCodeAt(i));i++);i===this.tokenStart+o&&this.error(\"Integer is expected\",this.tokenStart+o),Hm.call(this,i-this.tokenStart,Bm),e=this.substring(n,i),i+1===this.tokenEnd?(this.next(),t=Wm.call(this)):(Hm.call(this,i-this.tokenStart+1,_m),i+2===this.tokenEnd?(this.next(),this.skipSC(),qm.call(this,Om),t=\"-\"+this.consume(10)):(Um.call(this,i-this.tokenStart+2,Om),this.next(),t=this.substrToCursor(i+1)))}else this.error();return null!==e&&e.charCodeAt(0)===Nm&&(e=e.substr(1)),null!==t&&t.charCodeAt(0)===Nm&&(t=t.substr(1)),{type:\"AnPlusB\",loc:this.getLocation(n,this.tokenStart),a:e,b:t}}function Jm(n){if(n.a){let e=(\"+1\"===n.a||\"1\"===n.a?\"n\":\"-1\"===n.a&&\"-n\")||n.a+\"n\";if(n.b){let t=\"-\"===n.b[0]||\"+\"===n.b[0]?n.b:\"+\"+n.b;this.tokenize(e+t)}else this.tokenize(e)}else this.tokenize(n.b)}var Ym={};function Zm(){return this.Raw(this.consumeUntilLeftCurlyBracketOrSemicolon,!0)}function $m(){for(let n,e=1;n=this.lookupType(e);e++){if(24===n)return!0;if(23===n||3===n)return!1}return!1}ps(Ym,{generate:()=>th,name:()=>Xm,parse:()=>eh,structure:()=>nh,walkContext:()=>Qm});var Xm=\"Atrule\",Qm=\"atrule\",nh={name:String,prelude:[\"AtrulePrelude\",\"Raw\",null],block:[\"Block\",null]};function eh(n=!1){let e,t,a=this.tokenStart,o=null,i=null;switch(this.eat(3),e=this.substrToCursor(a+1),t=e.toLowerCase(),this.skipSC(),!1===this.eof&&23!==this.tokenType&&17!==this.tokenType&&(o=this.parseAtrulePrelude?this.parseWithFallback(this.AtrulePrelude.bind(this,e,n),Zm):Zm.call(this,this.tokenIndex),this.skipSC()),this.tokenType){case 17:this.next();break;case 23:i=hasOwnProperty.call(this.atrule,t)&&\"function\"==typeof this.atrule[t].block?this.atrule[t].block.call(this,n):this.Block($m.call(this))}return{type:\"Atrule\",loc:this.getLocation(a,this.tokenStart),name:e,prelude:o,block:i}}function th(n){this.token(3,\"@\"+n.name),null!==n.prelude&&this.node(n.prelude),n.block?this.node(n.block):this.token(17,\";\")}var ah={};ps(ah,{generate:()=>lh,name:()=>oh,parse:()=>sh,structure:()=>rh,walkContext:()=>ih});var oh=\"AtrulePrelude\",ih=\"atrulePrelude\",rh={children:[[]]};function sh(n){let e=null;return null!==n&&(n=n.toLowerCase()),this.skipSC(),e=hasOwnProperty.call(this.atrule,n)&&\"function\"==typeof this.atrule[n].prelude?this.atrule[n].prelude.call(this):this.readSequence(this.scope.AtrulePrelude),this.skipSC(),!0!==this.eof&&23!==this.tokenType&&17!==this.tokenType&&this.error(\"Semicolon or block is expected\"),{type:\"AtrulePrelude\",loc:this.getLocationFromList(e),children:e}}function lh(n){this.children(n)}var ch={};ps(ch,{generate:()=>vh,name:()=>fh,parse:()=>kh,structure:()=>yh});var dh=36,mh=42,hh=61,ph=94,uh=124,gh=126;function wh(){this.eof&&this.error(\"Unexpected end of input\");let n=this.tokenStart,e=!1;return this.isDelim(mh)?(e=!0,this.next()):this.isDelim(uh)||this.eat(1),this.isDelim(uh)?this.charCodeAt(this.tokenStart+1)!==hh?(this.next(),this.eat(1)):e&&this.error(\"Identifier is expected\",this.tokenEnd):e&&this.error(\"Vertical line is expected\"),{type:\"Identifier\",loc:this.getLocation(n,this.tokenStart),name:this.substrToCursor(n)}}function bh(){let n=this.tokenStart,e=this.charCodeAt(n);return e!==hh&&e!==gh&&e!==ph&&e!==dh&&e!==mh&&e!==uh&&this.error(\"Attribute selector (=, ~=, ^=, $=, *=, |=) is expected\"),this.next(),e!==hh&&(this.isDelim(hh)||this.error(\"Equal sign is expected\"),this.next()),this.substrToCursor(n)}var fh=\"AttributeSelector\",yh={name:\"Identifier\",matcher:[String,null],value:[\"String\",\"Identifier\",null],flags:[String,null]};function kh(){let n,e=this.tokenStart,t=null,a=null,o=null;return this.eat(19),this.skipSC(),n=wh.call(this),this.skipSC(),20!==this.tokenType&&(1!==this.tokenType&&(t=bh.call(this),this.skipSC(),a=5===this.tokenType?this.String():this.Identifier(),this.skipSC()),1===this.tokenType&&(o=this.consume(1),this.skipSC())),this.eat(20),{type:\"AttributeSelector\",loc:this.getLocation(e,this.tokenStart),name:n,matcher:t,value:a,flags:o}}function vh(n){this.token(9,\"[\"),this.node(n.name),null!==n.matcher&&(this.tokenize(n.matcher),this.node(n.value)),null!==n.flags&&this.token(1,n.flags),this.token(9,\"]\")}var Sh={};ps(Sh,{generate:()=>Ih,name:()=>zh,parse:()=>Rh,structure:()=>Eh,walkContext:()=>Th});var jh=38;function xh(){return this.Raw(null,!0)}function Ch(){return this.parseWithFallback(this.Rule,xh)}function Ah(){return this.Raw(this.consumeUntilSemicolonIncluded,!0)}function Lh(){if(17===this.tokenType)return Ah.call(this,this.tokenIndex);let n=this.parseWithFallback(this.Declaration,Ah);return 17===this.tokenType&&this.next(),n}var zh=\"Block\",Th=\"block\",Eh={children:[[\"Atrule\",\"Rule\",\"Declaration\"]]};function Rh(n){let e=n?Lh:Ch,t=this.tokenStart,a=this.createList();this.eat(23);n:for(;!this.eof;)switch(this.tokenType){case 24:break n;case 13:case 25:this.next();break;case 3:a.push(this.parseWithFallback(this.Atrule.bind(this,n),xh));break;default:n&&this.isDelim(jh)?a.push(Ch.call(this)):a.push(e.call(this))}return this.eof||this.eat(24),{type:\"Block\",loc:this.getLocation(t,this.tokenStart),children:a}}function Ih(n){this.token(23,\"{\"),this.children(n,n=>{\"Declaration\"===n.type&&this.token(17,\";\")}),this.token(24,\"}\")}var Dh={};ps(Dh,{generate:()=>_h,name:()=>Mh,parse:()=>Nh,structure:()=>Ph});var Mh=\"Brackets\",Ph={children:[[]]};function Nh(n,e){let t=this.tokenStart,a=null;return this.eat(19),a=n.call(this,e),this.eof||this.eat(20),{type:\"Brackets\",loc:this.getLocation(t,this.tokenStart),children:a}}function _h(n){this.token(9,\"[\"),this.children(n),this.token(9,\"]\")}var Bh={};ps(Bh,{generate:()=>qh,name:()=>Oh,parse:()=>Uh,structure:()=>Fh});var Oh=\"CDC\",Fh=[];function Uh(){let n=this.tokenStart;return this.eat(15),{type:\"CDC\",loc:this.getLocation(n,this.tokenStart)}}function qh(){this.token(15,\"--\\x3e\")}var Hh={};ps(Hh,{generate:()=>Kh,name:()=>Wh,parse:()=>Vh,structure:()=>Gh});var Wh=\"CDO\",Gh=[];function Vh(){let n=this.tokenStart;return this.eat(14),{type:\"CDO\",loc:this.getLocation(n,this.tokenStart)}}function Kh(){this.token(14,\"\\x3c!--\")}var Jh={};ps(Jh,{generate:()=>Qh,name:()=>Zh,parse:()=>Xh,structure:()=>$h});var Yh=46,Zh=\"ClassSelector\",$h={name:String};function Xh(){return this.eatDelim(Yh),{type:\"ClassSelector\",loc:this.getLocation(this.tokenStart-1,this.tokenEnd),name:this.consume(1)}}function Qh(n){this.token(9,\".\"),this.token(1,n.name)}var np={};ps(np,{generate:()=>lp,name:()=>ip,parse:()=>sp,structure:()=>rp});var ep=43,tp=47,ap=62,op=126,ip=\"Combinator\",rp={name:String};function sp(){let n,e=this.tokenStart;switch(this.tokenType){case 13:n=\" \";break;case 9:switch(this.charCodeAt(this.tokenStart)){case ap:case ep:case op:this.next();break;case tp:this.next(),this.eatIdent(\"deep\"),this.eatDelim(tp);break;default:this.error(\"Combinator is expected\")}n=this.substrToCursor(e)}return{type:\"Combinator\",loc:this.getLocation(e,this.tokenStart),name:n}}function lp(n){this.tokenize(n.name)}var cp={};ps(cp,{generate:()=>gp,name:()=>hp,parse:()=>up,structure:()=>pp});var dp=42,mp=47,hp=\"Comment\",pp={value:String};function up(){let n=this.tokenStart,e=this.tokenEnd;return this.eat(25),e-n+2>=2&&this.charCodeAt(e-2)===dp&&this.charCodeAt(e-1)===mp&&(e-=2),{type:\"Comment\",loc:this.getLocation(n,this.tokenStart),value:this.substring(n+2,e)}}function gp(n){this.token(25,\"/*\"+n.value+\"*/\")}var wp={};ps(wp,{generate:()=>jp,name:()=>fp,parse:()=>Sp,structure:()=>yp});var bp=new Set([16,22,0]),fp=\"Condition\",yp={kind:String,children:[[\"Identifier\",\"Feature\",\"FeatureFunction\",\"FeatureRange\",\"SupportsDeclaration\"]]};function kp(n){return 1===this.lookupTypeNonSC(1)&&bp.has(this.lookupTypeNonSC(2))?this.Feature(n):this.FeatureRange(n)}var vp={media:kp,container:kp,supports(){return this.SupportsDeclaration()}};function Sp(n=\"media\"){let e=this.createList();n:for(;!this.eof;)switch(this.tokenType){case 25:case 13:this.next();continue;case 1:e.push(this.Identifier());break;case 21:{let t=this.parseWithFallback(()=>vp[n].call(this,n),()=>null);t||(t=this.parseWithFallback(()=>{this.eat(21);let e=this.Condition(n);return this.eat(22),e},()=>this.GeneralEnclosed(n))),e.push(t);break}case 2:{let t=this.parseWithFallback(()=>this.FeatureFunction(n),()=>null);t||(t=this.GeneralEnclosed(n)),e.push(t);break}default:break n}return e.isEmpty&&this.error(\"Condition is expected\"),{type:\"Condition\",loc:this.getLocationFromList(e),kind:n,children:e}}function jp(n){n.children.forEach(n=>{\"Condition\"===n.type?(this.token(21,\"(\"),this.node(n),this.token(22,\")\")):this.node(n)})}var xp={};ps(xp,{generate:()=>Op,name:()=>Pp,parse:()=>Bp,structure:()=>_p,walkContext:()=>Np});var Cp=33,Ap=35,Lp=36,zp=38,Tp=42,Ep=43,Rp=47;function Ip(){return this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!0)}function Dp(){return this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!1)}function Mp(){let n=this.tokenIndex,e=this.Value();return\"Raw\"!==e.type&&!1===this.eof&&17!==this.tokenType&&!1===this.isDelim(Cp)&&!1===this.isBalanceEdge(n)&&this.error(),e}var Pp=\"Declaration\",Np=\"declaration\",_p={important:[Boolean,String],property:String,value:[\"Value\",\"Raw\"]};function Bp(){let n,e=this.tokenStart,t=this.tokenIndex,a=Fp.call(this),o=kc(a),i=o?this.parseCustomProperty:this.parseValue,r=o?Dp:Ip,s=!1;this.skipSC(),this.eat(16);let l=this.tokenIndex;if(o||this.skipSC(),n=i?this.parseWithFallback(Mp,r):r.call(this,this.tokenIndex),o&&\"Value\"===n.type&&n.children.isEmpty)for(let e=l-this.tokenIndex;e<=0;e++)if(13===this.lookupType(e)){n.children.appendData({type:\"WhiteSpace\",loc:null,value:\" \"});break}return this.isDelim(Cp)&&(s=Up.call(this),this.skipSC()),!1===this.eof&&17!==this.tokenType&&!1===this.isBalanceEdge(t)&&this.error(),{type:\"Declaration\",loc:this.getLocation(e,this.tokenStart),important:s,property:a,value:n}}function Op(n){this.token(1,n.property),this.token(16,\":\"),this.node(n.value),n.important&&(this.token(9,\"!\"),this.token(1,!0===n.important?\"important\":n.important))}function Fp(){let n=this.tokenStart;if(9===this.tokenType)switch(this.charCodeAt(this.tokenStart)){case Tp:case Lp:case Ep:case Ap:case zp:this.next();break;case Rp:this.next(),this.isDelim(Rp)&&this.next()}return 4===this.tokenType?this.eat(4):this.eat(1),this.substrToCursor(n)}function Up(){this.eat(9),this.skipSC();let n=this.consume(1);return\"important\"===n||n}var qp={};ps(qp,{generate:()=>Jp,name:()=>Gp,parse:()=>Kp,structure:()=>Vp});var Hp=38;function Wp(){return this.Raw(this.consumeUntilSemicolonIncluded,!0)}var Gp=\"DeclarationList\",Vp={children:[[\"Declaration\",\"Atrule\",\"Rule\"]]};function Kp(){let n=this.createList();for(;!this.eof;)switch(this.tokenType){case 13:case 25:case 17:this.next();break;case 3:n.push(this.parseWithFallback(this.Atrule.bind(this,!0),Wp));break;default:this.isDelim(Hp)?n.push(this.parseWithFallback(this.Rule,Wp)):n.push(this.parseWithFallback(this.Declaration,Wp))}return{type:\"DeclarationList\",loc:this.getLocationFromList(n),children:n}}function Jp(n){this.children(n,n=>{\"Declaration\"===n.type&&this.token(17,\";\")})}var Yp={};ps(Yp,{generate:()=>Qp,name:()=>Zp,parse:()=>Xp,structure:()=>$p});var Zp=\"Dimension\",$p={value:String,unit:String};function Xp(){let n=this.tokenStart,e=this.consumeNumber(12);return{type:\"Dimension\",loc:this.getLocation(n,this.tokenStart),value:e,unit:this.substring(n+e.length,this.tokenStart)}}function Qp(n){this.token(12,n.value+n.unit)}var nu={};ps(nu,{generate:()=>iu,name:()=>tu,parse:()=>ou,structure:()=>au});var eu=47,tu=\"Feature\",au={kind:String,name:String,value:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\",null]};function ou(n){let e,t=this.tokenStart,a=null;if(this.eat(21),this.skipSC(),e=this.consume(1),this.skipSC(),22!==this.tokenType){switch(this.eat(16),this.skipSC(),this.tokenType){case 10:a=9===this.lookupNonWSType(1)?this.Ratio():this.Number();break;case 12:a=this.Dimension();break;case 1:a=this.Identifier();break;case 2:a=this.parseWithFallback(()=>{let n=this.Function(this.readSequence,this.scope.Value);return this.skipSC(),this.isDelim(eu)&&this.error(),n},()=>this.Ratio());break;default:this.error(\"Number, dimension, ratio or identifier is expected\")}this.skipSC()}return this.eof||this.eat(22),{type:\"Feature\",loc:this.getLocation(t,this.tokenStart),kind:n,name:e,value:a}}function iu(n){this.token(21,\"(\"),this.token(1,n.name),null!==n.value&&(this.token(16,\":\"),this.node(n.value)),this.token(22,\")\")}var ru={};ps(ru,{generate:()=>mu,name:()=>su,parse:()=>du,structure:()=>lu});var su=\"FeatureFunction\",lu={kind:String,feature:String,value:[\"Declaration\",\"Selector\"]};function cu(n,e){let t=(this.features[n]||{})[e];return\"function\"!=typeof t&&this.error(`Unknown feature ${e}()`),t}function du(n=\"unknown\"){let e=this.tokenStart,t=this.consumeFunctionName(),a=cu.call(this,n,t.toLowerCase());this.skipSC();let o=this.parseWithFallback(()=>{let n=this.tokenIndex,e=a.call(this);return!1===this.eof&&!1===this.isBalanceEdge(n)&&this.error(),e},()=>this.Raw(null,!1));return this.eof||this.eat(22),{type:\"FeatureFunction\",loc:this.getLocation(e,this.tokenStart),kind:n,feature:t,value:o}}function mu(n){this.token(2,n.feature+\"(\"),this.node(n.value),this.token(22,\")\")}var hu={};ps(hu,{generate:()=>Su,name:()=>bu,parse:()=>vu,structure:()=>fu});var pu=47,uu=60,gu=61,wu=62,bu=\"FeatureRange\",fu={kind:String,left:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\"],leftComparison:String,middle:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\"],rightComparison:[String,null],right:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\",null]};function yu(){switch(this.skipSC(),this.tokenType){case 10:return this.isDelim(pu,this.lookupOffsetNonSC(1))?this.Ratio():this.Number();case 12:return this.Dimension();case 1:return this.Identifier();case 2:return this.parseWithFallback(()=>{let n=this.Function(this.readSequence,this.scope.Value);return this.skipSC(),this.isDelim(pu)&&this.error(),n},()=>this.Ratio());default:this.error(\"Number, dimension, ratio or identifier is expected\")}}function ku(n){if(this.skipSC(),this.isDelim(uu)||this.isDelim(wu)){let n=this.source[this.tokenStart];return this.next(),this.isDelim(gu)?(this.next(),n+\"=\"):n}if(this.isDelim(gu))return\"=\";this.error(`Expected ${n?'\":\", ':\"\"}\"<\", \">\", \"=\" or \")\"`)}function vu(n=\"unknown\"){let e=this.tokenStart;this.skipSC(),this.eat(21);let t=yu.call(this),a=ku.call(this,\"Identifier\"===t.type),o=yu.call(this),i=null,r=null;return 22!==this.lookupNonWSType(0)&&(i=ku.call(this),r=yu.call(this)),this.skipSC(),this.eat(22),{type:\"FeatureRange\",loc:this.getLocation(e,this.tokenStart),kind:n,left:t,leftComparison:a,middle:o,rightComparison:i,right:r}}function Su(n){this.token(21,\"(\"),this.node(n.left),this.tokenize(n.leftComparison),this.node(n.middle),n.right&&(this.tokenize(n.rightComparison),this.node(n.right)),this.token(22,\")\")}var ju={};ps(ju,{generate:()=>zu,name:()=>xu,parse:()=>Lu,structure:()=>Au,walkContext:()=>Cu});var xu=\"Function\",Cu=\"function\",Au={name:String,children:[[]]};function Lu(n,e){let t,a=this.tokenStart,o=this.consumeFunctionName(),i=o.toLowerCase();return t=e.hasOwnProperty(i)?e[i].call(this,e):n.call(this,e),this.eof||this.eat(22),{type:\"Function\",loc:this.getLocation(a,this.tokenStart),name:o,children:t}}function zu(n){this.token(2,n.name+\"(\"),this.children(n),this.token(22,\")\")}var Tu={};ps(Tu,{generate:()=>Du,name:()=>Eu,parse:()=>Iu,structure:()=>Ru});var Eu=\"GeneralEnclosed\",Ru={kind:String,function:[String,null],children:[[]]};function Iu(n){let e=this.tokenStart,t=null;2===this.tokenType?t=this.consumeFunctionName():this.eat(21);let a=this.parseWithFallback(()=>{let n=this.tokenIndex,e=this.readSequence(this.scope.Value);return!1===this.eof&&!1===this.isBalanceEdge(n)&&this.error(),e},()=>this.createSingleNodeList(this.Raw(null,!1)));return this.eof||this.eat(22),{type:\"GeneralEnclosed\",loc:this.getLocation(e,this.tokenStart),kind:n,function:t,children:a}}function Du(n){n.function?this.token(2,n.function+\"(\"):this.token(21,\"(\"),this.children(n),this.token(22,\")\")}var Mu={};ps(Mu,{generate:()=>Ou,name:()=>Nu,parse:()=>Bu,structure:()=>_u,xxx:()=>Pu});var Pu=\"XXX\",Nu=\"Hash\",_u={value:String};function Bu(){let n=this.tokenStart;return this.eat(4),{type:\"Hash\",loc:this.getLocation(n,this.tokenStart),value:this.substrToCursor(n+1)}}function Ou(n){this.token(4,\"#\"+n.value)}var Fu={};ps(Fu,{generate:()=>Wu,name:()=>Uu,parse:()=>Hu,structure:()=>qu});var Uu=\"Identifier\",qu={name:String};function Hu(){return{type:\"Identifier\",loc:this.getLocation(this.tokenStart,this.tokenEnd),name:this.consume(1)}}function Wu(n){this.token(1,n.name)}var Gu={};ps(Gu,{generate:()=>Yu,name:()=>Vu,parse:()=>Ju,structure:()=>Ku});var Vu=\"IdSelector\",Ku={name:String};function Ju(){let n=this.tokenStart;return this.eat(4),{type:\"IdSelector\",loc:this.getLocation(n,this.tokenStart),name:this.substrToCursor(n+1)}}function Yu(n){this.token(9,\"#\"+n.name)}var Zu={};ps(Zu,{generate:()=>eg,name:()=>Xu,parse:()=>ng,structure:()=>Qu});var $u=46,Xu=\"Layer\",Qu={name:String};function ng(){let n=this.tokenStart,e=this.consume(1);for(;this.isDelim($u);)this.eat(9),e+=\".\"+this.consume(1);return{type:\"Layer\",loc:this.getLocation(n,this.tokenStart),name:e}}function eg(n){this.tokenize(n.name)}var tg={};ps(tg,{generate:()=>rg,name:()=>ag,parse:()=>ig,structure:()=>og});var ag=\"LayerList\",og={children:[[\"Layer\"]]};function ig(){let n=this.createList();for(this.skipSC();!this.eof&&(n.push(this.Layer()),18===this.lookupTypeNonSC(0));)this.skipSC(),this.next(),this.skipSC();return{type:\"LayerList\",loc:this.getLocationFromList(n),children:n}}function rg(n){this.children(n,()=>this.token(18,\",\"))}var sg={};ps(sg,{generate:()=>mg,name:()=>lg,parse:()=>dg,structure:()=>cg});var lg=\"MediaQuery\",cg={modifier:[String,null],mediaType:[String,null],condition:[\"Condition\",null]};function dg(){let n=this.tokenStart,e=null,t=null,a=null;if(this.skipSC(),1===this.tokenType&&21!==this.lookupTypeNonSC(1)){let n=this.consume(1),o=n.toLowerCase();switch(\"not\"===o||\"only\"===o?(this.skipSC(),e=o,t=this.consume(1)):t=n,this.lookupTypeNonSC(0)){case 1:this.skipSC(),this.eatIdent(\"and\"),a=this.Condition(\"media\");break;case 23:case 17:case 18:case 0:break;default:this.error(\"Identifier or parenthesis is expected\")}}else switch(this.tokenType){case 1:case 21:case 2:a=this.Condition(\"media\");break;case 23:case 17:case 0:break;default:this.error(\"Identifier or parenthesis is expected\")}return{type:\"MediaQuery\",loc:this.getLocation(n,this.tokenStart),modifier:e,mediaType:t,condition:a}}function mg(n){n.mediaType?(n.modifier&&this.token(1,n.modifier),this.token(1,n.mediaType),n.condition&&(this.token(1,\"and\"),this.node(n.condition))):n.condition&&this.node(n.condition)}var hg={};ps(hg,{generate:()=>wg,name:()=>pg,parse:()=>gg,structure:()=>ug});var pg=\"MediaQueryList\",ug={children:[[\"MediaQuery\"]]};function gg(){let n=this.createList();for(this.skipSC();!this.eof&&(n.push(this.MediaQuery()),18===this.tokenType);)this.next();return{type:\"MediaQueryList\",loc:this.getLocationFromList(n),children:n}}function wg(n){this.children(n,()=>this.token(18,\",\"))}var bg={};ps(bg,{generate:()=>Sg,name:()=>yg,parse:()=>vg,structure:()=>kg});var fg=38,yg=\"NestingSelector\",kg={};function vg(){let n=this.tokenStart;return this.eatDelim(fg),{type:\"NestingSelector\",loc:this.getLocation(n,this.tokenStart)}}function Sg(){this.token(9,\"&\")}var jg={};ps(jg,{generate:()=>Lg,name:()=>xg,parse:()=>Ag,structure:()=>Cg});var xg=\"Nth\",Cg={nth:[\"AnPlusB\",\"Identifier\"],selector:[\"SelectorList\",null]};function Ag(){this.skipSC();let n,e=this.tokenStart,t=e,a=null;return n=this.lookupValue(0,\"odd\")||this.lookupValue(0,\"even\")?this.Identifier():this.AnPlusB(),t=this.tokenStart,this.skipSC(),this.lookupValue(0,\"of\")&&(this.next(),a=this.SelectorList(),t=this.tokenStart),{type:\"Nth\",loc:this.getLocation(e,t),nth:n,selector:a}}function Lg(n){this.node(n.nth),null!==n.selector&&(this.token(1,\"of\"),this.node(n.selector))}var zg={};ps(zg,{generate:()=>Ig,name:()=>Tg,parse:()=>Rg,structure:()=>Eg});var Tg=\"Number\",Eg={value:String};function Rg(){return{type:\"Number\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consume(10)}}function Ig(n){this.token(10,n.value)}var Dg={};ps(Dg,{generate:()=>_g,name:()=>Mg,parse:()=>Ng,structure:()=>Pg});var Mg=\"Operator\",Pg={value:String};function Ng(){let n=this.tokenStart;return this.next(),{type:\"Operator\",loc:this.getLocation(n,this.tokenStart),value:this.substrToCursor(n)}}function _g(n){this.tokenize(n.value)}var Bg={};ps(Bg,{generate:()=>qg,name:()=>Og,parse:()=>Ug,structure:()=>Fg});var Og=\"Parentheses\",Fg={children:[[]]};function Ug(n,e){let t=this.tokenStart,a=null;return this.eat(21),a=n.call(this,e),this.eof||this.eat(22),{type:\"Parentheses\",loc:this.getLocation(t,this.tokenStart),children:a}}function qg(n){this.token(21,\"(\"),this.children(n),this.token(22,\")\")}var Hg={};ps(Hg,{generate:()=>Kg,name:()=>Wg,parse:()=>Vg,structure:()=>Gg});var Wg=\"Percentage\",Gg={value:String};function Vg(){return{type:\"Percentage\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consumeNumber(11)}}function Kg(n){this.token(11,n.value+\"%\")}var Jg={};ps(Jg,{generate:()=>Qg,name:()=>Yg,parse:()=>Xg,structure:()=>$g,walkContext:()=>Zg});var Yg=\"PseudoClassSelector\",Zg=\"function\",$g={name:String,children:[[\"Raw\"],null]};function Xg(){let n,e,t=this.tokenStart,a=null;return this.eat(16),2===this.tokenType?(n=this.consumeFunctionName(),e=n.toLowerCase(),22==this.lookupNonWSType(0)?a=this.createList():hasOwnProperty.call(this.pseudo,e)?(this.skipSC(),a=this.pseudo[e].call(this),this.skipSC()):(a=this.createList(),a.push(this.Raw(null,!1))),this.eat(22)):n=this.consume(1),{type:\"PseudoClassSelector\",loc:this.getLocation(t,this.tokenStart),name:n,children:a}}function Qg(n){this.token(16,\":\"),null===n.children?this.token(1,n.name):(this.token(2,n.name+\"(\"),this.children(n),this.token(22,\")\"))}var nw={};ps(nw,{generate:()=>iw,name:()=>ew,parse:()=>ow,structure:()=>aw,walkContext:()=>tw});var ew=\"PseudoElementSelector\",tw=\"function\",aw={name:String,children:[[\"Raw\"],null]};function ow(){let n,e,t=this.tokenStart,a=null;return this.eat(16),this.eat(16),2===this.tokenType?(n=this.consumeFunctionName(),e=n.toLowerCase(),22==this.lookupNonWSType(0)?a=this.createList():hasOwnProperty.call(this.pseudo,e)?(this.skipSC(),a=this.pseudo[e].call(this),this.skipSC()):(a=this.createList(),a.push(this.Raw(null,!1))),this.eat(22)):n=this.consume(1),{type:\"PseudoElementSelector\",loc:this.getLocation(t,this.tokenStart),name:n,children:a}}function iw(n){this.token(16,\":\"),this.token(16,\":\"),null===n.children?this.token(1,n.name):(this.token(2,n.name+\"(\"),this.children(n),this.token(22,\")\"))}var rw={};ps(rw,{generate:()=>hw,name:()=>cw,parse:()=>mw,structure:()=>dw});var sw=47;function lw(){switch(this.skipSC(),this.tokenType){case 10:return this.Number();case 2:return this.Function(this.readSequence,this.scope.Value);default:this.error(\"Number of function is expected\")}}var cw=\"Ratio\",dw={left:[\"Number\",\"Function\"],right:[\"Number\",\"Function\",null]};function mw(){let n=this.tokenStart,e=lw.call(this),t=null;return this.skipSC(),this.isDelim(sw)&&(this.eatDelim(sw),t=lw.call(this)),{type:\"Ratio\",loc:this.getLocation(n,this.tokenStart),left:e,right:t}}function hw(n){this.node(n.left),this.token(9,\"/\"),n.right?this.node(n.right):this.node(10,1)}var pw={};function uw(){return this.tokenIndex>0&&13===this.lookupType(-1)?this.tokenIndex>1?this.getTokenStart(this.tokenIndex-1):this.firstCharOffset:this.tokenStart}ps(pw,{generate:()=>fw,name:()=>gw,parse:()=>bw,structure:()=>ww});var gw=\"Raw\",ww={value:String};function bw(n,e){let t,a=this.getTokenStart(this.tokenIndex);return this.skipUntilBalanced(this.tokenIndex,n||this.consumeUntilBalanceEnd),t=e&&this.tokenStart>a?uw.call(this):this.tokenStart,{type:\"Raw\",loc:this.getLocation(a,t),value:this.substring(a,t)}}function fw(n){this.tokenize(n.value)}var yw={};function kw(){return this.Raw(this.consumeUntilLeftCurlyBracket,!0)}function vw(){let n=this.SelectorList();return\"Raw\"!==n.type&&!1===this.eof&&23!==this.tokenType&&this.error(),n}ps(yw,{generate:()=>Aw,name:()=>Sw,parse:()=>Cw,structure:()=>xw,walkContext:()=>jw});var Sw=\"Rule\",jw=\"rule\",xw={prelude:[\"SelectorList\",\"Raw\"],block:[\"Block\"]};function Cw(){let n,e,t=this.tokenIndex,a=this.tokenStart;return n=this.parseRulePrelude?this.parseWithFallback(vw,kw):kw.call(this,t),e=this.Block(!0),{type:\"Rule\",loc:this.getLocation(a,this.tokenStart),prelude:n,block:e}}function Aw(n){this.node(n.prelude),this.node(n.block)}var Lw={};ps(Lw,{generate:()=>Rw,name:()=>zw,parse:()=>Ew,structure:()=>Tw});var zw=\"Scope\",Tw={root:[\"SelectorList\",\"Raw\",null],limit:[\"SelectorList\",\"Raw\",null]};function Ew(){let n=null,e=null;this.skipSC();let t=this.tokenStart;return 21===this.tokenType&&(this.next(),this.skipSC(),n=this.parseWithFallback(this.SelectorList,()=>this.Raw(!1,!0)),this.skipSC(),this.eat(22)),1===this.lookupNonWSType(0)&&(this.skipSC(),this.eatIdent(\"to\"),this.skipSC(),this.eat(21),this.skipSC(),e=this.parseWithFallback(this.SelectorList,()=>this.Raw(!1,!0)),this.skipSC(),this.eat(22)),{type:\"Scope\",loc:this.getLocation(t,this.tokenStart),root:n,limit:e}}function Rw(n){n.root&&(this.token(21,\"(\"),this.node(n.root),this.token(22,\")\")),n.limit&&(this.token(1,\"to\"),this.token(21,\"(\"),this.node(n.limit),this.token(22,\")\"))}var Iw={};ps(Iw,{generate:()=>Nw,name:()=>Dw,parse:()=>Pw,structure:()=>Mw});var Dw=\"Selector\",Mw={children:[[\"TypeSelector\",\"IdSelector\",\"ClassSelector\",\"AttributeSelector\",\"PseudoClassSelector\",\"PseudoElementSelector\",\"Combinator\"]]};function Pw(){let n=this.readSequence(this.scope.Selector);return null===this.getFirstListNode(n)&&this.error(\"Selector is expected\"),{type:\"Selector\",loc:this.getLocationFromList(n),children:n}}function Nw(n){this.children(n)}var _w={};ps(_w,{generate:()=>qw,name:()=>Bw,parse:()=>Uw,structure:()=>Fw,walkContext:()=>Ow});var Bw=\"SelectorList\",Ow=\"selector\",Fw={children:[[\"Selector\",\"Raw\"]]};function Uw(){let n=this.createList();for(;!this.eof&&(n.push(this.Selector()),18===this.tokenType);)this.next();return{type:\"SelectorList\",loc:this.getLocationFromList(n),children:n}}function qw(n){this.children(n,()=>this.token(18,\",\"))}var Hw={};ps(Hw,{generate:()=>Qw,name:()=>Zw,parse:()=>Xw,structure:()=>$w});var Ww={};ps(Ww,{decode:()=>Jw,encode:()=>Yw});var Gw=92,Vw=34,Kw=39;function Jw(n){let e=n.length,t=n.charCodeAt(0),a=t===Vw||t===Kw?1:0,o=1===a&&e>1&&n.charCodeAt(e-1)===t?e-2:e-1,i=\"\";for(let t=a;t<=o;t++){let a=n.charCodeAt(t);if(a===Gw){if(t===o){t!==e-1&&(i=n.substr(t+1));break}if(a=n.charCodeAt(++t),el(Gw,a)){let e=t-1,a=ul(n,e);t=a-1,i+=fl(n.substring(e+1,a))}else 13===a&&10===n.charCodeAt(t+1)&&t++}else i+=n[t]}return i}function Yw(n,e){let t=e?\"'\":'\"',a=e?Kw:Vw,o=\"\",i=!1;for(let e=0;e<n.length;e++){let t=n.charCodeAt(e);0!==t?t<=31||127===t?(o+=\"\\\\\"+t.toString(16),i=!0):t===a||t===Gw?(o+=\"\\\\\"+n.charAt(e),i=!1):(i&&(Js(t)||nl(t))&&(o+=\" \"),o+=n.charAt(e),i=!1):o+=\"�\"}return t+o+t}var Zw=\"String\",$w={value:String};function Xw(){return{type:\"String\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:Jw(this.consume(5))}}function Qw(n){this.token(5,Yw(n.value))}var nb={};ps(nb,{generate:()=>sb,name:()=>ab,parse:()=>rb,structure:()=>ib,walkContext:()=>ob});var eb=33;function tb(){return this.Raw(null,!1)}var ab=\"StyleSheet\",ob=\"stylesheet\",ib={children:[[\"Comment\",\"CDO\",\"CDC\",\"Atrule\",\"Rule\",\"Raw\"]]};function rb(){let n,e=this.tokenStart,t=this.createList();for(;!this.eof;){switch(this.tokenType){case 13:this.next();continue;case 25:if(this.charCodeAt(this.tokenStart+2)!==eb){this.next();continue}n=this.Comment();break;case 14:n=this.CDO();break;case 15:n=this.CDC();break;case 3:n=this.parseWithFallback(this.Atrule,tb);break;default:n=this.parseWithFallback(this.Rule,tb)}t.push(n)}return{type:\"StyleSheet\",loc:this.getLocation(e,this.tokenStart),children:t}}function sb(n){this.children(n)}var lb={};ps(lb,{generate:()=>hb,name:()=>cb,parse:()=>mb,structure:()=>db});var cb=\"SupportsDeclaration\",db={declaration:\"Declaration\"};function mb(){let n=this.tokenStart;this.eat(21),this.skipSC();let e=this.Declaration();return this.eof||this.eat(22),{type:\"SupportsDeclaration\",loc:this.getLocation(n,this.tokenStart),declaration:e}}function hb(n){this.token(21,\"(\"),this.node(n.declaration),this.token(22,\")\")}var pb={};ps(pb,{generate:()=>kb,name:()=>bb,parse:()=>yb,structure:()=>fb});var ub=42,gb=124;function wb(){1!==this.tokenType&&!1===this.isDelim(ub)&&this.error(\"Identifier or asterisk is expected\"),this.next()}var bb=\"TypeSelector\",fb={name:String};function yb(){let n=this.tokenStart;return this.isDelim(gb)?(this.next(),wb.call(this)):(wb.call(this),this.isDelim(gb)&&(this.next(),wb.call(this))),{type:\"TypeSelector\",loc:this.getLocation(n,this.tokenStart),name:this.substrToCursor(n)}}function kb(n){this.tokenize(n.name)}var vb={};ps(vb,{generate:()=>Ib,name:()=>Tb,parse:()=>Rb,structure:()=>Eb});var Sb=43,jb=45,xb=63;function Cb(n,e){let t=0;for(let a=this.tokenStart+n;a<this.tokenEnd;a++){let o=this.charCodeAt(a);if(o===jb&&e&&0!==t)return Cb.call(this,n+t+1,!1),-1;Js(o)||this.error(e&&0!==t?\"Hyphen minus\"+(t<6?\" or hex digit\":\"\")+\" is expected\":t<6?\"Hex digit is expected\":\"Unexpected input\",a),++t>6&&this.error(\"Too many hex digits\",a)}return this.next(),t}function Ab(n){let e=0;for(;this.isDelim(xb);)++e>n&&this.error(\"Too many question marks\"),this.next()}function Lb(n){this.charCodeAt(this.tokenStart)!==n&&this.error((n===Sb?\"Plus sign\":\"Hyphen minus\")+\" is expected\")}function zb(){let n=0;switch(this.tokenType){case 10:if(n=Cb.call(this,1,!0),this.isDelim(xb)){Ab.call(this,6-n);break}if(12===this.tokenType||10===this.tokenType){Lb.call(this,jb),Cb.call(this,1,!1);break}break;case 12:n=Cb.call(this,1,!0),n>0&&Ab.call(this,6-n);break;default:if(this.eatDelim(Sb),1===this.tokenType){n=Cb.call(this,0,!0),n>0&&Ab.call(this,6-n);break}if(this.isDelim(xb)){this.next(),Ab.call(this,5);break}this.error(\"Hex digit or question mark is expected\")}}var Tb=\"UnicodeRange\",Eb={value:String};function Rb(){let n=this.tokenStart;return this.eatIdent(\"u\"),zb.call(this),{type:\"UnicodeRange\",loc:this.getLocation(n,this.tokenStart),value:this.substrToCursor(n)}}function Ib(n){this.tokenize(n.value)}var Db={};ps(Db,{generate:()=>Vb,name:()=>Hb,parse:()=>Gb,structure:()=>Wb});var Mb={};ps(Mb,{decode:()=>Ub,encode:()=>qb});var Pb=32,Nb=92,_b=34,Bb=39,Ob=40,Fb=41;function Ub(n){let e=n.length,t=4,a=n.charCodeAt(e-1)===Fb?e-2:e-1,o=\"\";for(;t<a&&nl(n.charCodeAt(t));)t++;for(;t<a&&nl(n.charCodeAt(a));)a--;for(let i=t;i<=a;i++){let t=n.charCodeAt(i);if(t===Nb){if(i===a){i!==e-1&&(o=n.substr(i+1));break}if(t=n.charCodeAt(++i),el(Nb,t)){let e=i-1,t=ul(n,e);i=t-1,o+=fl(n.substring(e+1,t))}else 13===t&&10===n.charCodeAt(i+1)&&i++}else o+=n[i]}return o}function qb(n){let e=\"\",t=!1;for(let a=0;a<n.length;a++){let o=n.charCodeAt(a);0!==o?o<=31||127===o?(e+=\"\\\\\"+o.toString(16),t=!0):o===Pb||o===Nb||o===_b||o===Bb||o===Ob||o===Fb?(e+=\"\\\\\"+n.charAt(a),t=!1):(t&&Js(o)&&(e+=\" \"),e+=n.charAt(a),t=!1):e+=\"�\"}return\"url(\"+e+\")\"}var Hb=\"Url\",Wb={value:String};function Gb(){let n,e=this.tokenStart;switch(this.tokenType){case 7:n=Ub(this.consume(7));break;case 2:this.cmpStr(this.tokenStart,this.tokenEnd,\"url(\")||this.error(\"Function name must be `url`\"),this.eat(2),this.skipSC(),n=Jw(this.consume(5)),this.skipSC(),this.eof||this.eat(22);break;default:this.error(\"Url or Function is expected\")}return{type:\"Url\",loc:this.getLocation(e,this.tokenStart),value:n}}function Vb(n){this.token(7,qb(n.value))}var Kb={};ps(Kb,{generate:()=>$b,name:()=>Jb,parse:()=>Zb,structure:()=>Yb});var Jb=\"Value\",Yb={children:[[]]};function Zb(){let n=this.tokenStart,e=this.readSequence(this.scope.Value);return{type:\"Value\",loc:this.getLocation(n,this.tokenStart),children:e}}function $b(n){this.children(n)}var Xb={};ps(Xb,{generate:()=>af,name:()=>nf,parse:()=>tf,structure:()=>ef});var Qb=Object.freeze({type:\"WhiteSpace\",loc:null,value:\" \"}),nf=\"WhiteSpace\",ef={value:String};function tf(){return this.eat(13),Qb}function af(n){this.token(13,n.value)}var of={generic:!0,cssWideKeywords:Sc,generic:!0,cssWideKeywords:[\"initial\",\"inherit\",\"unset\",\"revert\",\"revert-layer\"],units:{angle:[\"deg\",\"grad\",\"rad\",\"turn\"],decibel:[\"db\"],flex:[\"fr\"],frequency:[\"hz\",\"khz\"],length:[\"cm\",\"mm\",\"q\",\"in\",\"pt\",\"pc\",\"px\",\"em\",\"rem\",\"ex\",\"rex\",\"cap\",\"rcap\",\"ch\",\"rch\",\"ic\",\"ric\",\"lh\",\"rlh\",\"vw\",\"svw\",\"lvw\",\"dvw\",\"vh\",\"svh\",\"lvh\",\"dvh\",\"vi\",\"svi\",\"lvi\",\"dvi\",\"vb\",\"svb\",\"lvb\",\"dvb\",\"vmin\",\"svmin\",\"lvmin\",\"dvmin\",\"vmax\",\"svmax\",\"lvmax\",\"dvmax\",\"cqw\",\"cqh\",\"cqi\",\"cqb\",\"cqmin\",\"cqmax\"],resolution:[\"dpi\",\"dpcm\",\"dppx\",\"x\"],semitones:[\"st\"],time:[\"s\",\"ms\"]},types:{\"abs()\":\"abs( <calc-sum> )\",\"absolute-size\":\"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large\",\"acos()\":\"acos( <calc-sum> )\",\"alpha-value\":\"<number>|<percentage>\",\"an+b\":\"odd|even|<integer>|<n-dimension>|'+'? † n|-n|<ndashdigit-dimension>|'+'? † <ndashdigit-ident>|<dashndashdigit-ident>|<n-dimension> <signed-integer>|'+'? † n <signed-integer>|-n <signed-integer>|<ndash-dimension> <signless-integer>|'+'? † n- <signless-integer>|-n- <signless-integer>|<n-dimension> ['+'|'-'] <signless-integer>|'+'? † n ['+'|'-'] <signless-integer>|-n ['+'|'-'] <signless-integer>\",\"anchor()\":\"anchor( <anchor-name>?&&<anchor-side> , <length-percentage>? )\",\"anchor-name\":\"<dashed-ident>\",\"anchor-side\":\"inside|outside|top|left|right|bottom|start|end|self-start|self-end|<percentage>|center\",\"anchor-size\":\"width|height|block|inline|self-block|self-inline\",\"anchor-size()\":\"anchor-size( [<anchor-name>||<anchor-size>]? , <length-percentage>? )\",\"angle-percentage\":\"<angle>|<percentage>\",\"angular-color-hint\":\"<angle-percentage>|<zero>\",\"angular-color-stop\":\"<color> <color-stop-angle>?\",\"angular-color-stop-list\":\"<angular-color-stop> , [<angular-color-hint>? , <angular-color-stop>]#?\",\"animateable-feature\":\"scroll-position|contents|<custom-ident>\",\"asin()\":\"asin( <calc-sum> )\",\"atan()\":\"atan( <calc-sum> )\",\"atan2()\":\"atan2( <calc-sum> , <calc-sum> )\",attachment:\"scroll|fixed|local\",\"attr()\":\"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )\",\"attr-matcher\":\"['~'|'|'|'^'|'$'|'*']? '='\",\"attr-modifier\":\"i|s\",\"attribute-selector\":\"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'\",\"auto-repeat\":\"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )\",\"auto-track-list\":\"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?\",axis:\"block|inline|x|y\",\"baseline-position\":\"[first|last]? baseline\",\"basic-shape\":\"<inset()>|<xywh()>|<rect()>|<circle()>|<ellipse()>|<polygon()>|<path()>\",\"basic-shape-rect\":\"<inset()>|<rect()>|<xywh()>\",\"bg-clip\":\"<visual-box>|border-area|text\",\"bg-image\":\"none|<image>\",\"bg-layer\":\"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<visual-box>||<visual-box>\",\"bg-position\":\"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]\",\"bg-size\":\"[<length-percentage>|auto]{1,2}|cover|contain\",\"blend-mode\":\"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity\",\"blur()\":\"blur( <length>? )\",\"brightness()\":\"brightness( [<number>|<percentage>]? )\",\"calc()\":\"calc( <calc-sum> )\",\"calc-constant\":\"e|pi|infinity|-infinity|NaN\",\"calc-product\":\"<calc-value> ['*' <calc-value>|'/' <number>]*\",\"calc-size()\":\"calc-size( <calc-size-basis> , <calc-sum> )\",\"calc-size-basis\":\"<intrinsic-size-keyword>|<calc-size()>|any|<calc-sum>\",\"calc-sum\":\"<calc-product> [['+'|'-'] <calc-product>]*\",\"calc-value\":\"<number>|<dimension>|<percentage>|<calc-constant>|( <calc-sum> )\",\"cf-final-image\":\"<image>|<color>\",\"cf-mixing-image\":\"<percentage>?&&<image>\",\"circle()\":\"circle( <radial-size>? [at <position>]? )\",\"clamp()\":\"clamp( <calc-sum>#{3} )\",\"class-selector\":\"'.' <ident-token>\",\"clip-source\":\"<url>\",color:\"<color-base>|currentColor|<system-color>|<device-cmyk()>|<light-dark()>|<-non-standard-color>\",\"color()\":\"color( <colorspace-params> [/ [<alpha-value>|none]]? )\",\"color-base\":\"<hex-color>|<color-function>|<named-color>|<color-mix()>|transparent\",\"color-function\":\"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hwb()>|<lab()>|<lch()>|<oklab()>|<oklch()>|<color()>\",\"color-interpolation-method\":\"in [<rectangular-color-space>|<polar-color-space> <hue-interpolation-method>?|<custom-color-space>]\",\"color-mix()\":\"color-mix( <color-interpolation-method> , [<color>&&<percentage [0,100]>?]#{2} )\",\"color-stop\":\"<color-stop-length>|<color-stop-angle>\",\"color-stop-angle\":\"[<angle-percentage>|<zero>]{1,2}\",\"color-stop-length\":\"<length-percentage>{1,2}\",\"color-stop-list\":\"<linear-color-stop> , [<linear-color-hint>? , <linear-color-stop>]#?\",\"colorspace-params\":\"[<predefined-rgb-params>|<xyz-params>]\",combinator:\"'>'|'+'|'~'|['|' '|']\",\"common-lig-values\":\"[common-ligatures|no-common-ligatures]\",\"compat-auto\":\"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button\",\"complex-selector\":\"<complex-selector-unit> [<combinator>? <complex-selector-unit>]*\",\"complex-selector-list\":\"<complex-selector>#\",\"composite-style\":\"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor\",\"compositing-operator\":\"add|subtract|intersect|exclude\",\"compound-selector\":\"[<type-selector>? <subclass-selector>*]!\",\"compound-selector-list\":\"<compound-selector>#\",\"conic-gradient()\":\"conic-gradient( [<conic-gradient-syntax>] )\",\"conic-gradient-syntax\":\"[[[from [<angle>|<zero>]]? [at <position>]?]||<color-interpolation-method>]? , <angular-color-stop-list>\",\"container-condition\":\"not <query-in-parens>|<query-in-parens> [[and <query-in-parens>]*|[or <query-in-parens>]*]\",\"container-name\":\"<custom-ident>\",\"container-query\":\"not <query-in-parens>|<query-in-parens> [[and <query-in-parens>]*|[or <query-in-parens>]*]\",\"content-distribution\":\"space-between|space-around|space-evenly|stretch\",\"content-list\":\"[<string>|contents|<image>|<counter>|<quote>|<target>|<leader()>|<attr()>]+\",\"content-position\":\"center|start|end|flex-start|flex-end\",\"content-replacement\":\"<image>\",\"contextual-alt-values\":\"[contextual|no-contextual]\",\"contrast()\":\"contrast( [<number>|<percentage>]? )\",\"coord-box\":\"content-box|padding-box|border-box|fill-box|stroke-box|view-box\",\"cos()\":\"cos( <calc-sum> )\",counter:\"<counter()>|<counters()>\",\"counter()\":\"counter( <counter-name> , <counter-style>? )\",\"counter-name\":\"<custom-ident>\",\"counter-style\":\"<counter-style-name>|symbols( )\",\"counter-style-name\":\"<custom-ident>\",\"counters()\":\"counters( <counter-name> , <string> , <counter-style>? )\",\"cross-fade()\":\"cross-fade( <cf-mixing-image> , <cf-final-image>? )\",\"cubic-bezier()\":\"cubic-bezier( [<number [0,1]> , <number>]#{2} )\",\"cubic-bezier-timing-function\":\"ease|ease-in|ease-out|ease-in-out|<cubic-bezier()>\",\"custom-color-space\":\"<dashed-ident>\",\"custom-params\":\"<dashed-ident> [<number>|<percentage>|none]+\",dasharray:\"[[<length-percentage>|<number>]+]#\",\"dashndashdigit-ident\":\"<ident-token>\",\"deprecated-system-color\":\"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonHighlight|ButtonShadow|CaptionText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText\",\"discretionary-lig-values\":\"[discretionary-ligatures|no-discretionary-ligatures]\",\"display-box\":\"contents|none\",\"display-inside\":\"flow|flow-root|table|flex|grid|ruby\",\"display-internal\":\"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container\",\"display-legacy\":\"inline-block|inline-list-item|inline-table|inline-flex|inline-grid\",\"display-listitem\":\"<display-outside>?&&[flow|flow-root]?&&list-item\",\"display-outside\":\"block|inline|run-in\",\"drop-shadow()\":\"drop-shadow( [<color>?&&<length>{2,3}] )\",\"easing-function\":\"<linear-easing-function>|<cubic-bezier-easing-function>|<step-easing-function>\",\"east-asian-variant-values\":\"[jis78|jis83|jis90|jis04|simplified|traditional]\",\"east-asian-width-values\":\"[full-width|proportional-width]\",\"element()\":\"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )\",\"ellipse()\":\"ellipse( <radial-size>? [at <position>]? )\",\"env()\":\"env( <custom-ident> , <declaration-value>? )\",\"exp()\":\"exp( <calc-sum> )\",\"explicit-track-list\":\"[<line-names>? <track-size>]+ <line-names>?\",\"family-name\":\"<string>|<custom-ident>+\",\"feature-tag-value\":\"<string> [<integer>|on|off]?\",\"feature-type\":\"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation\",\"feature-value-block\":\"<feature-type> '{' <feature-value-declaration-list> '}'\",\"feature-value-block-list\":\"<feature-value-block>+\",\"feature-value-declaration\":\"<custom-ident> : <integer>+ ;\",\"feature-value-declaration-list\":\"<feature-value-declaration>\",\"feature-value-name\":\"<custom-ident>\",\"filter-function\":\"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>\",\"filter-value-list\":\"[<filter-function>|<url>]+\",\"final-bg-layer\":\"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<visual-box>||<visual-box>\",\"fit-content()\":\"fit-content( <length-percentage [0,∞]> )\",\"fixed-breadth\":\"<length-percentage>\",\"fixed-repeat\":\"repeat( [<integer [1,∞]>] , [<line-names>? <fixed-size>]+ <line-names>? )\",\"fixed-size\":\"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )\",\"font-stretch-absolute\":\"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>\",\"font-variant-css21\":\"[normal|small-caps]\",\"font-weight-absolute\":\"normal|bold|<number [1,1000]>\",\"form-control-identifier\":\"select\",\"frequency-percentage\":\"<frequency>|<percentage>\",\"generic-complete\":\"serif|sans-serif|system-ui|cursive|fantasy|math|monospace\",\"general-enclosed\":\"[<function-token> <any-value>? )]|[( <any-value>? )]\",\"generic-family\":\"<generic-script-specific>|<generic-complete>|<generic-incomplete>|<-non-standard-generic-family>\",\"generic-incomplete\":\"ui-serif|ui-sans-serif|ui-monospace|ui-rounded\",\"geometry-box\":\"<shape-box>|fill-box|stroke-box|view-box\",gradient:\"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<repeating-conic-gradient()>|<-legacy-gradient>\",\"grayscale()\":\"grayscale( [<number>|<percentage>]? )\",\"grid-line\":\"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]\",\"historical-lig-values\":\"[historical-ligatures|no-historical-ligatures]\",\"hsl()\":\"hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )|hsl( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"hsla()\":\"hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )|hsla( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",hue:\"<number>|<angle>\",\"hue-interpolation-method\":\"[shorter|longer|increasing|decreasing] hue\",\"hue-rotate()\":\"hue-rotate( [<angle>|<zero>]? )\",\"hwb()\":\"hwb( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"hypot()\":\"hypot( <calc-sum># )\",image:\"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>\",\"image()\":\"image( <image-tags>? [<image-src>? , <color>?]! )\",\"image-set()\":\"image-set( <image-set-option># )\",\"image-set-option\":\"[<image>|<string>] [<resolution>||type( <string> )]\",\"image-src\":\"<url>|<string>\",\"image-tags\":\"ltr|rtl\",\"inflexible-breadth\":\"<length-percentage>|min-content|max-content|auto\",\"inset()\":\"inset( <length-percentage>{1,4} [round <'border-radius'>]? )\",\"invert()\":\"invert( [<number>|<percentage>]? )\",\"keyframe-block\":\"<keyframe-selector># { <declaration-list> }\",\"keyframe-selector\":\"from|to|<percentage [0,100]>|<timeline-range-name> <percentage>\",\"keyframes-name\":\"<custom-ident>|<string>\",\"lab()\":\"lab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"layer()\":\"layer( <layer-name> )\",\"layer-name\":\"<ident> ['.' <ident>]*\",\"lch()\":\"lch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )\",\"leader()\":\"leader( <leader-type> )\",\"leader-type\":\"dotted|solid|space|<string>\",\"length-percentage\":\"<length>|<percentage>\",\"light-dark()\":\"light-dark( <color> , <color> )\",\"line-name-list\":\"[<line-names>|<name-repeat>]+\",\"line-names\":\"'[' <custom-ident>* ']'\",\"line-style\":\"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset\",\"line-width\":\"<length>|thin|medium|thick\",\"linear()\":\"linear( [<number>&&<percentage>{0,2}]# )\",\"linear-color-hint\":\"<length-percentage>\",\"linear-color-stop\":\"<color> <color-stop-length>?\",\"linear-easing-function\":\"linear|<linear()>\",\"linear-gradient()\":\"linear-gradient( [<linear-gradient-syntax>] )\",\"linear-gradient-syntax\":\"[[<angle>|<zero>|to <side-or-corner>]||<color-interpolation-method>]? , <color-stop-list>\",\"log()\":\"log( <calc-sum> , <calc-sum>? )\",\"mask-layer\":\"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>\",\"mask-position\":\"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?\",\"mask-reference\":\"none|<image>|<mask-source>\",\"mask-source\":\"<url>\",\"masking-mode\":\"alpha|luminance|match-source\",\"matrix()\":\"matrix( <number>#{6} )\",\"matrix3d()\":\"matrix3d( <number>#{16} )\",\"max()\":\"max( <calc-sum># )\",\"media-and\":\"<media-in-parens> [and <media-in-parens>]+\",\"media-condition\":\"<media-not>|<media-and>|<media-or>|<media-in-parens>\",\"media-condition-without-or\":\"<media-not>|<media-and>|<media-in-parens>\",\"media-feature\":\"( [<mf-plain>|<mf-boolean>|<mf-range>] )\",\"media-in-parens\":\"( <media-condition> )|<media-feature>|<general-enclosed>\",\"media-not\":\"not <media-in-parens>\",\"media-or\":\"<media-in-parens> [or <media-in-parens>]+\",\"media-query\":\"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?\",\"media-query-list\":\"<media-query>#\",\"media-type\":\"<ident>\",\"mf-boolean\":\"<mf-name>\",\"mf-name\":\"<ident>\",\"mf-plain\":\"<mf-name> : <mf-value>\",\"mf-range\":\"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>\",\"mf-value\":\"<number>|<dimension>|<ident>|<ratio>\",\"min()\":\"min( <calc-sum># )\",\"minmax()\":\"minmax( [<length-percentage>|min-content|max-content|auto] , [<length-percentage>|<flex>|min-content|max-content|auto] )\",\"mod()\":\"mod( <calc-sum> , <calc-sum> )\",\"n-dimension\":\"<dimension-token>\",\"name-repeat\":\"repeat( [<integer [1,∞]>|auto-fill] , <line-names>+ )\",\"named-color\":\"aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen\",\"namespace-prefix\":\"<ident>\",\"ndash-dimension\":\"<dimension-token>\",\"ndashdigit-dimension\":\"<dimension-token>\",\"ndashdigit-ident\":\"<ident-token>\",\"ns-prefix\":\"[<ident-token>|'*']? '|'\",\"number-percentage\":\"<number>|<percentage>\",\"numeric-figure-values\":\"[lining-nums|oldstyle-nums]\",\"numeric-fraction-values\":\"[diagonal-fractions|stacked-fractions]\",\"numeric-spacing-values\":\"[proportional-nums|tabular-nums]\",\"offset-path\":\"<ray()>|<url>|<basic-shape>\",\"oklab()\":\"oklab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"oklch()\":\"oklch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )\",\"opacity()\":\"opacity( [<number>|<percentage>]? )\",\"opacity-value\":\"<number>|<percentage>\",\"outline-line-style\":\"none|dotted|dashed|solid|double|groove|ridge|inset|outset\",\"outline-radius\":\"<length>|<percentage>\",\"overflow-position\":\"unsafe|safe\",\"page-body\":\"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>\",\"page-margin-box\":\"<page-margin-box-type> '{' <declaration-list> '}'\",\"page-margin-box-type\":\"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom\",\"page-selector\":\"<pseudo-page>+|<ident> <pseudo-page>*\",\"page-selector-list\":\"[<page-selector>#]?\",\"page-size\":\"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger\",paint:\"none|<color>|<url> [none|<color>]?|context-fill|context-stroke\",\"paint()\":\"paint( <ident> , <declaration-value>? )\",\"paint-box\":\"<visual-box>|fill-box|stroke-box\",\"palette-identifier\":\"<dashed-ident>\",\"palette-mix()\":\"palette-mix( <color-interpolation-method> , [[normal|light|dark|<palette-identifier>|<palette-mix()>]&&<percentage [0,100]>?]#{2} )\",\"path()\":\"path( <'fill-rule'>? , <string> )\",\"perspective()\":\"perspective( [<length [0,∞]>|none] )\",\"polar-color-space\":\"hsl|hwb|lch|oklch\",\"polygon()\":\"polygon( <'fill-rule'>? , [<length-percentage> <length-percentage>]# )\",position:\"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]\",\"position-area\":\"[[left|center|right|span-left|span-right|x-start|x-end|span-x-start|span-x-end|x-self-start|x-self-end|span-x-self-start|span-x-self-end|span-all]||[top|center|bottom|span-top|span-bottom|y-start|y-end|span-y-start|span-y-end|y-self-start|y-self-end|span-y-self-start|span-y-self-end|span-all]|[block-start|center|block-end|span-block-start|span-block-end|span-all]||[inline-start|center|inline-end|span-inline-start|span-inline-end|span-all]|[self-block-start|center|self-block-end|span-self-block-start|span-self-block-end|span-all]||[self-inline-start|center|self-inline-end|span-self-inline-start|span-self-inline-end|span-all]|[start|center|end|span-start|span-end|span-all]{1,2}|[self-start|center|self-end|span-self-start|span-self-end|span-all]{1,2}]\",\"pow()\":\"pow( <calc-sum> , <calc-sum> )\",\"predefined-rgb\":\"srgb|srgb-linear|display-p3|a98-rgb|prophoto-rgb|rec2020\",\"predefined-rgb-params\":\"<predefined-rgb> [<number>|<percentage>|none]{3}\",\"pseudo-class-selector\":\"':' <ident-token>|':' <function-token> <any-value> ')'\",\"pseudo-element-selector\":\"':' <pseudo-class-selector>|<legacy-pseudo-element-selector>\",\"pseudo-page\":\": [left|right|first|blank]\",\"query-in-parens\":\"( <container-condition> )|( <size-feature> )|style( <style-query> )|<general-enclosed>\",quote:\"open-quote|close-quote|no-open-quote|no-close-quote\",\"radial-extent\":\"closest-corner|closest-side|farthest-corner|farthest-side\",\"radial-gradient()\":\"radial-gradient( [<radial-gradient-syntax>] )\",\"radial-gradient-syntax\":\"[[[<radial-shape>||<radial-size>]? [at <position>]?]||<color-interpolation-method>]? , <color-stop-list>\",\"radial-shape\":\"circle|ellipse\",\"radial-size\":\"<radial-extent>|<length [0,∞]>|<length-percentage [0,∞]>{2}\",ratio:\"<number [0,∞]> [/ <number [0,∞]>]?\",\"ray()\":\"ray( <angle>&&<ray-size>?&&contain?&&[at <position>]? )\",\"ray-size\":\"closest-side|closest-corner|farthest-side|farthest-corner|sides\",\"rect()\":\"rect( [<length-percentage>|auto]{4} [round <'border-radius'>]? )\",\"rectangular-color-space\":\"srgb|srgb-linear|display-p3|a98-rgb|prophoto-rgb|rec2020|lab|oklab|xyz|xyz-d50|xyz-d65\",\"relative-selector\":\"<combinator>? <complex-selector>\",\"relative-selector-list\":\"<relative-selector>#\",\"relative-size\":\"larger|smaller\",\"rem()\":\"rem( <calc-sum> , <calc-sum> )\",\"repeat-style\":\"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}\",\"repeating-conic-gradient()\":\"repeating-conic-gradient( [<conic-gradient-syntax>] )\",\"repeating-linear-gradient()\":\"repeating-linear-gradient( [<linear-gradient-syntax>] )\",\"repeating-radial-gradient()\":\"repeating-radial-gradient( [<radial-gradient-syntax>] )\",\"reversed-counter-name\":\"reversed( <counter-name> )\",\"rgb()\":\"rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )|rgb( [<number>|<percentage>|none]{3} [/ [<alpha-value>|none]]? )\",\"rgba()\":\"rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )|rgba( [<number>|<percentage>|none]{3} [/ [<alpha-value>|none]]? )\",\"rotate()\":\"rotate( [<angle>|<zero>] )\",\"rotate3d()\":\"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )\",\"rotateX()\":\"rotateX( [<angle>|<zero>] )\",\"rotateY()\":\"rotateY( [<angle>|<zero>] )\",\"rotateZ()\":\"rotateZ( [<angle>|<zero>] )\",\"round()\":\"round( <rounding-strategy>? , <calc-sum> , <calc-sum> )\",\"rounding-strategy\":\"nearest|up|down|to-zero\",\"saturate()\":\"saturate( [<number>|<percentage>]? )\",\"scale()\":\"scale( [<number>|<percentage>]#{1,2} )\",\"scale3d()\":\"scale3d( [<number>|<percentage>]#{3} )\",\"scaleX()\":\"scaleX( [<number>|<percentage>] )\",\"scaleY()\":\"scaleY( [<number>|<percentage>] )\",\"scaleZ()\":\"scaleZ( [<number>|<percentage>] )\",\"scope-end\":\"<forgiving-selector-list>\",\"scope-start\":\"<forgiving-selector-list>\",\"scroll()\":\"scroll( [<scroller>||<axis>]? )\",scroller:\"root|nearest|self\",\"scroll-state-feature\":\"<media-query-list>\",\"scroll-state-in-parens\":\"( <scroll-state-query> )|( <scroll-state-feature> )|<general-enclosed>\",\"scroll-state-query\":\"not <scroll-state-in-parens>|<scroll-state-in-parens> [[and <scroll-state-in-parens>]*|[or <scroll-state-in-parens>]*]|<scroll-state-feature>\",\"selector-list\":\"<complex-selector-list>\",\"self-position\":\"center|start|end|self-start|self-end|flex-start|flex-end\",\"sepia()\":\"sepia( [<number>|<percentage>]? )\",shadow:\"inset?&&<length>{2,4}&&<color>?\",\"shadow-t\":\"[<length>{2,3}&&<color>?]\",shape:\"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )\",\"shape-box\":\"<visual-box>|margin-box\",\"side-or-corner\":\"[left|right]||[top|bottom]\",\"sign()\":\"sign( <calc-sum> )\",\"signed-integer\":\"<number-token>\",\"signless-integer\":\"<number-token>\",\"sin()\":\"sin( <calc-sum> )\",\"single-animation\":\"<'animation-duration'>||<easing-function>||<'animation-delay'>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]||<single-animation-timeline>\",\"single-animation-composition\":\"replace|add|accumulate\",\"single-animation-direction\":\"normal|reverse|alternate|alternate-reverse\",\"single-animation-fill-mode\":\"none|forwards|backwards|both\",\"single-animation-iteration-count\":\"infinite|<number>\",\"single-animation-play-state\":\"running|paused\",\"single-animation-timeline\":\"auto|none|<dashed-ident>|<scroll()>|<view()>\",\"single-transition\":\"[none|<single-transition-property>]||<time>||<easing-function>||<time>||<transition-behavior-value>\",\"single-transition-property\":\"all|<custom-ident>\",size:\"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}\",\"size-feature\":\"<mf-plain>|<mf-boolean>|<mf-range>\",\"skew()\":\"skew( [<angle>|<zero>] , [<angle>|<zero>]? )\",\"skewX()\":\"skewX( [<angle>|<zero>] )\",\"skewY()\":\"skewY( [<angle>|<zero>] )\",\"sqrt()\":\"sqrt( <calc-sum> )\",\"step-position\":\"jump-start|jump-end|jump-none|jump-both|start|end\",\"step-easing-function\":\"step-start|step-end|<steps()>\",\"steps()\":\"steps( <integer> , <step-position>? )\",\"style-feature\":\"<declaration>\",\"style-in-parens\":\"( <style-condition> )|( <style-feature> )|<general-enclosed>\",\"style-query\":\"<style-condition>|<style-feature>\",\"subclass-selector\":\"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>\",\"supports-condition\":\"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*\",\"supports-decl\":\"( <declaration> )\",\"supports-feature\":\"<supports-decl>|<supports-selector-fn>\",\"supports-in-parens\":\"( <supports-condition> )|<supports-feature>|<general-enclosed>\",\"supports-selector-fn\":\"selector( <complex-selector> )\",symbol:\"<string>|<image>|<custom-ident>\",\"symbols()\":\"symbols( <symbols-type>? [<string>|<image>]+ )\",\"symbols-type\":\"cyclic|numeric|alphabetic|symbolic|fixed\",\"system-color\":\"AccentColor|AccentColorText|ActiveText|ButtonBorder|ButtonFace|ButtonText|Canvas|CanvasText|Field|FieldText|GrayText|Highlight|HighlightText|LinkText|Mark|MarkText|SelectedItem|SelectedItemText|VisitedText\",\"tan()\":\"tan( <calc-sum> )\",target:\"<target-counter()>|<target-counters()>|<target-text()>\",\"target-counter()\":\"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )\",\"target-counters()\":\"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )\",\"target-text()\":\"target-text( [<string>|<url>] , [content|before|after|first-letter]? )\",\"text-edge\":\"[text|cap|ex|ideographic|ideographic-ink] [text|alphabetic|ideographic|ideographic-ink]?\",\"time-percentage\":\"<time>|<percentage>\",\"timeline-range-name\":\"cover|contain|entry|exit|entry-crossing|exit-crossing\",\"track-breadth\":\"<length-percentage>|<flex>|min-content|max-content|auto\",\"track-list\":\"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?\",\"track-repeat\":\"repeat( [<integer [1,∞]>] , [<line-names>? <track-size>]+ <line-names>? )\",\"track-size\":\"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( <length-percentage> )\",\"transform-function\":\"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>\",\"transform-list\":\"<transform-function>+\",\"transition-behavior-value\":\"normal|allow-discrete\",\"translate()\":\"translate( <length-percentage> , <length-percentage>? )\",\"translate3d()\":\"translate3d( <length-percentage> , <length-percentage> , <length> )\",\"translateX()\":\"translateX( <length-percentage> )\",\"translateY()\":\"translateY( <length-percentage> )\",\"translateZ()\":\"translateZ( <length> )\",\"try-size\":\"most-width|most-height|most-block-size|most-inline-size\",\"try-tactic\":\"flip-block||flip-inline||flip-start\",\"type-or-unit\":\"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%\",\"type-selector\":\"<wq-name>|<ns-prefix>? '*'\",\"var()\":\"var( <custom-property-name> , <declaration-value>? )\",\"view()\":\"view( [<axis>||<'view-timeline-inset'>]? )\",\"viewport-length\":\"auto|<length-percentage>\",\"visual-box\":\"content-box|padding-box|border-box\",\"wq-name\":\"<ns-prefix>? <ident-token>\",\"xywh()\":\"xywh( <length-percentage>{2} <length-percentage [0,∞]>{2} [round <'border-radius'>]? )\",xyz:\"xyz|xyz-d50|xyz-d65\",\"xyz-params\":\"<xyz-space> [<number>|<percentage>|none]{3}\",\"-legacy-gradient\":\"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>\",\"-legacy-linear-gradient\":\"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )\",\"-legacy-repeating-linear-gradient\":\"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )\",\"-legacy-linear-gradient-arguments\":\"[<angle>|<side-or-corner>]? , <color-stop-list>\",\"-legacy-radial-gradient\":\"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )\",\"-legacy-repeating-radial-gradient\":\"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )\",\"-legacy-radial-gradient-arguments\":\"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>\",\"-legacy-radial-gradient-size\":\"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover\",\"-legacy-radial-gradient-shape\":\"circle|ellipse\",\"-non-standard-font\":\"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body\",\"-non-standard-color\":\"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text\",\"-non-standard-image-rendering\":\"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast\",\"-non-standard-overflow\":\"overlay|-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable\",\"-non-standard-size\":\"intrinsic|min-intrinsic|-webkit-fill-available|-webkit-fit-content|-webkit-min-content|-webkit-max-content|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content\",\"-webkit-gradient()\":\"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )\",\"-webkit-gradient-color-stop\":\"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )\",\"-webkit-gradient-point\":\"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]\",\"-webkit-gradient-radius\":\"<length>|<percentage>\",\"-webkit-gradient-type\":\"linear|radial\",\"-webkit-mask-box-repeat\":\"repeat|stretch|round\",\"-ms-filter-function-list\":\"<-ms-filter-function>+\",\"-ms-filter-function\":\"<-ms-filter-function-progid>|<-ms-filter-function-legacy>\",\"-ms-filter-function-progid\":\"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]\",\"-ms-filter-function-legacy\":\"<ident-token>|<function-token> <any-value>? )\",age:\"child|young|old\",\"attr-name\":\"<wq-name>\",\"attr-fallback\":\"<any-value>\",bottom:\"<length>|auto\",\"cubic-bezier-easing-function\":\"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )\",\"generic-voice\":\"[<age>? <gender> <integer>?]\",gender:\"male|female|neutral\",\"generic-script-specific\":\"generic( kai )|generic( fangsong )|generic( nastaliq )\",\"-non-standard-generic-family\":\"-apple-system|BlinkMacSystemFont\",\"intrinsic-size-keyword\":\"min-content|max-content|fit-content\",left:\"<length>|auto\",\"device-cmyk()\":\"<legacy-device-cmyk-syntax>|<modern-device-cmyk-syntax>\",\"legacy-device-cmyk-syntax\":\"device-cmyk( <number>#{4} )\",\"modern-device-cmyk-syntax\":\"device-cmyk( <cmyk-component>{4} [/ [<alpha-value>|none]]? )\",\"cmyk-component\":\"<number>|<percentage>|none\",\"color-space\":\"<rectangular-color-space>|<polar-color-space>|<custom-color-space>\",right:\"<length>|auto\",\"forgiving-selector-list\":\"<complex-real-selector-list>\",\"forgiving-relative-selector-list\":\"<relative-real-selector-list>\",\"complex-real-selector-list\":\"<complex-real-selector>#\",\"simple-selector-list\":\"<simple-selector>#\",\"relative-real-selector-list\":\"<relative-real-selector>#\",\"complex-selector-unit\":\"[<compound-selector>? <pseudo-compound-selector>*]!\",\"complex-real-selector\":\"<compound-selector> [<combinator>? <compound-selector>]*\",\"relative-real-selector\":\"<combinator>? <complex-real-selector>\",\"pseudo-compound-selector\":\"<pseudo-element-selector> <pseudo-class-selector>*\",\"simple-selector\":\"<type-selector>|<subclass-selector>\",\"legacy-pseudo-element-selector\":\"':' [before|after|first-line|first-letter]\",\"svg-length\":\"<percentage>|<length>|<number>\",\"svg-writing-mode\":\"lr-tb|rl-tb|tb-rl|lr|rl|tb\",top:\"<length>|auto\",x:\"<number>\",y:\"<number>\",declaration:\"<ident-token> : <declaration-value>? ['!' important]?\",\"declaration-list\":\"[<declaration>? ';']* <declaration>?\",url:\"url( <string> <url-modifier>* )|<url-token>\",\"url-modifier\":\"<ident>|<function-token> <any-value> )\",\"number-zero-one\":\"<number [0,1]>\",\"number-one-or-greater\":\"<number [1,∞]>\",\"xyz-space\":\"xyz|xyz-d50|xyz-d65\",\"style-condition\":\"not <style-in-parens>|<style-in-parens> [[and <style-in-parens>]*|[or <style-in-parens>]*]\",\"-non-standard-display\":\"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box\",\"inset-area\":\"[[left|center|right|span-left|span-right|x-start|x-end|span-x-start|span-x-end|x-self-start|x-self-end|span-x-self-start|span-x-self-end|span-all]||[top|center|bottom|span-top|span-bottom|y-start|y-end|span-y-start|span-y-end|y-self-start|y-self-end|span-y-self-start|span-y-self-end|span-all]|[block-start|center|block-end|span-block-start|span-block-end|span-all]||[inline-start|center|inline-end|span-inline-start|span-inline-end|span-all]|[self-block-start|self-block-end|span-self-block-start|span-self-block-end|span-all]||[self-inline-start|self-inline-end|span-self-inline-start|span-self-inline-end|span-all]|[start|center|end|span-start|span-end|span-all]{1,2}|[self-start|center|self-end|span-self-start|span-self-end|span-all]{1,2}]\",\"font-variant-css2\":\"normal|small-caps\",\"font-width-css3\":\"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded\",\"system-family-name\":\"caption|icon|menu|message-box|small-caption|status-bar\"},properties:{\"--*\":\"<declaration-value>\",\"-ms-accelerator\":\"false|true\",\"-ms-block-progression\":\"tb|rl|bt|lr\",\"-ms-content-zoom-chaining\":\"none|chained\",\"-ms-content-zoom-limit\":\"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>\",\"-ms-content-zoom-limit-max\":\"<percentage>\",\"-ms-content-zoom-limit-min\":\"<percentage>\",\"-ms-content-zoom-snap\":\"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>\",\"-ms-content-zoom-snap-points\":\"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )\",\"-ms-content-zoom-snap-type\":\"none|proximity|mandatory\",\"-ms-content-zooming\":\"none|zoom\",\"-ms-filter\":\"<string>\",\"-ms-flow-from\":\"[none|<custom-ident>]#\",\"-ms-flow-into\":\"[none|<custom-ident>]#\",\"-ms-grid-columns\":\"none|<track-list>|<auto-track-list>\",\"-ms-grid-rows\":\"none|<track-list>|<auto-track-list>\",\"-ms-high-contrast-adjust\":\"auto|none\",\"-ms-hyphenate-limit-chars\":\"auto|<integer>{1,3}\",\"-ms-hyphenate-limit-lines\":\"no-limit|<integer>\",\"-ms-hyphenate-limit-zone\":\"<percentage>|<length>\",\"-ms-ime-align\":\"auto|after\",\"-ms-overflow-style\":\"auto|none|scrollbar|-ms-autohiding-scrollbar\",\"-ms-scroll-chaining\":\"chained|none\",\"-ms-scroll-limit\":\"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>\",\"-ms-scroll-limit-x-max\":\"auto|<length>\",\"-ms-scroll-limit-x-min\":\"<length>\",\"-ms-scroll-limit-y-max\":\"auto|<length>\",\"-ms-scroll-limit-y-min\":\"<length>\",\"-ms-scroll-rails\":\"none|railed\",\"-ms-scroll-snap-points-x\":\"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )\",\"-ms-scroll-snap-points-y\":\"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )\",\"-ms-scroll-snap-type\":\"none|proximity|mandatory\",\"-ms-scroll-snap-x\":\"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>\",\"-ms-scroll-snap-y\":\"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>\",\"-ms-scroll-translation\":\"none|vertical-to-horizontal\",\"-ms-scrollbar-3dlight-color\":\"<color>\",\"-ms-scrollbar-arrow-color\":\"<color>\",\"-ms-scrollbar-base-color\":\"<color>\",\"-ms-scrollbar-darkshadow-color\":\"<color>\",\"-ms-scrollbar-face-color\":\"<color>\",\"-ms-scrollbar-highlight-color\":\"<color>\",\"-ms-scrollbar-shadow-color\":\"<color>\",\"-ms-scrollbar-track-color\":\"<color>\",\"-ms-text-autospace\":\"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space\",\"-ms-touch-select\":\"grippers|none\",\"-ms-user-select\":\"none|element|text\",\"-ms-wrap-flow\":\"auto|both|start|end|maximum|clear\",\"-ms-wrap-margin\":\"<length>\",\"-ms-wrap-through\":\"wrap|none\",\"-moz-appearance\":\"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized\",\"-moz-binding\":\"<url>|none\",\"-moz-border-bottom-colors\":\"<color>+|none\",\"-moz-border-left-colors\":\"<color>+|none\",\"-moz-border-right-colors\":\"<color>+|none\",\"-moz-border-top-colors\":\"<color>+|none\",\"-moz-context-properties\":\"none|[fill|fill-opacity|stroke|stroke-opacity]#\",\"-moz-float-edge\":\"border-box|content-box|margin-box|padding-box\",\"-moz-force-broken-image-icon\":\"0|1\",\"-moz-image-region\":\"<shape>|auto\",\"-moz-orient\":\"inline|block|horizontal|vertical\",\"-moz-outline-radius\":\"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?\",\"-moz-outline-radius-bottomleft\":\"<outline-radius>\",\"-moz-outline-radius-bottomright\":\"<outline-radius>\",\"-moz-outline-radius-topleft\":\"<outline-radius>\",\"-moz-outline-radius-topright\":\"<outline-radius>\",\"-moz-stack-sizing\":\"ignore|stretch-to-fit\",\"-moz-text-blink\":\"none|blink\",\"-moz-user-focus\":\"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none\",\"-moz-user-input\":\"auto|none|enabled|disabled\",\"-moz-user-modify\":\"read-only|read-write|write-only\",\"-moz-window-dragging\":\"drag|no-drag\",\"-moz-window-shadow\":\"default|menu|tooltip|sheet|none\",\"-webkit-appearance\":\"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button\",\"-webkit-border-before\":\"<'border-width'>||<'border-style'>||<color>\",\"-webkit-border-before-color\":\"<color>\",\"-webkit-border-before-style\":\"<'border-style'>\",\"-webkit-border-before-width\":\"<'border-width'>\",\"-webkit-box-reflect\":\"[above|below|right|left]? <length>? <image>?\",\"-webkit-line-clamp\":\"none|<integer>\",\"-webkit-mask\":\"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<visual-box>|border|padding|content|text]||[<visual-box>|border|padding|content]]#\",\"-webkit-mask-attachment\":\"<attachment>#\",\"-webkit-mask-clip\":\"[<coord-box>|no-clip|border|padding|content|text]#\",\"-webkit-mask-composite\":\"<composite-style>#\",\"-webkit-mask-image\":\"<mask-reference>#\",\"-webkit-mask-origin\":\"[<coord-box>|border|padding|content]#\",\"-webkit-mask-position\":\"<position>#\",\"-webkit-mask-position-x\":\"[<length-percentage>|left|center|right]#\",\"-webkit-mask-position-y\":\"[<length-percentage>|top|center|bottom]#\",\"-webkit-mask-repeat\":\"<repeat-style>#\",\"-webkit-mask-repeat-x\":\"repeat|no-repeat|space|round\",\"-webkit-mask-repeat-y\":\"repeat|no-repeat|space|round\",\"-webkit-mask-size\":\"<bg-size>#\",\"-webkit-overflow-scrolling\":\"auto|touch\",\"-webkit-tap-highlight-color\":\"<color>\",\"-webkit-text-fill-color\":\"<color>\",\"-webkit-text-stroke\":\"<length>||<color>\",\"-webkit-text-stroke-color\":\"<color>\",\"-webkit-text-stroke-width\":\"<length>\",\"-webkit-touch-callout\":\"default|none\",\"-webkit-user-modify\":\"read-only|read-write|read-write-plaintext-only\",\"-webkit-user-select\":\"auto|none|text|all\",\"accent-color\":\"auto|<color>\",\"align-content\":\"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>\",\"align-items\":\"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]\",\"align-self\":\"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>\",\"align-tracks\":\"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#\",\"alignment-baseline\":\"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical\",all:\"initial|inherit|unset|revert|revert-layer\",\"anchor-name\":\"none|<dashed-ident>#\",\"anchor-scope\":\"none|all|<dashed-ident>#\",animation:\"<single-animation>#\",\"animation-composition\":\"<single-animation-composition>#\",\"animation-delay\":\"<time>#\",\"animation-direction\":\"<single-animation-direction>#\",\"animation-duration\":\"<time>#\",\"animation-fill-mode\":\"<single-animation-fill-mode>#\",\"animation-iteration-count\":\"<single-animation-iteration-count>#\",\"animation-name\":\"[none|<keyframes-name>]#\",\"animation-play-state\":\"<single-animation-play-state>#\",\"animation-range\":\"[<'animation-range-start'> <'animation-range-end'>?]#\",\"animation-range-end\":\"[normal|<length-percentage>|<timeline-range-name> <length-percentage>?]#\",\"animation-range-start\":\"[normal|<length-percentage>|<timeline-range-name> <length-percentage>?]#\",\"animation-timeline\":\"<single-animation-timeline>#\",\"animation-timing-function\":\"<easing-function>#\",appearance:\"none|auto|textfield|menulist-button|<compat-auto>\",\"aspect-ratio\":\"auto||<ratio>\",\"backdrop-filter\":\"none|<filter-value-list>\",\"backface-visibility\":\"visible|hidden\",background:\"[<bg-layer> ,]* <final-bg-layer>\",\"background-attachment\":\"<attachment>#\",\"background-blend-mode\":\"<blend-mode>#\",\"background-clip\":\"<bg-clip>#\",\"background-color\":\"<color>\",\"background-image\":\"<bg-image>#\",\"background-origin\":\"<visual-box>#\",\"background-position\":\"<bg-position>#\",\"background-position-x\":\"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#\",\"background-position-y\":\"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#\",\"background-repeat\":\"<repeat-style>#\",\"background-size\":\"<bg-size>#\",\"baseline-shift\":\"baseline|sub|super|<svg-length>\",\"block-size\":\"<'width'>\",border:\"<line-width>||<line-style>||<color>\",\"border-block\":\"<'border-block-start'>\",\"border-block-color\":\"<'border-top-color'>{1,2}\",\"border-block-end\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-block-end-color\":\"<'border-top-color'>\",\"border-block-end-style\":\"<'border-top-style'>\",\"border-block-end-width\":\"<'border-top-width'>\",\"border-block-start\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-block-start-color\":\"<'border-top-color'>\",\"border-block-start-style\":\"<'border-top-style'>\",\"border-block-start-width\":\"<'border-top-width'>\",\"border-block-style\":\"<'border-top-style'>{1,2}\",\"border-block-width\":\"<'border-top-width'>{1,2}\",\"border-bottom\":\"<line-width>||<line-style>||<color>\",\"border-bottom-color\":\"<'border-top-color'>\",\"border-bottom-left-radius\":\"<length-percentage>{1,2}\",\"border-bottom-right-radius\":\"<length-percentage>{1,2}\",\"border-bottom-style\":\"<line-style>\",\"border-bottom-width\":\"<line-width>\",\"border-collapse\":\"collapse|separate\",\"border-color\":\"<color>{1,4}\",\"border-end-end-radius\":\"<'border-top-left-radius'>\",\"border-end-start-radius\":\"<'border-top-left-radius'>\",\"border-image\":\"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>\",\"border-image-outset\":\"[<length>|<number>]{1,4}\",\"border-image-repeat\":\"[stretch|repeat|round|space]{1,2}\",\"border-image-slice\":\"<number-percentage>{1,4}&&fill?\",\"border-image-source\":\"none|<image>\",\"border-image-width\":\"[<length-percentage>|<number>|auto]{1,4}\",\"border-inline\":\"<'border-block-start'>\",\"border-inline-color\":\"<'border-top-color'>{1,2}\",\"border-inline-end\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-inline-end-color\":\"<'border-top-color'>\",\"border-inline-end-style\":\"<'border-top-style'>\",\"border-inline-end-width\":\"<'border-top-width'>\",\"border-inline-start\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-inline-start-color\":\"<'border-top-color'>\",\"border-inline-start-style\":\"<'border-top-style'>\",\"border-inline-start-width\":\"<'border-top-width'>\",\"border-inline-style\":\"<'border-top-style'>{1,2}\",\"border-inline-width\":\"<'border-top-width'>{1,2}\",\"border-left\":\"<line-width>||<line-style>||<color>\",\"border-left-color\":\"<color>\",\"border-left-style\":\"<line-style>\",\"border-left-width\":\"<line-width>\",\"border-radius\":\"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?\",\"border-right\":\"<line-width>||<line-style>||<color>\",\"border-right-color\":\"<color>\",\"border-right-style\":\"<line-style>\",\"border-right-width\":\"<line-width>\",\"border-spacing\":\"<length> <length>?\",\"border-start-end-radius\":\"<'border-top-left-radius'>\",\"border-start-start-radius\":\"<'border-top-left-radius'>\",\"border-style\":\"<line-style>{1,4}\",\"border-top\":\"<line-width>||<line-style>||<color>\",\"border-top-color\":\"<color>\",\"border-top-left-radius\":\"<length-percentage>{1,2}\",\"border-top-right-radius\":\"<length-percentage>{1,2}\",\"border-top-style\":\"<line-style>\",\"border-top-width\":\"<line-width>\",\"border-width\":\"<line-width>{1,4}\",bottom:\"<length>|<percentage>|auto\",\"box-align\":\"start|center|end|baseline|stretch\",\"box-decoration-break\":\"slice|clone\",\"box-direction\":\"normal|reverse|inherit\",\"box-flex\":\"<number>\",\"box-flex-group\":\"<integer>\",\"box-lines\":\"single|multiple\",\"box-ordinal-group\":\"<integer>\",\"box-orient\":\"horizontal|vertical|inline-axis|block-axis|inherit\",\"box-pack\":\"start|center|end|justify\",\"box-shadow\":\"none|<shadow>#\",\"box-sizing\":\"content-box|border-box\",\"break-after\":\"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region\",\"break-before\":\"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region\",\"break-inside\":\"auto|avoid|avoid-page|avoid-column|avoid-region\",\"caption-side\":\"top|bottom\",caret:\"<'caret-color'>||<'caret-shape'>\",\"caret-color\":\"auto|<color>\",\"caret-shape\":\"auto|bar|block|underscore\",clear:\"none|left|right|both|inline-start|inline-end\",clip:\"<shape>|auto\",\"clip-path\":\"<clip-source>|[<basic-shape>||<geometry-box>]|none\",\"clip-rule\":\"nonzero|evenodd\",color:\"<color>\",\"color-interpolation-filters\":\"auto|sRGB|linearRGB\",\"color-scheme\":\"normal|[light|dark|<custom-ident>]+&&only?\",\"column-count\":\"<integer>|auto\",\"column-fill\":\"auto|balance\",\"column-gap\":\"normal|<length-percentage>\",\"column-rule\":\"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>\",\"column-rule-color\":\"<color>\",\"column-rule-style\":\"<'border-style'>\",\"column-rule-width\":\"<'border-width'>\",\"column-span\":\"none|all\",\"column-width\":\"<length>|auto\",columns:\"<'column-width'>||<'column-count'>\",contain:\"none|strict|content|[[size||inline-size]||layout||style||paint]\",\"contain-intrinsic-block-size\":\"auto? [none|<length>]\",\"contain-intrinsic-height\":\"auto? [none|<length>]\",\"contain-intrinsic-inline-size\":\"auto? [none|<length>]\",\"contain-intrinsic-size\":\"[auto? [none|<length>]]{1,2}\",\"contain-intrinsic-width\":\"auto? [none|<length>]\",container:\"<'container-name'> [/ <'container-type'>]?\",\"container-name\":\"none|<custom-ident>+\",\"container-type\":\"normal|[[size|inline-size]||scroll-state]\",content:\"normal|none|[<content-replacement>|<content-list>] [/ [<string>|<counter>]+]?\",\"content-visibility\":\"visible|auto|hidden\",\"counter-increment\":\"[<counter-name> <integer>?]+|none\",\"counter-reset\":\"[<counter-name> <integer>?|<reversed-counter-name> <integer>?]+|none\",\"counter-set\":\"[<counter-name> <integer>?]+|none\",cursor:\"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]\",cx:\"<length>|<percentage>\",cy:\"<length>|<percentage>\",d:\"none|path( <string> )\",direction:\"ltr|rtl\",display:\"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>\",\"dominant-baseline\":\"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge\",\"empty-cells\":\"show|hide\",\"field-sizing\":\"content|fixed\",fill:\"<paint>\",\"fill-opacity\":\"<number-zero-one>\",\"fill-rule\":\"nonzero|evenodd\",filter:\"none|<filter-value-list>|<-ms-filter-function-list>\",flex:\"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]\",\"flex-basis\":\"content|<'width'>\",\"flex-direction\":\"row|row-reverse|column|column-reverse\",\"flex-flow\":\"<'flex-direction'>||<'flex-wrap'>\",\"flex-grow\":\"<number>\",\"flex-shrink\":\"<number>\",\"flex-wrap\":\"nowrap|wrap|wrap-reverse\",float:\"left|right|none|inline-start|inline-end\",\"flood-color\":\"<color>\",\"flood-opacity\":\"<'opacity'>\",font:\"[[<'font-style'>||<font-variant-css2>||<'font-weight'>||<font-width-css3>]? <'font-size'> [/ <'line-height'>]? <'font-family'>#]|<system-family-name>|<-non-standard-font>\",\"font-family\":\"[<family-name>|<generic-family>]#\",\"font-feature-settings\":\"normal|<feature-tag-value>#\",\"font-kerning\":\"auto|normal|none\",\"font-language-override\":\"normal|<string>\",\"font-optical-sizing\":\"auto|none\",\"font-palette\":\"normal|light|dark|<palette-identifier>|<palette-mix()>\",\"font-size\":\"<absolute-size>|<relative-size>|<length-percentage [0,∞]>|math\",\"font-size-adjust\":\"none|[ex-height|cap-height|ch-width|ic-width|ic-height]? [from-font|<number>]\",\"font-smooth\":\"auto|never|always|<absolute-size>|<length>\",\"font-stretch\":\"<font-stretch-absolute>\",\"font-style\":\"normal|italic|oblique <angle>?\",\"font-synthesis\":\"none|[weight||style||small-caps||position]\",\"font-synthesis-position\":\"auto|none\",\"font-synthesis-small-caps\":\"auto|none\",\"font-synthesis-style\":\"auto|none\",\"font-synthesis-weight\":\"auto|none\",\"font-variant\":\"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]\",\"font-variant-alternates\":\"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]\",\"font-variant-caps\":\"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps\",\"font-variant-east-asian\":\"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]\",\"font-variant-emoji\":\"normal|text|emoji|unicode\",\"font-variant-ligatures\":\"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]\",\"font-variant-numeric\":\"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]\",\"font-variant-position\":\"normal|sub|super\",\"font-variation-settings\":\"normal|[<string> <number>]#\",\"font-weight\":\"<font-weight-absolute>|bolder|lighter\",\"forced-color-adjust\":\"auto|none|preserve-parent-color\",gap:\"<'row-gap'> <'column-gap'>?\",grid:\"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>\",\"grid-area\":\"<grid-line> [/ <grid-line>]{0,3}\",\"grid-auto-columns\":\"<track-size>+\",\"grid-auto-flow\":\"[row|column]||dense\",\"grid-auto-rows\":\"<track-size>+\",\"grid-column\":\"<grid-line> [/ <grid-line>]?\",\"grid-column-end\":\"<grid-line>\",\"grid-column-gap\":\"<length-percentage>\",\"grid-column-start\":\"<grid-line>\",\"grid-gap\":\"<'grid-row-gap'> <'grid-column-gap'>?\",\"grid-row\":\"<grid-line> [/ <grid-line>]?\",\"grid-row-end\":\"<grid-line>\",\"grid-row-gap\":\"<length-percentage>\",\"grid-row-start\":\"<grid-line>\",\"grid-template\":\"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?\",\"grid-template-areas\":\"none|<string>+\",\"grid-template-columns\":\"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?\",\"grid-template-rows\":\"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?\",\"hanging-punctuation\":\"none|[first||[force-end|allow-end]||last]\",height:\"auto|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"hyphenate-character\":\"auto|<string>\",\"hyphenate-limit-chars\":\"[auto|<integer>]{1,3}\",hyphens:\"none|manual|auto\",\"image-orientation\":\"from-image|<angle>|[<angle>? flip]\",\"image-rendering\":\"auto|crisp-edges|pixelated|smooth|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>\",\"image-resolution\":\"[from-image||<resolution>]&&snap?\",\"ime-mode\":\"auto|normal|active|inactive|disabled\",\"initial-letter\":\"normal|[<number> <integer>?]\",\"initial-letter-align\":\"[auto|alphabetic|hanging|ideographic]\",\"inline-size\":\"<'width'>\",inset:\"<'top'>{1,4}\",\"inset-block\":\"<'top'>{1,2}\",\"inset-block-end\":\"<'top'>\",\"inset-block-start\":\"<'top'>\",\"inset-inline\":\"<'top'>{1,2}\",\"inset-inline-end\":\"<'top'>\",\"inset-inline-start\":\"<'top'>\",\"interpolate-size\":\"numeric-only|allow-keywords\",isolation:\"auto|isolate\",\"justify-content\":\"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]\",\"justify-items\":\"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]\",\"justify-self\":\"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]\",\"justify-tracks\":\"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#\",left:\"<length>|<percentage>|auto\",\"letter-spacing\":\"normal|<length-percentage>\",\"lighting-color\":\"<color>\",\"line-break\":\"auto|loose|normal|strict|anywhere\",\"line-clamp\":\"none|<integer>\",\"line-height\":\"normal|<number>|<length>|<percentage>\",\"line-height-step\":\"<length>\",\"list-style\":\"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>\",\"list-style-image\":\"<image>|none\",\"list-style-position\":\"inside|outside\",\"list-style-type\":\"<counter-style>|<string>|none\",margin:\"<'margin-top'>{1,4}\",\"margin-block\":\"<'margin-top'>{1,2}\",\"margin-block-end\":\"<'margin-top'>\",\"margin-block-start\":\"<'margin-top'>\",\"margin-bottom\":\"<length-percentage>|auto\",\"margin-inline\":\"<'margin-top'>{1,2}\",\"margin-inline-end\":\"<'margin-top'>\",\"margin-inline-start\":\"<'margin-top'>\",\"margin-left\":\"<length-percentage>|auto\",\"margin-right\":\"<length-percentage>|auto\",\"margin-top\":\"<length-percentage>|auto\",\"margin-trim\":\"none|in-flow|all\",marker:\"none|<url>\",\"marker-end\":\"none|<url>\",\"marker-mid\":\"none|<url>\",\"marker-start\":\"none|<url>\",mask:\"<mask-layer>#\",\"mask-border\":\"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>\",\"mask-border-mode\":\"luminance|alpha\",\"mask-border-outset\":\"[<length>|<number>]{1,4}\",\"mask-border-repeat\":\"[stretch|repeat|round|space]{1,2}\",\"mask-border-slice\":\"<number-percentage>{1,4} fill?\",\"mask-border-source\":\"none|<image>\",\"mask-border-width\":\"[<length-percentage>|<number>|auto]{1,4}\",\"mask-clip\":\"[<coord-box>|no-clip]#\",\"mask-composite\":\"<compositing-operator>#\",\"mask-image\":\"<mask-reference>#\",\"mask-mode\":\"<masking-mode>#\",\"mask-origin\":\"<coord-box>#\",\"mask-position\":\"<position>#\",\"mask-repeat\":\"<repeat-style>#\",\"mask-size\":\"<bg-size>#\",\"mask-type\":\"luminance|alpha\",\"masonry-auto-flow\":\"[pack|next]||[definite-first|ordered]\",\"math-depth\":\"auto-add|add( <integer> )|<integer>\",\"math-shift\":\"normal|compact\",\"math-style\":\"normal|compact\",\"max-block-size\":\"<'max-width'>\",\"max-height\":\"none|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"max-inline-size\":\"<'max-width'>\",\"max-lines\":\"none|<integer>\",\"max-width\":\"none|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"min-block-size\":\"<'min-width'>\",\"min-height\":\"auto|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"min-inline-size\":\"<'min-width'>\",\"min-width\":\"auto|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"mix-blend-mode\":\"<blend-mode>|plus-lighter\",\"object-fit\":\"fill|contain|cover|none|scale-down\",\"object-position\":\"<position>\",\"object-view-box\":\"none|<basic-shape-rect>\",offset:\"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?\",\"offset-anchor\":\"auto|<position>\",\"offset-distance\":\"<length-percentage>\",\"offset-path\":\"none|<offset-path>||<coord-box>\",\"offset-position\":\"normal|auto|<position>\",\"offset-rotate\":\"[auto|reverse]||<angle>\",opacity:\"<opacity-value>\",order:\"<integer>\",orphans:\"<integer>\",outline:\"<'outline-width'>||<'outline-style'>||<'outline-color'>\",\"outline-color\":\"auto|<color>\",\"outline-offset\":\"<length>\",\"outline-style\":\"auto|<outline-line-style>\",\"outline-width\":\"<line-width>\",overflow:\"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>\",\"overflow-anchor\":\"auto|none\",\"overflow-block\":\"visible|hidden|clip|scroll|auto\",\"overflow-clip-box\":\"padding-box|content-box\",\"overflow-clip-margin\":\"<visual-box>||<length [0,∞]>\",\"overflow-inline\":\"visible|hidden|clip|scroll|auto\",\"overflow-wrap\":\"normal|break-word|anywhere\",\"overflow-x\":\"visible|hidden|clip|scroll|auto|<-non-standard-overflow>\",\"overflow-y\":\"visible|hidden|clip|scroll|auto|<-non-standard-overflow>\",overlay:\"none|auto\",\"overscroll-behavior\":\"[contain|none|auto]{1,2}\",\"overscroll-behavior-block\":\"contain|none|auto\",\"overscroll-behavior-inline\":\"contain|none|auto\",\"overscroll-behavior-x\":\"contain|none|auto\",\"overscroll-behavior-y\":\"contain|none|auto\",padding:\"<'padding-top'>{1,4}\",\"padding-block\":\"<'padding-top'>{1,2}\",\"padding-block-end\":\"<'padding-top'>\",\"padding-block-start\":\"<'padding-top'>\",\"padding-bottom\":\"<length-percentage [0,∞]>\",\"padding-inline\":\"<'padding-top'>{1,2}\",\"padding-inline-end\":\"<'padding-top'>\",\"padding-inline-start\":\"<'padding-top'>\",\"padding-left\":\"<length-percentage [0,∞]>\",\"padding-right\":\"<length-percentage [0,∞]>\",\"padding-top\":\"<length-percentage [0,∞]>\",page:\"auto|<custom-ident>\",\"page-break-after\":\"auto|always|avoid|left|right|recto|verso\",\"page-break-before\":\"auto|always|avoid|left|right|recto|verso\",\"page-break-inside\":\"auto|avoid\",\"paint-order\":\"normal|[fill||stroke||markers]\",perspective:\"none|<length>\",\"perspective-origin\":\"<position>\",\"place-content\":\"<'align-content'> <'justify-content'>?\",\"place-items\":\"<'align-items'> <'justify-items'>?\",\"place-self\":\"<'align-self'> <'justify-self'>?\",\"pointer-events\":\"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit\",position:\"static|relative|absolute|sticky|fixed|-webkit-sticky\",\"position-anchor\":\"auto|<anchor-name>\",\"position-area\":\"none|<position-area>\",\"position-try\":\"<'position-try-order'>? <'position-try-fallbacks'>\",\"position-try-fallbacks\":\"none|[[<dashed-ident>||<try-tactic>]|<'position-area'>]#\",\"position-try-order\":\"normal|<try-size>\",\"position-visibility\":\"always|[anchors-valid||anchors-visible||no-overflow]\",\"print-color-adjust\":\"economy|exact\",quotes:\"none|auto|[<string> <string>]+\",r:\"<length>|<percentage>\",resize:\"none|both|horizontal|vertical|block|inline\",right:\"<length>|<percentage>|auto\",rotate:\"none|<angle>|[x|y|z|<number>{3}]&&<angle>\",\"row-gap\":\"normal|<length-percentage>\",\"ruby-align\":\"start|center|space-between|space-around\",\"ruby-merge\":\"separate|collapse|auto\",\"ruby-position\":\"[alternate||[over|under]]|inter-character\",rx:\"<length>|<percentage>\",ry:\"<length>|<percentage>\",scale:\"none|[<number>|<percentage>]{1,3}\",\"scroll-behavior\":\"auto|smooth\",\"scroll-initial-target\":\"none|nearest\",\"scroll-margin\":\"<length>{1,4}\",\"scroll-margin-block\":\"<length>{1,2}\",\"scroll-margin-block-end\":\"<length>\",\"scroll-margin-block-start\":\"<length>\",\"scroll-margin-bottom\":\"<length>\",\"scroll-margin-inline\":\"<length>{1,2}\",\"scroll-margin-inline-end\":\"<length>\",\"scroll-margin-inline-start\":\"<length>\",\"scroll-margin-left\":\"<length>\",\"scroll-margin-right\":\"<length>\",\"scroll-margin-top\":\"<length>\",\"scroll-padding\":\"[auto|<length-percentage>]{1,4}\",\"scroll-padding-block\":\"[auto|<length-percentage>]{1,2}\",\"scroll-padding-block-end\":\"auto|<length-percentage>\",\"scroll-padding-block-start\":\"auto|<length-percentage>\",\"scroll-padding-bottom\":\"auto|<length-percentage>\",\"scroll-padding-inline\":\"[auto|<length-percentage>]{1,2}\",\"scroll-padding-inline-end\":\"auto|<length-percentage>\",\"scroll-padding-inline-start\":\"auto|<length-percentage>\",\"scroll-padding-left\":\"auto|<length-percentage>\",\"scroll-padding-right\":\"auto|<length-percentage>\",\"scroll-padding-top\":\"auto|<length-percentage>\",\"scroll-snap-align\":\"[none|start|end|center]{1,2}\",\"scroll-snap-coordinate\":\"none|<position>#\",\"scroll-snap-destination\":\"<position>\",\"scroll-snap-points-x\":\"none|repeat( <length-percentage> )\",\"scroll-snap-points-y\":\"none|repeat( <length-percentage> )\",\"scroll-snap-stop\":\"normal|always\",\"scroll-snap-type\":\"none|[x|y|block|inline|both] [mandatory|proximity]?\",\"scroll-snap-type-x\":\"none|mandatory|proximity\",\"scroll-snap-type-y\":\"none|mandatory|proximity\",\"scroll-timeline\":\"[<'scroll-timeline-name'> <'scroll-timeline-axis'>?]#\",\"scroll-timeline-axis\":\"[block|inline|x|y]#\",\"scroll-timeline-name\":\"[none|<dashed-ident>]#\",\"scrollbar-color\":\"auto|<color>{2}\",\"scrollbar-gutter\":\"auto|stable&&both-edges?\",\"scrollbar-width\":\"auto|thin|none\",\"shape-image-threshold\":\"<opacity-value>\",\"shape-margin\":\"<length-percentage>\",\"shape-outside\":\"none|[<shape-box>||<basic-shape>]|<image>\",\"shape-rendering\":\"auto|optimizeSpeed|crispEdges|geometricPrecision\",\"speak-as\":\"normal|spell-out||digits||[literal-punctuation|no-punctuation]\",\"stop-color\":\"<'color'>\",\"stop-opacity\":\"<'opacity'>\",stroke:\"<paint>\",\"stroke-dasharray\":\"none|[<svg-length>+]#\",\"stroke-dashoffset\":\"<svg-length>\",\"stroke-linecap\":\"butt|round|square\",\"stroke-linejoin\":\"miter|round|bevel\",\"stroke-miterlimit\":\"<number-one-or-greater>\",\"stroke-opacity\":\"<'opacity'>\",\"stroke-width\":\"<svg-length>\",\"tab-size\":\"<integer>|<length>\",\"table-layout\":\"auto|fixed\",\"text-align\":\"start|end|left|right|center|justify|match-parent\",\"text-align-last\":\"auto|start|end|left|right|center|justify\",\"text-anchor\":\"start|middle|end\",\"text-box\":\"normal|<'text-box-trim'>||<'text-box-edge'>\",\"text-box-edge\":\"auto|<text-edge>\",\"text-box-trim\":\"none|trim-start|trim-end|trim-both\",\"text-combine-upright\":\"none|all|[digits <integer>?]\",\"text-decoration\":\"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>\",\"text-decoration-color\":\"<color>\",\"text-decoration-line\":\"none|[underline||overline||line-through||blink]|spelling-error|grammar-error\",\"text-decoration-skip\":\"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]\",\"text-decoration-skip-ink\":\"auto|all|none\",\"text-decoration-style\":\"solid|double|dotted|dashed|wavy\",\"text-decoration-thickness\":\"auto|from-font|<length>|<percentage>\",\"text-emphasis\":\"<'text-emphasis-style'>||<'text-emphasis-color'>\",\"text-emphasis-color\":\"<color>\",\"text-emphasis-position\":\"auto|[over|under]&&[right|left]?\",\"text-emphasis-style\":\"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>\",\"text-indent\":\"<length-percentage>&&hanging?&&each-line?\",\"text-justify\":\"auto|inter-character|inter-word|none\",\"text-orientation\":\"mixed|upright|sideways\",\"text-overflow\":\"[clip|ellipsis|<string>]{1,2}\",\"text-rendering\":\"auto|optimizeSpeed|optimizeLegibility|geometricPrecision\",\"text-shadow\":\"none|<shadow-t>#\",\"text-size-adjust\":\"none|auto|<percentage>\",\"text-spacing-trim\":\"space-all|normal|space-first|trim-start\",\"text-transform\":\"none|[capitalize|uppercase|lowercase]||full-width||full-size-kana|math-auto\",\"text-underline-offset\":\"auto|<length>|<percentage>\",\"text-underline-position\":\"auto|from-font|[under||[left|right]]\",\"text-wrap\":\"<'text-wrap-mode'>||<'text-wrap-style'>\",\"text-wrap-mode\":\"wrap|nowrap\",\"text-wrap-style\":\"auto|balance|stable|pretty\",\"timeline-scope\":\"none|<dashed-ident>#\",top:\"<length>|<percentage>|auto\",\"touch-action\":\"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation\",transform:\"none|<transform-list>\",\"transform-box\":\"content-box|border-box|fill-box|stroke-box|view-box\",\"transform-origin\":\"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?\",\"transform-style\":\"flat|preserve-3d\",transition:\"<single-transition>#\",\"transition-behavior\":\"<transition-behavior-value>#\",\"transition-delay\":\"<time>#\",\"transition-duration\":\"<time>#\",\"transition-property\":\"none|<single-transition-property>#\",\"transition-timing-function\":\"<easing-function>#\",translate:\"none|<length-percentage> [<length-percentage> <length>?]?\",\"unicode-bidi\":\"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext\",\"user-select\":\"auto|text|none|all\",\"vector-effect\":\"none|non-scaling-stroke|non-scaling-size|non-rotation|fixed-position\",\"vertical-align\":\"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>\",\"view-timeline\":\"[<'view-timeline-name'> [<'view-timeline-axis'>||<'view-timeline-inset'>]?]#\",\"view-timeline-axis\":\"[block|inline|x|y]#\",\"view-timeline-inset\":\"[[auto|<length-percentage>]{1,2}]#\",\"view-timeline-name\":\"[none|<dashed-ident>]#\",\"view-transition-class\":\"none|<custom-ident>+\",\"view-transition-name\":\"none|<custom-ident>\",visibility:\"visible|hidden|collapse\",\"white-space\":\"normal|pre|pre-wrap|pre-line|<'white-space-collapse'>||<'text-wrap-mode'>\",\"white-space-collapse\":\"collapse|preserve|preserve-breaks|preserve-spaces|break-spaces\",widows:\"<integer>\",width:\"auto|<length-percentage [0,∞]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,∞]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"will-change\":\"auto|<animateable-feature>#\",\"word-break\":\"normal|break-all|keep-all|break-word|auto-phrase\",\"word-spacing\":\"normal|<length>\",\"word-wrap\":\"normal|break-word\",\"writing-mode\":\"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>\",x:\"<length>|<percentage>\",y:\"<length>|<percentage>\",\"z-index\":\"auto|<integer>\",zoom:\"normal|reset|<number [0,∞]>||<percentage [0,∞]>\",\"-moz-background-clip\":\"padding|border\",\"-moz-border-radius-bottomleft\":\"<'border-bottom-left-radius'>\",\"-moz-border-radius-bottomright\":\"<'border-bottom-right-radius'>\",\"-moz-border-radius-topleft\":\"<'border-top-left-radius'>\",\"-moz-border-radius-topright\":\"<'border-bottom-right-radius'>\",\"-moz-control-character-visibility\":\"visible|hidden\",\"-moz-osx-font-smoothing\":\"auto|grayscale\",\"-moz-user-select\":\"none|text|all|-moz-none\",\"-ms-flex-align\":\"start|end|center|baseline|stretch\",\"-ms-flex-item-align\":\"auto|start|end|center|baseline|stretch\",\"-ms-flex-line-pack\":\"start|end|center|justify|distribute|stretch\",\"-ms-flex-negative\":\"<'flex-shrink'>\",\"-ms-flex-pack\":\"start|end|center|justify|distribute\",\"-ms-flex-order\":\"<integer>\",\"-ms-flex-positive\":\"<'flex-grow'>\",\"-ms-flex-preferred-size\":\"<'flex-basis'>\",\"-ms-interpolation-mode\":\"nearest-neighbor|bicubic\",\"-ms-grid-column-align\":\"start|end|center|stretch\",\"-ms-grid-row-align\":\"start|end|center|stretch\",\"-ms-hyphenate-limit-last\":\"none|always|column|page|spread\",\"-webkit-background-clip\":\"[<visual-box>|border|padding|content|text]#\",\"-webkit-column-break-after\":\"always|auto|avoid\",\"-webkit-column-break-before\":\"always|auto|avoid\",\"-webkit-column-break-inside\":\"always|auto|avoid\",\"-webkit-font-smoothing\":\"auto|none|antialiased|subpixel-antialiased\",\"-webkit-mask-box-image\":\"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?\",\"-webkit-print-color-adjust\":\"economy|exact\",\"-webkit-text-security\":\"none|circle|disc|square\",\"-webkit-user-drag\":\"none|element|auto\",behavior:\"<url>+\",cue:\"<'cue-before'> <'cue-after'>?\",\"cue-after\":\"<url> <decibel>?|none\",\"cue-before\":\"<url> <decibel>?|none\",\"glyph-orientation-horizontal\":\"<angle>\",\"glyph-orientation-vertical\":\"<angle>\",kerning:\"auto|<svg-length>\",pause:\"<'pause-before'> <'pause-after'>?\",\"pause-after\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"pause-before\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"position-try-options\":\"<'position-try-fallbacks'>\",rest:\"<'rest-before'> <'rest-after'>?\",\"rest-after\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"rest-before\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",speak:\"auto|never|always\",\"voice-balance\":\"<number>|left|center|right|leftwards|rightwards\",\"voice-duration\":\"auto|<time>\",\"voice-family\":\"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve\",\"voice-pitch\":\"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]\",\"voice-range\":\"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]\",\"voice-rate\":\"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>\",\"voice-stress\":\"normal|strong|moderate|none|reduced\",\"voice-volume\":\"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]\",\"white-space-trim\":\"none|discard-before||discard-after||discard-inner\"},atrules:{charset:{prelude:\"<string>\",descriptors:null},\"counter-style\":{prelude:\"<counter-style-name>\",descriptors:{\"additive-symbols\":\"[<integer>&&<symbol>]#\",fallback:\"<counter-style-name>\",negative:\"<symbol> <symbol>?\",pad:\"<integer>&&<symbol>\",prefix:\"<symbol>\",range:\"[[<integer>|infinite]{2}]#|auto\",\"speak-as\":\"auto|bullets|numbers|words|spell-out|<counter-style-name>\",suffix:\"<symbol>\",symbols:\"<symbol>+\",system:\"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]\"}},container:{prelude:\"[<container-name>]? <container-condition>\",descriptors:null},document:{prelude:\"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#\",descriptors:null},\"font-face\":{prelude:null,descriptors:{\"ascent-override\":\"normal|<percentage>\",\"descent-override\":\"normal|<percentage>\",\"font-display\":\"auto|block|swap|fallback|optional\",\"font-family\":\"<family-name>\",\"font-feature-settings\":\"normal|<feature-tag-value>#\",\"font-stretch\":\"<font-stretch-absolute>{1,2}\",\"font-style\":\"normal|italic|oblique <angle>{0,2}\",\"font-variation-settings\":\"normal|[<string> <number>]#\",\"font-weight\":\"<font-weight-absolute>{1,2}\",\"line-gap-override\":\"normal|<percentage>\",\"size-adjust\":\"<percentage>\",src:\"[<url> [format( <string># )]?|local( <family-name> )]#\",\"unicode-range\":\"<unicode-range-token>#\"}},\"font-feature-values\":{prelude:\"<family-name>#\",descriptors:null},\"font-palette-values\":{prelude:\"<dashed-ident>\",descriptors:{\"base-palette\":\"light|dark|<integer [0,∞]>\",\"font-family\":\"<family-name>#\",\"override-colors\":\"[<integer [0,∞]> <color>]#\"}},import:{prelude:\"[<string>|<url>] [layer|layer( <layer-name> )]? [supports( [<supports-condition>|<declaration>] )]? <media-query-list>?\",descriptors:null},keyframes:{prelude:\"<keyframes-name>\",descriptors:null},layer:{prelude:\"[<layer-name>#|<layer-name>?]\",descriptors:null},media:{prelude:\"<media-query-list>\",descriptors:null},namespace:{prelude:\"<namespace-prefix>? [<string>|<url>]\",descriptors:null},page:{prelude:\"<page-selector-list>\",descriptors:{bleed:\"auto|<length>\",marks:\"none|[crop||cross]\",\"page-orientation\":\"upright|rotate-left|rotate-right\",size:\"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]\"}},\"position-try\":{prelude:\"<dashed-ident>\",descriptors:{top:\"<'top'>\",left:\"<'left'>\",bottom:\"<'bottom'>\",right:\"<'right'>\",\"inset-block-start\":\"<'inset-block-start'>\",\"inset-block-end\":\"<'inset-block-end'>\",\"inset-inline-start\":\"<'inset-inline-start'>\",\"inset-inline-end\":\"<'inset-inline-end'>\",\"inset-block\":\"<'inset-block'>\",\"inset-inline\":\"<'inset-inline'>\",inset:\"<'inset'>\",\"margin-top\":\"<'margin-top'>\",\"margin-left\":\"<'margin-left'>\",\"margin-bottom\":\"<'margin-bottom'>\",\"margin-right\":\"<'margin-right'>\",\"margin-block-start\":\"<'margin-block-start'>\",\"margin-block-end\":\"<'margin-block-end'>\",\"margin-inline-start\":\"<'margin-inline-start'>\",\"margin-inline-end\":\"<'margin-inline-end'>\",margin:\"<'margin'>\",\"margin-block\":\"<'margin-block'>\",\"margin-inline\":\"<'margin-inline'>\",width:\"<'width'>\",height:\"<'height'>\",\"min-width\":\"<'min-width'>\",\"min-height\":\"<'min-height'>\",\"max-width\":\"<'max-width'>\",\"max-height\":\"<'max-height'>\",\"block-size\":\"<'block-size'>\",\"inline-size\":\"<'inline-size'>\",\"min-block-size\":\"<'min-block-size'>\",\"min-inline-size\":\"<'min-inline-size'>\",\"max-block-size\":\"<'max-block-size'>\",\"max-inline-size\":\"<'max-inline-size'>\",\"align-self\":\"<'align-self'>|anchor-center\",\"justify-self\":\"<'justify-self'>|anchor-center\"}},property:{prelude:\"<custom-property-name>\",descriptors:{inherits:\"true|false\",\"initial-value\":\"<declaration-value>?\",syntax:\"<string>\"}},scope:{prelude:\"[( <scope-start> )]? [to ( <scope-end> )]?\",descriptors:null},\"starting-style\":{prelude:null,descriptors:null},supports:{prelude:\"<supports-condition>\",descriptors:null},\"view-transition\":{prelude:null,descriptors:{navigation:\"auto|none\",types:\"none|<custom-ident>+\"}},nest:{prelude:\"<complex-selector-list>\",descriptors:null}},node:Mm},rf={};ps(rf,{AtrulePrelude:()=>lf,Selector:()=>cf,Value:()=>mf});function sf(n){switch(this.tokenType){case 4:return this.Hash();case 18:return this.Operator();case 21:return this.Parentheses(this.readSequence,n.recognizer);case 19:return this.Brackets(this.readSequence,n.recognizer);case 5:return this.String();case 12:return this.Dimension();case 11:return this.Percentage();case 10:return this.Number();case 2:return this.cmpStr(this.tokenStart,this.tokenEnd,\"url(\")?this.Url():this.Function(this.readSequence,n.recognizer);case 7:return this.Url();case 1:return this.cmpChar(this.tokenStart,117)&&this.cmpChar(this.tokenStart+1,43)?this.UnicodeRange():this.Identifier();case 9:{let n=this.charCodeAt(this.tokenStart);if(47===n||42===n||43===n||45===n)return this.Operator();35===n&&this.error(\"Hex or identifier is expected\",this.tokenStart+1);break}}}var lf={getNode:sf};var cf={onWhiteSpace:function(n,e){null!==e.last&&\"Combinator\"!==e.last.type&&null!==n&&\"Combinator\"!==n.type&&e.push({type:\"Combinator\",loc:null,name:\" \"})},getNode:function(){switch(this.tokenType){case 19:return this.AttributeSelector();case 4:return this.IdSelector();case 16:return 16===this.lookupType(1)?this.PseudoElementSelector():this.PseudoClassSelector();case 1:return this.TypeSelector();case 10:case 11:return this.Percentage();case 12:46===this.charCodeAt(this.tokenStart)&&this.error(\"Identifier is expected\",this.tokenStart+1);break;case 9:switch(this.charCodeAt(this.tokenStart)){case 43:case 62:case 126:case 47:return this.Combinator();case 46:return this.ClassSelector();case 42:case 124:return this.TypeSelector();case 35:return this.IdSelector();case 38:return this.NestingSelector()}}}};function df(n){return null!==n&&\"Operator\"===n.type&&(\"-\"===n.value[n.value.length-1]||\"+\"===n.value[n.value.length-1])}var mf={getNode:sf,onWhiteSpace(n,e){df(n)&&(n.value=\" \"+n.value),df(e.last)&&(e.last.value+=\" \")},expression:function(){return this.createSingleNodeList(this.Raw(null,!1))},var:function(){let n=this.createList();if(this.skipSC(),n.push(this.Identifier()),this.skipSC(),18===this.tokenType){n.push(this.Operator());let e=this.tokenIndex,t=this.parseCustomProperty?this.Value(null):this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!1);if(\"Value\"===t.type&&t.children.isEmpty)for(let n=e-this.tokenIndex;n<=0;n++)if(13===this.lookupType(n)){t.children.appendData({type:\"WhiteSpace\",loc:null,value:\" \"});break}n.push(t)}return n}},hf=new Set([\"none\",\"and\",\"not\",\"or\"]),pf={parse:{prelude(){let n=this.createList();if(1===this.tokenType){let e=this.substring(this.tokenStart,this.tokenEnd);hf.has(e.toLowerCase())||n.push(this.Identifier())}return n.push(this.Condition(\"container\")),n},block(n=!1){return this.Block(n)}}},uf={parse:{prelude:null,block(){return this.Block(!0)}}};function gf(n,e){return this.parseWithFallback(()=>{try{return n.call(this)}finally{this.skipSC(),22!==this.lookupNonWSType(0)&&this.error()}},e||(()=>this.Raw(null,!0)))}var wf={layer(){this.skipSC();let n=this.createList(),e=gf.call(this,this.Layer);return(\"Raw\"!==e.type||\"\"!==e.value)&&n.push(e),n},supports(){this.skipSC();let n=this.createList(),e=gf.call(this,this.Declaration,()=>gf.call(this,()=>this.Condition(\"supports\")));return(\"Raw\"!==e.type||\"\"!==e.value)&&n.push(e),n}},bf={parse:{prelude(){let n=this.createList();switch(this.tokenType){case 5:n.push(this.String());break;case 7:case 2:n.push(this.Url());break;default:this.error(\"String or url() is expected\")}return this.skipSC(),1===this.tokenType&&this.cmpStr(this.tokenStart,this.tokenEnd,\"layer\")?n.push(this.Identifier()):2===this.tokenType&&this.cmpStr(this.tokenStart,this.tokenEnd,\"layer(\")&&n.push(this.Function(null,wf)),this.skipSC(),2===this.tokenType&&this.cmpStr(this.tokenStart,this.tokenEnd,\"supports(\")&&n.push(this.Function(null,wf)),(1===this.lookupNonWSType(0)||21===this.lookupNonWSType(0))&&n.push(this.MediaQueryList()),n},block:null}},ff={parse:{prelude(){return this.createSingleNodeList(this.LayerList())},block(){return this.Block(!1)}}},yf={parse:{prelude(){return this.createSingleNodeList(this.MediaQueryList())},block(n=!1){return this.Block(n)}}},kf={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(!0)}}},vf={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(!0)}}},Sf={parse:{prelude(){return this.createSingleNodeList(this.Scope())},block(n=!1){return this.Block(n)}}},jf={parse:{prelude:null,block(n=!1){return this.Block(n)}}},xf={parse:{prelude(){return this.createSingleNodeList(this.Condition(\"supports\"))},block(n=!1){return this.Block(n)}}},Cf={container:pf,\"font-face\":uf,import:bf,layer:ff,media:yf,nest:kf,page:vf,scope:Sf,\"starting-style\":jf,supports:xf};var Af={parse(){return this.createSingleNodeList(this.SelectorList())}},Lf={parse(){return this.createSingleNodeList(this.Selector())}},zf={parse(){return this.createSingleNodeList(this.Identifier())}},Tf={parse:function(){let n=this.createList();this.skipSC();n:for(;!this.eof;){switch(this.tokenType){case 1:n.push(this.Identifier());break;case 5:n.push(this.String());break;case 18:n.push(this.Operator());break;case 22:break n;default:this.error(\"Identifier, string or comma is expected\")}this.skipSC()}return n}},Ef={parse(){return this.createSingleNodeList(this.Nth())}},Rf={dir:zf,has:Af,lang:Tf,matches:Af,is:Af,\"-moz-any\":Af,\"-webkit-any\":Af,where:Af,not:Af,\"nth-child\":Ef,\"nth-last-child\":Ef,\"nth-last-of-type\":Ef,\"nth-of-type\":Ef,slotted:Lf,host:Lf,\"host-context\":Lf},If={};ps(If,{AnPlusB:()=>Km,Atrule:()=>eh,AtrulePrelude:()=>sh,AttributeSelector:()=>kh,Block:()=>Rh,Brackets:()=>Nh,CDC:()=>Uh,CDO:()=>Vh,ClassSelector:()=>Xh,Combinator:()=>sp,Comment:()=>up,Condition:()=>Sp,Declaration:()=>Bp,DeclarationList:()=>Kp,Dimension:()=>Xp,Feature:()=>ou,FeatureFunction:()=>du,FeatureRange:()=>vu,Function:()=>Lu,GeneralEnclosed:()=>Iu,Hash:()=>Bu,IdSelector:()=>Ju,Identifier:()=>Hu,Layer:()=>ng,LayerList:()=>ig,MediaQuery:()=>dg,MediaQueryList:()=>gg,NestingSelector:()=>vg,Nth:()=>Ag,Number:()=>Rg,Operator:()=>Ng,Parentheses:()=>Ug,Percentage:()=>Vg,PseudoClassSelector:()=>Xg,PseudoElementSelector:()=>ow,Ratio:()=>mw,Raw:()=>bw,Rule:()=>Cw,Scope:()=>Ew,Selector:()=>Pw,SelectorList:()=>Uw,String:()=>Xw,StyleSheet:()=>rb,SupportsDeclaration:()=>mb,TypeSelector:()=>yb,UnicodeRange:()=>Rb,Url:()=>Gb,Value:()=>Zb,WhiteSpace:()=>tf});var Df={parseContext:{default:\"StyleSheet\",stylesheet:\"StyleSheet\",atrule:\"Atrule\",atrulePrelude(n){return this.AtrulePrelude(n.atrule?String(n.atrule):null)},mediaQueryList:\"MediaQueryList\",mediaQuery:\"MediaQuery\",condition(n){return this.Condition(n.kind)},rule:\"Rule\",selectorList:\"SelectorList\",selector:\"Selector\",block(){return this.Block(!0)},declarationList:\"DeclarationList\",declaration:\"Declaration\",value:\"Value\"},features:{supports:{selector(){return this.Selector()}},container:{style(){return this.Declaration()}}},scope:rf,atrule:Cf,pseudo:Rf,node:If},Mf=Dm({...of,...Df,...{node:Mm}});function Pf(n){let e={};for(let t of Object.keys(n)){let a=n[t];a&&(Array.isArray(a)||a instanceof Rl?a=a.map(Pf):a.constructor===Object&&(a=Pf(a))),e[t]=a}return e}var Nf={};ps(Nf,{decode:()=>Bf,encode:()=>Of});var _f=92;function Bf(n){let e=n.length-1,t=\"\";for(let a=0;a<n.length;a++){let o=n.charCodeAt(a);if(o===_f){if(a===e)break;if(o=n.charCodeAt(++a),el(_f,o)){let e=a-1,o=ul(n,e);a=o-1,t+=fl(n.substring(e+1,o))}else 13===o&&10===n.charCodeAt(a+1)&&a++}else t+=n[a]}return t}function Of(n){let e=\"\";if(1===n.length&&45===n.charCodeAt(0))return\"\\\\-\";for(let t=0;t<n.length;t++){let a=n.charCodeAt(t);0!==a?a<=31||127===a||a>=48&&a<=57&&(0===t||1===t&&45===n.charCodeAt(0))?e+=\"\\\\\"+a.toString(16)+\" \":$s(a)?e+=n.charAt(t):e+=\"\\\\\"+n.charAt(t):e+=\"�\"}return e}var{tokenize:Ff,parse:Uf,generate:qf,lexer:Hf,createLexer:Wf,walk:Gf,find:Vf,findLast:Kf,findAll:Jf,toPlainObject:Yf,fromPlainObject:Zf,fork:$f}=Mf,Xf=Object.freeze({__proto__:null,Lexer:Lm,List:Rl,OffsetToLocation:Sl,TokenStream:zl,clone:Pf,createLexer:Wf,createSyntax:Dm,definitionSyntax:td,find:Vf,findAll:Jf,findLast:Kf,fork:$f,fromPlainObject:Zf,generate:qf,ident:Nf,isCustomProperty:kc,keyword:bc,lexer:Hf,parse:Uf,property:fc,string:Ww,toPlainObject:Yf,tokenNames:yl,tokenTypes:ks,tokenize:Ff,url:Mb,vendorPrefix:yc,version:\"3.1.0\",walk:Gf});const Qf=new Set([\"inherit\",\"initial\",\"unset\"]),ny=new Set([\"caption\",\"icon\",\"menu\",\"message-box\",\"small-caption\",\"status-bar\"]),ey=new Set([\"normal\",\"bold\",\"bolder\",\"lighter\",\"100\",\"200\",\"300\",\"400\",\"500\",\"600\",\"700\",\"800\",\"900\"]),ty=new Set([\"normal\",\"italic\",\"oblique\"]),ay=new Set([\"normal\",\"small-caps\"]),oy=new Set([\"normal\",\"condensed\",\"semi-condensed\",\"extra-condensed\",\"ultra-condensed\",\"expanded\",\"semi-expanded\",\"extra-expanded\",\"ultra-expanded\"]),iy=new Set([\"Dimension\",\"Identifier\",\"Percentage\",\"Number\",\"Function\",\"UnaryExpression\"]),ry=new Set([\"style\",\"variant\",\"weight\",\"stretch\"]),sy=\"Operator\",ly=\"Identifier\",cy=\"normal\";function dy(n){const e=qf(n),t=e.toLowerCase();if(ny.has(t))return{system:e};if(Qf.has(t))return{global:e};const a=n.children,o={lineHeight:cy,stretch:cy,style:cy,variant:cy,weight:cy},i={style:!1,variant:!1,weight:!1,stretch:!1};for(let n=a.head;n;n=n.next){const e=n.data.name||n.data.value||qf(n.data),t=e.toLowerCase();if(t!==cy)if(ey.has(t))i.weight||(o.weight=e,i.weight=!0);else if(ty.has(t))i.style||(o.style=e,i.style=!0);else if(ay.has(t))i.variant||(o.variant=e,i.variant=!0);else{if(!oy.has(t)){if(iy.has(n.data.type)){if(o.size=qf(n.data),n=n.next,n&&n.data.type==sy&&\"/\"==n.data.value&&n.next&&(o.lineHeight=qf(n.next.data),n=n.next.next),!n)throw my(\"Missing required font-family.\");o.family=[];let e=\"\";for(;n;){for(;n&&n.data.type==sy&&\",\"==n.data.value;)n=n.next;if(n)if(n.data.type==ly)for(;n&&n.data.type==ly;)e+=\" \"+qf(n.data),n=n.next;else e=hy(qf(n.data)),n=n.next;e=e.trim(),e&&(o.family.push(e),e=\"\")}return o}throw my(\"Unknown or unsupported font token: \"+e)}i.stretch||(o.stretch=e,i.stretch=!0)}else ry.forEach(n=>{i[n]||(o[n]=e)})}throw my(\"Missing required font-size.\")}function my(n){return new Error(\"[parse-css-font] \"+n)}function hy(n){return n?(('\"'===n[0]&&'\"'===n[n.length-1]||\"'\"===n[0]&&\"'\"===n[n.length-1])&&(n=n.slice(1,-1)),Do(n).trim()):n}var py=Object.freeze({__proto__:null,parse:dy});function uy(n,e=0){const t=[{mode:\"normal\",character:null}],a=[];let o=0,i=\"\",r=null,s=null,l=e,c=n;\"(\"===n[0]&&\")\"===n[n.length-1]&&(c=n.substring(1,n.length-1),l++);for(let n=0;n<c.length;n++){const e=c[n];if(\"'\"!==e&&'\"'!==e||(!0===t[o].isCalculationEnabled?(t.push({mode:\"string\",isCalculationEnabled:!1,character:e}),o++):\"string\"===t[o].mode&&t[o].character===e&&\"\\\\\"!==c[n-1]&&(t.pop(),o--)),\"{\"===e?(t.push({mode:\"interpolation\",isCalculationEnabled:!0}),o++):\"}\"===e&&(t.pop(),o--),\"normal\"===t[o].mode&&\":\"===e){const e=c.substring(n+1);s={type:\"value\",before:/^(\\s*)/.exec(e)[1],after:/(\\s*)$/.exec(e)[1],value:e.trim()},s.sourceIndex=s.before.length+n+1+l,r={type:\"colon\",sourceIndex:n+l,after:s.before,value:\":\"};break}i+=e}return i={type:\"media-feature\",before:/^(\\s*)/.exec(i)[1],after:/(\\s*)$/.exec(i)[1],value:i.trim()},i.sourceIndex=i.before.length+l,a.push(i),null!==r&&(r.before=i.after,a.push(r)),null!==s&&a.push(s),a}function gy(n,e=0){const t=[];let a,o=0,i=!1;function r(){return{before:\"\",after:\"\",value:\"\"}}a={before:\"\",after:\"\",value:\"\"};for(let s=0;s<n.length;s++){const l=n[s];i?(a.value+=l,\"{\"!==l&&\"(\"!==l||o++,\")\"!==l&&\"}\"!==l||o--):-1!==l.search(/\\s/)?a.before+=l:(\"(\"===l&&(a.type=\"media-feature-expression\",o++),a.value=l,a.sourceIndex=e+s,i=!0),!i||0!==o||\")\"!==l&&s!==n.length-1&&-1===n[s+1].search(/\\s/)||(-1!==[\"not\",\"only\",\"and\"].indexOf(a.value)&&(a.type=\"keyword\"),\"media-feature-expression\"===a.type&&(a.nodes=uy(a.value,a.sourceIndex)),t.push(Array.isArray(a.nodes)?new by(a):new fy(a)),a=r(),i=!1)}for(let n=0;n<t.length;n++)if(a=t[n],n>0&&(t[n-1].after=a.before),void 0===a.type){if(n>0){if(\"media-feature-expression\"===t[n-1].type){a.type=\"keyword\";continue}if(\"not\"===t[n-1].value||\"only\"===t[n-1].value){a.type=\"media-type\";continue}if(\"and\"===t[n-1].value){a.type=\"media-feature-expression\";continue}\"media-type\"===t[n-1].type&&(t[n+1]?a.type=\"media-feature-expression\"===t[n+1].type?\"keyword\":\"media-feature-expression\":a.type=\"media-feature-expression\")}if(0===n){if(!t[n+1]){a.type=\"media-type\";continue}if(t[n+1]&&(\"media-feature-expression\"===t[n+1].type||\"keyword\"===t[n+1].type)){a.type=\"media-type\";continue}if(t[n+2]){if(\"media-feature-expression\"===t[n+2].type){a.type=\"media-type\",t[n+1].type=\"keyword\";continue}if(\"keyword\"===t[n+2].type){a.type=\"keyword\",t[n+1].type=\"media-type\";continue}}if(t[n+3]&&\"media-feature-expression\"===t[n+3].type){a.type=\"keyword\",t[n+1].type=\"media-type\",t[n+2].type=\"keyword\";continue}}}return t}function wy(n){const e=[];let t=0,a=0;const o=/^(\\s*)url\\s*\\(/.exec(n);if(null!==o){let a=o[0].length,i=1;for(;i>0;){const e=n[a];\"(\"===e&&i++,\")\"===e&&i--,a++}e.unshift(new fy({type:\"url\",value:n.substring(0,a).trim(),sourceIndex:o[1].length,before:o[1],after:/^(\\s*)/.exec(n.substring(a))[1]})),t=a}for(let o=t;o<n.length;o++){const i=n[o];if(\"(\"===i&&a++,\")\"===i&&a--,0===a&&\",\"===i){const a=n.substring(t,o),i=/^(\\s*)/.exec(a)[1];e.push(new by({type:\"media-query\",value:a.trim(),sourceIndex:t+i.length,nodes:gy(a,t),before:i,after:/(\\s*)$/.exec(a)[1]})),t=o+1}}const i=n.substring(t),r=/^(\\s*)/.exec(i)[1];return e.push(new by({type:\"media-query\",value:i.trim(),sourceIndex:t+r.length,nodes:gy(i,t),before:r,after:/(\\s*)$/.exec(i)[1]})),e}function by(n){this.constructor(n),this.nodes=n.nodes,void 0===this.after&&(this.after=this.nodes.length>0?this.nodes[this.nodes.length-1].after:\"\"),void 0===this.before&&(this.before=this.nodes.length>0?this.nodes[0].before:\"\"),void 0===this.sourceIndex&&(this.sourceIndex=this.before.length),this.nodes.forEach(n=>{n.parent=this})}function fy(n){this.after=n.after,this.before=n.before,this.type=n.type,this.value=n.value,this.sourceIndex=n.sourceIndex}by.prototype=Object.create(fy.prototype),by.constructor=fy,by.prototype.walk=function(n,e){const t=\"string\"==typeof n||n instanceof RegExp,a=t?e:n,o=\"string\"==typeof n?new RegExp(n):n;for(let i=0;i<this.nodes.length;i++){const r=this.nodes[i];if((!t||o.test(r.type))&&a&&!1===a(r,i,this.nodes))return!1;if(r.nodes&&!1===r.walk(n,e))return!1}return!0},by.prototype.each=function(n=()=>{}){for(let e=0;e<this.nodes.length;e++){if(!1===n(this.nodes[e],e,this.nodes))return!1}return!0};var yy=Object.freeze({__proto__:null,parseMediaList:wy});const ky=\"___PRESERVED_TOKEN_\",vy={maxLineLen:0,expandVars:!1,uglyComments:!1,cuteComments:!1,debug:!1,output:\"\"},Sy=/url\\(\\s*([\"']?)data:/g,jy=/\\s+/g,xy=/\\n/g;const Cy=/(=\\s*?[\"']?)?#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])(\\}|[^0-9a-f{][^{]*?\\})/gi;const Ay=/@[a-z0-9-_]*keyframes\\s+[a-z0-9-_]+\\s*{/gi,Ly=/(^\\s|\\s$)/g;const zy=/\"([^\\\\\"])*\"/g,Ty=/\"(\\\\.)*\"/g,Ey=/\"(\\\\)*\"/g,Ry=/'([^\\\\'])*'/g,Iy=/'(\\\\.)*'/g,Dy=/'(\\\\)*'/g,My=/progid:DXImageTransform.Microsoft.Alpha\\(Opacity=/gi,Py=/\\r\\n/g,Ny=/[\\r\\n]/g,_y=/@variables\\s*\\{\\s*([^}]+)\\s*\\}/g,By=/\\s*([a-z0-9-]+)\\s*:\\s*([^;}]+)\\s*/gi,Oy=/var\\s*\\(\\s*([^)]+)\\s*\\)/g,Fy=/calc\\(([^;}]*)\\)/g,Uy=/(^\\s*|\\s*$)/g,qy=/\\( /g,Hy=/ \\)/g,Wy=/\\s*filter:\\s*progid:DXImageTransform.Microsoft.Matrix\\(([^)]+)\\);/g,Gy=/(^|\\})(([^{:])+:)+([^{]*{)/g,Vy=/\\s+([!{;:>+()\\],])/g,Ky=/([^\\\\])\\s+([}])/g,Jy=/!important/g,Yy=/___PSEUDOCLASSCOLON___/g,Zy=/:/g,$y=/\\s*(animation|animation-delay|animation-duration|transition|transition-delay|transition-duration):\\s*([^;}]+)/gi,Xy=/(^|\\D)0?\\.?0(m?s)/gi,Qy=/\\s*(flex|flex-basis):\\s*([^;}]+)/gi,nk=/\\s+/,ek=/(hsla?)\\(([^)]+)\\)/g,tk=/(^\\s+|\\s+$)/g,ak=/:first-(line|letter)(\\{|,)/gi,ok=/^(.*)(@charset)( \"[^\"]*\";)/gi,ik=/^((\\s*)(@charset)( [^;]+;\\s*))+/gi,rk=/@(font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframe|media|page|namespace)/gi,sk=/:(active|after|before|checked|disabled|empty|enabled|first-(?:child|of-type)|focus|hover|last-(?:child|of-type)|link|only-(?:child|of-type)|root|:selection|target|visited)/gi,lk=/^(.*)(@charset \"[^\"]*\";)/g,ck=/^(\\s*@charset [^;]+;\\s*)+/g,dk=/:(lang|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?any)\\(/gi,mk=/([:,( ]\\s*)(attr|color-stop|from|rgba|to|url|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|max|min|(?:repeating-)?(?:linear|radial)-gradient)|-webkit-gradient)/gi,hk=/\\s*\\/\\*/g,pk=/\\*\\/\\s*/g,uk=/\\band\\(/gi,gk=/([^:])not\\(/gi,wk=/\\bor\\(/gi,bk=/([!{}:;>+([,])\\s+/g,fk=/;+\\}/g,yk=/([0-9])\\.0(ex|ch|r?em|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|g?rad|turn|m?s|k?Hz|dpi|dpcm|dppx|%| |;)/gi,kk=/:0 0 0 0(;|\\})/g,vk=/:0 0 0(;|\\})/g,Sk=/(transform-origin|webkit-transform-origin|moz-transform-origin|o-transform-origin|ms-transform-origin|box-shadow):0(;|\\})/gi,jk=/(:|\\s)0+\\.(\\d+)/g,xk=/rgb\\s*\\(\\s*([0-9,\\s]+)\\s*\\)/gi,Ck=/(border|border-top|border-right|border-bottom|border-left|outline|background):none(;|\\})/gi,Ak=/progid:DXImageTransform\\.Microsoft\\.Alpha\\(Opacity=/gi,Lk=/\\(([-A-Za-z]+):([0-9]+)\\/([0-9]+)\\)/g,zk=/___QUERY_FRACTION___/g,Tk=/;;+/g,Ek=/(:|\\s)(#f00)(;|})/g,Rk=/___PRESERVED_NEWLINE___/g,Ik=/(:|\\s)(#000080)(;|})/g,Dk=/(:|\\s)(#808080)(;|})/g,Mk=/(:|\\s)(#808000)(;|})/g,Pk=/(:|\\s)(#800080)(;|})/g,Nk=/(:|\\s)(#c0c0c0)(;|})/g,_k=/(:|\\s)(#008080)(;|})/g,Bk=/(:|\\s)(#ffa500)(;|})/g,Ok=/(:|\\s)(#800000)(;|})/g;function Fk(n=\"\",e=vy){const t=[],a=[];let o;const i=n;function r(e){n=n.replace(e,n=>{const e=n.substring(0,1);if((n=n.slice(1,-1)).indexOf(\"___PRESERVE_CANDIDATE_COMMENT_\")>=0)for(let e=0,a=t.length;e<a;e+=1)n=n.replace(\"___PRESERVE_CANDIDATE_COMMENT_\"+e+\"___\",t[e]);return n=n.replace(My,\"alpha(opacity=\"),a.push(n),e+ky+(a.length-1)+\"___\"+e})}n=function(n,e){const t=Sy,a=n.length-1,o=[];let i,r=0;for(;null!==(i=t.exec(n));){const s=i.index+4;let l=i[1];0===l.length&&(l=\")\");let c=!1,d=t.lastIndex-1;for(;!1===c&&d+1<=a&&-1!=d;)d=n.indexOf(l,d+1),d>0&&\"\\\\\"!==n.charAt(d-1)&&(c=!0,\")\"!=l&&(d=n.indexOf(\")\",d)));if(o.push(n.substring(r,i.index)),c){let t=n.substring(s,d);const a=t.split(\",\");a.length>1&&\";base64\"==a[0].slice(-7)?t=t.replace(jy,\"\"):(t=t.replace(xy,\" \"),t=t.replace(jy,\" \"),t=t.replace(tk,\"\")),e.push(t);const i=\"url(\"+ky+(e.length-1)+\"___)\";o.push(i),r=d+1}else o.push(n.substring(i.index,t.lastIndex)),r=t.lastIndex}return o.push(n.substring(r)),o.join(\"\")}(n,a),n=function(n,e){const t=[];let a,o=0;for(;;){const i=n.indexOf(\"/*\",o);if(!(i>-1))break;if(a=n.indexOf(\"*/\",i+2),!(a>-1)){a=-2;break}e.push(n.slice(i+2,a)),t.push(n.slice(o,i)),t.push(\"/*___PRESERVE_CANDIDATE_COMMENT_\"+(e.length-1)+\"___*/\"),o=a+2}return t.push(n.slice(a+2)),t.join(\"\")}(n,t),r(zy),r(Ty),r(Ey),r(Ry),r(Iy),r(Dy);for(let o=0,i=t.length;o<i;o+=1){const i=t[o],r=\"___PRESERVE_CANDIDATE_COMMENT_\"+o+\"___\";if(\"!\"!==i.charAt(0))if(\"\\\\\"!==i.charAt(i.length-1)){if(0===i.length){const e=n.indexOf(r);e>2&&\">\"===n.charAt(e-3)&&(a.push(\"\"),n=n.replace(r,ky+(a.length-1)+\"___\"))}n=n.replace(`/*${r}*/`,\"\")}else a.push(\"\\\\\"),n=n.replace(r,ky+(a.length-1)+\"___\"),o+=1,a.push(\"\"),n=n.replace(\"___PRESERVE_CANDIDATE_COMMENT_\"+o+\"___\",ky+(a.length-1)+\"___\");else e.cuteComments?a.push(i.substring(1).replace(Py,\"\\n\")):e.uglyComments?a.push(i.substring(1).replace(Ny,\"\")):a.push(i),n=n.replace(r,ky+(a.length-1)+\"___\")}if(e.expandVars){const e={};o=_y,n=n.replace(o,(n,t)=>(o=By,t.replace(o,(n,t,a)=>(t&&a&&(e[t]=a),\"\")),\"\")),o=Oy,n=n.replace(o,(n,t)=>e[t]||\"none\")}n=n.replace(jy,\" \"),o=Fy,n=n.replace(o,(n,e)=>(a.push(\"calc(\"+e.replace(Uy,\"\").replace(qy,\"(\").replace(Hy,\")\")+\")\"),ky+(a.length-1)+\"___\")),o=Wy,n=n.replace(o,(n,e)=>(a.push(e),\"filter:progid:DXImageTransform.Microsoft.Matrix(\"+ky+(a.length-1)+\"___);\"));try{o=Gy,n=n.replace(o,n=>n.replace(Zy,\"___PSEUDOCLASSCOLON___\"))}catch(n){}if(n=(n=(n=(n=n.replace(Vy,\"$1\")).replace(Ky,\"$1$2\")).replace(Jy,\" !important\")).replace(Yy,\":\"),o=$y,n=n.replace(o,(n,e,t)=>e+\":\"+(t=t.replace(Xy,(n,e,t)=>(a.push(\"0\"+t),e+ky+(a.length-1)+\"___\")))),o=Qy,n=function(n,e){const t=Ay;let a,o=0;const i=(n,t)=>{\"0\"===(n=n.replace(Ly,\"\")).charAt(0)&&(e.push(n),a[t]=ky+(e.length-1)+\"___\")};for(;;){let e=0;a=\"\";let r=n.slice(o).search(t);if(r<0)break;o+=r,r=o;const s=n.length,l=[];for(;o<s;++o){const t=n.charAt(o);if(\"{\"===t)0===e?l.push(a.replace(Ly,\"\")):1===e&&(a=a.split(\",\"),a.forEach(i),l.push(a.join(\",\").replace(Ly,\"\"))),a=\"\",e+=1;else if(\"}\"===t){if(2===e)l.push(\"{\"+a.replace(Ly,\"\")+\"}\"),a=\"\";else if(1===e){n=n.slice(0,r)+l.shift()+\"{\"+l.join(\"\")+n.slice(o);break}e-=1}if(e<0)break;\"{\"!==t&&\"}\"!==t&&(a+=t)}}return n}(n=(n=n.replace(o,(n,e,t)=>{let o=t.split(nk);return a.push(o.pop()),o.push(ky+(a.length-1)+\"___\"),o=o.join(\" \"),`${e}:${o}`})).replace(ek,(n,e,t)=>{const o=[];return t.split(\",\").forEach(n=>{\"0%\"===(n=n.replace(tk,\"\"))?(a.push(\"0%\"),o.push(ky+(a.length-1)+\"___\")):o.push(n)}),e+\"(\"+o.join(\",\")+\")\"}),a),n=n.replace(ak,(n,e,t)=>\":first-\"+e.toLowerCase()+\" \"+t),n=e.cuteComments?(n=n.replace(hk,\"___PRESERVED_NEWLINE___/*\")).replace(pk,\"*/___PRESERVED_NEWLINE___\"):n.replace(pk,\"*/\"),o=ok,n=n.replace(o,(n,e,t,a)=>t.toLowerCase()+a+e),o=ik,n=n.replace(o,(n,e,t,a,o)=>t+a.toLowerCase()+o),o=rk,n=n.replace(o,(n,e)=>\"@\"+e.toLowerCase()),o=sk,n=(n=(n=n.replace(o,(n,e)=>\":\"+e.toLowerCase())).replace(lk,\"$2$1\")).replace(ck,\"$1\"),o=dk,n=n.replace(o,(n,e)=>\":\"+e.toLowerCase()+\"(\"),o=mk,n=(n=(n=(n=(n=(n=(n=(n=(n=n.replace(o,(n,e,t)=>e+t.toLowerCase())).replace(uk,\"and (\")).replace(gk,\"$1not (\")).replace(wk,\"or (\")).replace(bk,\"$1\")).replace(fk,\"}\")).replace(yk,\"$1$2\")).replace(kk,\":0$1\")).replace(vk,\":0$1\"),o=Sk,n=(n=n.replace(o,(n,e,t)=>e.toLowerCase()+\":0 0\"+t)).replace(jk,\"$1.$2\"),o=xk,n=function(n){const e=Cy,t=[];let a,o=0;for(;null!==(a=e.exec(n));)t.push(n.substring(o,a.index)),a[1]?t.push(a[1]+\"#\"+(a[2]+a[3]+a[4]+a[5]+a[6]+a[7])):a[2].toLowerCase()==a[3].toLowerCase()&&a[4].toLowerCase()==a[5].toLowerCase()&&a[6].toLowerCase()==a[7].toLowerCase()?t.push(\"#\"+(a[3]+a[5]+a[7]).toLowerCase()):t.push(\"#\"+(a[2]+a[3]+a[4]+a[5]+a[6]+a[7]).toLowerCase()),o=e.lastIndex=e.lastIndex-a[8].length;return t.push(n.substring(o)),t.join(\"\")}(n=n.replace(o,(n,e)=>{const t=e.split(\",\");let a=\"#\";for(let n=0;n<t.length;n+=1){let e=parseInt(t[n],10);e<16&&(a+=\"0\"),e>255&&(e=255),a+=e.toString(16)}return a})),n=(n=(n=(n=(n=(n=(n=(n=(n=n.replace(Ek,\"$1red$3\")).replace(Ik,\"$1navy$3\")).replace(Dk,\"$1gray$3\")).replace(Mk,\"$1olive$3\")).replace(Pk,\"$1purple$3\")).replace(Nk,\"$1silver$3\")).replace(_k,\"$1teal$3\")).replace(Bk,\"$1orange$3\")).replace(Ok,\"$1maroon$3\"),o=Ck,n=(n=(n=(n=n.replace(o,(n,e,t)=>e.toLowerCase()+\":0\"+t)).replace(Ak,\"alpha(opacity=\")).replace(Lk,\"($1:$2___QUERY_FRACTION___$3)\")).replace(zk,\"/\"),e.maxLineLen>0){const t=[];let a=[];for(let o=0,i=n.length;o<i;o+=1){const i=n.charAt(o);a.push(i),\"}\"===i&&a.length>e.maxLineLen&&(t.push(a.join(\"\")),a=[])}a.length&&t.push(a.join(\"\")),n=t.join(\"\\n\")}if(n=(n=n.replace(Tk,\";\")).replace(Uy,\"\"),a.length>1e3)return i;for(let e=a.length-1;e>=0;e--)n=n.replace(ky+e+\"___\",a[e],\"g\");return n=n.replace(Rk,\"\\n\")}var Uk=Object.freeze({__proto__:null,defaultOptions:vy,processString:Fk});function qk(n){function e(n){return\" \"===n||\"\\t\"===n||\"\\n\"===n||\"\\f\"===n||\"\\r\"===n}function t(e){let t;const a=e.exec(n.substring(g));if(a)return t=a[0],g+=t.length,t}const a=n.length,o=/^[ \\t\\n\\r\\u000c]+/,i=/^[, \\t\\n\\r\\u000c]+/,r=/^[^ \\t\\n\\r\\u000c]+/,s=/[,]+$/,l=/^\\d+$/,c=/^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;let d,m,h,p,u,g=0;const w=[];for(;;){if(t(i),g>=a)return w;d=t(r),m=[],\",\"===d.slice(-1)?(d=d.replace(s,\"\"),f()):b()}function b(){for(t(o),h=\"\",p=\"in descriptor\";;){if(u=n.charAt(g),\"in descriptor\"===p)if(e(u))h&&(m.push(h),h=\"\",p=\"after descriptor\");else{if(\",\"===u)return g+=1,h&&m.push(h),void f();if(\"(\"===u)h+=u,p=\"in parens\";else{if(\"\"===u)return h&&m.push(h),void f();h+=u}}else if(\"in parens\"===p)if(\")\"===u)h+=u,p=\"in descriptor\";else{if(\"\"===u)return m.push(h),void f();h+=u}else if(\"after descriptor\"===p)if(e(u));else{if(\"\"===u)return void f();p=\"in descriptor\",g-=1}g+=1}}function f(){let e,t,a,o,i,r,s,h,p,u=!1;const g={};for(o=0;o<m.length;o++)i=m[o],r=i[i.length-1],s=i.substring(0,i.length-1),h=parseInt(s,10),p=parseFloat(s),l.test(s)&&\"w\"===r?((e||t)&&(u=!0),0===h?u=!0:e=h):c.test(s)&&\"x\"===r?((e||t||a)&&(u=!0),p<0?u=!0:t=p):l.test(s)&&\"h\"===r?((a||t)&&(u=!0),0===h?u=!0:a=h):u=!0;u?console&&console.log&&console.log('Invalid srcset descriptor found in \"'+n+'\" at \"'+i+'\".'):(g.url=d,e&&(g.w=e),t&&(g.d=t),a&&(g.h=a),w.push(g))}}var Hk=Object.freeze({__proto__:null,process:qk});let Wk,Gk,Vk,Kk;Wk={},Wk.removeLeadingAndTrailingHTTPWhitespace=n=>n.replace(/^[ \\t\\n\\r]+/,\"\").replace(/[ \\t\\n\\r]+$/,\"\"),Wk.removeTrailingHTTPWhitespace=n=>n.replace(/[ \\t\\n\\r]+$/,\"\"),Wk.isHTTPWhitespaceChar=n=>\" \"===n||\"\\t\"===n||\"\\n\"===n||\"\\r\"===n,Wk.solelyContainsHTTPTokenCodePoints=n=>/^[-!#$%&'*+.^_`|~A-Za-z0-9]*$/.test(n),Wk.soleyContainsHTTPQuotedStringTokenCodePoints=n=>/^[\\t\\u0020-\\u007E\\u0080-\\u00FF]*$/.test(n),Wk.asciiLowercase=n=>n.replace(/[A-Z]/g,n=>n.toLowerCase()),Wk.collectAnHTTPQuotedString=(n,e)=>{let t=\"\";for(e++;;){for(;e<n.length&&'\"'!==n[e]&&\"\\\\\"!==n[e];)t+=n[e],++e;if(e>=n.length)break;const a=n[e];if(++e,\"\\\\\"!==a)break;if(e>=n.length){t+=\"\\\\\";break}t+=n[e],++e}return[t,e]};{const{solelyContainsHTTPTokenCodePoints:n}=Wk;Vk=e=>{let t=`${e.type}/${e.subtype}`;if(0===e.parameters.size)return t;for(let[a,o]of e.parameters)t+=\";\",t+=a,t+=\"=\",n(o)&&0!==o.length||(o=o.replace(/([\"\\\\])/g,\"\\\\$1\"),o=`\"${o}\"`),t+=o;return t}}{const{removeLeadingAndTrailingHTTPWhitespace:n,removeTrailingHTTPWhitespace:e,isHTTPWhitespaceChar:t,solelyContainsHTTPTokenCodePoints:a,soleyContainsHTTPQuotedStringTokenCodePoints:o,asciiLowercase:i,collectAnHTTPQuotedString:r}=Wk;Gk=s=>{s=n(s);let l=0,c=\"\";for(;l<s.length&&\"/\"!==s[l];)c+=s[l],++l;if(0===c.length||!a(c))return null;if(l>=s.length)return null;++l;let d=\"\";for(;l<s.length&&\";\"!==s[l];)d+=s[l],++l;if(d=e(d),0===d.length||!a(d))return null;const m={type:i(c),subtype:i(d),parameters:new Map};for(;l<s.length;){for(++l;t(s[l]);)++l;let n=\"\";for(;l<s.length&&\";\"!==s[l]&&\"=\"!==s[l];)n+=s[l],++l;if(n=i(n),l<s.length){if(\";\"===s[l])continue;++l}let c=null;if('\"'===s[l])for([c,l]=r(s,l);l<s.length&&\";\"!==s[l];)++l;else{for(c=\"\";l<s.length&&\";\"!==s[l];)c+=s[l],++l;if(c=e(c),\"\"===c)continue}n.length>0&&a(n)&&o(c)&&!m.parameters.has(n)&&m.parameters.set(n,c)}return m}}{const n=Gk,e=Vk,{asciiLowercase:t,solelyContainsHTTPTokenCodePoints:a,soleyContainsHTTPQuotedStringTokenCodePoints:o}=Wk;Kk=class{constructor(e){e=String(e);const t=n(e);if(null===t)throw new Error(`Could not parse MIME type string \"${e}\"`);this._type=t.type,this._subtype=t.subtype,this._parameters=new i(t.parameters)}static parse(n){try{return new this(n)}catch(n){return null}}get essence(){return`${this.type}/${this.subtype}`}get type(){return this._type}set type(n){if(0===(n=t(String(n))).length)throw new Error(\"Invalid type: must be a non-empty string\");if(!a(n))throw new Error(`Invalid type ${n}: must contain only HTTP token code points`);this._type=n}get subtype(){return this._subtype}set subtype(n){if(0===(n=t(String(n))).length)throw new Error(\"Invalid subtype: must be a non-empty string\");if(!a(n))throw new Error(`Invalid subtype ${n}: must contain only HTTP token code points`);this._subtype=n}get parameters(){return this._parameters}toString(){return e(this)}isJavaScript({allowParameters:n=!1}={}){switch(this._type){case\"text\":switch(this._subtype){case\"ecmascript\":case\"javascript\":case\"javascript1.0\":case\"javascript1.1\":case\"javascript1.2\":case\"javascript1.3\":case\"javascript1.4\":case\"javascript1.5\":case\"jscript\":case\"livescript\":case\"x-ecmascript\":case\"x-javascript\":return n||0===this._parameters.size;default:return!1}case\"application\":switch(this._subtype){case\"ecmascript\":case\"javascript\":case\"x-ecmascript\":case\"x-javascript\":return n||0===this._parameters.size;default:return!1}default:return!1}}isXML(){return\"xml\"===this._subtype&&(\"text\"===this._type||\"application\"===this._type)||this._subtype.endsWith(\"+xml\")}isHTML(){return\"html\"===this._subtype&&\"text\"===this._type}};class i{constructor(n){this._map=n}get size(){return this._map.size}get(n){return n=t(String(n)),this._map.get(n)}has(n){return n=t(String(n)),this._map.has(n)}set(n,e){if(n=t(String(n)),e=String(e),!a(n))throw new Error(`Invalid MIME type parameter name \"${n}\": only HTTP token code points are valid.`);if(!o(e))throw new Error(`Invalid MIME type parameter value \"${e}\": only HTTP quoted-string token code points are valid.`);return this._map.set(n,e)}clear(){this._map.clear()}delete(n){return n=t(String(n)),this._map.delete(n)}forEach(n,e){this._map.forEach(n,e)}keys(){return this._map.keys()}values(){return this._map.values()}entries(){return this._map.entries()}[Symbol.iterator](){return this._map[Symbol.iterator]()}}}var Jk=Object.freeze({__proto__:null,get MIMEType(){return Kk},cssMinifier:Uk,cssUnescape:Mo,fontPropertyParser:py,mediaQueryParser:yy,srcsetParser:Hk,zip:Oa});const Yk={normalizeFontFamily:Zi,flatten:rr,getFontWeight:ar,removeQuotes:tr},Zk=/\\s*,\\s*/,$k=/-/,Xk=/\\?/g,Qk=/^U\\+/i,nv=[/^normal$/,/^italic$/,/^oblique$/,/^oblique\\s+/];function ev(n,e,t,a){const o={rules:{processed:0,discarded:0},fonts:{processed:0,discarded:0}},i={declared:[],used:[]},r=n.createElement(\"style\");let s=\"\";n.body.appendChild(r),e.forEach(e=>{if(e.stylesheet){const t=e.stylesheet.children;t&&(o.processed+=t.size,o.discarded+=t.size,tv(t,i,a),s=pv(n,t,r,s))}}),t.forEach(n=>{const e=lv(n,a);e.length&&i.used.push(e),s=uv(n.children,r,s)}),r.remove(),s+=n.body.innerText,globalThis.getComputedStyle&&a.doc&&(i.used=i.used.map(n=>n.map(n=>{const e=n.match(/^var\\((--.*)\\)$/);if(e&&e[1]){const t=globalThis.getComputedStyle(a.doc.body).getPropertyValue(e[1]);return t&&t.split(\",\").map(n=>Yk.normalizeFontFamily(n))||n}return n})),i.used=i.used.map(n=>Yk.flatten(n)));let l,c;i.used.find(n=>n.find(n=>n.match(/^var\\(--/)))?l=[]:(c=new Map,i.used.forEach(n=>n.forEach(n=>{if(i.declared.find(e=>e.fontFamily==n)){const e=a.usedFonts&&a.usedFonts.filter(e=>e[0]==n);e&&e.length&&c.set(n,e)}})),l=i.declared.filter(n=>!c.has(n.fontFamily)));const d=Array.from(new Set(s)).map(n=>n.charCodeAt(0)).sort((n,e)=>n-e);return e.forEach(n=>{if(n.stylesheet){const e=n.stylesheet.children;e&&(av(e,i.declared,l,c,d),o.rules.discarded-=e.size)}}),o}function tv(n,e,t){n.forEach(n=>{if(\"Atrule\"==n.type&&(\"media\"==n.name||\"supports\"==n.name||\"layer\"==n.name||\"container\"==n.name)&&n.block&&n.block.children)tv(n.block.children,e,t);else if(\"Rule\"==n.type){const a=lv(n.block,t);a.length&&e.used.push(a)}else if(\"Atrule\"==n.type&&\"font-face\"==n.name){const t=Yk.normalizeFontFamily(sv(n.block.children,\"font-family\"));if(t){const a=sv(n.block.children,\"font-weight\")||\"400\",o=sv(n.block.children,\"font-style\")||\"normal\",i=sv(n.block.children,\"font-variant\")||\"normal\";a.split(\",\").forEach(n=>e.declared.push({fontFamily:t,fontWeight:Yk.getFontWeight(Yk.removeQuotes(n)),fontStyle:o,fontVariant:i}))}}})}function av(n,e,t,a,o){const i=[];for(let r=n.head;r;r=r.next){const n=r.data;if(\"Atrule\"==n.type&&\"import\"==n.name&&n.prelude&&n.prelude.children&&n.prelude.children.head.data.importedChildren)av(n.prelude.children.head.data.importedChildren,e,t,a,o);else if(\"Atrule\"==n.type&&(\"media\"==n.name||\"supports\"==n.name||\"layer\"==n.name||\"container\"==n.name)&&n.block&&n.block.children)av(n.block.children,e,t,a,o);else if(\"Atrule\"==n.type&&\"font-face\"==n.name){const s=Yk.normalizeFontFamily(sv(n.block.children,\"font-family\"));if(s){const l=sv(n.block.children,\"unicode-range\");!t.find(n=>n.fontFamily==s)&&wv(o,l)&&ov(n,s,e,a)||i.push(r)}const l=[];for(let e=n.block.children.head;e;e=e.next)\"font-display\"==e.data.property&&l.push(e);l.length&&l.forEach(e=>n.block.children.remove(e))}}i.forEach(e=>n.remove(e))}function ov(n,e,t,a){let o;const i=a&&a.get(e);if(i&&i.length){let a=sv(n.block.children,\"font-style\")||\"normal\";if(nv.find(n=>a.trim().match(n))){const r=Yk.getFontWeight(sv(n.block.children,\"font-weight\")||\"400\"),s=t.filter(n=>n.fontFamily==e&&n.fontStyle==a).map(n=>n.fontWeight.split(\" \")).sort((n,e)=>Number.parseInt(n[0],10)-Number.parseInt(e[0],10));let l=i.map(n=>dv(n,a,s)).filter(n=>n);o=iv(r,l),o||(l=i.map(n=>((n=Array.from(n))[2]=\"normal\",dv(n,a,s))).filter(n=>n),o=iv(r,l),o||(l=i.map(n=>((n=Array.from(n))[2]=a=\"normal\",dv(n,a,s))).filter(n=>n),o=iv(r,l)))}else o=!0}else o=!0;return o}function iv(n,e){let t;for(const a of n.split(\",\")){let{min:n,max:o}=rv(a);o||(o=900),t=t||e.find(e=>{let{min:t,max:a}=rv(e);return a||(a=t),t>=n&&a<=o})}return t}function rv(n){const e=n.split(\" \");return{min:Number.parseInt(Yk.getFontWeight(e[0]),10),max:e[1]&&Number.parseInt(Yk.getFontWeight(e[1]),10)}}function sv(n,e){let t;if(n&&(t=n.filter(n=>n.property==e).tail),t)try{return Yk.removeQuotes(qf(t.data.value)).toLowerCase()}catch(n){}}function lv(n,e){let t=n.children.filter(n=>\"font-family\"==n.property).tail,a=[];t&&(t.data.value.children?cv(t.data.value,a):(t=qf(t.data.value),t&&a.push(Yk.normalizeFontFamily(t))));const o=n.children.filter(n=>\"font\"==n.property).tail;if(o&&o.data&&o.data.value)try{let n=o.data.value;const t=qf(n).match(/^var\\((--.*)\\)$/);t&&t[1]&&(n=Uf(globalThis.getComputedStyle(e.doc.body).getPropertyValue(t[1]),{context:\"value\"}));dy(n).family.forEach(n=>a.push(Yk.normalizeFontFamily(n)))}catch(n){}return a}function cv(n,e){let t=n.children.head;for(;t;)if(\"Identifier\"==t.data.type){let n=t.data.name,a=t.next;for(;a&&\"Operator\"!=a.data.type&&\",\"!=a.data.value;)n+=\" \"+a.data.name,a=a.next;e.push(Yk.normalizeFontFamily(n)),t=t.next}else if(\"Function\"==t.data.type&&\"var\"==t.data.name&&t.data.children){const n=t.data.children.head.data.name;e.push(Yk.normalizeFontFamily(\"var(\"+n+\")\"));let a=t.data.children.head.next;for(;a&&\"Operator\"==a.data.type&&\",\"==a.data.value;)a=a.next;const o=a;o&&(o.data.children?cv(o.data,e):e.push(Yk.normalizeFontFamily(o.data.value))),t=t.next}else\"String\"==t.data.type?(e.push(Yk.normalizeFontFamily(t.data.value)),t=t.next):\"Number\"==t.data.type?(e.push(Yk.normalizeFontFamily(String(t.data.value))),t=t.next):t=t.next}function dv(n,e,t){let a;if(t=t.map(n=>n.map(n=>String(Number.parseInt(n,10)))),n[2]==e){let e=Number(n[1]);t.length>1?(e>=400&&e<=500&&(a=t.find(n=>n[0]>=e&&n[0]<=500),a||(a=mv(e,t)),a||(a=hv(e,t))),e<400&&(a=t.slice().reverse().find(n=>n[n.length-1]<=e),a||(a=hv(e,t))),e>500&&(a=t.find(n=>n[0]>=e),a||(a=mv(e,t))),a||(a=t.find(n=>n[0]<=e&&n[n.length-1]>=e))):a=t[0]}return a?a.join(\" \"):void 0}function mv(n,e){return e.slice().reverse().find(e=>e[e.length-1]<n)}function hv(n,e){return e.find(e=>e[0]>n)}function pv(n,e,t,a){return e.forEach(e=>{e.block&&e.block.children&&e.prelude&&e.prelude.children&&(\"Atrule\"!=e.type||\"media\"!=e.name&&\"supports\"!=e.name&&\"layer\"!=e.name&&\"container\"!=e.name?\"Rule\"==e.type&&(a=uv(e.block.children,t,a)):a=pv(n,e.block.children,t,a))}),a}function uv(n,e,t){const a=gv(n,\"content\",e),o=gv(n,\"quotes\",e);return t.includes(a)||(t+=a),t.includes(o)||(t+=o),t}function gv(n,e,t){const a=sv(n,e)||\"\";return a?(t.textContent='tmp { content:\"'+a+'\"}',t.sheet&&t.sheet.cssRules?Yk.removeQuotes(t.sheet.cssRules[0].style.getPropertyValue(\"content\")):a):\"\"}function wv(n,e){if(e){const t=e.split(Zk),a=t.filter(e=>{const t=e.split($k);if(2==t.length)t[0]=bv(t[0]),t[1]=bv(t[1]);else if(1==t.length)if(t[0].includes(\"?\")){const n=t[0],e=n;t[0]=bv(n.replace(Xk,\"0\")),t[1]=bv(e.replace(Xk,\"F\"))}else t[0]&&(t[0]=t[1]=bv(t[0]));if(!t[0]||n.find(n=>n>=t[0]&&n<=t[1]))return!0});return Boolean(!t.length||a.length)}return!0}function bv(n){return n=n.replace(Qk,\"\"),parseInt(n,16)}var fv=Object.freeze({__proto__:null,process:ev});function yv(n){if(!n||!n.nodes)return!1;for(const e of n.nodes)if(e&&\"keyword\"===e.type&&e.value&&\"not\"===e.value.toLowerCase())return!0;return!1}function kv(n,e){for(let t=e-1;t>=0;t--){const e=n.nodes[t];if(e){if(\"operator\"===e.type&&\",\"===e.value)break;if(\"keyword\"===e.type&&e.value&&\"not\"===e.value.toLowerCase())return!0}}return!1}function vv(n,e=[]){for(let t=0;t<n.nodes.length;t++){const a=n.nodes[t];if(\"media-query\"!=a.type){if(\"media-type\"==a.type){const o=kv(n,t);e.push({not:o,value:a.value})}}else vv(a,e)}return e}function Sv(n){if(!n||!n.nodes)return!1;for(const e of n.nodes)if(e){if(\"media-feature-expression\"===e.type)return!0;if(\"keyword\"===e.type&&e.value&&\"and\"===e.value.toLowerCase())return!0}return!!yv(n)}const jv={flatten:rr},xv=\"all\";function Cv(n,{keepPrintStyleSheets:e}={}){const t={processed:0,discarded:0};return n.forEach((a,o)=>{if(a.stylesheet)if(Lv(a.mediaText||xv,e)&&a.stylesheet.children){Av(a.stylesheet.children,t,e).forEach(({cssRules:n,cssRule:e})=>n.remove(e))}else n.delete(o),o.element&&o.element.remove()}),t}function Av(n,e,t,a=[]){for(let o=n.head;o;o=o.next){const i=o.data;\"Atrule\"==i.type&&\"media\"==i.name&&i.block&&i.block.children&&i.prelude&&i.prelude.children&&(e.processed++,Lv(qf(i.prelude),t)?Av(i.block.children,e,t,a):(a.push({cssRules:n,cssRule:o}),e.discarded++))}return a}function Lv(n,e){let t;try{t=function(n){return wy(n)}(n);for(const n of t)if(n&&n.nodes){if(Sv(n))return!0;if(yv(n))return!0}}catch{return!0}let a=jv.flatten(t.filter(n=>n&&n.nodes).map(n=>vv(n)));return a&&a.length||(a=[{not:!1,value:xv}]),a.some(n=>!n.not&&(\"screen\"==n.value||n.value==xv||e&&\"print\"==n.value))}var zv=Object.freeze({__proto__:null,process:Cv});function Tv(n,e={a:0,b:0,c:0}){if(!n||!n.type)return e;switch(n.type){case\"Selector\":Rv(n.children,n=>Tv(n,e));break;case\"IdSelector\":e.a++;break;case\"ClassSelector\":case\"AttributeSelector\":e.b++;break;case\"TypeSelector\":\"*\"!==n.name&&e.c++;break;case\"PseudoElementSelector\":e.c++;break;case\"PseudoClassSelector\":{const t=n.name.toLowerCase();if(\"where\"===t)break;if(\"is\"===t||\"not\"===t||\"has\"===t){Rv(n.children,n=>{\"SelectorList\"===n.type&&Ev(e,Iv(n))});break}if(\"nth-child\"===t||\"nth-last-child\"===t){e.b++,Rv(n.children,n=>{\"Nth\"===n.type&&n.selector&&Ev(e,Iv(n.selector))});break}\"scope\"===t?e.c++:e.b++;break}}return e}function Ev(n,e){n.a+=e.a,n.b+=e.b,n.c+=e.c}function Rv(n,e){if(!n)return;let t=n.head;for(;t;)e(t.data),t=t.next}function Iv(n){let e={a:0,b:0,c:0};return Rv(n.children,n=>{const t=Tv(n,{a:0,b:0,c:0});(t.a>e.a||t.a===e.a&&t.b>e.b||t.a===e.a&&t.b===e.b&&t.c>e.c)&&(e=t)}),e}function Dv(n,e,t){if(!e||!e.length){let e={a:0,b:0,c:0};const a=[];return Gf(n,{enter(n){if(a.push(n),\"Selector\"===n.type){if(a.some(n=>\"PseudoClassSelector\"===n.type&&\"where\"===n.name))return;const t=Tv(n);(t.a>e.a||t.a===e.a&&t.b>e.b||t.a===e.a&&t.b===e.b&&t.c>e.c)&&(e=t)}},leave(){a.pop()}}),t&&t.length&&e.b++,e}const a=qf(n);let o=[\"\"];e.forEach(n=>{if(!n||!n.children||!n.children.size)return;const e=n.children.toArray(),t=[];o.forEach(n=>e.forEach(e=>{const a=qf(e),o=n?n+\" \"+a:a;t.includes(o)||t.push(o)})),t.length&&(o=t)});let i={a:0,b:0,c:0};const r=new Set;return o.forEach(n=>{const e=function(n,e){return n?e?-1!==e.indexOf(\"&\")?e.split(\"&\").join(n):n+\" \"+e:n:e}(n,a);if(!r.has(e)){r.add(e);try{const n=Dv(Uf(e,{context:\"selectorList\"}));(n.a>i.a||n.a===i.a&&n.b>i.b||n.a===i.a&&n.b===i.b&&n.c>i.c)&&(i=n)}catch{}}}),i}const Mv=new Set([\"after\",\"before\",\"first-letter\",\"first-line\",\"placeholder\",\"selection\",\"part\",\"marker\"]);function Pv(n){if(!n||!n.children)return[];const e=[];for(let t=n.children.head;t;t=t.next){const n=t.data;e.push({data:n,text:qf(n)})}return e}const Nv=[\"root\",\"empty\",\"first-child\",\"last-child\",\"only-child\",\"first-of-type\",\"last-of-type\",\"only-of-type\"],_v=[\"nth-child\",\"nth-last-child\",\"heading\",\"nth-of-type\",\"nth-last-of-type\"],Bv=[\"not\",\"is\",\"where\",\"has\"];function Ov(n,e,t){if(t.normalizedSelectorText||(t.normalizedSelectorText=new WeakMap),t.normalizedSelectorText.has(n))return t.normalizedSelectorText.get(n);const a=Uf(qf(n.data),{context:\"selectorList\"});Fv(a,e);let o=qf(a);return o&&o.trim()||(o=\"*\"),t.normalizedSelectorText.set(n,o),o}function Fv(n,e){let t=n.children.head;for(;t;){const a=t.next,o=t.data;if(\"NestingSelector\"===o.type){if(e&&e.length){const a=e[e.length-1];let o=a&&a.data?a.data:a;if(o&&\"SelectorList\"===o.type&&o.children&&o.children.tail&&(o=o.children.tail.data),o&&o.children){for(let e=o.children.head;e;e=e.next){const a=Pf(e.data);n.children.insertData(a,t)}n.children.remove(t)}}}else\"TypeSelector\"===o.type&&\"string\"==typeof o.name&&o.name.includes(\"|\")?o.name=o.name.substring(o.name.lastIndexOf(\"|\")+1):\"PseudoElementSelector\"===o.type?n.children.remove(t):\"PseudoClassSelector\"===o.type?qv(o)&&Uv(n.children,t):\"Selector\"===o.type&&Fv(o,e);t=a}}function Uv(n,e){null==e.prev||\"Combinator\"==e.prev.data.type||\"WhiteSpace\"==e.prev.data.type?n.replace(e,Uf(\"*\",{context:\"selector\"}).children.head):n.remove(e)}function qv(n){const e=n.name.toLowerCase();return n.children?!_v.includes(e)&&!Bv.includes(e):!Nv.includes(e)}const Hv=new Set([\"after\",\"before\",\"first-letter\",\"first-line\"]),Wv=\"media\",Gv=\"supports\",Vv=new Set([Wv,Gv,\"container\"]),Kv=\"Rule\",Jv=\"Atrule\",Yv=\"Declaration\",Zv=\"Raw\",$v=\"Value\",Xv=\"layer\",Qv=\"font-face\",nS=\"keyframes\",eS=\"style\",tS=\"selectorList\",aS=\"declarationList\",oS=\"-\",iS=\"|\",rS=/\\\\(?![0-9a-fA-F]{1,6}\\s|[^0-9a-zA-Z])/;function sS(n,e){const t={doc:n,stats:{processed:0,discarded:0},matchedElements:new Set,matchedSelectors:new Map,matchingSelectors:new Map,layerDeclarationCounter:0,layerDeclarations:[],layerOrder:new Map,selectorData:new Map,selectorTexts:new Map,preludeTexts:new Map,rulesCounter:0,scopeIdCounter:0};return function(n,e){n.forEach((n,t)=>{n.scoped||!n.stylesheet||t.urlNode||TS(n.stylesheet)&&lS(n.stylesheet.children,{layerStack:[],conditionalStack:[]},e)})}(e,t),function(n){const e=[];for(let t=0;t<n.layerDeclarations.length;t++){const a=n.layerDeclarations[t];e.push(a.name)}for(let t=0;t<e.length;t++){const a=e[t];n.layerOrder.has(a)||n.layerOrder.set(a,n.layerOrder.size)}}(t),function(n,e){n.forEach((t,a)=>{if(!t.scoped&&t.stylesheet&&!a.urlNode&&TS(t.stylesheet)){const a=t.mediaText?[{name:Wv,prelude:t.mediaText}]:[];hS(t.stylesheet.children,n,{ancestorsSelectors:[],layerStack:[],scopeStack:[],conditionalStack:a},e)}})}(e,t),function(n){const e=new Set;n.matchedElements.forEach(t=>function(n,e,t){const a=new Map,o=function(n,e){const t=e.matchingSelectors.get(n),a=[];t.forEach(n=>{const t=e.selectorData.get(n).rule;if(TS(t.block)){for(let a=t.block.children.head;a;a=a.next){const{type:t,value:o}=a.data;t===Yv&&o&&i(a,e.selectorData.get(n).specificity,!1,n)}}});const o=function(n){const e=n.getAttribute(eS);if(e){let n;try{n=Uf(e,{context:aS})}catch{return[]}const t=[];for(let e=n.children&&n.children.head;e;e=e.next)e.data.type===Yv&&t.push({declaration:e,specificity:{a:1,b:0,c:0},isInline:!0});return t}return[]}(n);for(const n of o)i(n.declaration,n.specificity,!0);return a;function i(n,e,t,o){const{property:i,value:r}=n.data,s=r.type===Zv,l=TS(r)||r.type===Zv;let c;if(r.type===$v&&l&&1==r.children.size&&(r.children.head.data.name&&(c=r.children.head.data.name.startsWith(oS)||rS.test(r.children.head.data.name)),!i.startsWith(oS)&&r.children.head.data.value))try{c=!Hf.matchProperty(i,r).matched}catch{}!l||s||c||a.push({declaration:n,selector:o,specificity:e,isInline:t})}}(n,t),i=new Map;o.forEach(n=>{const{selector:e}=n,a=bS(fS(e,t));i.has(a)||i.set(a,[]),i.get(a).push(n)}),i.forEach(n=>{n.sort((n,e)=>function(n,e,t){const a=n.declaration.data.important?1:0,o=e.declaration.data.important?1:0;if(a!==o)return a-o;if(n.isInline&&!e.isInline)return 1;if(!n.isInline&&e.isInline)return-1;const i=n.selector?t.selectorData.get(n.selector):null,r=e.selector?t.selectorData.get(e.selector):null;if(i&&r){const o=function(n,e,t){const a=0===n.length,o=0===e.length;if(a&&o)return 0;if(a)return 1;if(o)return-1;const i=IS(n),r=IS(e);if(i===r)return 0;const s=Math.min(n.length,e.length),l=t.layerOrder;for(let t=0;t<s;t++)if(n[t]!==e[t]){const a=IS(n.slice(0,t+1)),o=IS(e.slice(0,t+1)),i=l.get(a),r=l.get(o);return void 0!==i&&void 0!==r?i-r:void 0!==i?-1:void 0!==r?1:0}return n.length-e.length}(i.layerStack,r.layerStack,t);if(0!==o)return a?-o:o;const s=n.specificity,l=e.specificity;return s.a!==l.a?s.a-l.a:s.b!==l.b?s.b-l.b:s.c!==l.c?s.c-l.c:i.rule.order!==r.rule.order?i.rule.order-r.rule.order:0}{const t=n.specificity,a=e.specificity;return t.a!==a.a?t.a-a.a:t.b!==a.b?t.b-a.b:t.c!==a.c?t.c-a.c:0}}(n,e,t)),n.forEach(n=>{const{selector:e,declaration:o}=n,i=fS(e,t);a.set(o.data.property+\":\"+bS(i),{selector:e,declaration:o})})}),a.forEach(({declaration:n})=>e.add(n))}(t,e,n)),function(n,e){const t=new Map,a=new Set;e.matchedElements.forEach(n=>{const o=e.matchingSelectors.get(n);o&&o.forEach(n=>{const o=e.selectorData.get(n).rule;if(TS(o.block)){const n=o.block.children;for(let e=n.head;e;e=e.next)if(e.data.type===Yv){t.set(e,n);const{property:i,value:r}=e.data;(i&&i.startsWith(\"--\")||r&&r.type===Zv||o.hasUnqueryableSelector)&&a.add(e)}}})}),t.forEach((e,t)=>{n.has(t)||a.has(t)||e.remove(t)})}(e,n)}(t),function(n,e){n.forEach((n,t)=>{n.scoped||!n.stylesheet||t.urlNode||TS(n.stylesheet)&&AS(n.stylesheet.children,e)})}(e,t),t.stats}function lS(n,e,t){const{layerStack:a,conditionalStack:o}=e;for(let i=n.head;i;i=i.next){const n=i.data;if(n.type===Jv&&n.name===Xv)cS(n,a,o,t);else if(n.type===Jv&&TS(n.block)){const e=dS(o,n,t);lS(n.block.children,{layerStack:a,conditionalStack:e},t)}else n.type===Kv&&TS(n.block)&&lS(n.block.children,e,t)}}function cS(n,e,t,a){if(n.block){const o=RS(n.prelude,a);mS(e,o,t,a),lS(n.block.children,{layerStack:[...e,o],conditionalStack:t},a)}else if(n.prelude){RS(n.prelude,a).split(\",\").forEach(n=>mS(e,n,t,a))}}function dS(n,e,t){return Vv.has(e.name)?[...n,{name:e.name,prelude:RS(e.prelude,t)}]:n}function mS(n,e,t,a){const o=IS([...n,e]);a.layerDeclarations.push({name:o,order:a.layerDeclarationCounter++,conditionalStack:t.slice()})}function hS(n,e,t,a){const o=new Set;for(let i=n.head;i;i=i.next)a.stats.processed++,pS(i.data,i,e,t,o,a);o.forEach(e=>n.remove(e))}function pS(n,e,t,a,o,i){n.type===Jv&&\"import\"===n.name&&TS(n.prelude)&&n.prelude.children.head.data.importedChildren?function(n,e,t,a,o,i){const r=n.prelude.children.head.data,s=r.importedMediaText?[{name:Wv,prelude:r.importedMediaText}]:[];void 0!==r.importedLayerName&&s.push({name:Xv,prelude:r.importedLayerName});void 0!==r.importedSupportsCondition&&s.push({name:Gv,prelude:r.importedSupportsCondition});hS(r.importedChildren,t,{...a,conditionalStack:s},i)}(n,0,t,a,0,i):n.type===Jv&&n.name===Xv&&TS(n.block)?function(n,e,t,a,o,i){const r=RS(n.prelude,i),s={...a,layerStack:[...a.layerStack,r]};LS(n),hS(n.block.children,t,s,i),TS(n.block)||(i.stats.discarded++,o.add(e))}(n,e,t,a,o,i):n.type===Jv&&\"scope\"===n.name&&TS(n.block)?function(n,e,t,a,o,i){let r;try{r=function(n,e,t){const a=e.scopeStack||[],o=n&&n.include?n.include:[];let i=[];i=o.length?function(n,e,t){const a=new Set;return n.forEach(n=>{const o=Ov(n,null,t);xS(MS(t.doc,o),e).forEach(n=>a.add(n))}),Array.from(a)}(o,a,t):a.length?Array.from(a[a.length-1].rootElements):function(n){const e=[];n.doc&&n.doc.documentElement&&e.push(n.doc.documentElement);!e.length&&n.doc&&n.doc.body&&e.push(n.doc.body);!e.length&&n.doc&&n.doc.children&&e.push(...Array.from(n.doc.children).filter(n=>1===n.nodeType));return e}(t);const r=Array.from(new Set(i.filter(Boolean)));if(!r.length)return null;const s=function(n,e,t){const a=new Set;if(!n.length||!e.length)return a;return n.forEach(n=>{const o=Ov(n,null,t);e.forEach(n=>{kS(n,o).forEach(n=>a.add(n))})}),a}(n.exclude||[],r,t);return{id:t.scopeIdCounter++,rootElements:new Set(r),stopElements:s}}(function(n){if(!n)return{include:[],exclude:[]};const e=function(n){if(!n||!n.children)return null;for(let e=n.children.head;e;e=e.next)if(e.data&&\"Scope\"===e.data.type)return e.data;return null}(n);if(!e)return{include:[],exclude:[]};const t=Pv(e.root),a=Pv(e.limit);function o(n){let e=!1;return Gf(n,{visit:\"PseudoElementSelector\",enter(){e=!0}}),e||Gf(n,{visit:\"PseudoClassSelector\",enter(n){const t=(n.name||\"\").toLowerCase();Mv.has(t)&&(e=!0)}}),e}for(const n of t)if(o(n.data))throw new Error(\"Pseudo-elements are not allowed in @scope prelude (scope-start)\");for(const n of a)if(o(n.data))throw new Error(\"Pseudo-elements are not allowed in @scope prelude (scope-end)\");return{include:t,exclude:a}}(n.prelude),a,i)}catch(n){}if(!r)return i.stats.discarded++,void o.add(e);const s={...a,scopeStack:[...a.scopeStack||[],r]};LS(n),hS(n.block.children,t,s,i),TS(n.block)||(i.stats.discarded++,o.add(e))}(n,e,t,a,o,i):n.type===Jv&&n.name!==Qv&&n.name!==nS&&!n.name.startsWith(oS)&&TS(n.block)?function(n,e,t,a,o,i){const r=dS(a.conditionalStack,n,i),s={...a,conditionalStack:r};LS(n),hS(n.block.children,t,s,i),TS(n.block)||(i.stats.discarded++,o.add(e))}(n,e,t,a,o,i):n.type===Kv&&TS(n.prelude)&&function(n,e,t,a,o,i){n.order=i.rulesCounter++;const r=function(n,e,t){const a=[],{ancestorsSelectors:o}=e;for(let i=n.prelude.children.head,r=0;i;i=i.next,r++){const{startsWithCombinator:r,hasUnqueryableSelector:s}=uS(i.data);if(s&&(n.hasUnqueryableSelector=!0),wS(i,n,e,t),!(s||r&&o&&o.length)){const n=yS(i,o,e.scopeStack,t);n.length?gS(n,i,t):a.push(i)}}return a}(n,a,i),s=function(n,e,t,a,o){e&&e.length&&e.forEach(e=>n.prelude.children.remove(e));if(!TS(n.prelude))return o.stats.discarded++,t.add(a),!0;return!1}(n,r,o,e,i);!s&&TS(n.block)&&function(n,e,t,a){LS(n);const o={...t,ancestorsSelectors:[...t.ancestorsSelectors,n.prelude]};hS(n.block.children,e,o,a)}(n,t,a,i)}(n,e,t,a,o,i)}function uS(n){let e=!1,t=!1;Gf(n,{enter(n){(\"PseudoElementSelector\"===n.type||\"PseudoClassSelector\"===n.type&&(Hv.has(n.name)||qv(n)))&&(e=!0)}});const a=n.children.head.data;return t=a&&\"Combinator\"===a.type,{hasUnqueryableSelector:e,startsWithCombinator:t}}function gS(n,e,t){n.forEach(n=>{t.matchedElements.add(n);let a=t.matchingSelectors.get(n);a||(a=[],t.matchingSelectors.set(n,a),n.matchingSelectors=a),a.push(e)})}function wS(n,e,t,a){const{ancestorsSelectors:o,layerStack:i,scopeStack:r,conditionalStack:s}=t;a.selectorData.set(n,{specificity:Dv(n.data,o,r),rule:e,layerStack:i,conditionalStack:s})}function bS(n){return n.map(n=>`${n.name}:${n.prelude}`).join(\"|\")}function fS(n,e){let t=[];if(n){const a=e.selectorData.get(n);a&&a.conditionalStack&&(t=a.conditionalStack)}return t}function yS(n,e,t,a){const o=function(n,e,t){let a;if(e&&e.length){a=function(n,e,t){const a=ES(n,t);if(e&&e.length){let n=[\"\"];e.forEach(e=>{if(TS(e)){const a=e.children.toArray(),o=[];n.forEach(n=>a.forEach(e=>{const a=ES(e,t),i=n?zS(n,a):a;o.includes(i)||o.push(i)})),o.length&&(n=o)}});const o=new Set;return n.forEach(n=>{const e=n?zS(n,a):a;o.add(e)}),Array.from(o).join(\",\")}return a}(n.data,e,t);a=Ov({data:DS(a,tS)},e,t)}a||(a=Ov(n,e,t));return a}(n,e,a),i=function(n,e){if(!e||!e.length)return n;const t=e.map(n=>n.id).join(iS);return`${n}${iS}${t}`}(o,t),r=a.matchedSelectors.get(i);if(r)return r;let s;return t&&t.length?(s=function(n,e){const t=e[e.length-1],a=Array.from(t.rootElements);if(!a.length)return[];const o=new Set;return a.forEach(e=>{kS(e,n).forEach(n=>o.add(n))}),Array.from(o)}(o,t),s=xS(s,t)):s=MS(a.doc,o),a.matchedSelectors.set(i,s),s}function kS(n,e){const t=new Set;if(!n||1!==n.nodeType)return t;let a;vS(n,e)&&t.add(n);try{a=n.querySelectorAll(e)}catch{a=SS([n],e,!0)}for(const n of a)t.add(n);return Array.from(t)}function vS(n,e){if(!n||1!==n.nodeType)return!1;try{return n.matches(e)}catch{return!1}}function SS(n,e,t){const a=[],o=new Set,i=[];for(n.forEach(n=>{n&&1===n.nodeType&&i.push({node:n,include:!t})});i.length;){const{node:n,include:t}=i.pop();if(n&&!o.has(n)){o.add(n),t&&vS(n,e)&&a.push(n);for(let e=n.firstElementChild;e;e=e.nextElementSibling)i.push({node:e,include:!0})}}return a}function jS(n){if(!n)return[];if(9===n.nodeType||11===n.nodeType){const e=[];return n.documentElement&&e.push(n.documentElement),!n.body||e.length&&n.body===e[0]||e.push(n.body),!e.length&&n.children&&e.push(...Array.from(n.children).filter(n=>1===n.nodeType)),e}return[n]}function xS(n,e){return e&&e.length?n.filter(n=>function(n,e){if(!n)return!1;for(let t=0;t<e.length;t++)if(!CS(n,e[t]))return!1;return!0}(n,e)):n}function CS(n,e){let t=n;for(;t&&1===t.nodeType;){if(e.stopElements&&e.stopElements.has(t))return!1;if(e.rootElements.has(t))return!0;t=t.parentElement}return!1}function AS(n,e){const t=new Set;for(let a=n.head;a;a=a.next){const n=a.data;n.type===Kv?TS(n.block)?AS(n.block.children,e):(e.stats.discarded++,t.add(a)):n.type===Jv&&n.block&&n.name!==Qv&&n.name!==nS&&(AS(n.block.children,e),TS(n.block)||(e.stats.discarded++,t.add(a)))}t.forEach(e=>n.remove(e))}function LS(n){const e=[];if(TS(n.block))for(let t=n.block.children.head;t;t=t.next)if(t.data.type===Zv)if(-1!==t.data.value.indexOf(\"{\")&&t.data.value.indexOf(\"{\")<t.data.value.indexOf(\"}\"))try{for(let n=DS(t.data.value,\"stylesheet\").children.head;n;n=n.next)e.push(n)}catch(n){}else e.push(t);else e.push(t);n.block.children.clear(),e.forEach(e=>n.block.children.appendData(e.data))}function zS(n,e){const t=DS(e||\"&\"),a=n?DS(n):null;let o=!1;if(Gf(t,{visit:\"NestingSelector\",enter(n,e,t){if(o=!0,!a)return void t.remove(e);a.children.toArray().map(n=>Pf(n)).forEach(n=>t.insertData(n,e)),t.remove(e)}}),o)return qf(t);if(!a)return qf(t);const i=DS(`${n} ${e}`);return qf(i)}function TS(n){return Boolean(n&&n.children&&n.children.head)}function ES(n,e){return e.selectorTexts.has(n)||e.selectorTexts.set(n,qf(n)),e.selectorTexts.get(n)}function RS(n,e){return n?(e.preludeTexts.has(n)||e.preludeTexts.set(n,qf(n)),e.preludeTexts.get(n)):\"\"}function IS(n){return n.map(n=>\"\"===n?\"\\0\":n).join(\".\")}function DS(n,e=\"selector\"){return Uf(n,{context:e})}function MS(n,e){if(!n)return[];const t=9===n.nodeType||11===n.nodeType,a=Boolean(e&&-1!==e.indexOf(\":scope\"));if(t&&a)return function(n,e){const t=jS(n);if(!t.length)return[];const a=new Set;return t.forEach(n=>{kS(n,e).forEach(n=>a.add(n))}),Array.from(a)}(n,e);try{return Array.from(n.querySelectorAll(e))}catch{return SS(jS(n),e,!1)}}var PS=Object.freeze({__proto__:null,process:sS});const NS=\"data:,\";function _S(n){n.querySelectorAll(\"picture\").forEach(n=>{const e=n.querySelector(\"img\");if(e){let{src:t,srcset:a}=BS(e);if(!t){const e=function(n){let e=n.find(n=>n.src),t=e&&e.src,a=e&&e.srcset;t||(e=n.find(n=>FS(n.src)),t=e&&e.src,t==NS&&(t=null));a||(e=n.find(n=>FS(n.srcset)),a=e&&e.srcset,a==NS&&(a=null));return{src:t,srcset:a}}(Array.from(n.querySelectorAll(\"source\")).reverse());t=e.src,a||(a=e.srcset)}OS({src:t,srcset:a},e,n)}}),n.querySelectorAll(\":not(picture) > img[srcset]\").forEach(n=>OS(BS(n),n))}function BS(n){let e=n.getAttribute(\"src\");e==NS&&(e=null);let t=FS(n.getAttribute(\"srcset\"));return t==NS&&(t=null),{src:e,srcset:t}}function OS(n,e,t){n.src?(e.setAttribute(\"src\",n.src),e.setAttribute(\"srcset\",\"\"),e.setAttribute(\"sizes\",\"\")):(e.setAttribute(\"src\",NS),n.srcset?e.setAttribute(\"srcset\",n.srcset):(e.setAttribute(\"srcset\",\"\"),e.setAttribute(\"sizes\",\"\"))),t&&t.querySelectorAll(\"source\").forEach(n=>n.remove())}function FS(n){if(n)try{const e=qk(n);if(e.length)return e.find(n=>n.url).url}catch(n){}}var US=Object.freeze({__proto__:null,process:_S});const qS=[\"allowfullscreen\",\"async\",\"autofocus\",\"autoplay\",\"checked\",\"compact\",\"controls\",\"declare\",\"default\",\"defaultchecked\",\"defaultmuted\",\"defaultselected\",\"defer\",\"disabled\",\"enabled\",\"formnovalidate\",\"hidden\",\"indeterminate\",\"inert\",\"ismap\",\"itemscope\",\"loop\",\"multiple\",\"muted\",\"nohref\",\"noresize\",\"noshade\",\"novalidate\",\"nowrap\",\"open\",\"pauseonexit\",\"readonly\",\"required\",\"reversed\",\"scoped\",\"seamless\",\"selected\",\"sortable\",\"truespeed\",\"typemustmatch\",\"visible\"],HS=[\"SCRIPT\",\"STYLE\",\"PRE\",\"TEXTAREA\"],WS=[\"id\",\"class\",\"style\",\"lang\",\"dir\",\"onclick\",\"ondblclick\",\"onmousedown\",\"onmouseup\",\"onmouseover\",\"onmousemove\",\"onmouseout\",\"onkeypress\",\"onkeydown\",\"onkeyup\"],GS={FORM:{method:\"get\"},SCRIPT:{language:\"javascript\",type:\"text/javascript\",charset:n=>!n.getAttribute(\"src\")},STYLE:{media:\"all\",type:\"text/css\"},LINK:{media:\"all\"}},VS=/[ \\t\\f\\r]+/g,KS=/[ \\t\\f\\r]{2,}|[\\t\\f\\r]/g,JS=/\\n{2,}/g,YS=/^\\s+$/,ZS=[function(n){1==n.nodeType&&Array.from(n.attributes).forEach(e=>{qS.includes(e.name)&&n.setAttribute(e.name,\"\")})},function(n){3==n.nodeType&&n.previousSibling&&3==n.previousSibling.nodeType&&(n.textContent=n.previousSibling.textContent+n.textContent,n.previousSibling.remove())},function(n,e){if(3==n.nodeType){let t=n.parentElement;if(!(\"\"==t.getAttribute(e.PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME))){const e=n.textContent;let a=XS(t);for(;a;)t=t.parentElement,a=t&&XS(t);if((!t||a)&&e.length>1){const t=function(n){return n.parentElement&&\"HEAD\"==QS(n.parentElement)?\"\\n\":\" \"}(n);let a;a=\" \"==t?e.replace(KS,\" \"):e.replace(VS,t),a=a.replace(JS,\"\\n\"),a!=e&&(n.textContent=a)}}}},function(n){if(8==n.nodeType&&\"HTML\"!=QS(n.parentElement))return!n.textContent.toLowerCase().trim().startsWith(\"[if\")},function(n){1==n.nodeType&&Array.from(n.attributes).forEach(e=>{if(WS.includes(e.name.toLowerCase())){const t=n.getAttribute(e.name);(\"\"==t||(t||\"\").match(YS))&&n.removeAttribute(e.name)}})},function(n){if(1==n.nodeType){const e=GS[QS(n)];e&&Object.keys(e).forEach(t=>{const a=e[t];(\"function\"==typeof a?a(n):n.getAttribute(t)==a)&&n.removeAttribute(t)})}},function(n){if(1==n.nodeType&&\"SCRIPT\"==QS(n)&&\"application/ld+json\"==n.type&&n.textContent.trim())try{n.textContent=JSON.stringify(JSON.parse(n.textContent))}catch(n){}}];function $S(n,e){!function(n){n.querySelectorAll(\"style, script:not([src])\").forEach(n=>{n.textContent.trim()||n.remove()})}(n);const t=n.createTreeWalker(n.documentElement,4294967295,null,!1);let a=t.nextNode();for(;a;){const n=ZS.find(n=>n(a,e)),o=a;a=t.nextNode(),n&&o.remove()}}function XS(n){return n&&!HS.includes(QS(n))}function QS(n){return n.tagName&&n.tagName.toUpperCase()}var nj=Object.freeze({__proto__:null,process:$S});const ej=[\"AREA\",\"BASE\",\"BASEFONT\",\"BGSOUND\",\"BR\",\"COL\",\"COMMAND\",\"EMBED\",\"FRAME\",\"HR\",\"IMG\",\"INPUT\",\"KEYGEN\",\"LINK\",\"META\",\"PARAM\",\"SOURCE\",\"TRACK\",\"WBR\"],tj=[{tagName:\"HEAD\",accept:n=>!n.childNodes.length||1==n.childNodes[0].nodeType},{tagName:\"BODY\",accept:n=>!n.childNodes.length}],aj=[{tagName:\"HTML\",accept:n=>!n||8!=n.nodeType},{tagName:\"HEAD\",accept:n=>!n||8!=n.nodeType&&(3!=n.nodeType||!sj(n.textContent))},{tagName:\"BODY\",accept:n=>!n||8!=n.nodeType},{tagName:\"LI\",accept:(n,e)=>!n&&e.parentElement&&(\"UL\"==lj(e.parentElement)||\"OL\"==lj(e.parentElement))||n&&[\"LI\"].includes(lj(n))},{tagName:\"DT\",accept:n=>!n||[\"DT\",\"DD\"].includes(lj(n))},{tagName:\"P\",accept:n=>n&&[\"ADDRESS\",\"ARTICLE\",\"ASIDE\",\"BLOCKQUOTE\",\"DETAILS\",\"DIV\",\"DL\",\"FIELDSET\",\"FIGCAPTION\",\"FIGURE\",\"FOOTER\",\"FORM\",\"H1\",\"H2\",\"H3\",\"H4\",\"H5\",\"H6\",\"HEADER\",\"HR\",\"MAIN\",\"NAV\",\"OL\",\"P\",\"PRE\",\"SECTION\",\"TABLE\",\"UL\"].includes(lj(n))},{tagName:\"DD\",accept:n=>!n||[\"DT\",\"DD\"].includes(lj(n))},{tagName:\"RT\",accept:n=>!n||[\"RT\",\"RP\"].includes(lj(n))},{tagName:\"RP\",accept:n=>!n||[\"RT\",\"RP\"].includes(lj(n))},{tagName:\"OPTGROUP\",accept:n=>!n||[\"OPTGROUP\"].includes(lj(n))},{tagName:\"OPTION\",accept:n=>!n||[\"OPTION\",\"OPTGROUP\"].includes(lj(n))},{tagName:\"COLGROUP\",accept:n=>!n||8!=n.nodeType&&(3!=n.nodeType||!sj(n.textContent))},{tagName:\"CAPTION\",accept:n=>!n||8!=n.nodeType&&(3!=n.nodeType||!sj(n.textContent))},{tagName:\"THEAD\",accept:n=>!n||[\"TBODY\",\"TFOOT\"].includes(lj(n))},{tagName:\"TBODY\",accept:n=>!n||[\"TBODY\",\"TFOOT\"].includes(lj(n))},{tagName:\"TFOOT\",accept:n=>!n},{tagName:\"TR\",accept:n=>!n||[\"TR\"].includes(lj(n))},{tagName:\"TD\",accept:n=>!n||[\"TD\",\"TH\"].includes(lj(n))},{tagName:\"TH\",accept:n=>!n||[\"TD\",\"TH\"].includes(lj(n))}],oj=[\"STYLE\",\"SCRIPT\",\"XMP\",\"IFRAME\",\"NOEMBED\",\"NOFRAMES\",\"PLAINTEXT\",\"NOSCRIPT\"];function ij(n,e){const t=n.doctype;let a=\"\";return t&&(a=\"<!DOCTYPE \"+t.nodeName,t.publicId?(a+=' PUBLIC \"'+t.publicId+'\"',t.systemId&&(a+=' \"'+t.systemId+'\"')):t.systemId&&(a+=' SYSTEM \"'+t.systemId+'\"'),t.internalSubset&&(a+=\" [\"+t.internalSubset+\"]\"),a+=\"> \"),a+rj(n.documentElement,e)}function rj(n,e,t){return 3==n.nodeType?function(n){const e=n.parentNode;let t;e&&1==e.nodeType&&(t=lj(e));return!t||oj.includes(t)?(\"SCRIPT\"!=t||e.type&&\"text/javascript\"!=e.type)&&\"STYLE\"!=t?n.textContent:n.textContent.replace(/<\\//gi,\"<\\\\/\").replace(/\\/>/gi,\"\\\\/>\"):n.textContent.replace(/&/g,\"&amp;\").replace(/\\u00a0/g,\"&nbsp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}(n):8==n.nodeType?\"\\x3c!--\"+n.textContent+\"--\\x3e\":1==n.nodeType?function(n,e,t){const a=lj(n),o=e&&tj.find(e=>a==lj(e)&&e.accept(n));let i=\"\";o&&!n.attributes.length||(i=\"<\"+a.toLowerCase(),Array.from(n.attributes).forEach(t=>i+=function(n,e,t){const a=n.name;let o=\"\";if(!a.match(/[\"'>/=]/)){let i,r=n.value;t&&\"class\"==a&&(r=Array.from(e.classList).map(n=>n.trim()).join(\" \")),r=r.replace(/&/g,\"&amp;\").replace(/\\u00a0/g,\"&nbsp;\"),r.includes('\"')&&(r.includes(\"'\")||!t?r=r.replace(/\"/g,\"&quot;\"):i=!0);const s=!t||r.match(/[ \\t\\n\\f\\r'\"`=<>]/);o+=\" \";const l=n.namespaceURI,c=n.localName||a;l?\"http://www.w3.org/XML/1998/namespace\"==l?o+=\"xml:\"+c:\"http://www.w3.org/2000/xmlns/\"==l?o+=\"xmlns\"===c?\"xmlns\":\"xmlns:\"+c:\"http://www.w3.org/1999/xlink\"==l?o+=\"xlink:\"+c:n.prefix?o+=n.prefix+\":\"+c:o+=a:o+=a,\"\"!=r&&(o+=\"=\",s&&(o+=i?\"'\":'\"'),o+=r,s&&(o+=i?\"'\":'\"'))}return o}(t,n,e)),i+=\">\");\"TEMPLATE\"!=a||n.childNodes.length?Array.from(n.childNodes).forEach(n=>i+=rj(n,e,t||\"svg\"==a)):i+=n.innerHTML;const r=e&&aj.find(e=>a==lj(e)&&e.accept(n.nextSibling,n));(t||!r&&!ej.includes(a))&&(i+=\"</\"+a.toLowerCase()+\">\");return i}(n,e,t):void 0}function sj(n){return Boolean(n.match(/^[ \\t\\n\\f\\r]/))}function lj(n){return n.tagName&&n.tagName.toUpperCase()}var cj=Object.freeze({__proto__:null,process:ij});function dj(n,e,t,a){this.message=n,this.expected=e,this.found=t,this.location=a,this.name=\"SyntaxError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,dj)}async function mj(n,e){e=void 0!==e?e:{};var t,a={},o={start:tn},i=tn,r=function(n){return n.join(\"\")},s=\"|\",l=$(\"|\",!1),c=function(n){return n},d=\"%\",m=$(\"%\",!1),h=\"<\",p=$(\"<\",!1),u=\">\",g=$(\">\",!1),w=function(n,t,a){return e.callFunction(n,t,a)},b=\"{\",f=$(\"{\",!1),y=\"}\",k=$(\"}\",!1),v=function(n,t){return e.getVariableValue(n,t)},S=\"[\",j=$(\"[\",!1),x=\"]\",C=$(\"]\",!1),A=function(n,e){return{length:n,unit:e}},L=\"ch\",z=$(\"ch\",!1),T=/^[a-z0-9-]/,E=X([[\"a\",\"z\"],[\"0\",\"9\"],\"-\"],!1,!1),R=function(){return Z()},I=/^[0-9]/,D=X([[\"0\",\"9\"]],!1,!1),M=function(){return Number(Z())},P=\"\\\\\\\\%\",N=$(\"\\\\\\\\%\",!1),_=\"\\\\\\\\{\",B=$(\"\\\\\\\\{\",!1),O=\"\\\\\\\\|\",F=$(\"\\\\\\\\|\",!1),U=\"\\\\\\\\>\",q=$(\"\\\\\\\\>\",!1),H={type:\"any\"},W=0,G=0,V=[{line:1,column:1}],K=0,J=[],Y=0;if(\"startRule\"in e){if(!(e.startRule in o))throw new Error(\"Can't start parsing from rule \\\"\"+e.startRule+'\".');i=o[e.startRule]}function Z(){return n.substring(G,W)}function $(n,e){return{type:\"literal\",text:n,ignoreCase:e}}function X(n,e,t){return{type:\"class\",parts:n,inverted:e,ignoreCase:t}}function Q(e){var t,a=V[e];if(a)return a;for(t=e-1;!V[t];)t--;for(a={line:(a=V[t]).line,column:a.column};t<e;)10===n.charCodeAt(t)?(a.line++,a.column=1):a.column++,t++;return V[e]=a,a}function nn(n,e){var t=Q(n),a=Q(e);return{start:{offset:n,line:t.line,column:t.column},end:{offset:e,line:a.line,column:a.column}}}function en(n){W<K||(W>K&&(K=W,J=[]),J.push(n))}async function tn(){return await an()}async function an(){var n,e,t;for(n=W,e=[],t=await on();t!==a;)e.push(t),t=await on();return e!==a&&(G=n,e=r(e)),n=e}async function on(){var e;return(e=await async function(){var e,t,o,i,r,s,l;e=W,37===n.charCodeAt(W)?(t=d,W++):(t=a,0===Y&&en(m));t!==a&&(o=ln())!==a?(60===n.charCodeAt(W)?(i=h,W++):(i=a,0===Y&&en(p)),i!==a?(r=await async function(){var n,e,t;n=W,e=await an(),e!==a?(t=await async function(){var n,e;if(n=[],e=await rn(),e!==a)for(;e!==a;)n.push(e),e=await rn();else n=a;return n}(),t===a&&(t=null),t!==a?n=e=[e,t]:(W=n,n=a)):(W=n,n=a);return n}(),r!==a?(62===n.charCodeAt(W)?(s=u,W++):(s=a,0===Y&&en(g)),s!==a?((l=sn())===a&&(l=null),l!==a?(G=e,e=t=await w(o,r,l)):(W=e,e=a)):(W=e,e=a)):(W=e,e=a)):(W=e,e=a)):(W=e,e=a);return e}())===a&&(e=await async function(){var e,t,o,i,r;e=W,123===n.charCodeAt(W)?(t=b,W++):(t=a,0===Y&&en(f));t!==a&&(o=ln())!==a?(125===n.charCodeAt(W)?(i=y,W++):(i=a,0===Y&&en(k)),i!==a?((r=sn())===a&&(r=null),r!==a?(G=e,e=t=await v(o,r)):(W=e,e=a)):(W=e,e=a)):(W=e,e=a);return e}())===a&&(e=function(){var n,e,t;if(n=W,e=[],(t=cn())!==a)for(;t!==a;)e.push(t),t=cn();else e=a;e!==a&&(G=n,e=R());return n=e,n}()),e}async function rn(){var e,t,o;return e=W,124===n.charCodeAt(W)?(t=s,W++):(t=a,0===Y&&en(l)),t!==a&&(o=await an())!==a?(G=e,e=t=c(o)):(W=e,e=a),e}function sn(){var e,t,o,i,r;return e=W,91===n.charCodeAt(W)?(t=S,W++):(t=a,0===Y&&en(j)),t!==a?(o=function(){var e,t,o;e=W,t=[],I.test(n.charAt(W))?(o=n.charAt(W),W++):(o=a,0===Y&&en(D));if(o!==a)for(;o!==a;)t.push(o),I.test(n.charAt(W))?(o=n.charAt(W),W++):(o=a,0===Y&&en(D));else t=a;t!==a&&(G=e,t=M());return e=t,e}(),o!==a?(i=function(){var e;n.substr(W,2)===L?(e=L,W+=2):(e=a,0===Y&&en(z));e===a&&(e=null);return e}(),i!==a?(93===n.charCodeAt(W)?(r=x,W++):(r=a,0===Y&&en(C)),r!==a?(G=e,e=t=A(o,i)):(W=e,e=a)):(W=e,e=a)):(W=e,e=a)):(W=e,e=a),e}function ln(){var e,t,o;if(e=W,t=[],T.test(n.charAt(W))?(o=n.charAt(W),W++):(o=a,0===Y&&en(E)),o!==a)for(;o!==a;)t.push(o),T.test(n.charAt(W))?(o=n.charAt(W),W++):(o=a,0===Y&&en(E));else t=a;return t!==a&&(G=e,t=R()),e=t}function cn(){var e,t,o,i,r,c;return e=W,t=W,Y++,37===n.charCodeAt(W)?(o=d,W++):(o=a,0===Y&&en(m)),Y--,o===a?t=void 0:(W=t,t=a),t!==a?(o=W,Y++,123===n.charCodeAt(W)?(i=b,W++):(i=a,0===Y&&en(f)),Y--,i===a?o=void 0:(W=o,o=a),o!==a?(i=W,Y++,124===n.charCodeAt(W)?(r=s,W++):(r=a,0===Y&&en(l)),Y--,r===a?i=void 0:(W=i,i=a),i!==a?(r=W,Y++,62===n.charCodeAt(W)?(c=u,W++):(c=a,0===Y&&en(g)),Y--,c===a?r=void 0:(W=r,r=a),r!==a?(c=function(){var e;n.substr(W,3)===P?(e=P,W+=3):(e=a,0===Y&&en(N));e===a&&(n.substr(W,3)===_?(e=_,W+=3):(e=a,0===Y&&en(B)),e===a&&(n.substr(W,3)===O?(e=O,W+=3):(e=a,0===Y&&en(F)),e===a&&(n.substr(W,3)===U?(e=U,W+=3):(e=a,0===Y&&en(q)),e===a&&(n.length>W?(e=n.charAt(W),W++):(e=a,0===Y&&en(H))))));return e}(),c!==a?e=t=[t,o,i,r,c]:(W=e,e=a)):(W=e,e=a)):(W=e,e=a)):(W=e,e=a)):(W=e,e=a),e}if((t=await i())!==a&&W===n.length)return t;throw t!==a&&W<n.length&&en({type:\"end\"}),function(n,e,t){return new dj(dj.buildMessage(n,e),n,e,t)}(J,K<n.length?n.charAt(K):null,K<n.length?nn(K,K+1):nn(K,K))}!function(n,e){function t(){this.constructor=n}t.prototype=e.prototype,n.prototype=new t}(dj,Error),dj.buildMessage=function(n,e){var t={literal:function(n){return'\"'+o(n.text)+'\"'},class:function(n){var e,t=\"\";for(e=0;e<n.parts.length;e++)t+=n.parts[e]instanceof Array?i(n.parts[e][0])+\"-\"+i(n.parts[e][1]):i(n.parts[e]);return\"[\"+(n.inverted?\"^\":\"\")+t+\"]\"},any:function(){return\"any character\"},end:function(){return\"end of input\"},other:function(n){return n.description}};function a(n){return n.charCodeAt(0).toString(16).toUpperCase()}function o(n){return n.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(n){return\"\\\\x0\"+a(n)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(n){return\"\\\\x\"+a(n)})}function i(n){return n.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(n){return\"\\\\x0\"+a(n)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(n){return\"\\\\x\"+a(n)})}function r(n){return t[n.type](n)}return\"Expected \"+function(n){var e,t,a=new Array(n.length);for(e=0;e<n.length;e++)a[e]=r(n[e]);if(a.sort(),a.length>0){for(e=1,t=1;e<a.length;e++)a[e-1]!==a[e]&&(a[t]=a[e],t++);a.length=t}switch(a.length){case 1:return a[0];case 2:return a[0]+\" or \"+a[1];default:return a.slice(0,-1).join(\", \")+\", or \"+a[a.length-1]}}(n)+\" but \"+function(n){return n?'\"'+o(n)+'\"':\"end of input\"}(e)+\" found.\"};const hj=globalThis.Blob,pj=globalThis.FileReader,uj=globalThis.URL,gj=globalThis.Intl,wj=globalThis.URLSearchParams,bj=globalThis.navigator,fj=/([{}()^$&.*?/+|[\\\\\\\\]|\\]|-)/g,yj={\"😀\":\"grinning-face\",\"😃\":\"grinning-face-with-big-eyes\",\"😄\":\"grinning-face-with-smiling-eyes\",\"😁\":\"beaming-face-with-smiling-eyes\",\"😆\":\"grinning-squinting-face\",\"😅\":\"grinning-face-with-sweat\",\"🤣\":\"rolling-on-the-floor-laughing\",\"😂\":\"face-with-tears-of-joy\",\"🙂\":\"slightly-smiling-face\",\"🙃\":\"upside-down-face\",\"🫠\":\"melting-face\",\"😉\":\"winking-face\",\"😊\":\"smiling-face-with-smiling-eyes\",\"😇\":\"smiling-face-with-halo\",\"🥰\":\"smiling-face-with-hearts\",\"😍\":\"smiling-face-with-heart-eyes\",\"🤩\":\"star-struck\",\"😘\":\"face-blowing-a-kiss\",\"😗\":\"kissing-face\",\"☺\":\"smiling-face\",\"😚\":\"kissing-face-with-closed-eyes\",\"😙\":\"kissing-face-with-smiling-eyes\",\"🥲\":\"smiling-face-with-tear\",\"😋\":\"face-savoring-food\",\"😛\":\"face-with-tongue\",\"😜\":\"winking-face-with-tongue\",\"🤪\":\"zany-face\",\"😝\":\"squinting-face-with-tongue\",\"🤑\":\"money-mouth-face\",\"🤗\":\"smiling-face-with-open-hands\",\"🤭\":\"face-with-hand-over-mouth\",\"🫢\":\"face-with-open-eyes-and-hand-over-mouth\",\"🫣\":\"face-with-peeking-eye\",\"🤫\":\"shushing-face\",\"🤔\":\"thinking-face\",\"🫡\":\"saluting-face\",\"🤐\":\"zipper-mouth-face\",\"🤨\":\"face-with-raised-eyebrow\",\"😐\":\"neutral-face\",\"😑\":\"expressionless-face\",\"😶\":\"face-without-mouth\",\"🫥\":\"dotted-line-face\",\"😶‍🌫️\":\"face-in-clouds\",\"😏\":\"smirking-face\",\"😒\":\"unamused-face\",\"🙄\":\"face-with-rolling-eyes\",\"😬\":\"grimacing-face\",\"😮‍💨\":\"face-exhaling\",\"🤥\":\"lying-face\",\"🫨\":\"⊛-shaking-face\",\"😌\":\"relieved-face\",\"😔\":\"pensive-face\",\"😪\":\"sleepy-face\",\"🤤\":\"drooling-face\",\"😴\":\"sleeping-face\",\"😷\":\"face-with-medical-mask\",\"🤒\":\"face-with-thermometer\",\"🤕\":\"face-with-head-bandage\",\"🤢\":\"nauseated-face\",\"🤮\":\"face-vomiting\",\"🤧\":\"sneezing-face\",\"🥵\":\"hot-face\",\"🥶\":\"cold-face\",\"🥴\":\"woozy-face\",\"😵\":\"face-with-crossed-out-eyes\",\"😵‍💫\":\"face-with-spiral-eyes\",\"🤯\":\"exploding-head\",\"🤠\":\"cowboy-hat-face\",\"🥳\":\"partying-face\",\"🥸\":\"disguised-face\",\"😎\":\"smiling-face-with-sunglasses\",\"🤓\":\"nerd-face\",\"🧐\":\"face-with-monocle\",\"😕\":\"confused-face\",\"🫤\":\"face-with-diagonal-mouth\",\"😟\":\"worried-face\",\"🙁\":\"slightly-frowning-face\",\"☹\":\"frowning-face\",\"😮\":\"face-with-open-mouth\",\"😯\":\"hushed-face\",\"😲\":\"astonished-face\",\"😳\":\"flushed-face\",\"🥺\":\"pleading-face\",\"🥹\":\"face-holding-back-tears\",\"😦\":\"frowning-face-with-open-mouth\",\"😧\":\"anguished-face\",\"😨\":\"fearful-face\",\"😰\":\"anxious-face-with-sweat\",\"😥\":\"sad-but-relieved-face\",\"😢\":\"crying-face\",\"😭\":\"loudly-crying-face\",\"😱\":\"face-screaming-in-fear\",\"😖\":\"confounded-face\",\"😣\":\"persevering-face\",\"😞\":\"disappointed-face\",\"😓\":\"downcast-face-with-sweat\",\"😩\":\"weary-face\",\"😫\":\"tired-face\",\"🥱\":\"yawning-face\",\"😤\":\"face-with-steam-from-nose\",\"😡\":\"enraged-face\",\"😠\":\"angry-face\",\"🤬\":\"face-with-symbols-on-mouth\",\"😈\":\"smiling-face-with-horns\",\"👿\":\"angry-face-with-horns\",\"💀\":\"skull\",\"☠\":\"skull-and-crossbones\",\"💩\":\"pile-of-poo\",\"🤡\":\"clown-face\",\"👹\":\"ogre\",\"👺\":\"goblin\",\"👻\":\"ghost\",\"👽\":\"alien\",\"👾\":\"alien-monster\",\"🤖\":\"robot\",\"😺\":\"grinning-cat\",\"😸\":\"grinning-cat-with-smiling-eyes\",\"😹\":\"cat-with-tears-of-joy\",\"😻\":\"smiling-cat-with-heart-eyes\",\"😼\":\"cat-with-wry-smile\",\"😽\":\"kissing-cat\",\"🙀\":\"weary-cat\",\"😿\":\"crying-cat\",\"😾\":\"pouting-cat\",\"🙈\":\"see-no-evil-monkey\",\"🙉\":\"hear-no-evil-monkey\",\"🙊\":\"speak-no-evil-monkey\",\"💌\":\"love-letter\",\"💘\":\"heart-with-arrow\",\"💝\":\"heart-with-ribbon\",\"💖\":\"sparkling-heart\",\"💗\":\"growing-heart\",\"💓\":\"beating-heart\",\"💞\":\"revolving-hearts\",\"💕\":\"two-hearts\",\"💟\":\"heart-decoration\",\"❣\":\"heart-exclamation\",\"💔\":\"broken-heart\",\"❤️‍🔥\":\"heart-on-fire\",\"❤️‍🩹\":\"mending-heart\",\"❤\":\"red-heart\",\"🩷\":\"⊛-pink-heart\",\"🧡\":\"orange-heart\",\"💛\":\"yellow-heart\",\"💚\":\"green-heart\",\"💙\":\"blue-heart\",\"🩵\":\"⊛-light-blue-heart\",\"💜\":\"purple-heart\",\"🤎\":\"brown-heart\",\"🖤\":\"black-heart\",\"🩶\":\"⊛-grey-heart\",\"🤍\":\"white-heart\",\"💋\":\"kiss-mark\",\"💯\":\"hundred-points\",\"💢\":\"anger-symbol\",\"💥\":\"collision\",\"💫\":\"dizzy\",\"💦\":\"sweat-droplets\",\"💨\":\"dashing-away\",\"🕳\":\"hole\",\"💬\":\"speech-balloon\",\"👁️‍🗨️\":\"eye-in-speech-bubble\",\"🗨\":\"left-speech-bubble\",\"🗯\":\"right-anger-bubble\",\"💭\":\"thought-balloon\",\"💤\":\"zzz\",\"👋\":\"waving-hand\",\"🤚\":\"raised-back-of-hand\",\"🖐\":\"hand-with-fingers-splayed\",\"✋\":\"raised-hand\",\"🖖\":\"vulcan-salute\",\"🫱\":\"rightwards-hand\",\"🫲\":\"leftwards-hand\",\"🫳\":\"palm-down-hand\",\"🫴\":\"palm-up-hand\",\"🫷\":\"⊛-leftwards-pushing-hand\",\"🫸\":\"⊛-rightwards-pushing-hand\",\"👌\":\"ok-hand\",\"🤌\":\"pinched-fingers\",\"🤏\":\"pinching-hand\",\"✌\":\"victory-hand\",\"🤞\":\"crossed-fingers\",\"🫰\":\"hand-with-index-finger-and-thumb-crossed\",\"🤟\":\"love-you-gesture\",\"🤘\":\"sign-of-the-horns\",\"🤙\":\"call-me-hand\",\"👈\":\"backhand-index-pointing-left\",\"👉\":\"backhand-index-pointing-right\",\"👆\":\"backhand-index-pointing-up\",\"🖕\":\"middle-finger\",\"👇\":\"backhand-index-pointing-down\",\"☝\":\"index-pointing-up\",\"🫵\":\"index-pointing-at-the-viewer\",\"👍\":\"thumbs-up\",\"👎\":\"thumbs-down\",\"✊\":\"raised-fist\",\"👊\":\"oncoming-fist\",\"🤛\":\"left-facing-fist\",\"🤜\":\"right-facing-fist\",\"👏\":\"clapping-hands\",\"🙌\":\"raising-hands\",\"🫶\":\"heart-hands\",\"👐\":\"open-hands\",\"🤲\":\"palms-up-together\",\"🤝\":\"handshake\",\"🙏\":\"folded-hands\",\"✍\":\"writing-hand\",\"💅\":\"nail-polish\",\"🤳\":\"selfie\",\"💪\":\"flexed-biceps\",\"🦾\":\"mechanical-arm\",\"🦿\":\"mechanical-leg\",\"🦵\":\"leg\",\"🦶\":\"foot\",\"👂\":\"ear\",\"🦻\":\"ear-with-hearing-aid\",\"👃\":\"nose\",\"🧠\":\"brain\",\"🫀\":\"anatomical-heart\",\"🫁\":\"lungs\",\"🦷\":\"tooth\",\"🦴\":\"bone\",\"👀\":\"eyes\",\"👁\":\"eye\",\"👅\":\"tongue\",\"👄\":\"mouth\",\"🫦\":\"biting-lip\",\"👶\":\"baby\",\"🧒\":\"child\",\"👦\":\"boy\",\"👧\":\"girl\",\"🧑\":\"person\",\"👱\":\"person-blond-hair\",\"👨\":\"man\",\"🧔\":\"person-beard\",\"🧔‍♂️\":\"man-beard\",\"🧔‍♀️\":\"woman-beard\",\"👨‍🦰\":\"man-red-hair\",\"👨‍🦱\":\"man-curly-hair\",\"👨‍🦳\":\"man-white-hair\",\"👨‍🦲\":\"man-bald\",\"👩\":\"woman\",\"👩‍🦰\":\"woman-red-hair\",\"🧑‍🦰\":\"person-red-hair\",\"👩‍🦱\":\"woman-curly-hair\",\"🧑‍🦱\":\"person-curly-hair\",\"👩‍🦳\":\"woman-white-hair\",\"🧑‍🦳\":\"person-white-hair\",\"👩‍🦲\":\"woman-bald\",\"🧑‍🦲\":\"person-bald\",\"👱‍♀️\":\"woman-blond-hair\",\"👱‍♂️\":\"man-blond-hair\",\"🧓\":\"older-person\",\"👴\":\"old-man\",\"👵\":\"old-woman\",\"🙍\":\"person-frowning\",\"🙍‍♂️\":\"man-frowning\",\"🙍‍♀️\":\"woman-frowning\",\"🙎\":\"person-pouting\",\"🙎‍♂️\":\"man-pouting\",\"🙎‍♀️\":\"woman-pouting\",\"🙅\":\"person-gesturing-no\",\"🙅‍♂️\":\"man-gesturing-no\",\"🙅‍♀️\":\"woman-gesturing-no\",\"🙆\":\"person-gesturing-ok\",\"🙆‍♂️\":\"man-gesturing-ok\",\"🙆‍♀️\":\"woman-gesturing-ok\",\"💁\":\"person-tipping-hand\",\"💁‍♂️\":\"man-tipping-hand\",\"💁‍♀️\":\"woman-tipping-hand\",\"🙋\":\"person-raising-hand\",\"🙋‍♂️\":\"man-raising-hand\",\"🙋‍♀️\":\"woman-raising-hand\",\"🧏\":\"deaf-person\",\"🧏‍♂️\":\"deaf-man\",\"🧏‍♀️\":\"deaf-woman\",\"🙇\":\"person-bowing\",\"🙇‍♂️\":\"man-bowing\",\"🙇‍♀️\":\"woman-bowing\",\"🤦\":\"person-facepalming\",\"🤦‍♂️\":\"man-facepalming\",\"🤦‍♀️\":\"woman-facepalming\",\"🤷\":\"person-shrugging\",\"🤷‍♂️\":\"man-shrugging\",\"🤷‍♀️\":\"woman-shrugging\",\"🧑‍⚕️\":\"health-worker\",\"👨‍⚕️\":\"man-health-worker\",\"👩‍⚕️\":\"woman-health-worker\",\"🧑‍🎓\":\"student\",\"👨‍🎓\":\"man-student\",\"👩‍🎓\":\"woman-student\",\"🧑‍🏫\":\"teacher\",\"👨‍🏫\":\"man-teacher\",\"👩‍🏫\":\"woman-teacher\",\"🧑‍⚖️\":\"judge\",\"👨‍⚖️\":\"man-judge\",\"👩‍⚖️\":\"woman-judge\",\"🧑‍🌾\":\"farmer\",\"👨‍🌾\":\"man-farmer\",\"👩‍🌾\":\"woman-farmer\",\"🧑‍🍳\":\"cook\",\"👨‍🍳\":\"man-cook\",\"👩‍🍳\":\"woman-cook\",\"🧑‍🔧\":\"mechanic\",\"👨‍🔧\":\"man-mechanic\",\"👩‍🔧\":\"woman-mechanic\",\"🧑‍🏭\":\"factory-worker\",\"👨‍🏭\":\"man-factory-worker\",\"👩‍🏭\":\"woman-factory-worker\",\"🧑‍💼\":\"office-worker\",\"👨‍💼\":\"man-office-worker\",\"👩‍💼\":\"woman-office-worker\",\"🧑‍🔬\":\"scientist\",\"👨‍🔬\":\"man-scientist\",\"👩‍🔬\":\"woman-scientist\",\"🧑‍💻\":\"technologist\",\"👨‍💻\":\"man-technologist\",\"👩‍💻\":\"woman-technologist\",\"🧑‍🎤\":\"singer\",\"👨‍🎤\":\"man-singer\",\"👩‍🎤\":\"woman-singer\",\"🧑‍🎨\":\"artist\",\"👨‍🎨\":\"man-artist\",\"👩‍🎨\":\"woman-artist\",\"🧑‍✈️\":\"pilot\",\"👨‍✈️\":\"man-pilot\",\"👩‍✈️\":\"woman-pilot\",\"🧑‍🚀\":\"astronaut\",\"👨‍🚀\":\"man-astronaut\",\"👩‍🚀\":\"woman-astronaut\",\"🧑‍🚒\":\"firefighter\",\"👨‍🚒\":\"man-firefighter\",\"👩‍🚒\":\"woman-firefighter\",\"👮\":\"police-officer\",\"👮‍♂️\":\"man-police-officer\",\"👮‍♀️\":\"woman-police-officer\",\"🕵\":\"detective\",\"🕵️‍♂️\":\"man-detective\",\"🕵️‍♀️\":\"woman-detective\",\"💂\":\"guard\",\"💂‍♂️\":\"man-guard\",\"💂‍♀️\":\"woman-guard\",\"🥷\":\"ninja\",\"👷\":\"construction-worker\",\"👷‍♂️\":\"man-construction-worker\",\"👷‍♀️\":\"woman-construction-worker\",\"🫅\":\"person-with-crown\",\"🤴\":\"prince\",\"👸\":\"princess\",\"👳\":\"person-wearing-turban\",\"👳‍♂️\":\"man-wearing-turban\",\"👳‍♀️\":\"woman-wearing-turban\",\"👲\":\"person-with-skullcap\",\"🧕\":\"woman-with-headscarf\",\"🤵\":\"person-in-tuxedo\",\"🤵‍♂️\":\"man-in-tuxedo\",\"🤵‍♀️\":\"woman-in-tuxedo\",\"👰\":\"person-with-veil\",\"👰‍♂️\":\"man-with-veil\",\"👰‍♀️\":\"woman-with-veil\",\"🤰\":\"pregnant-woman\",\"🫃\":\"pregnant-man\",\"🫄\":\"pregnant-person\",\"🤱\":\"breast-feeding\",\"👩‍🍼\":\"woman-feeding-baby\",\"👨‍🍼\":\"man-feeding-baby\",\"🧑‍🍼\":\"person-feeding-baby\",\"👼\":\"baby-angel\",\"🎅\":\"santa-claus\",\"🤶\":\"mrs-claus\",\"🧑‍🎄\":\"mx-claus\",\"🦸\":\"superhero\",\"🦸‍♂️\":\"man-superhero\",\"🦸‍♀️\":\"woman-superhero\",\"🦹\":\"supervillain\",\"🦹‍♂️\":\"man-supervillain\",\"🦹‍♀️\":\"woman-supervillain\",\"🧙\":\"mage\",\"🧙‍♂️\":\"man-mage\",\"🧙‍♀️\":\"woman-mage\",\"🧚\":\"fairy\",\"🧚‍♂️\":\"man-fairy\",\"🧚‍♀️\":\"woman-fairy\",\"🧛\":\"vampire\",\"🧛‍♂️\":\"man-vampire\",\"🧛‍♀️\":\"woman-vampire\",\"🧜\":\"merperson\",\"🧜‍♂️\":\"merman\",\"🧜‍♀️\":\"mermaid\",\"🧝\":\"elf\",\"🧝‍♂️\":\"man-elf\",\"🧝‍♀️\":\"woman-elf\",\"🧞\":\"genie\",\"🧞‍♂️\":\"man-genie\",\"🧞‍♀️\":\"woman-genie\",\"🧟\":\"zombie\",\"🧟‍♂️\":\"man-zombie\",\"🧟‍♀️\":\"woman-zombie\",\"🧌\":\"troll\",\"💆\":\"person-getting-massage\",\"💆‍♂️\":\"man-getting-massage\",\"💆‍♀️\":\"woman-getting-massage\",\"💇\":\"person-getting-haircut\",\"💇‍♂️\":\"man-getting-haircut\",\"💇‍♀️\":\"woman-getting-haircut\",\"🚶\":\"person-walking\",\"🚶‍♂️\":\"man-walking\",\"🚶‍♀️\":\"woman-walking\",\"🧍\":\"person-standing\",\"🧍‍♂️\":\"man-standing\",\"🧍‍♀️\":\"woman-standing\",\"🧎\":\"person-kneeling\",\"🧎‍♂️\":\"man-kneeling\",\"🧎‍♀️\":\"woman-kneeling\",\"🧑‍🦯\":\"person-with-white-cane\",\"👨‍🦯\":\"man-with-white-cane\",\"👩‍🦯\":\"woman-with-white-cane\",\"🧑‍🦼\":\"person-in-motorized-wheelchair\",\"👨‍🦼\":\"man-in-motorized-wheelchair\",\"👩‍🦼\":\"woman-in-motorized-wheelchair\",\"🧑‍🦽\":\"person-in-manual-wheelchair\",\"👨‍🦽\":\"man-in-manual-wheelchair\",\"👩‍🦽\":\"woman-in-manual-wheelchair\",\"🏃\":\"person-running\",\"🏃‍♂️\":\"man-running\",\"🏃‍♀️\":\"woman-running\",\"💃\":\"woman-dancing\",\"🕺\":\"man-dancing\",\"🕴\":\"person-in-suit-levitating\",\"👯\":\"people-with-bunny-ears\",\"👯‍♂️\":\"men-with-bunny-ears\",\"👯‍♀️\":\"women-with-bunny-ears\",\"🧖\":\"person-in-steamy-room\",\"🧖‍♂️\":\"man-in-steamy-room\",\"🧖‍♀️\":\"woman-in-steamy-room\",\"🧗\":\"person-climbing\",\"🧗‍♂️\":\"man-climbing\",\"🧗‍♀️\":\"woman-climbing\",\"🤺\":\"person-fencing\",\"🏇\":\"horse-racing\",\"⛷\":\"skier\",\"🏂\":\"snowboarder\",\"🏌\":\"person-golfing\",\"🏌️‍♂️\":\"man-golfing\",\"🏌️‍♀️\":\"woman-golfing\",\"🏄\":\"person-surfing\",\"🏄‍♂️\":\"man-surfing\",\"🏄‍♀️\":\"woman-surfing\",\"🚣\":\"person-rowing-boat\",\"🚣‍♂️\":\"man-rowing-boat\",\"🚣‍♀️\":\"woman-rowing-boat\",\"🏊\":\"person-swimming\",\"🏊‍♂️\":\"man-swimming\",\"🏊‍♀️\":\"woman-swimming\",\"⛹\":\"person-bouncing-ball\",\"⛹️‍♂️\":\"man-bouncing-ball\",\"⛹️‍♀️\":\"woman-bouncing-ball\",\"🏋\":\"person-lifting-weights\",\"🏋️‍♂️\":\"man-lifting-weights\",\"🏋️‍♀️\":\"woman-lifting-weights\",\"🚴\":\"person-biking\",\"🚴‍♂️\":\"man-biking\",\"🚴‍♀️\":\"woman-biking\",\"🚵\":\"person-mountain-biking\",\"🚵‍♂️\":\"man-mountain-biking\",\"🚵‍♀️\":\"woman-mountain-biking\",\"🤸\":\"person-cartwheeling\",\"🤸‍♂️\":\"man-cartwheeling\",\"🤸‍♀️\":\"woman-cartwheeling\",\"🤼\":\"people-wrestling\",\"🤼‍♂️\":\"men-wrestling\",\"🤼‍♀️\":\"women-wrestling\",\"🤽\":\"person-playing-water-polo\",\"🤽‍♂️\":\"man-playing-water-polo\",\"🤽‍♀️\":\"woman-playing-water-polo\",\"🤾\":\"person-playing-handball\",\"🤾‍♂️\":\"man-playing-handball\",\"🤾‍♀️\":\"woman-playing-handball\",\"🤹\":\"person-juggling\",\"🤹‍♂️\":\"man-juggling\",\"🤹‍♀️\":\"woman-juggling\",\"🧘\":\"person-in-lotus-position\",\"🧘‍♂️\":\"man-in-lotus-position\",\"🧘‍♀️\":\"woman-in-lotus-position\",\"🛀\":\"person-taking-bath\",\"🛌\":\"person-in-bed\",\"🧑‍🤝‍🧑\":\"people-holding-hands\",\"👭\":\"women-holding-hands\",\"👫\":\"woman-and-man-holding-hands\",\"👬\":\"men-holding-hands\",\"💏\":\"kiss\",\"👩‍❤️‍💋‍👨\":\"kiss-woman,-man\",\"👨‍❤️‍💋‍👨\":\"kiss-man,-man\",\"👩‍❤️‍💋‍👩\":\"kiss-woman,-woman\",\"💑\":\"couple-with-heart\",\"👩‍❤️‍👨\":\"couple-with-heart-woman,-man\",\"👨‍❤️‍👨\":\"couple-with-heart-man,-man\",\"👩‍❤️‍👩\":\"couple-with-heart-woman,-woman\",\"👪\":\"family\",\"👨‍👩‍👦\":\"family-man,-woman,-boy\",\"👨‍👩‍👧\":\"family-man,-woman,-girl\",\"👨‍👩‍👧‍👦\":\"family-man,-woman,-girl,-boy\",\"👨‍👩‍👦‍👦\":\"family-man,-woman,-boy,-boy\",\"👨‍👩‍👧‍👧\":\"family-man,-woman,-girl,-girl\",\"👨‍👨‍👦\":\"family-man,-man,-boy\",\"👨‍👨‍👧\":\"family-man,-man,-girl\",\"👨‍👨‍👧‍👦\":\"family-man,-man,-girl,-boy\",\"👨‍👨‍👦‍👦\":\"family-man,-man,-boy,-boy\",\"👨‍👨‍👧‍👧\":\"family-man,-man,-girl,-girl\",\"👩‍👩‍👦\":\"family-woman,-woman,-boy\",\"👩‍👩‍👧\":\"family-woman,-woman,-girl\",\"👩‍👩‍👧‍👦\":\"family-woman,-woman,-girl,-boy\",\"👩‍👩‍👦‍👦\":\"family-woman,-woman,-boy,-boy\",\"👩‍👩‍👧‍👧\":\"family-woman,-woman,-girl,-girl\",\"👨‍👦\":\"family-man,-boy\",\"👨‍👦‍👦\":\"family-man,-boy,-boy\",\"👨‍👧\":\"family-man,-girl\",\"👨‍👧‍👦\":\"family-man,-girl,-boy\",\"👨‍👧‍👧\":\"family-man,-girl,-girl\",\"👩‍👦\":\"family-woman,-boy\",\"👩‍👦‍👦\":\"family-woman,-boy,-boy\",\"👩‍👧\":\"family-woman,-girl\",\"👩‍👧‍👦\":\"family-woman,-girl,-boy\",\"👩‍👧‍👧\":\"family-woman,-girl,-girl\",\"🗣\":\"speaking-head\",\"👤\":\"bust-in-silhouette\",\"👥\":\"busts-in-silhouette\",\"🫂\":\"people-hugging\",\"👣\":\"footprints\",\"🦰\":\"red-hair\",\"🦱\":\"curly-hair\",\"🦳\":\"white-hair\",\"🦲\":\"bald\",\"🐵\":\"monkey-face\",\"🐒\":\"monkey\",\"🦍\":\"gorilla\",\"🦧\":\"orangutan\",\"🐶\":\"dog-face\",\"🐕\":\"dog\",\"🦮\":\"guide-dog\",\"🐕‍🦺\":\"service-dog\",\"🐩\":\"poodle\",\"🐺\":\"wolf\",\"🦊\":\"fox\",\"🦝\":\"raccoon\",\"🐱\":\"cat-face\",\"🐈\":\"cat\",\"🐈‍⬛\":\"black-cat\",\"🦁\":\"lion\",\"🐯\":\"tiger-face\",\"🐅\":\"tiger\",\"🐆\":\"leopard\",\"🐴\":\"horse-face\",\"🫎\":\"⊛-moose\",\"🫏\":\"⊛-donkey\",\"🐎\":\"horse\",\"🦄\":\"unicorn\",\"🦓\":\"zebra\",\"🦌\":\"deer\",\"🦬\":\"bison\",\"🐮\":\"cow-face\",\"🐂\":\"ox\",\"🐃\":\"water-buffalo\",\"🐄\":\"cow\",\"🐷\":\"pig-face\",\"🐖\":\"pig\",\"🐗\":\"boar\",\"🐽\":\"pig-nose\",\"🐏\":\"ram\",\"🐑\":\"ewe\",\"🐐\":\"goat\",\"🐪\":\"camel\",\"🐫\":\"two-hump-camel\",\"🦙\":\"llama\",\"🦒\":\"giraffe\",\"🐘\":\"elephant\",\"🦣\":\"mammoth\",\"🦏\":\"rhinoceros\",\"🦛\":\"hippopotamus\",\"🐭\":\"mouse-face\",\"🐁\":\"mouse\",\"🐀\":\"rat\",\"🐹\":\"hamster\",\"🐰\":\"rabbit-face\",\"🐇\":\"rabbit\",\"🐿\":\"chipmunk\",\"🦫\":\"beaver\",\"🦔\":\"hedgehog\",\"🦇\":\"bat\",\"🐻\":\"bear\",\"🐻‍❄️\":\"polar-bear\",\"🐨\":\"koala\",\"🐼\":\"panda\",\"🦥\":\"sloth\",\"🦦\":\"otter\",\"🦨\":\"skunk\",\"🦘\":\"kangaroo\",\"🦡\":\"badger\",\"🐾\":\"paw-prints\",\"🦃\":\"turkey\",\"🐔\":\"chicken\",\"🐓\":\"rooster\",\"🐣\":\"hatching-chick\",\"🐤\":\"baby-chick\",\"🐥\":\"front-facing-baby-chick\",\"🐦\":\"bird\",\"🐧\":\"penguin\",\"🕊\":\"dove\",\"🦅\":\"eagle\",\"🦆\":\"duck\",\"🦢\":\"swan\",\"🦉\":\"owl\",\"🦤\":\"dodo\",\"🪶\":\"feather\",\"🦩\":\"flamingo\",\"🦚\":\"peacock\",\"🦜\":\"parrot\",\"🪽\":\"⊛-wing\",\"🐦‍⬛\":\"⊛-black-bird\",\"🪿\":\"⊛-goose\",\"🐸\":\"frog\",\"🐊\":\"crocodile\",\"🐢\":\"turtle\",\"🦎\":\"lizard\",\"🐍\":\"snake\",\"🐲\":\"dragon-face\",\"🐉\":\"dragon\",\"🦕\":\"sauropod\",\"🦖\":\"t-rex\",\"🐳\":\"spouting-whale\",\"🐋\":\"whale\",\"🐬\":\"dolphin\",\"🦭\":\"seal\",\"🐟\":\"fish\",\"🐠\":\"tropical-fish\",\"🐡\":\"blowfish\",\"🦈\":\"shark\",\"🐙\":\"octopus\",\"🐚\":\"spiral-shell\",\"🪸\":\"coral\",\"🪼\":\"⊛-jellyfish\",\"🐌\":\"snail\",\"🦋\":\"butterfly\",\"🐛\":\"bug\",\"🐜\":\"ant\",\"🐝\":\"honeybee\",\"🪲\":\"beetle\",\"🐞\":\"lady-beetle\",\"🦗\":\"cricket\",\"🪳\":\"cockroach\",\"🕷\":\"spider\",\"🕸\":\"spider-web\",\"🦂\":\"scorpion\",\"🦟\":\"mosquito\",\"🪰\":\"fly\",\"🪱\":\"worm\",\"🦠\":\"microbe\",\"💐\":\"bouquet\",\"🌸\":\"cherry-blossom\",\"💮\":\"white-flower\",\"🪷\":\"lotus\",\"🏵\":\"rosette\",\"🌹\":\"rose\",\"🥀\":\"wilted-flower\",\"🌺\":\"hibiscus\",\"🌻\":\"sunflower\",\"🌼\":\"blossom\",\"🌷\":\"tulip\",\"🪻\":\"⊛-hyacinth\",\"🌱\":\"seedling\",\"🪴\":\"potted-plant\",\"🌲\":\"evergreen-tree\",\"🌳\":\"deciduous-tree\",\"🌴\":\"palm-tree\",\"🌵\":\"cactus\",\"🌾\":\"sheaf-of-rice\",\"🌿\":\"herb\",\"☘\":\"shamrock\",\"🍀\":\"four-leaf-clover\",\"🍁\":\"maple-leaf\",\"🍂\":\"fallen-leaf\",\"🍃\":\"leaf-fluttering-in-wind\",\"🪹\":\"empty-nest\",\"🪺\":\"nest-with-eggs\",\"🍄\":\"mushroom\",\"🍇\":\"grapes\",\"🍈\":\"melon\",\"🍉\":\"watermelon\",\"🍊\":\"tangerine\",\"🍋\":\"lemon\",\"🍌\":\"banana\",\"🍍\":\"pineapple\",\"🥭\":\"mango\",\"🍎\":\"red-apple\",\"🍏\":\"green-apple\",\"🍐\":\"pear\",\"🍑\":\"peach\",\"🍒\":\"cherries\",\"🍓\":\"strawberry\",\"🫐\":\"blueberries\",\"🥝\":\"kiwi-fruit\",\"🍅\":\"tomato\",\"🫒\":\"olive\",\"🥥\":\"coconut\",\"🥑\":\"avocado\",\"🍆\":\"eggplant\",\"🥔\":\"potato\",\"🥕\":\"carrot\",\"🌽\":\"ear-of-corn\",\"🌶\":\"hot-pepper\",\"🫑\":\"bell-pepper\",\"🥒\":\"cucumber\",\"🥬\":\"leafy-green\",\"🥦\":\"broccoli\",\"🧄\":\"garlic\",\"🧅\":\"onion\",\"🥜\":\"peanuts\",\"🫘\":\"beans\",\"🌰\":\"chestnut\",\"🫚\":\"⊛-ginger-root\",\"🫛\":\"⊛-pea-pod\",\"🍞\":\"bread\",\"🥐\":\"croissant\",\"🥖\":\"baguette-bread\",\"🫓\":\"flatbread\",\"🥨\":\"pretzel\",\"🥯\":\"bagel\",\"🥞\":\"pancakes\",\"🧇\":\"waffle\",\"🧀\":\"cheese-wedge\",\"🍖\":\"meat-on-bone\",\"🍗\":\"poultry-leg\",\"🥩\":\"cut-of-meat\",\"🥓\":\"bacon\",\"🍔\":\"hamburger\",\"🍟\":\"french-fries\",\"🍕\":\"pizza\",\"🌭\":\"hot-dog\",\"🥪\":\"sandwich\",\"🌮\":\"taco\",\"🌯\":\"burrito\",\"🫔\":\"tamale\",\"🥙\":\"stuffed-flatbread\",\"🧆\":\"falafel\",\"🥚\":\"egg\",\"🍳\":\"cooking\",\"🥘\":\"shallow-pan-of-food\",\"🍲\":\"pot-of-food\",\"🫕\":\"fondue\",\"🥣\":\"bowl-with-spoon\",\"🥗\":\"green-salad\",\"🍿\":\"popcorn\",\"🧈\":\"butter\",\"🧂\":\"salt\",\"🥫\":\"canned-food\",\"🍱\":\"bento-box\",\"🍘\":\"rice-cracker\",\"🍙\":\"rice-ball\",\"🍚\":\"cooked-rice\",\"🍛\":\"curry-rice\",\"🍜\":\"steaming-bowl\",\"🍝\":\"spaghetti\",\"🍠\":\"roasted-sweet-potato\",\"🍢\":\"oden\",\"🍣\":\"sushi\",\"🍤\":\"fried-shrimp\",\"🍥\":\"fish-cake-with-swirl\",\"🥮\":\"moon-cake\",\"🍡\":\"dango\",\"🥟\":\"dumpling\",\"🥠\":\"fortune-cookie\",\"🥡\":\"takeout-box\",\"🦀\":\"crab\",\"🦞\":\"lobster\",\"🦐\":\"shrimp\",\"🦑\":\"squid\",\"🦪\":\"oyster\",\"🍦\":\"soft-ice-cream\",\"🍧\":\"shaved-ice\",\"🍨\":\"ice-cream\",\"🍩\":\"doughnut\",\"🍪\":\"cookie\",\"🎂\":\"birthday-cake\",\"🍰\":\"shortcake\",\"🧁\":\"cupcake\",\"🥧\":\"pie\",\"🍫\":\"chocolate-bar\",\"🍬\":\"candy\",\"🍭\":\"lollipop\",\"🍮\":\"custard\",\"🍯\":\"honey-pot\",\"🍼\":\"baby-bottle\",\"🥛\":\"glass-of-milk\",\"☕\":\"hot-beverage\",\"🫖\":\"teapot\",\"🍵\":\"teacup-without-handle\",\"🍶\":\"sake\",\"🍾\":\"bottle-with-popping-cork\",\"🍷\":\"wine-glass\",\"🍸\":\"cocktail-glass\",\"🍹\":\"tropical-drink\",\"🍺\":\"beer-mug\",\"🍻\":\"clinking-beer-mugs\",\"🥂\":\"clinking-glasses\",\"🥃\":\"tumbler-glass\",\"🫗\":\"pouring-liquid\",\"🥤\":\"cup-with-straw\",\"🧋\":\"bubble-tea\",\"🧃\":\"beverage-box\",\"🧉\":\"mate\",\"🧊\":\"ice\",\"🥢\":\"chopsticks\",\"🍽\":\"fork-and-knife-with-plate\",\"🍴\":\"fork-and-knife\",\"🥄\":\"spoon\",\"🔪\":\"kitchen-knife\",\"🫙\":\"jar\",\"🏺\":\"amphora\",\"🌍\":\"globe-showing-europe-africa\",\"🌎\":\"globe-showing-americas\",\"🌏\":\"globe-showing-asia-australia\",\"🌐\":\"globe-with-meridians\",\"🗺\":\"world-map\",\"🗾\":\"map-of-japan\",\"🧭\":\"compass\",\"🏔\":\"snow-capped-mountain\",\"⛰\":\"mountain\",\"🌋\":\"volcano\",\"🗻\":\"mount-fuji\",\"🏕\":\"camping\",\"🏖\":\"beach-with-umbrella\",\"🏜\":\"desert\",\"🏝\":\"desert-island\",\"🏞\":\"national-park\",\"🏟\":\"stadium\",\"🏛\":\"classical-building\",\"🏗\":\"building-construction\",\"🧱\":\"brick\",\"🪨\":\"rock\",\"🪵\":\"wood\",\"🛖\":\"hut\",\"🏘\":\"houses\",\"🏚\":\"derelict-house\",\"🏠\":\"house\",\"🏡\":\"house-with-garden\",\"🏢\":\"office-building\",\"🏣\":\"japanese-post-office\",\"🏤\":\"post-office\",\"🏥\":\"hospital\",\"🏦\":\"bank\",\"🏨\":\"hotel\",\"🏩\":\"love-hotel\",\"🏪\":\"convenience-store\",\"🏫\":\"school\",\"🏬\":\"department-store\",\"🏭\":\"factory\",\"🏯\":\"japanese-castle\",\"🏰\":\"castle\",\"💒\":\"wedding\",\"🗼\":\"tokyo-tower\",\"🗽\":\"statue-of-liberty\",\"⛪\":\"church\",\"🕌\":\"mosque\",\"🛕\":\"hindu-temple\",\"🕍\":\"synagogue\",\"⛩\":\"shinto-shrine\",\"🕋\":\"kaaba\",\"⛲\":\"fountain\",\"⛺\":\"tent\",\"🌁\":\"foggy\",\"🌃\":\"night-with-stars\",\"🏙\":\"cityscape\",\"🌄\":\"sunrise-over-mountains\",\"🌅\":\"sunrise\",\"🌆\":\"cityscape-at-dusk\",\"🌇\":\"sunset\",\"🌉\":\"bridge-at-night\",\"♨\":\"hot-springs\",\"🎠\":\"carousel-horse\",\"🛝\":\"playground-slide\",\"🎡\":\"ferris-wheel\",\"🎢\":\"roller-coaster\",\"💈\":\"barber-pole\",\"🎪\":\"circus-tent\",\"🚂\":\"locomotive\",\"🚃\":\"railway-car\",\"🚄\":\"high-speed-train\",\"🚅\":\"bullet-train\",\"🚆\":\"train\",\"🚇\":\"metro\",\"🚈\":\"light-rail\",\"🚉\":\"station\",\"🚊\":\"tram\",\"🚝\":\"monorail\",\"🚞\":\"mountain-railway\",\"🚋\":\"tram-car\",\"🚌\":\"bus\",\"🚍\":\"oncoming-bus\",\"🚎\":\"trolleybus\",\"🚐\":\"minibus\",\"🚑\":\"ambulance\",\"🚒\":\"fire-engine\",\"🚓\":\"police-car\",\"🚔\":\"oncoming-police-car\",\"🚕\":\"taxi\",\"🚖\":\"oncoming-taxi\",\"🚗\":\"automobile\",\"🚘\":\"oncoming-automobile\",\"🚙\":\"sport-utility-vehicle\",\"🛻\":\"pickup-truck\",\"🚚\":\"delivery-truck\",\"🚛\":\"articulated-lorry\",\"🚜\":\"tractor\",\"🏎\":\"racing-car\",\"🏍\":\"motorcycle\",\"🛵\":\"motor-scooter\",\"🦽\":\"manual-wheelchair\",\"🦼\":\"motorized-wheelchair\",\"🛺\":\"auto-rickshaw\",\"🚲\":\"bicycle\",\"🛴\":\"kick-scooter\",\"🛹\":\"skateboard\",\"🛼\":\"roller-skate\",\"🚏\":\"bus-stop\",\"🛣\":\"motorway\",\"🛤\":\"railway-track\",\"🛢\":\"oil-drum\",\"⛽\":\"fuel-pump\",\"🛞\":\"wheel\",\"🚨\":\"police-car-light\",\"🚥\":\"horizontal-traffic-light\",\"🚦\":\"vertical-traffic-light\",\"🛑\":\"stop-sign\",\"🚧\":\"construction\",\"⚓\":\"anchor\",\"🛟\":\"ring-buoy\",\"⛵\":\"sailboat\",\"🛶\":\"canoe\",\"🚤\":\"speedboat\",\"🛳\":\"passenger-ship\",\"⛴\":\"ferry\",\"🛥\":\"motor-boat\",\"🚢\":\"ship\",\"✈\":\"airplane\",\"🛩\":\"small-airplane\",\"🛫\":\"airplane-departure\",\"🛬\":\"airplane-arrival\",\"🪂\":\"parachute\",\"💺\":\"seat\",\"🚁\":\"helicopter\",\"🚟\":\"suspension-railway\",\"🚠\":\"mountain-cableway\",\"🚡\":\"aerial-tramway\",\"🛰\":\"satellite\",\"🚀\":\"rocket\",\"🛸\":\"flying-saucer\",\"🛎\":\"bellhop-bell\",\"🧳\":\"luggage\",\"⌛\":\"hourglass-done\",\"⏳\":\"hourglass-not-done\",\"⌚\":\"watch\",\"⏰\":\"alarm-clock\",\"⏱\":\"stopwatch\",\"⏲\":\"timer-clock\",\"🕰\":\"mantelpiece-clock\",\"🕛\":\"twelve-o-clock\",\"🕧\":\"twelve-thirty\",\"🕐\":\"one-o-clock\",\"🕜\":\"one-thirty\",\"🕑\":\"two-o-clock\",\"🕝\":\"two-thirty\",\"🕒\":\"three-o-clock\",\"🕞\":\"three-thirty\",\"🕓\":\"four-o-clock\",\"🕟\":\"four-thirty\",\"🕔\":\"five-o-clock\",\"🕠\":\"five-thirty\",\"🕕\":\"six-o-clock\",\"🕡\":\"six-thirty\",\"🕖\":\"seven-o-clock\",\"🕢\":\"seven-thirty\",\"🕗\":\"eight-o-clock\",\"🕣\":\"eight-thirty\",\"🕘\":\"nine-o-clock\",\"🕤\":\"nine-thirty\",\"🕙\":\"ten-o-clock\",\"🕥\":\"ten-thirty\",\"🕚\":\"eleven-o-clock\",\"🕦\":\"eleven-thirty\",\"🌑\":\"new-moon\",\"🌒\":\"waxing-crescent-moon\",\"🌓\":\"first-quarter-moon\",\"🌔\":\"waxing-gibbous-moon\",\"🌕\":\"full-moon\",\"🌖\":\"waning-gibbous-moon\",\"🌗\":\"last-quarter-moon\",\"🌘\":\"waning-crescent-moon\",\"🌙\":\"crescent-moon\",\"🌚\":\"new-moon-face\",\"🌛\":\"first-quarter-moon-face\",\"🌜\":\"last-quarter-moon-face\",\"🌡\":\"thermometer\",\"☀\":\"sun\",\"🌝\":\"full-moon-face\",\"🌞\":\"sun-with-face\",\"🪐\":\"ringed-planet\",\"⭐\":\"star\",\"🌟\":\"glowing-star\",\"🌠\":\"shooting-star\",\"🌌\":\"milky-way\",\"☁\":\"cloud\",\"⛅\":\"sun-behind-cloud\",\"⛈\":\"cloud-with-lightning-and-rain\",\"🌤\":\"sun-behind-small-cloud\",\"🌥\":\"sun-behind-large-cloud\",\"🌦\":\"sun-behind-rain-cloud\",\"🌧\":\"cloud-with-rain\",\"🌨\":\"cloud-with-snow\",\"🌩\":\"cloud-with-lightning\",\"🌪\":\"tornado\",\"🌫\":\"fog\",\"🌬\":\"wind-face\",\"🌀\":\"cyclone\",\"🌈\":\"rainbow\",\"🌂\":\"closed-umbrella\",\"☂\":\"umbrella\",\"☔\":\"umbrella-with-rain-drops\",\"⛱\":\"umbrella-on-ground\",\"⚡\":\"high-voltage\",\"❄\":\"snowflake\",\"☃\":\"snowman\",\"⛄\":\"snowman-without-snow\",\"☄\":\"comet\",\"🔥\":\"fire\",\"💧\":\"droplet\",\"🌊\":\"water-wave\",\"🎃\":\"jack-o-lantern\",\"🎄\":\"christmas-tree\",\"🎆\":\"fireworks\",\"🎇\":\"sparkler\",\"🧨\":\"firecracker\",\"✨\":\"sparkles\",\"🎈\":\"balloon\",\"🎉\":\"party-popper\",\"🎊\":\"confetti-ball\",\"🎋\":\"tanabata-tree\",\"🎍\":\"pine-decoration\",\"🎎\":\"japanese-dolls\",\"🎏\":\"carp-streamer\",\"🎐\":\"wind-chime\",\"🎑\":\"moon-viewing-ceremony\",\"🧧\":\"red-envelope\",\"🎀\":\"ribbon\",\"🎁\":\"wrapped-gift\",\"🎗\":\"reminder-ribbon\",\"🎟\":\"admission-tickets\",\"🎫\":\"ticket\",\"🎖\":\"military-medal\",\"🏆\":\"trophy\",\"🏅\":\"sports-medal\",\"🥇\":\"1st-place-medal\",\"🥈\":\"2nd-place-medal\",\"🥉\":\"3rd-place-medal\",\"⚽\":\"soccer-ball\",\"⚾\":\"baseball\",\"🥎\":\"softball\",\"🏀\":\"basketball\",\"🏐\":\"volleyball\",\"🏈\":\"american-football\",\"🏉\":\"rugby-football\",\"🎾\":\"tennis\",\"🥏\":\"flying-disc\",\"🎳\":\"bowling\",\"🏏\":\"cricket-game\",\"🏑\":\"field-hockey\",\"🏒\":\"ice-hockey\",\"🥍\":\"lacrosse\",\"🏓\":\"ping-pong\",\"🏸\":\"badminton\",\"🥊\":\"boxing-glove\",\"🥋\":\"martial-arts-uniform\",\"🥅\":\"goal-net\",\"⛳\":\"flag-in-hole\",\"⛸\":\"ice-skate\",\"🎣\":\"fishing-pole\",\"🤿\":\"diving-mask\",\"🎽\":\"running-shirt\",\"🎿\":\"skis\",\"🛷\":\"sled\",\"🥌\":\"curling-stone\",\"🎯\":\"bullseye\",\"🪀\":\"yo-yo\",\"🪁\":\"kite\",\"🔫\":\"water-pistol\",\"🎱\":\"pool-8-ball\",\"🔮\":\"crystal-ball\",\"🪄\":\"magic-wand\",\"🎮\":\"video-game\",\"🕹\":\"joystick\",\"🎰\":\"slot-machine\",\"🎲\":\"game-die\",\"🧩\":\"puzzle-piece\",\"🧸\":\"teddy-bear\",\"🪅\":\"piñata\",\"🪩\":\"mirror-ball\",\"🪆\":\"nesting-dolls\",\"♠\":\"spade-suit\",\"♥\":\"heart-suit\",\"♦\":\"diamond-suit\",\"♣\":\"club-suit\",\"♟\":\"chess-pawn\",\"🃏\":\"joker\",\"🀄\":\"mahjong-red-dragon\",\"🎴\":\"flower-playing-cards\",\"🎭\":\"performing-arts\",\"🖼\":\"framed-picture\",\"🎨\":\"artist-palette\",\"🧵\":\"thread\",\"🪡\":\"sewing-needle\",\"🧶\":\"yarn\",\"🪢\":\"knot\",\"👓\":\"glasses\",\"🕶\":\"sunglasses\",\"🥽\":\"goggles\",\"🥼\":\"lab-coat\",\"🦺\":\"safety-vest\",\"👔\":\"necktie\",\"👕\":\"t-shirt\",\"👖\":\"jeans\",\"🧣\":\"scarf\",\"🧤\":\"gloves\",\"🧥\":\"coat\",\"🧦\":\"socks\",\"👗\":\"dress\",\"👘\":\"kimono\",\"🥻\":\"sari\",\"🩱\":\"one-piece-swimsuit\",\"🩲\":\"briefs\",\"🩳\":\"shorts\",\"👙\":\"bikini\",\"👚\":\"woman-s-clothes\",\"🪭\":\"⊛-folding-hand-fan\",\"👛\":\"purse\",\"👜\":\"handbag\",\"👝\":\"clutch-bag\",\"🛍\":\"shopping-bags\",\"🎒\":\"backpack\",\"🩴\":\"thong-sandal\",\"👞\":\"man-s-shoe\",\"👟\":\"running-shoe\",\"🥾\":\"hiking-boot\",\"🥿\":\"flat-shoe\",\"👠\":\"high-heeled-shoe\",\"👡\":\"woman-s-sandal\",\"🩰\":\"ballet-shoes\",\"👢\":\"woman-s-boot\",\"🪮\":\"⊛-hair-pick\",\"👑\":\"crown\",\"👒\":\"woman-s-hat\",\"🎩\":\"top-hat\",\"🎓\":\"graduation-cap\",\"🧢\":\"billed-cap\",\"🪖\":\"military-helmet\",\"⛑\":\"rescue-worker-s-helmet\",\"📿\":\"prayer-beads\",\"💄\":\"lipstick\",\"💍\":\"ring\",\"💎\":\"gem-stone\",\"🔇\":\"muted-speaker\",\"🔈\":\"speaker-low-volume\",\"🔉\":\"speaker-medium-volume\",\"🔊\":\"speaker-high-volume\",\"📢\":\"loudspeaker\",\"📣\":\"megaphone\",\"📯\":\"postal-horn\",\"🔔\":\"bell\",\"🔕\":\"bell-with-slash\",\"🎼\":\"musical-score\",\"🎵\":\"musical-note\",\"🎶\":\"musical-notes\",\"🎙\":\"studio-microphone\",\"🎚\":\"level-slider\",\"🎛\":\"control-knobs\",\"🎤\":\"microphone\",\"🎧\":\"headphone\",\"📻\":\"radio\",\"🎷\":\"saxophone\",\"🪗\":\"accordion\",\"🎸\":\"guitar\",\"🎹\":\"musical-keyboard\",\"🎺\":\"trumpet\",\"🎻\":\"violin\",\"🪕\":\"banjo\",\"🥁\":\"drum\",\"🪘\":\"long-drum\",\"🪇\":\"maracas\",\"🪈\":\"flute\",\"📱\":\"mobile-phone\",\"📲\":\"mobile-phone-with-arrow\",\"☎\":\"telephone\",\"📞\":\"telephone-receiver\",\"📟\":\"pager\",\"📠\":\"fax-machine\",\"🔋\":\"battery\",\"🪫\":\"low-battery\",\"🔌\":\"electric-plug\",\"💻\":\"laptop\",\"🖥\":\"desktop-computer\",\"🖨\":\"printer\",\"⌨\":\"keyboard\",\"🖱\":\"computer-mouse\",\"🖲\":\"trackball\",\"💽\":\"computer-disk\",\"💾\":\"floppy-disk\",\"💿\":\"optical-disk\",\"📀\":\"dvd\",\"🧮\":\"abacus\",\"🎥\":\"movie-camera\",\"🎞\":\"film-frames\",\"📽\":\"film-projector\",\"🎬\":\"clapper-board\",\"📺\":\"television\",\"📷\":\"camera\",\"📸\":\"camera-with-flash\",\"📹\":\"video-camera\",\"📼\":\"videocassette\",\"🔍\":\"magnifying-glass-tilted-left\",\"🔎\":\"magnifying-glass-tilted-right\",\"🕯\":\"candle\",\"💡\":\"light-bulb\",\"🔦\":\"flashlight\",\"🏮\":\"red-paper-lantern\",\"🪔\":\"diya-lamp\",\"📔\":\"notebook-with-decorative-cover\",\"📕\":\"closed-book\",\"📖\":\"open-book\",\"📗\":\"green-book\",\"📘\":\"blue-book\",\"📙\":\"orange-book\",\"📚\":\"books\",\"📓\":\"notebook\",\"📒\":\"ledger\",\"📃\":\"page-with-curl\",\"📜\":\"scroll\",\"📄\":\"page-facing-up\",\"📰\":\"newspaper\",\"🗞\":\"rolled-up-newspaper\",\"📑\":\"bookmark-tabs\",\"🔖\":\"bookmark\",\"🏷\":\"label\",\"💰\":\"money-bag\",\"🪙\":\"coin\",\"💴\":\"yen-banknote\",\"💵\":\"dollar-banknote\",\"💶\":\"euro-banknote\",\"💷\":\"pound-banknote\",\"💸\":\"money-with-wings\",\"💳\":\"credit-card\",\"🧾\":\"receipt\",\"💹\":\"chart-increasing-with-yen\",\"✉\":\"envelope\",\"📧\":\"e-mail\",\"📨\":\"incoming-envelope\",\"📩\":\"envelope-with-arrow\",\"📤\":\"outbox-tray\",\"📥\":\"inbox-tray\",\"📦\":\"package\",\"📫\":\"closed-mailbox-with-raised-flag\",\"📪\":\"closed-mailbox-with-lowered-flag\",\"📬\":\"open-mailbox-with-raised-flag\",\"📭\":\"open-mailbox-with-lowered-flag\",\"📮\":\"postbox\",\"🗳\":\"ballot-box-with-ballot\",\"✏\":\"pencil\",\"✒\":\"black-nib\",\"🖋\":\"fountain-pen\",\"🖊\":\"pen\",\"🖌\":\"paintbrush\",\"🖍\":\"crayon\",\"📝\":\"memo\",\"💼\":\"briefcase\",\"📁\":\"file-folder\",\"📂\":\"open-file-folder\",\"🗂\":\"card-index-dividers\",\"📅\":\"calendar\",\"📆\":\"tear-off-calendar\",\"🗒\":\"spiral-notepad\",\"🗓\":\"spiral-calendar\",\"📇\":\"card-index\",\"📈\":\"chart-increasing\",\"📉\":\"chart-decreasing\",\"📊\":\"bar-chart\",\"📋\":\"clipboard\",\"📌\":\"pushpin\",\"📍\":\"round-pushpin\",\"📎\":\"paperclip\",\"🖇\":\"linked-paperclips\",\"📏\":\"straight-ruler\",\"📐\":\"triangular-ruler\",\"✂\":\"scissors\",\"🗃\":\"card-file-box\",\"🗄\":\"file-cabinet\",\"🗑\":\"wastebasket\",\"🔒\":\"locked\",\"🔓\":\"unlocked\",\"🔏\":\"locked-with-pen\",\"🔐\":\"locked-with-key\",\"🔑\":\"key\",\"🗝\":\"old-key\",\"🔨\":\"hammer\",\"🪓\":\"axe\",\"⛏\":\"pick\",\"⚒\":\"hammer-and-pick\",\"🛠\":\"hammer-and-wrench\",\"🗡\":\"dagger\",\"⚔\":\"crossed-swords\",\"💣\":\"bomb\",\"🪃\":\"boomerang\",\"🏹\":\"bow-and-arrow\",\"🛡\":\"shield\",\"🪚\":\"carpentry-saw\",\"🔧\":\"wrench\",\"🪛\":\"screwdriver\",\"🔩\":\"nut-and-bolt\",\"⚙\":\"gear\",\"🗜\":\"clamp\",\"⚖\":\"balance-scale\",\"🦯\":\"white-cane\",\"🔗\":\"link\",\"⛓\":\"chains\",\"🪝\":\"hook\",\"🧰\":\"toolbox\",\"🧲\":\"magnet\",\"🪜\":\"ladder\",\"⚗\":\"alembic\",\"🧪\":\"test-tube\",\"🧫\":\"petri-dish\",\"🧬\":\"dna\",\"🔬\":\"microscope\",\"🔭\":\"telescope\",\"📡\":\"satellite-antenna\",\"💉\":\"syringe\",\"🩸\":\"drop-of-blood\",\"💊\":\"pill\",\"🩹\":\"adhesive-bandage\",\"🩼\":\"crutch\",\"🩺\":\"stethoscope\",\"🩻\":\"x-ray\",\"🚪\":\"door\",\"🛗\":\"elevator\",\"🪞\":\"mirror\",\"🪟\":\"window\",\"🛏\":\"bed\",\"🛋\":\"couch-and-lamp\",\"🪑\":\"chair\",\"🚽\":\"toilet\",\"🪠\":\"plunger\",\"🚿\":\"shower\",\"🛁\":\"bathtub\",\"🪤\":\"mouse-trap\",\"🪒\":\"razor\",\"🧴\":\"lotion-bottle\",\"🧷\":\"safety-pin\",\"🧹\":\"broom\",\"🧺\":\"basket\",\"🧻\":\"roll-of-paper\",\"🪣\":\"bucket\",\"🧼\":\"soap\",\"🫧\":\"bubbles\",\"🪥\":\"toothbrush\",\"🧽\":\"sponge\",\"🧯\":\"fire-extinguisher\",\"🛒\":\"shopping-cart\",\"🚬\":\"cigarette\",\"⚰\":\"coffin\",\"🪦\":\"headstone\",\"⚱\":\"funeral-urn\",\"🧿\":\"nazar-amulet\",\"🪬\":\"hamsa\",\"🗿\":\"moai\",\"🪧\":\"placard\",\"🪪\":\"identification-card\",\"🏧\":\"atm-sign\",\"🚮\":\"litter-in-bin-sign\",\"🚰\":\"potable-water\",\"♿\":\"wheelchair-symbol\",\"🚹\":\"men-s-room\",\"🚺\":\"women-s-room\",\"🚻\":\"restroom\",\"🚼\":\"baby-symbol\",\"🚾\":\"water-closet\",\"🛂\":\"passport-control\",\"🛃\":\"customs\",\"🛄\":\"baggage-claim\",\"🛅\":\"left-luggage\",\"⚠\":\"warning\",\"🚸\":\"children-crossing\",\"⛔\":\"no-entry\",\"🚫\":\"prohibited\",\"🚳\":\"no-bicycles\",\"🚭\":\"no-smoking\",\"🚯\":\"no-littering\",\"🚱\":\"non-potable-water\",\"🚷\":\"no-pedestrians\",\"📵\":\"no-mobile-phones\",\"🔞\":\"no-one-under-eighteen\",\"☢\":\"radioactive\",\"☣\":\"biohazard\",\"⬆\":\"up-arrow\",\"↗\":\"up-right-arrow\",\"➡\":\"right-arrow\",\"↘\":\"down-right-arrow\",\"⬇\":\"down-arrow\",\"↙\":\"down-left-arrow\",\"⬅\":\"left-arrow\",\"↖\":\"up-left-arrow\",\"↕\":\"up-down-arrow\",\"↔\":\"left-right-arrow\",\"↩\":\"right-arrow-curving-left\",\"↪\":\"left-arrow-curving-right\",\"⤴\":\"right-arrow-curving-up\",\"⤵\":\"right-arrow-curving-down\",\"🔃\":\"clockwise-vertical-arrows\",\"🔄\":\"counterclockwise-arrows-button\",\"🔙\":\"back-arrow\",\"🔚\":\"end-arrow\",\"🔛\":\"on!-arrow\",\"🔜\":\"soon-arrow\",\"🔝\":\"top-arrow\",\"🛐\":\"place-of-worship\",\"⚛\":\"atom-symbol\",\"🕉\":\"om\",\"✡\":\"star-of-david\",\"☸\":\"wheel-of-dharma\",\"☯\":\"yin-yang\",\"✝\":\"latin-cross\",\"☦\":\"orthodox-cross\",\"☪\":\"star-and-crescent\",\"☮\":\"peace-symbol\",\"🕎\":\"menorah\",\"🔯\":\"dotted-six-pointed-star\",\"🪯\":\"⊛-khanda\",\"♈\":\"aries\",\"♉\":\"taurus\",\"♊\":\"gemini\",\"♋\":\"cancer\",\"♌\":\"leo\",\"♍\":\"virgo\",\"♎\":\"libra\",\"♏\":\"scorpio\",\"♐\":\"sagittarius\",\"♑\":\"capricorn\",\"♒\":\"aquarius\",\"♓\":\"pisces\",\"⛎\":\"ophiuchus\",\"🔀\":\"shuffle-tracks-button\",\"🔁\":\"repeat-button\",\"🔂\":\"repeat-single-button\",\"▶\":\"play-button\",\"⏩\":\"fast-forward-button\",\"⏭\":\"next-track-button\",\"⏯\":\"play-or-pause-button\",\"◀\":\"reverse-button\",\"⏪\":\"fast-reverse-button\",\"⏮\":\"last-track-button\",\"🔼\":\"upwards-button\",\"⏫\":\"fast-up-button\",\"🔽\":\"downwards-button\",\"⏬\":\"fast-down-button\",\"⏸\":\"pause-button\",\"⏹\":\"stop-button\",\"⏺\":\"record-button\",\"⏏\":\"eject-button\",\"🎦\":\"cinema\",\"🔅\":\"dim-button\",\"🔆\":\"bright-button\",\"📶\":\"antenna-bars\",\"🛜\":\"⊛-wireless\",\"📳\":\"vibration-mode\",\"📴\":\"mobile-phone-off\",\"♀\":\"female-sign\",\"♂\":\"male-sign\",\"⚧\":\"transgender-symbol\",\"✖\":\"multiply\",\"➕\":\"plus\",\"➖\":\"minus\",\"➗\":\"divide\",\"🟰\":\"heavy-equals-sign\",\"♾\":\"infinity\",\"‼\":\"double-exclamation-mark\",\"⁉\":\"exclamation-question-mark\",\"❓\":\"red-question-mark\",\"❔\":\"white-question-mark\",\"❕\":\"white-exclamation-mark\",\"❗\":\"red-exclamation-mark\",\"〰\":\"wavy-dash\",\"💱\":\"currency-exchange\",\"💲\":\"heavy-dollar-sign\",\"⚕\":\"medical-symbol\",\"♻\":\"recycling-symbol\",\"⚜\":\"fleur-de-lis\",\"🔱\":\"trident-emblem\",\"📛\":\"name-badge\",\"🔰\":\"japanese-symbol-for-beginner\",\"⭕\":\"hollow-red-circle\",\"✅\":\"check-mark-button\",\"☑\":\"check-box-with-check\",\"✔\":\"check-mark\",\"❌\":\"cross-mark\",\"❎\":\"cross-mark-button\",\"➰\":\"curly-loop\",\"➿\":\"double-curly-loop\",\"〽\":\"part-alternation-mark\",\"✳\":\"eight-spoked-asterisk\",\"✴\":\"eight-pointed-star\",\"❇\":\"sparkle\",\"©\":\"copyright\",\"®\":\"registered\",\"™\":\"trade-mark\",\"#️⃣\":\"keycap-#\",\"*️⃣\":\"keycap-*\",\"0️⃣\":\"keycap-0\",\"1️⃣\":\"keycap-1\",\"2️⃣\":\"keycap-2\",\"3️⃣\":\"keycap-3\",\"4️⃣\":\"keycap-4\",\"5️⃣\":\"keycap-5\",\"6️⃣\":\"keycap-6\",\"7️⃣\":\"keycap-7\",\"8️⃣\":\"keycap-8\",\"9️⃣\":\"keycap-9\",\"🔟\":\"keycap-10\",\"🔠\":\"input-latin-uppercase\",\"🔡\":\"input-latin-lowercase\",\"🔢\":\"input-numbers\",\"🔣\":\"input-symbols\",\"🔤\":\"input-latin-letters\",\"🅰\":\"a-button-(blood-type)\",\"🆎\":\"ab-button-(blood-type)\",\"🅱\":\"b-button-(blood-type)\",\"🆑\":\"cl-button\",\"🆒\":\"cool-button\",\"🆓\":\"free-button\",\"ℹ\":\"information\",\"🆔\":\"id-button\",\"Ⓜ\":\"circled-m\",\"🆕\":\"new-button\",\"🆖\":\"ng-button\",\"🅾\":\"o-button-(blood-type)\",\"🆗\":\"ok-button\",\"🅿\":\"p-button\",\"🆘\":\"sos-button\",\"🆙\":\"up!-button\",\"🆚\":\"vs-button\",\"🈁\":\"japanese-here-button\",\"🈂\":\"japanese-service-charge-button\",\"🈷\":\"japanese-monthly-amount-button\",\"🈶\":\"japanese-not-free-of-charge-button\",\"🈯\":\"japanese-reserved-button\",\"🉐\":\"japanese-bargain-button\",\"🈹\":\"japanese-discount-button\",\"🈚\":\"japanese-free-of-charge-button\",\"🈲\":\"japanese-prohibited-button\",\"🉑\":\"japanese-acceptable-button\",\"🈸\":\"japanese-application-button\",\"🈴\":\"japanese-passing-grade-button\",\"🈳\":\"japanese-vacancy-button\",\"㊗\":\"japanese-congratulations-button\",\"㊙\":\"japanese-secret-button\",\"🈺\":\"japanese-open-for-business-button\",\"🈵\":\"japanese-no-vacancy-button\",\"🔴\":\"red-circle\",\"🟠\":\"orange-circle\",\"🟡\":\"yellow-circle\",\"🟢\":\"green-circle\",\"🔵\":\"blue-circle\",\"🟣\":\"purple-circle\",\"🟤\":\"brown-circle\",\"⚫\":\"black-circle\",\"⚪\":\"white-circle\",\"🟥\":\"red-square\",\"🟧\":\"orange-square\",\"🟨\":\"yellow-square\",\"🟩\":\"green-square\",\"🟦\":\"blue-square\",\"🟪\":\"purple-square\",\"🟫\":\"brown-square\",\"⬛\":\"black-large-square\",\"⬜\":\"white-large-square\",\"◼\":\"black-medium-square\",\"◻\":\"white-medium-square\",\"◾\":\"black-medium-small-square\",\"◽\":\"white-medium-small-square\",\"▪\":\"black-small-square\",\"▫\":\"white-small-square\",\"🔶\":\"large-orange-diamond\",\"🔷\":\"large-blue-diamond\",\"🔸\":\"small-orange-diamond\",\"🔹\":\"small-blue-diamond\",\"🔺\":\"red-triangle-pointed-up\",\"🔻\":\"red-triangle-pointed-down\",\"💠\":\"diamond-with-a-dot\",\"🔘\":\"radio-button\",\"🔳\":\"white-square-button\",\"🔲\":\"black-square-button\",\"🏁\":\"chequered-flag\",\"🚩\":\"triangular-flag\",\"🎌\":\"crossed-flags\",\"🏴\":\"black-flag\",\"🏳\":\"white-flag\",\"🏳️‍🌈\":\"rainbow-flag\",\"🏳️‍⚧️\":\"transgender-flag\",\"🏴‍☠️\":\"pirate-flag\",\"🇦🇨\":\"flag-ascension-island\",\"🇦🇩\":\"flag-andorra\",\"🇦🇪\":\"flag-united-arab-emirates\",\"🇦🇫\":\"flag-afghanistan\",\"🇦🇬\":\"flag-antigua-and-barbuda\",\"🇦🇮\":\"flag-anguilla\",\"🇦🇱\":\"flag-albania\",\"🇦🇲\":\"flag-armenia\",\"🇦🇴\":\"flag-angola\",\"🇦🇶\":\"flag-antarctica\",\"🇦🇷\":\"flag-argentina\",\"🇦🇸\":\"flag-american-samoa\",\"🇦🇹\":\"flag-austria\",\"🇦🇺\":\"flag-australia\",\"🇦🇼\":\"flag-aruba\",\"🇦🇽\":\"flag-åland-islands\",\"🇦🇿\":\"flag-azerbaijan\",\"🇧🇦\":\"flag-bosnia-and-herzegovina\",\"🇧🇧\":\"flag-barbados\",\"🇧🇩\":\"flag-bangladesh\",\"🇧🇪\":\"flag-belgium\",\"🇧🇫\":\"flag-burkina-faso\",\"🇧🇬\":\"flag-bulgaria\",\"🇧🇭\":\"flag-bahrain\",\"🇧🇮\":\"flag-burundi\",\"🇧🇯\":\"flag-benin\",\"🇧🇱\":\"flag-st-barthelemy\",\"🇧🇲\":\"flag-bermuda\",\"🇧🇳\":\"flag-brunei\",\"🇧🇴\":\"flag-bolivia\",\"🇧🇶\":\"flag-caribbean-netherlands\",\"🇧🇷\":\"flag-brazil\",\"🇧🇸\":\"flag-bahamas\",\"🇧🇹\":\"flag-bhutan\",\"🇧🇻\":\"flag-bouvet-island\",\"🇧🇼\":\"flag-botswana\",\"🇧🇾\":\"flag-belarus\",\"🇧🇿\":\"flag-belize\",\"🇨🇦\":\"flag-canada\",\"🇨🇨\":\"flag-cocos-(keeling)-islands\",\"🇨🇩\":\"flag-congo---kinshasa\",\"🇨🇫\":\"flag-central-african-republic\",\"🇨🇬\":\"flag-congo---brazzaville\",\"🇨🇭\":\"flag-switzerland\",\"🇨🇮\":\"flag-côte-d-ivoire\",\"🇨🇰\":\"flag-cook-islands\",\"🇨🇱\":\"flag-chile\",\"🇨🇲\":\"flag-cameroon\",\"🇨🇳\":\"flag-china\",\"🇨🇴\":\"flag-colombia\",\"🇨🇵\":\"flag-clipperton-island\",\"🇨🇷\":\"flag-costa-rica\",\"🇨🇺\":\"flag-cuba\",\"🇨🇻\":\"flag-cape-verde\",\"🇨🇼\":\"flag-curaçao\",\"🇨🇽\":\"flag-christmas-island\",\"🇨🇾\":\"flag-cyprus\",\"🇨🇿\":\"flag-czechia\",\"🇩🇪\":\"flag-germany\",\"🇩🇬\":\"flag-diego-garcia\",\"🇩🇯\":\"flag-djibouti\",\"🇩🇰\":\"flag-denmark\",\"🇩🇲\":\"flag-dominica\",\"🇩🇴\":\"flag-dominican-republic\",\"🇩🇿\":\"flag-algeria\",\"🇪🇦\":\"flag-ceuta-and-melilla\",\"🇪🇨\":\"flag-ecuador\",\"🇪🇪\":\"flag-estonia\",\"🇪🇬\":\"flag-egypt\",\"🇪🇭\":\"flag-western-sahara\",\"🇪🇷\":\"flag-eritrea\",\"🇪🇸\":\"flag-spain\",\"🇪🇹\":\"flag-ethiopia\",\"🇪🇺\":\"flag-european-union\",\"🇫🇮\":\"flag-finland\",\"🇫🇯\":\"flag-fiji\",\"🇫🇰\":\"flag-falkland-islands\",\"🇫🇲\":\"flag-micronesia\",\"🇫🇴\":\"flag-faroe-islands\",\"🇫🇷\":\"flag-france\",\"🇬🇦\":\"flag-gabon\",\"🇬🇧\":\"flag-united-kingdom\",\"🇬🇩\":\"flag-grenada\",\"🇬🇪\":\"flag-georgia\",\"🇬🇫\":\"flag-french-guiana\",\"🇬🇬\":\"flag-guernsey\",\"🇬🇭\":\"flag-ghana\",\"🇬🇮\":\"flag-gibraltar\",\"🇬🇱\":\"flag-greenland\",\"🇬🇲\":\"flag-gambia\",\"🇬🇳\":\"flag-guinea\",\"🇬🇵\":\"flag-guadeloupe\",\"🇬🇶\":\"flag-equatorial-guinea\",\"🇬🇷\":\"flag-greece\",\"🇬🇸\":\"flag-south-georgia-and-south-sandwich-islands\",\"🇬🇹\":\"flag-guatemala\",\"🇬🇺\":\"flag-guam\",\"🇬🇼\":\"flag-guinea-bissau\",\"🇬🇾\":\"flag-guyana\",\"🇭🇰\":\"flag-hong-kong-sar-china\",\"🇭🇲\":\"flag-heard-and-mcdonald-islands\",\"🇭🇳\":\"flag-honduras\",\"🇭🇷\":\"flag-croatia\",\"🇭🇹\":\"flag-haiti\",\"🇭🇺\":\"flag-hungary\",\"🇮🇨\":\"flag-canary-islands\",\"🇮🇩\":\"flag-indonesia\",\"🇮🇪\":\"flag-ireland\",\"🇮🇱\":\"flag-israel\",\"🇮🇲\":\"flag-isle-of-man\",\"🇮🇳\":\"flag-india\",\"🇮🇴\":\"flag-british-indian-ocean-territory\",\"🇮🇶\":\"flag-iraq\",\"🇮🇷\":\"flag-iran\",\"🇮🇸\":\"flag-iceland\",\"🇮🇹\":\"flag-italy\",\"🇯🇪\":\"flag-jersey\",\"🇯🇲\":\"flag-jamaica\",\"🇯🇴\":\"flag-jordan\",\"🇯🇵\":\"flag-japan\",\"🇰🇪\":\"flag-kenya\",\"🇰🇬\":\"flag-kyrgyzstan\",\"🇰🇭\":\"flag-cambodia\",\"🇰🇮\":\"flag-kiribati\",\"🇰🇲\":\"flag-comoros\",\"🇰🇳\":\"flag-st-kitts-and-nevis\",\"🇰🇵\":\"flag-north-korea\",\"🇰🇷\":\"flag-south-korea\",\"🇰🇼\":\"flag-kuwait\",\"🇰🇾\":\"flag-cayman-islands\",\"🇰🇿\":\"flag-kazakhstan\",\"🇱🇦\":\"flag-laos\",\"🇱🇧\":\"flag-lebanon\",\"🇱🇨\":\"flag-st-lucia\",\"🇱🇮\":\"flag-liechtenstein\",\"🇱🇰\":\"flag-sri-lanka\",\"🇱🇷\":\"flag-liberia\",\"🇱🇸\":\"flag-lesotho\",\"🇱🇹\":\"flag-lithuania\",\"🇱🇺\":\"flag-luxembourg\",\"🇱🇻\":\"flag-latvia\",\"🇱🇾\":\"flag-libya\",\"🇲🇦\":\"flag-morocco\",\"🇲🇨\":\"flag-monaco\",\"🇲🇩\":\"flag-moldova\",\"🇲🇪\":\"flag-montenegro\",\"🇲🇫\":\"flag-st-martin\",\"🇲🇬\":\"flag-madagascar\",\"🇲🇭\":\"flag-marshall-islands\",\"🇲🇰\":\"flag-north-macedonia\",\"🇲🇱\":\"flag-mali\",\"🇲🇲\":\"flag-myanmar-(burma)\",\"🇲🇳\":\"flag-mongolia\",\"🇲🇴\":\"flag-macao-sar-china\",\"🇲🇵\":\"flag-northern-mariana-islands\",\"🇲🇶\":\"flag-martinique\",\"🇲🇷\":\"flag-mauritania\",\"🇲🇸\":\"flag-montserrat\",\"🇲🇹\":\"flag-malta\",\"🇲🇺\":\"flag-mauritius\",\"🇲🇻\":\"flag-maldives\",\"🇲🇼\":\"flag-malawi\",\"🇲🇽\":\"flag-mexico\",\"🇲🇾\":\"flag-malaysia\",\"🇲🇿\":\"flag-mozambique\",\"🇳🇦\":\"flag-namibia\",\"🇳🇨\":\"flag-new-caledonia\",\"🇳🇪\":\"flag-niger\",\"🇳🇫\":\"flag-norfolk-island\",\"🇳🇬\":\"flag-nigeria\",\"🇳🇮\":\"flag-nicaragua\",\"🇳🇱\":\"flag-netherlands\",\"🇳🇴\":\"flag-norway\",\"🇳🇵\":\"flag-nepal\",\"🇳🇷\":\"flag-nauru\",\"🇳🇺\":\"flag-niue\",\"🇳🇿\":\"flag-new-zealand\",\"🇴🇲\":\"flag-oman\",\"🇵🇦\":\"flag-panama\",\"🇵🇪\":\"flag-peru\",\"🇵🇫\":\"flag-french-polynesia\",\"🇵🇬\":\"flag-papua-new-guinea\",\"🇵🇭\":\"flag-philippines\",\"🇵🇰\":\"flag-pakistan\",\"🇵🇱\":\"flag-poland\",\"🇵🇲\":\"flag-st-pierre-and-miquelon\",\"🇵🇳\":\"flag-pitcairn-islands\",\"🇵🇷\":\"flag-puerto-rico\",\"🇵🇸\":\"flag-palestinian-territories\",\"🇵🇹\":\"flag-portugal\",\"🇵🇼\":\"flag-palau\",\"🇵🇾\":\"flag-paraguay\",\"🇶🇦\":\"flag-qatar\",\"🇷🇪\":\"flag-reunion\",\"🇷🇴\":\"flag-romania\",\"🇷🇸\":\"flag-serbia\",\"🇷🇺\":\"flag-russia\",\"🇷🇼\":\"flag-rwanda\",\"🇸🇦\":\"flag-saudi-arabia\",\"🇸🇧\":\"flag-solomon-islands\",\"🇸🇨\":\"flag-seychelles\",\"🇸🇩\":\"flag-sudan\",\"🇸🇪\":\"flag-sweden\",\"🇸🇬\":\"flag-singapore\",\"🇸🇭\":\"flag-st-helena\",\"🇸🇮\":\"flag-slovenia\",\"🇸🇯\":\"flag-svalbard-and-jan-mayen\",\"🇸🇰\":\"flag-slovakia\",\"🇸🇱\":\"flag-sierra-leone\",\"🇸🇲\":\"flag-san-marino\",\"🇸🇳\":\"flag-senegal\",\"🇸🇴\":\"flag-somalia\",\"🇸🇷\":\"flag-suriname\",\"🇸🇸\":\"flag-south-sudan\",\"🇸🇹\":\"flag-são-tome-and-príncipe\",\"🇸🇻\":\"flag-el-salvador\",\"🇸🇽\":\"flag-sint-maarten\",\"🇸🇾\":\"flag-syria\",\"🇸🇿\":\"flag-eswatini\",\"🇹🇦\":\"flag-tristan-da-cunha\",\"🇹🇨\":\"flag-turks-and-caicos-islands\",\"🇹🇩\":\"flag-chad\",\"🇹🇫\":\"flag-french-southern-territories\",\"🇹🇬\":\"flag-togo\",\"🇹🇭\":\"flag-thailand\",\"🇹🇯\":\"flag-tajikistan\",\"🇹🇰\":\"flag-tokelau\",\"🇹🇱\":\"flag-timor-leste\",\"🇹🇲\":\"flag-turkmenistan\",\"🇹🇳\":\"flag-tunisia\",\"🇹🇴\":\"flag-tonga\",\"🇹🇷\":\"flag-turkey\",\"🇹🇹\":\"flag-trinidad-and-tobago\",\"🇹🇻\":\"flag-tuvalu\",\"🇹🇼\":\"flag-taiwan\",\"🇹🇿\":\"flag-tanzania\",\"🇺🇦\":\"flag-ukraine\",\"🇺🇬\":\"flag-uganda\",\"🇺🇲\":\"flag-us-outlying-islands\",\"🇺🇳\":\"flag-united-nations\",\"🇺🇸\":\"flag-united-states\",\"🇺🇾\":\"flag-uruguay\",\"🇺🇿\":\"flag-uzbekistan\",\"🇻🇦\":\"flag-vatican-city\",\"🇻🇨\":\"flag-st-vincent-and-grenadines\",\"🇻🇪\":\"flag-venezuela\",\"🇻🇬\":\"flag-british-virgin-islands\",\"🇻🇮\":\"flag-us-virgin-islands\",\"🇻🇳\":\"flag-vietnam\",\"🇻🇺\":\"flag-vanuatu\",\"🇼🇫\":\"flag-wallis-and-futuna\",\"🇼🇸\":\"flag-samoa\",\"🇽🇰\":\"flag-kosovo\",\"🇾🇪\":\"flag-yemen\",\"🇾🇹\":\"flag-mayotte\",\"🇿🇦\":\"flag-south-africa\",\"🇿🇲\":\"flag-zambia\",\"🇿🇼\":\"flag-zimbabwe\",\"🏴󠁧󠁢󠁥󠁮󠁧󠁿\":\"flag-england\",\"🏴󠁧󠁢󠁳󠁣󠁴󠁿\":\"flag-scotland\",\"🏴󠁧󠁢󠁷󠁬󠁳󠁿\":\"flag-wales\"},kj=Object.keys(yj),vj='\\n// This Source Code Form is subject to the terms of the Mozilla Public\\n// License, v. 2.0. If a copy of the MPL was not distributed with this\\n// file, You can obtain one at https://mozilla.org/MPL/2.0/.\\n\\n// Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat,\\n// rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported.\\n\\n// Instructions on pulling and using this list can be found at https://publicsuffix.org/list/.\\n\\n// ===BEGIN ICANN DOMAINS===\\n\\n// ac : http://nic.ac/rules.htm\\nac\\ncom.ac\\nedu.ac\\ngov.ac\\nnet.ac\\nmil.ac\\norg.ac\\n\\n// ad : https://en.wikipedia.org/wiki/.ad\\nad\\nnom.ad\\n\\n// ae : https://tdra.gov.ae/en/aeda/ae-policies\\nae\\nco.ae\\nnet.ae\\norg.ae\\nsch.ae\\nac.ae\\ngov.ae\\nmil.ae\\n\\n// aero : see https://www.information.aero/index.php?id=66\\naero\\naccident-investigation.aero\\naccident-prevention.aero\\naerobatic.aero\\naeroclub.aero\\naerodrome.aero\\nagents.aero\\naircraft.aero\\nairline.aero\\nairport.aero\\nair-surveillance.aero\\nairtraffic.aero\\nair-traffic-control.aero\\nambulance.aero\\namusement.aero\\nassociation.aero\\nauthor.aero\\nballooning.aero\\nbroker.aero\\ncaa.aero\\ncargo.aero\\ncatering.aero\\ncertification.aero\\nchampionship.aero\\ncharter.aero\\ncivilaviation.aero\\nclub.aero\\nconference.aero\\nconsultant.aero\\nconsulting.aero\\ncontrol.aero\\ncouncil.aero\\ncrew.aero\\ndesign.aero\\ndgca.aero\\neducator.aero\\nemergency.aero\\nengine.aero\\nengineer.aero\\nentertainment.aero\\nequipment.aero\\nexchange.aero\\nexpress.aero\\nfederation.aero\\nflight.aero\\nfuel.aero\\ngliding.aero\\ngovernment.aero\\ngroundhandling.aero\\ngroup.aero\\nhanggliding.aero\\nhomebuilt.aero\\ninsurance.aero\\njournal.aero\\njournalist.aero\\nleasing.aero\\nlogistics.aero\\nmagazine.aero\\nmaintenance.aero\\nmedia.aero\\nmicrolight.aero\\nmodelling.aero\\nnavigation.aero\\nparachuting.aero\\nparagliding.aero\\npassenger-association.aero\\npilot.aero\\npress.aero\\nproduction.aero\\nrecreation.aero\\nrepbody.aero\\nres.aero\\nresearch.aero\\nrotorcraft.aero\\nsafety.aero\\nscientist.aero\\nservices.aero\\nshow.aero\\nskydiving.aero\\nsoftware.aero\\nstudent.aero\\ntrader.aero\\ntrading.aero\\ntrainer.aero\\nunion.aero\\nworkinggroup.aero\\nworks.aero\\n\\n// af : http://www.nic.af/help.jsp\\naf\\ngov.af\\ncom.af\\norg.af\\nnet.af\\nedu.af\\n\\n// ag : http://www.nic.ag/prices.htm\\nag\\ncom.ag\\norg.ag\\nnet.ag\\nco.ag\\nnom.ag\\n\\n// ai : http://nic.com.ai/\\nai\\noff.ai\\ncom.ai\\nnet.ai\\norg.ai\\n\\n// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31\\nal\\ncom.al\\nedu.al\\ngov.al\\nmil.al\\nnet.al\\norg.al\\n\\n// am : https://www.amnic.net/policy/en/Policy_EN.pdf\\nam\\nco.am\\ncom.am\\ncommune.am\\nnet.am\\norg.am\\n\\n// ao : https://en.wikipedia.org/wiki/.ao\\n// http://www.dns.ao/REGISTR.DOC\\nao\\ned.ao\\ngv.ao\\nog.ao\\nco.ao\\npb.ao\\nit.ao\\n\\n// aq : https://en.wikipedia.org/wiki/.aq\\naq\\n\\n// ar : https://nic.ar/es/nic-argentina/normativa\\nar\\nbet.ar\\ncom.ar\\ncoop.ar\\nedu.ar\\ngob.ar\\ngov.ar\\nint.ar\\nmil.ar\\nmusica.ar\\nmutual.ar\\nnet.ar\\norg.ar\\nsenasa.ar\\ntur.ar\\n\\n// arpa : https://en.wikipedia.org/wiki/.arpa\\n// Confirmed by registry <iana-questions@icann.org> 2008-06-18\\narpa\\ne164.arpa\\nin-addr.arpa\\nip6.arpa\\niris.arpa\\nuri.arpa\\nurn.arpa\\n\\n// as : https://en.wikipedia.org/wiki/.as\\nas\\ngov.as\\n\\n// asia : https://en.wikipedia.org/wiki/.asia\\nasia\\n\\n// at : https://en.wikipedia.org/wiki/.at\\n// Confirmed by registry <it@nic.at> 2008-06-17\\nat\\nac.at\\nco.at\\ngv.at\\nor.at\\nsth.ac.at\\n\\n// au : https://en.wikipedia.org/wiki/.au\\n// http://www.auda.org.au/\\nau\\n// 2LDs\\ncom.au\\nnet.au\\norg.au\\nedu.au\\ngov.au\\nasn.au\\nid.au\\n// Historic 2LDs (closed to new registration, but sites still exist)\\ninfo.au\\nconf.au\\noz.au\\n// CGDNs - http://www.cgdn.org.au/\\nact.au\\nnsw.au\\nnt.au\\nqld.au\\nsa.au\\ntas.au\\nvic.au\\nwa.au\\n// 3LDs\\nact.edu.au\\ncatholic.edu.au\\n// eq.edu.au - Removed at the request of the Queensland Department of Education\\nnsw.edu.au\\nnt.edu.au\\nqld.edu.au\\nsa.edu.au\\ntas.edu.au\\nvic.edu.au\\nwa.edu.au\\n// act.gov.au  Bug 984824 - Removed at request of Greg Tankard\\n// nsw.gov.au  Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au>\\n// nt.gov.au  Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au>\\nqld.gov.au\\nsa.gov.au\\ntas.gov.au\\nvic.gov.au\\nwa.gov.au\\n// 4LDs\\n// education.tas.edu.au - Removed at the request of the Department of Education Tasmania\\nschools.nsw.edu.au\\n\\n// aw : https://en.wikipedia.org/wiki/.aw\\naw\\ncom.aw\\n\\n// ax : https://en.wikipedia.org/wiki/.ax\\nax\\n\\n// az : https://en.wikipedia.org/wiki/.az\\naz\\ncom.az\\nnet.az\\nint.az\\ngov.az\\norg.az\\nedu.az\\ninfo.az\\npp.az\\nmil.az\\nname.az\\npro.az\\nbiz.az\\n\\n// ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf\\nba\\ncom.ba\\nedu.ba\\ngov.ba\\nmil.ba\\nnet.ba\\norg.ba\\n\\n// bb : https://en.wikipedia.org/wiki/.bb\\nbb\\nbiz.bb\\nco.bb\\ncom.bb\\nedu.bb\\ngov.bb\\ninfo.bb\\nnet.bb\\norg.bb\\nstore.bb\\ntv.bb\\n\\n// bd : https://en.wikipedia.org/wiki/.bd\\n*.bd\\n\\n// be : https://en.wikipedia.org/wiki/.be\\n// Confirmed by registry <tech@dns.be> 2008-06-08\\nbe\\nac.be\\n\\n// bf : https://en.wikipedia.org/wiki/.bf\\nbf\\ngov.bf\\n\\n// bg : https://en.wikipedia.org/wiki/.bg\\n// https://www.register.bg/user/static/rules/en/index.html\\nbg\\na.bg\\nb.bg\\nc.bg\\nd.bg\\ne.bg\\nf.bg\\ng.bg\\nh.bg\\ni.bg\\nj.bg\\nk.bg\\nl.bg\\nm.bg\\nn.bg\\no.bg\\np.bg\\nq.bg\\nr.bg\\ns.bg\\nt.bg\\nu.bg\\nv.bg\\nw.bg\\nx.bg\\ny.bg\\nz.bg\\n0.bg\\n1.bg\\n2.bg\\n3.bg\\n4.bg\\n5.bg\\n6.bg\\n7.bg\\n8.bg\\n9.bg\\n\\n// bh : https://en.wikipedia.org/wiki/.bh\\nbh\\ncom.bh\\nedu.bh\\nnet.bh\\norg.bh\\ngov.bh\\n\\n// bi : https://en.wikipedia.org/wiki/.bi\\n// http://whois.nic.bi/\\nbi\\nco.bi\\ncom.bi\\nedu.bi\\nor.bi\\norg.bi\\n\\n// biz : https://en.wikipedia.org/wiki/.biz\\nbiz\\n\\n// bj : https://nic.bj/bj-suffixes.txt\\n// submitted by registry <contact@nic.bj>\\nbj\\nafrica.bj\\nagro.bj\\narchitectes.bj\\nassur.bj\\navocats.bj\\nco.bj\\ncom.bj\\neco.bj\\necono.bj\\nedu.bj\\ninfo.bj\\nloisirs.bj\\nmoney.bj\\nnet.bj\\norg.bj\\note.bj\\nresto.bj\\nrestaurant.bj\\ntourism.bj\\nuniv.bj\\n\\n// bm : http://www.bermudanic.bm/dnr-text.txt\\nbm\\ncom.bm\\nedu.bm\\ngov.bm\\nnet.bm\\norg.bm\\n\\n// bn : http://www.bnnic.bn/faqs\\nbn\\ncom.bn\\nedu.bn\\ngov.bn\\nnet.bn\\norg.bn\\n\\n// bo : https://nic.bo/delegacion2015.php#h-1.10\\nbo\\ncom.bo\\nedu.bo\\ngob.bo\\nint.bo\\norg.bo\\nnet.bo\\nmil.bo\\ntv.bo\\nweb.bo\\n// Social Domains\\nacademia.bo\\nagro.bo\\narte.bo\\nblog.bo\\nbolivia.bo\\nciencia.bo\\ncooperativa.bo\\ndemocracia.bo\\ndeporte.bo\\necologia.bo\\neconomia.bo\\nempresa.bo\\nindigena.bo\\nindustria.bo\\ninfo.bo\\nmedicina.bo\\nmovimiento.bo\\nmusica.bo\\nnatural.bo\\nnombre.bo\\nnoticias.bo\\npatria.bo\\npolitica.bo\\nprofesional.bo\\nplurinacional.bo\\npueblo.bo\\nrevista.bo\\nsalud.bo\\ntecnologia.bo\\ntksat.bo\\ntransporte.bo\\nwiki.bo\\n\\n// br : http://registro.br/dominio/categoria.html\\n// Submitted by registry <fneves@registro.br>\\nbr\\n9guacu.br\\nabc.br\\nadm.br\\nadv.br\\nagr.br\\naju.br\\nam.br\\nanani.br\\naparecida.br\\napp.br\\narq.br\\nart.br\\nato.br\\nb.br\\nbarueri.br\\nbelem.br\\nbhz.br\\nbib.br\\nbio.br\\nblog.br\\nbmd.br\\nboavista.br\\nbsb.br\\ncampinagrande.br\\ncampinas.br\\ncaxias.br\\ncim.br\\ncng.br\\ncnt.br\\ncom.br\\ncontagem.br\\ncoop.br\\ncoz.br\\ncri.br\\ncuiaba.br\\ncuritiba.br\\ndef.br\\ndes.br\\ndet.br\\ndev.br\\necn.br\\neco.br\\nedu.br\\nemp.br\\nenf.br\\neng.br\\nesp.br\\netc.br\\neti.br\\nfar.br\\nfeira.br\\nflog.br\\nfloripa.br\\nfm.br\\nfnd.br\\nfortal.br\\nfot.br\\nfoz.br\\nfst.br\\ng12.br\\ngeo.br\\nggf.br\\ngoiania.br\\ngov.br\\n// gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil\\nac.gov.br\\nal.gov.br\\nam.gov.br\\nap.gov.br\\nba.gov.br\\nce.gov.br\\ndf.gov.br\\nes.gov.br\\ngo.gov.br\\nma.gov.br\\nmg.gov.br\\nms.gov.br\\nmt.gov.br\\npa.gov.br\\npb.gov.br\\npe.gov.br\\npi.gov.br\\npr.gov.br\\nrj.gov.br\\nrn.gov.br\\nro.gov.br\\nrr.gov.br\\nrs.gov.br\\nsc.gov.br\\nse.gov.br\\nsp.gov.br\\nto.gov.br\\ngru.br\\nimb.br\\nind.br\\ninf.br\\njab.br\\njampa.br\\njdf.br\\njoinville.br\\njor.br\\njus.br\\nleg.br\\nlel.br\\nlog.br\\nlondrina.br\\nmacapa.br\\nmaceio.br\\nmanaus.br\\nmaringa.br\\nmat.br\\nmed.br\\nmil.br\\nmorena.br\\nmp.br\\nmus.br\\nnatal.br\\nnet.br\\nniteroi.br\\n*.nom.br\\nnot.br\\nntr.br\\nodo.br\\nong.br\\norg.br\\nosasco.br\\npalmas.br\\npoa.br\\nppg.br\\npro.br\\npsc.br\\npsi.br\\npvh.br\\nqsl.br\\nradio.br\\nrec.br\\nrecife.br\\nrep.br\\nribeirao.br\\nrio.br\\nriobranco.br\\nriopreto.br\\nsalvador.br\\nsampa.br\\nsantamaria.br\\nsantoandre.br\\nsaobernardo.br\\nsaogonca.br\\nseg.br\\nsjc.br\\nslg.br\\nslz.br\\nsorocaba.br\\nsrv.br\\ntaxi.br\\ntc.br\\ntec.br\\nteo.br\\nthe.br\\ntmp.br\\ntrd.br\\ntur.br\\ntv.br\\nudi.br\\nvet.br\\nvix.br\\nvlog.br\\nwiki.br\\nzlg.br\\n\\n// bs : http://www.nic.bs/rules.html\\nbs\\ncom.bs\\nnet.bs\\norg.bs\\nedu.bs\\ngov.bs\\n\\n// bt : https://en.wikipedia.org/wiki/.bt\\nbt\\ncom.bt\\nedu.bt\\ngov.bt\\nnet.bt\\norg.bt\\n\\n// bv : No registrations at this time.\\n// Submitted by registry <jarle@uninett.no>\\nbv\\n\\n// bw : https://en.wikipedia.org/wiki/.bw\\n// http://www.gobin.info/domainname/bw.doc\\n// list of other 2nd level tlds ?\\nbw\\nco.bw\\norg.bw\\n\\n// by : https://en.wikipedia.org/wiki/.by\\n// http://tld.by/rules_2006_en.html\\n// list of other 2nd level tlds ?\\nby\\ngov.by\\nmil.by\\n// Official information does not indicate that com.by is a reserved\\n// second-level domain, but it\\'s being used as one (see www.google.com.by and\\n// www.yahoo.com.by, for example), so we list it here for safety\\'s sake.\\ncom.by\\n\\n// http://hoster.by/\\nof.by\\n\\n// bz : https://en.wikipedia.org/wiki/.bz\\n// http://www.belizenic.bz/\\nbz\\ncom.bz\\nnet.bz\\norg.bz\\nedu.bz\\ngov.bz\\n\\n// ca : https://en.wikipedia.org/wiki/.ca\\nca\\n// ca geographical names\\nab.ca\\nbc.ca\\nmb.ca\\nnb.ca\\nnf.ca\\nnl.ca\\nns.ca\\nnt.ca\\nnu.ca\\non.ca\\npe.ca\\nqc.ca\\nsk.ca\\nyk.ca\\n// gc.ca: https://en.wikipedia.org/wiki/.gc.ca\\n// see also: http://registry.gc.ca/en/SubdomainFAQ\\ngc.ca\\n\\n// cat : https://en.wikipedia.org/wiki/.cat\\ncat\\n\\n// cc : https://en.wikipedia.org/wiki/.cc\\ncc\\n\\n// cd : https://en.wikipedia.org/wiki/.cd\\n// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1\\ncd\\ngov.cd\\n\\n// cf : https://en.wikipedia.org/wiki/.cf\\ncf\\n\\n// cg : https://en.wikipedia.org/wiki/.cg\\ncg\\n\\n// ch : https://en.wikipedia.org/wiki/.ch\\nch\\n\\n// ci : https://en.wikipedia.org/wiki/.ci\\n// http://www.nic.ci/index.php?page=charte\\nci\\norg.ci\\nor.ci\\ncom.ci\\nco.ci\\nedu.ci\\ned.ci\\nac.ci\\nnet.ci\\ngo.ci\\nasso.ci\\naéroport.ci\\nint.ci\\npresse.ci\\nmd.ci\\ngouv.ci\\n\\n// ck : https://en.wikipedia.org/wiki/.ck\\n*.ck\\n!www.ck\\n\\n// cl : https://www.nic.cl\\n// Confirmed by .CL registry <hsalgado@nic.cl>\\ncl\\nco.cl\\ngob.cl\\ngov.cl\\nmil.cl\\n\\n// cm : https://en.wikipedia.org/wiki/.cm plus bug 981927\\ncm\\nco.cm\\ncom.cm\\ngov.cm\\nnet.cm\\n\\n// cn : https://en.wikipedia.org/wiki/.cn\\n// Submitted by registry <tanyaling@cnnic.cn>\\ncn\\nac.cn\\ncom.cn\\nedu.cn\\ngov.cn\\nnet.cn\\norg.cn\\nmil.cn\\n公司.cn\\n网络.cn\\n網絡.cn\\n// cn geographic names\\nah.cn\\nbj.cn\\ncq.cn\\nfj.cn\\ngd.cn\\ngs.cn\\ngz.cn\\ngx.cn\\nha.cn\\nhb.cn\\nhe.cn\\nhi.cn\\nhl.cn\\nhn.cn\\njl.cn\\njs.cn\\njx.cn\\nln.cn\\nnm.cn\\nnx.cn\\nqh.cn\\nsc.cn\\nsd.cn\\nsh.cn\\nsn.cn\\nsx.cn\\ntj.cn\\nxj.cn\\nxz.cn\\nyn.cn\\nzj.cn\\nhk.cn\\nmo.cn\\ntw.cn\\n\\n// co : https://en.wikipedia.org/wiki/.co\\n// Submitted by registry <tecnico@uniandes.edu.co>\\nco\\narts.co\\ncom.co\\nedu.co\\nfirm.co\\ngov.co\\ninfo.co\\nint.co\\nmil.co\\nnet.co\\nnom.co\\norg.co\\nrec.co\\nweb.co\\n\\n// com : https://en.wikipedia.org/wiki/.com\\ncom\\n\\n// coop : https://en.wikipedia.org/wiki/.coop\\ncoop\\n\\n// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do\\ncr\\nac.cr\\nco.cr\\ned.cr\\nfi.cr\\ngo.cr\\nor.cr\\nsa.cr\\n\\n// cu : https://en.wikipedia.org/wiki/.cu\\ncu\\ncom.cu\\nedu.cu\\norg.cu\\nnet.cu\\ngov.cu\\ninf.cu\\n\\n// cv : https://en.wikipedia.org/wiki/.cv\\n// cv : http://www.dns.cv/tldcv_portal/do?com=DS;5446457100;111;+PAGE(4000018)+K-CAT-CODIGO(RDOM)+RCNT(100); <- registration rules\\ncv\\ncom.cv\\nedu.cv\\nint.cv\\nnome.cv\\norg.cv\\n\\n// cw : http://www.una.cw/cw_registry/\\n// Confirmed by registry <registry@una.net> 2013-03-26\\ncw\\ncom.cw\\nedu.cw\\nnet.cw\\norg.cw\\n\\n// cx : https://en.wikipedia.org/wiki/.cx\\n// list of other 2nd level tlds ?\\ncx\\ngov.cx\\n\\n// cy : http://www.nic.cy/\\n// Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy>\\n// namespace policies URL https://www.nic.cy/portal//sites/default/files/symfonia_gia_eggrafi.pdf\\ncy\\nac.cy\\nbiz.cy\\ncom.cy\\nekloges.cy\\ngov.cy\\nltd.cy\\nmil.cy\\nnet.cy\\norg.cy\\npress.cy\\npro.cy\\ntm.cy\\n\\n// cz : https://en.wikipedia.org/wiki/.cz\\ncz\\n\\n// de : https://en.wikipedia.org/wiki/.de\\n// Confirmed by registry <ops@denic.de> (with technical\\n// reservations) 2008-07-01\\nde\\n\\n// dj : https://en.wikipedia.org/wiki/.dj\\ndj\\n\\n// dk : https://en.wikipedia.org/wiki/.dk\\n// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17\\ndk\\n\\n// dm : https://en.wikipedia.org/wiki/.dm\\ndm\\ncom.dm\\nnet.dm\\norg.dm\\nedu.dm\\ngov.dm\\n\\n// do : https://en.wikipedia.org/wiki/.do\\ndo\\nart.do\\ncom.do\\nedu.do\\ngob.do\\ngov.do\\nmil.do\\nnet.do\\norg.do\\nsld.do\\nweb.do\\n\\n// dz : http://www.nic.dz/images/pdf_nic/charte.pdf\\ndz\\nart.dz\\nasso.dz\\ncom.dz\\nedu.dz\\ngov.dz\\norg.dz\\nnet.dz\\npol.dz\\nsoc.dz\\ntm.dz\\n\\n// ec : http://www.nic.ec/reg/paso1.asp\\n// Submitted by registry <vabboud@nic.ec>\\nec\\ncom.ec\\ninfo.ec\\nnet.ec\\nfin.ec\\nk12.ec\\nmed.ec\\npro.ec\\norg.ec\\nedu.ec\\ngov.ec\\ngob.ec\\nmil.ec\\n\\n// edu : https://en.wikipedia.org/wiki/.edu\\nedu\\n\\n// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B\\nee\\nedu.ee\\ngov.ee\\nriik.ee\\nlib.ee\\nmed.ee\\ncom.ee\\npri.ee\\naip.ee\\norg.ee\\nfie.ee\\n\\n// eg : https://en.wikipedia.org/wiki/.eg\\neg\\ncom.eg\\nedu.eg\\neun.eg\\ngov.eg\\nmil.eg\\nname.eg\\nnet.eg\\norg.eg\\nsci.eg\\n\\n// er : https://en.wikipedia.org/wiki/.er\\n*.er\\n\\n// es : https://www.nic.es/site_ingles/ingles/dominios/index.html\\nes\\ncom.es\\nnom.es\\norg.es\\ngob.es\\nedu.es\\n\\n// et : https://en.wikipedia.org/wiki/.et\\net\\ncom.et\\ngov.et\\norg.et\\nedu.et\\nbiz.et\\nname.et\\ninfo.et\\nnet.et\\n\\n// eu : https://en.wikipedia.org/wiki/.eu\\neu\\n\\n// fi : https://en.wikipedia.org/wiki/.fi\\nfi\\n// aland.fi : https://en.wikipedia.org/wiki/.ax\\n// This domain is being phased out in favor of .ax. As there are still many\\n// domains under aland.fi, we still keep it on the list until aland.fi is\\n// completely removed.\\n// TODO: Check for updates (expected to be phased out around Q1/2009)\\naland.fi\\n\\n// fj : http://domains.fj/\\n// Submitted by registry <garth.miller@cocca.org.nz> 2020-02-11\\nfj\\nac.fj\\nbiz.fj\\ncom.fj\\ngov.fj\\ninfo.fj\\nmil.fj\\nname.fj\\nnet.fj\\norg.fj\\npro.fj\\n\\n// fk : https://en.wikipedia.org/wiki/.fk\\n*.fk\\n\\n// fm : https://en.wikipedia.org/wiki/.fm\\ncom.fm\\nedu.fm\\nnet.fm\\norg.fm\\nfm\\n\\n// fo : https://en.wikipedia.org/wiki/.fo\\nfo\\n\\n// fr : https://www.afnic.fr/ https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\nfr\\nasso.fr\\ncom.fr\\ngouv.fr\\nnom.fr\\nprd.fr\\ntm.fr\\n// Other SLDs now selfmanaged out of AFNIC range. Former \"domaines sectoriels\", still registration suffixes\\navoues.fr\\ncci.fr\\ngreta.fr\\nhuissier-justice.fr\\n\\n// ga : https://en.wikipedia.org/wiki/.ga\\nga\\n\\n// gb : This registry is effectively dormant\\n// Submitted by registry <Damien.Shaw@ja.net>\\ngb\\n\\n// gd : https://en.wikipedia.org/wiki/.gd\\nedu.gd\\ngov.gd\\ngd\\n\\n// ge : http://www.nic.net.ge/policy_en.pdf\\nge\\ncom.ge\\nedu.ge\\ngov.ge\\norg.ge\\nmil.ge\\nnet.ge\\npvt.ge\\n\\n// gf : https://en.wikipedia.org/wiki/.gf\\ngf\\n\\n// gg : http://www.channelisles.net/register-domains/\\n// Confirmed by registry <nigel@channelisles.net> 2013-11-28\\ngg\\nco.gg\\nnet.gg\\norg.gg\\n\\n// gh : https://en.wikipedia.org/wiki/.gh\\n// see also: http://www.nic.gh/reg_now.php\\n// Although domains directly at second level are not possible at the moment,\\n// they have been possible for some time and may come back.\\ngh\\ncom.gh\\nedu.gh\\ngov.gh\\norg.gh\\nmil.gh\\n\\n// gi : http://www.nic.gi/rules.html\\ngi\\ncom.gi\\nltd.gi\\ngov.gi\\nmod.gi\\nedu.gi\\norg.gi\\n\\n// gl : https://en.wikipedia.org/wiki/.gl\\n// http://nic.gl\\ngl\\nco.gl\\ncom.gl\\nedu.gl\\nnet.gl\\norg.gl\\n\\n// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm\\ngm\\n\\n// gn : http://psg.com/dns/gn/gn.txt\\n// Submitted by registry <randy@psg.com>\\ngn\\nac.gn\\ncom.gn\\nedu.gn\\ngov.gn\\norg.gn\\nnet.gn\\n\\n// gov : https://en.wikipedia.org/wiki/.gov\\ngov\\n\\n// gp : http://www.nic.gp/index.php?lang=en\\ngp\\ncom.gp\\nnet.gp\\nmobi.gp\\nedu.gp\\norg.gp\\nasso.gp\\n\\n// gq : https://en.wikipedia.org/wiki/.gq\\ngq\\n\\n// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html\\n// Submitted by registry <segred@ics.forth.gr>\\ngr\\ncom.gr\\nedu.gr\\nnet.gr\\norg.gr\\ngov.gr\\n\\n// gs : https://en.wikipedia.org/wiki/.gs\\ngs\\n\\n// gt : https://www.gt/sitio/registration_policy.php?lang=en\\ngt\\ncom.gt\\nedu.gt\\ngob.gt\\nind.gt\\nmil.gt\\nnet.gt\\norg.gt\\n\\n// gu : http://gadao.gov.gu/register.html\\n// University of Guam : https://www.uog.edu\\n// Submitted by uognoc@triton.uog.edu\\ngu\\ncom.gu\\nedu.gu\\ngov.gu\\nguam.gu\\ninfo.gu\\nnet.gu\\norg.gu\\nweb.gu\\n\\n// gw : https://en.wikipedia.org/wiki/.gw\\n// gw : https://nic.gw/regras/\\ngw\\n\\n// gy : https://en.wikipedia.org/wiki/.gy\\n// http://registry.gy/\\ngy\\nco.gy\\ncom.gy\\nedu.gy\\ngov.gy\\nnet.gy\\norg.gy\\n\\n// hk : https://www.hkirc.hk\\n// Submitted by registry <hk.tech@hkirc.hk>\\nhk\\ncom.hk\\nedu.hk\\ngov.hk\\nidv.hk\\nnet.hk\\norg.hk\\n公司.hk\\n教育.hk\\n敎育.hk\\n政府.hk\\n個人.hk\\n个人.hk\\n箇人.hk\\n網络.hk\\n网络.hk\\n组織.hk\\n網絡.hk\\n网絡.hk\\n组织.hk\\n組織.hk\\n組织.hk\\n\\n// hm : https://en.wikipedia.org/wiki/.hm\\nhm\\n\\n// hn : http://www.nic.hn/politicas/ps02,,05.html\\nhn\\ncom.hn\\nedu.hn\\norg.hn\\nnet.hn\\nmil.hn\\ngob.hn\\n\\n// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf\\nhr\\niz.hr\\nfrom.hr\\nname.hr\\ncom.hr\\n\\n// ht : http://www.nic.ht/info/charte.cfm\\nht\\ncom.ht\\nshop.ht\\nfirm.ht\\ninfo.ht\\nadult.ht\\nnet.ht\\npro.ht\\norg.ht\\nmed.ht\\nart.ht\\ncoop.ht\\npol.ht\\nasso.ht\\nedu.ht\\nrel.ht\\ngouv.ht\\nperso.ht\\n\\n// hu : http://www.domain.hu/domain/English/sld.html\\n// Confirmed by registry <pasztor@iszt.hu> 2008-06-12\\nhu\\nco.hu\\ninfo.hu\\norg.hu\\npriv.hu\\nsport.hu\\ntm.hu\\n2000.hu\\nagrar.hu\\nbolt.hu\\ncasino.hu\\ncity.hu\\nerotica.hu\\nerotika.hu\\nfilm.hu\\nforum.hu\\ngames.hu\\nhotel.hu\\ningatlan.hu\\njogasz.hu\\nkonyvelo.hu\\nlakas.hu\\nmedia.hu\\nnews.hu\\nreklam.hu\\nsex.hu\\nshop.hu\\nsuli.hu\\nszex.hu\\ntozsde.hu\\nutazas.hu\\nvideo.hu\\n\\n// id : https://pandi.id/en/domain/registration-requirements/\\nid\\nac.id\\nbiz.id\\nco.id\\ndesa.id\\ngo.id\\nmil.id\\nmy.id\\nnet.id\\nor.id\\nponpes.id\\nsch.id\\nweb.id\\n\\n// ie : https://en.wikipedia.org/wiki/.ie\\nie\\ngov.ie\\n\\n// il :         http://www.isoc.org.il/domains/\\n// see also:    https://en.isoc.org.il/il-cctld/registration-rules\\n// ISOC-IL      (operated by .il Registry)\\nil\\nac.il\\nco.il\\ngov.il\\nidf.il\\nk12.il\\nmuni.il\\nnet.il\\norg.il\\n// xn--4dbrk0ce (\"Israel\", Hebrew) : IL\\nישראל\\n// xn--4dbgdty6c.xn--4dbrk0ce.\\nאקדמיה.ישראל\\n// xn--5dbhl8d.xn--4dbrk0ce.\\nישוב.ישראל\\n// xn--8dbq2a.xn--4dbrk0ce.\\nצהל.ישראל\\n// xn--hebda8b.xn--4dbrk0ce.\\nממשל.ישראל\\n\\n// im : https://www.nic.im/\\n// Submitted by registry <info@nic.im>\\nim\\nac.im\\nco.im\\ncom.im\\nltd.co.im\\nnet.im\\norg.im\\nplc.co.im\\ntt.im\\ntv.im\\n\\n// in : https://en.wikipedia.org/wiki/.in\\n// see also: https://registry.in/policies\\n// Please note, that nic.in is not an official eTLD, but used by most\\n// government institutions.\\nin\\n5g.in\\n6g.in\\nac.in\\nai.in\\nam.in\\nbihar.in\\nbiz.in\\nbusiness.in\\nca.in\\ncn.in\\nco.in\\ncom.in\\ncoop.in\\ncs.in\\ndelhi.in\\ndr.in\\nedu.in\\ner.in\\nfirm.in\\ngen.in\\ngov.in\\ngujarat.in\\nind.in\\ninfo.in\\nint.in\\ninternet.in\\nio.in\\nme.in\\nmil.in\\nnet.in\\nnic.in\\norg.in\\npg.in\\npost.in\\npro.in\\nres.in\\ntravel.in\\ntv.in\\nuk.in\\nup.in\\nus.in\\n\\n// info : https://en.wikipedia.org/wiki/.info\\ninfo\\n\\n// int : https://en.wikipedia.org/wiki/.int\\n// Confirmed by registry <iana-questions@icann.org> 2008-06-18\\nint\\neu.int\\n\\n// io : http://www.nic.io/rules.htm\\n// list of other 2nd level tlds ?\\nio\\ncom.io\\n\\n// iq : http://www.cmc.iq/english/iq/iqregister1.htm\\niq\\ngov.iq\\nedu.iq\\nmil.iq\\ncom.iq\\norg.iq\\nnet.iq\\n\\n// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules\\n// Also see http://www.nic.ir/Internationalized_Domain_Names\\n// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16\\nir\\nac.ir\\nco.ir\\ngov.ir\\nid.ir\\nnet.ir\\norg.ir\\nsch.ir\\n// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH)\\nایران.ir\\n// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH)\\nايران.ir\\n\\n// is : http://www.isnic.is/domain/rules.php\\n// Confirmed by registry <marius@isgate.is> 2008-12-06\\nis\\nnet.is\\ncom.is\\nedu.is\\ngov.is\\norg.is\\nint.is\\n\\n// it : https://en.wikipedia.org/wiki/.it\\nit\\ngov.it\\nedu.it\\n// Reserved geo-names (regions and provinces):\\n// https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf\\n// Regions\\nabr.it\\nabruzzo.it\\naosta-valley.it\\naostavalley.it\\nbas.it\\nbasilicata.it\\ncal.it\\ncalabria.it\\ncam.it\\ncampania.it\\nemilia-romagna.it\\nemiliaromagna.it\\nemr.it\\nfriuli-v-giulia.it\\nfriuli-ve-giulia.it\\nfriuli-vegiulia.it\\nfriuli-venezia-giulia.it\\nfriuli-veneziagiulia.it\\nfriuli-vgiulia.it\\nfriuliv-giulia.it\\nfriulive-giulia.it\\nfriulivegiulia.it\\nfriulivenezia-giulia.it\\nfriuliveneziagiulia.it\\nfriulivgiulia.it\\nfvg.it\\nlaz.it\\nlazio.it\\nlig.it\\nliguria.it\\nlom.it\\nlombardia.it\\nlombardy.it\\nlucania.it\\nmar.it\\nmarche.it\\nmol.it\\nmolise.it\\npiedmont.it\\npiemonte.it\\npmn.it\\npug.it\\npuglia.it\\nsar.it\\nsardegna.it\\nsardinia.it\\nsic.it\\nsicilia.it\\nsicily.it\\ntaa.it\\ntos.it\\ntoscana.it\\ntrentin-sud-tirol.it\\ntrentin-süd-tirol.it\\ntrentin-sudtirol.it\\ntrentin-südtirol.it\\ntrentin-sued-tirol.it\\ntrentin-suedtirol.it\\ntrentino-a-adige.it\\ntrentino-aadige.it\\ntrentino-alto-adige.it\\ntrentino-altoadige.it\\ntrentino-s-tirol.it\\ntrentino-stirol.it\\ntrentino-sud-tirol.it\\ntrentino-süd-tirol.it\\ntrentino-sudtirol.it\\ntrentino-südtirol.it\\ntrentino-sued-tirol.it\\ntrentino-suedtirol.it\\ntrentino.it\\ntrentinoa-adige.it\\ntrentinoaadige.it\\ntrentinoalto-adige.it\\ntrentinoaltoadige.it\\ntrentinos-tirol.it\\ntrentinostirol.it\\ntrentinosud-tirol.it\\ntrentinosüd-tirol.it\\ntrentinosudtirol.it\\ntrentinosüdtirol.it\\ntrentinosued-tirol.it\\ntrentinosuedtirol.it\\ntrentinsud-tirol.it\\ntrentinsüd-tirol.it\\ntrentinsudtirol.it\\ntrentinsüdtirol.it\\ntrentinsued-tirol.it\\ntrentinsuedtirol.it\\ntuscany.it\\numb.it\\numbria.it\\nval-d-aosta.it\\nval-daosta.it\\nvald-aosta.it\\nvaldaosta.it\\nvalle-aosta.it\\nvalle-d-aosta.it\\nvalle-daosta.it\\nvalleaosta.it\\nvalled-aosta.it\\nvalledaosta.it\\nvallee-aoste.it\\nvallée-aoste.it\\nvallee-d-aoste.it\\nvallée-d-aoste.it\\nvalleeaoste.it\\nvalléeaoste.it\\nvalleedaoste.it\\nvalléedaoste.it\\nvao.it\\nvda.it\\nven.it\\nveneto.it\\n// Provinces\\nag.it\\nagrigento.it\\nal.it\\nalessandria.it\\nalto-adige.it\\naltoadige.it\\nan.it\\nancona.it\\nandria-barletta-trani.it\\nandria-trani-barletta.it\\nandriabarlettatrani.it\\nandriatranibarletta.it\\nao.it\\naosta.it\\naoste.it\\nap.it\\naq.it\\naquila.it\\nar.it\\narezzo.it\\nascoli-piceno.it\\nascolipiceno.it\\nasti.it\\nat.it\\nav.it\\navellino.it\\nba.it\\nbalsan-sudtirol.it\\nbalsan-südtirol.it\\nbalsan-suedtirol.it\\nbalsan.it\\nbari.it\\nbarletta-trani-andria.it\\nbarlettatraniandria.it\\nbelluno.it\\nbenevento.it\\nbergamo.it\\nbg.it\\nbi.it\\nbiella.it\\nbl.it\\nbn.it\\nbo.it\\nbologna.it\\nbolzano-altoadige.it\\nbolzano.it\\nbozen-sudtirol.it\\nbozen-südtirol.it\\nbozen-suedtirol.it\\nbozen.it\\nbr.it\\nbrescia.it\\nbrindisi.it\\nbs.it\\nbt.it\\nbulsan-sudtirol.it\\nbulsan-südtirol.it\\nbulsan-suedtirol.it\\nbulsan.it\\nbz.it\\nca.it\\ncagliari.it\\ncaltanissetta.it\\ncampidano-medio.it\\ncampidanomedio.it\\ncampobasso.it\\ncarbonia-iglesias.it\\ncarboniaiglesias.it\\ncarrara-massa.it\\ncarraramassa.it\\ncaserta.it\\ncatania.it\\ncatanzaro.it\\ncb.it\\nce.it\\ncesena-forli.it\\ncesena-forlì.it\\ncesenaforli.it\\ncesenaforlì.it\\nch.it\\nchieti.it\\nci.it\\ncl.it\\ncn.it\\nco.it\\ncomo.it\\ncosenza.it\\ncr.it\\ncremona.it\\ncrotone.it\\ncs.it\\nct.it\\ncuneo.it\\ncz.it\\ndell-ogliastra.it\\ndellogliastra.it\\nen.it\\nenna.it\\nfc.it\\nfe.it\\nfermo.it\\nferrara.it\\nfg.it\\nfi.it\\nfirenze.it\\nflorence.it\\nfm.it\\nfoggia.it\\nforli-cesena.it\\nforlì-cesena.it\\nforlicesena.it\\nforlìcesena.it\\nfr.it\\nfrosinone.it\\nge.it\\ngenoa.it\\ngenova.it\\ngo.it\\ngorizia.it\\ngr.it\\ngrosseto.it\\niglesias-carbonia.it\\niglesiascarbonia.it\\nim.it\\nimperia.it\\nis.it\\nisernia.it\\nkr.it\\nla-spezia.it\\nlaquila.it\\nlaspezia.it\\nlatina.it\\nlc.it\\nle.it\\nlecce.it\\nlecco.it\\nli.it\\nlivorno.it\\nlo.it\\nlodi.it\\nlt.it\\nlu.it\\nlucca.it\\nmacerata.it\\nmantova.it\\nmassa-carrara.it\\nmassacarrara.it\\nmatera.it\\nmb.it\\nmc.it\\nme.it\\nmedio-campidano.it\\nmediocampidano.it\\nmessina.it\\nmi.it\\nmilan.it\\nmilano.it\\nmn.it\\nmo.it\\nmodena.it\\nmonza-brianza.it\\nmonza-e-della-brianza.it\\nmonza.it\\nmonzabrianza.it\\nmonzaebrianza.it\\nmonzaedellabrianza.it\\nms.it\\nmt.it\\nna.it\\nnaples.it\\nnapoli.it\\nno.it\\nnovara.it\\nnu.it\\nnuoro.it\\nog.it\\nogliastra.it\\nolbia-tempio.it\\nolbiatempio.it\\nor.it\\noristano.it\\not.it\\npa.it\\npadova.it\\npadua.it\\npalermo.it\\nparma.it\\npavia.it\\npc.it\\npd.it\\npe.it\\nperugia.it\\npesaro-urbino.it\\npesarourbino.it\\npescara.it\\npg.it\\npi.it\\npiacenza.it\\npisa.it\\npistoia.it\\npn.it\\npo.it\\npordenone.it\\npotenza.it\\npr.it\\nprato.it\\npt.it\\npu.it\\npv.it\\npz.it\\nra.it\\nragusa.it\\nravenna.it\\nrc.it\\nre.it\\nreggio-calabria.it\\nreggio-emilia.it\\nreggiocalabria.it\\nreggioemilia.it\\nrg.it\\nri.it\\nrieti.it\\nrimini.it\\nrm.it\\nrn.it\\nro.it\\nroma.it\\nrome.it\\nrovigo.it\\nsa.it\\nsalerno.it\\nsassari.it\\nsavona.it\\nsi.it\\nsiena.it\\nsiracusa.it\\nso.it\\nsondrio.it\\nsp.it\\nsr.it\\nss.it\\nsuedtirol.it\\nsüdtirol.it\\nsv.it\\nta.it\\ntaranto.it\\nte.it\\ntempio-olbia.it\\ntempioolbia.it\\nteramo.it\\nterni.it\\ntn.it\\nto.it\\ntorino.it\\ntp.it\\ntr.it\\ntrani-andria-barletta.it\\ntrani-barletta-andria.it\\ntraniandriabarletta.it\\ntranibarlettaandria.it\\ntrapani.it\\ntrento.it\\ntreviso.it\\ntrieste.it\\nts.it\\nturin.it\\ntv.it\\nud.it\\nudine.it\\nurbino-pesaro.it\\nurbinopesaro.it\\nva.it\\nvarese.it\\nvb.it\\nvc.it\\nve.it\\nvenezia.it\\nvenice.it\\nverbania.it\\nvercelli.it\\nverona.it\\nvi.it\\nvibo-valentia.it\\nvibovalentia.it\\nvicenza.it\\nviterbo.it\\nvr.it\\nvs.it\\nvt.it\\nvv.it\\n\\n// je : http://www.channelisles.net/register-domains/\\n// Confirmed by registry <nigel@channelisles.net> 2013-11-28\\nje\\nco.je\\nnet.je\\norg.je\\n\\n// jm : http://www.com.jm/register.html\\n*.jm\\n\\n// jo : http://www.dns.jo/Registration_policy.aspx\\njo\\ncom.jo\\norg.jo\\nnet.jo\\nedu.jo\\nsch.jo\\ngov.jo\\nmil.jo\\nname.jo\\n\\n// jobs : https://en.wikipedia.org/wiki/.jobs\\njobs\\n\\n// jp : https://en.wikipedia.org/wiki/.jp\\n// http://jprs.co.jp/en/jpdomain.html\\n// Submitted by registry <info@jprs.jp>\\njp\\n// jp organizational type names\\nac.jp\\nad.jp\\nco.jp\\ned.jp\\ngo.jp\\ngr.jp\\nlg.jp\\nne.jp\\nor.jp\\n// jp prefecture type names\\naichi.jp\\nakita.jp\\naomori.jp\\nchiba.jp\\nehime.jp\\nfukui.jp\\nfukuoka.jp\\nfukushima.jp\\ngifu.jp\\ngunma.jp\\nhiroshima.jp\\nhokkaido.jp\\nhyogo.jp\\nibaraki.jp\\nishikawa.jp\\niwate.jp\\nkagawa.jp\\nkagoshima.jp\\nkanagawa.jp\\nkochi.jp\\nkumamoto.jp\\nkyoto.jp\\nmie.jp\\nmiyagi.jp\\nmiyazaki.jp\\nnagano.jp\\nnagasaki.jp\\nnara.jp\\nniigata.jp\\noita.jp\\nokayama.jp\\nokinawa.jp\\nosaka.jp\\nsaga.jp\\nsaitama.jp\\nshiga.jp\\nshimane.jp\\nshizuoka.jp\\ntochigi.jp\\ntokushima.jp\\ntokyo.jp\\ntottori.jp\\ntoyama.jp\\nwakayama.jp\\nyamagata.jp\\nyamaguchi.jp\\nyamanashi.jp\\n栃木.jp\\n愛知.jp\\n愛媛.jp\\n兵庫.jp\\n熊本.jp\\n茨城.jp\\n北海道.jp\\n千葉.jp\\n和歌山.jp\\n長崎.jp\\n長野.jp\\n新潟.jp\\n青森.jp\\n静岡.jp\\n東京.jp\\n石川.jp\\n埼玉.jp\\n三重.jp\\n京都.jp\\n佐賀.jp\\n大分.jp\\n大阪.jp\\n奈良.jp\\n宮城.jp\\n宮崎.jp\\n富山.jp\\n山口.jp\\n山形.jp\\n山梨.jp\\n岩手.jp\\n岐阜.jp\\n岡山.jp\\n島根.jp\\n広島.jp\\n徳島.jp\\n沖縄.jp\\n滋賀.jp\\n神奈川.jp\\n福井.jp\\n福岡.jp\\n福島.jp\\n秋田.jp\\n群馬.jp\\n香川.jp\\n高知.jp\\n鳥取.jp\\n鹿児島.jp\\n// jp geographic type names\\n// http://jprs.jp/doc/rule/saisoku-1.html\\n*.kawasaki.jp\\n*.kitakyushu.jp\\n*.kobe.jp\\n*.nagoya.jp\\n*.sapporo.jp\\n*.sendai.jp\\n*.yokohama.jp\\n!city.kawasaki.jp\\n!city.kitakyushu.jp\\n!city.kobe.jp\\n!city.nagoya.jp\\n!city.sapporo.jp\\n!city.sendai.jp\\n!city.yokohama.jp\\n// 4th level registration\\naisai.aichi.jp\\nama.aichi.jp\\nanjo.aichi.jp\\nasuke.aichi.jp\\nchiryu.aichi.jp\\nchita.aichi.jp\\nfuso.aichi.jp\\ngamagori.aichi.jp\\nhanda.aichi.jp\\nhazu.aichi.jp\\nhekinan.aichi.jp\\nhigashiura.aichi.jp\\nichinomiya.aichi.jp\\ninazawa.aichi.jp\\ninuyama.aichi.jp\\nisshiki.aichi.jp\\niwakura.aichi.jp\\nkanie.aichi.jp\\nkariya.aichi.jp\\nkasugai.aichi.jp\\nkira.aichi.jp\\nkiyosu.aichi.jp\\nkomaki.aichi.jp\\nkonan.aichi.jp\\nkota.aichi.jp\\nmihama.aichi.jp\\nmiyoshi.aichi.jp\\nnishio.aichi.jp\\nnisshin.aichi.jp\\nobu.aichi.jp\\noguchi.aichi.jp\\noharu.aichi.jp\\nokazaki.aichi.jp\\nowariasahi.aichi.jp\\nseto.aichi.jp\\nshikatsu.aichi.jp\\nshinshiro.aichi.jp\\nshitara.aichi.jp\\ntahara.aichi.jp\\ntakahama.aichi.jp\\ntobishima.aichi.jp\\ntoei.aichi.jp\\ntogo.aichi.jp\\ntokai.aichi.jp\\ntokoname.aichi.jp\\ntoyoake.aichi.jp\\ntoyohashi.aichi.jp\\ntoyokawa.aichi.jp\\ntoyone.aichi.jp\\ntoyota.aichi.jp\\ntsushima.aichi.jp\\nyatomi.aichi.jp\\nakita.akita.jp\\ndaisen.akita.jp\\nfujisato.akita.jp\\ngojome.akita.jp\\nhachirogata.akita.jp\\nhappou.akita.jp\\nhigashinaruse.akita.jp\\nhonjo.akita.jp\\nhonjyo.akita.jp\\nikawa.akita.jp\\nkamikoani.akita.jp\\nkamioka.akita.jp\\nkatagami.akita.jp\\nkazuno.akita.jp\\nkitaakita.akita.jp\\nkosaka.akita.jp\\nkyowa.akita.jp\\nmisato.akita.jp\\nmitane.akita.jp\\nmoriyoshi.akita.jp\\nnikaho.akita.jp\\nnoshiro.akita.jp\\nodate.akita.jp\\noga.akita.jp\\nogata.akita.jp\\nsemboku.akita.jp\\nyokote.akita.jp\\nyurihonjo.akita.jp\\naomori.aomori.jp\\ngonohe.aomori.jp\\nhachinohe.aomori.jp\\nhashikami.aomori.jp\\nhiranai.aomori.jp\\nhirosaki.aomori.jp\\nitayanagi.aomori.jp\\nkuroishi.aomori.jp\\nmisawa.aomori.jp\\nmutsu.aomori.jp\\nnakadomari.aomori.jp\\nnoheji.aomori.jp\\noirase.aomori.jp\\nowani.aomori.jp\\nrokunohe.aomori.jp\\nsannohe.aomori.jp\\nshichinohe.aomori.jp\\nshingo.aomori.jp\\ntakko.aomori.jp\\ntowada.aomori.jp\\ntsugaru.aomori.jp\\ntsuruta.aomori.jp\\nabiko.chiba.jp\\nasahi.chiba.jp\\nchonan.chiba.jp\\nchosei.chiba.jp\\nchoshi.chiba.jp\\nchuo.chiba.jp\\nfunabashi.chiba.jp\\nfuttsu.chiba.jp\\nhanamigawa.chiba.jp\\nichihara.chiba.jp\\nichikawa.chiba.jp\\nichinomiya.chiba.jp\\ninzai.chiba.jp\\nisumi.chiba.jp\\nkamagaya.chiba.jp\\nkamogawa.chiba.jp\\nkashiwa.chiba.jp\\nkatori.chiba.jp\\nkatsuura.chiba.jp\\nkimitsu.chiba.jp\\nkisarazu.chiba.jp\\nkozaki.chiba.jp\\nkujukuri.chiba.jp\\nkyonan.chiba.jp\\nmatsudo.chiba.jp\\nmidori.chiba.jp\\nmihama.chiba.jp\\nminamiboso.chiba.jp\\nmobara.chiba.jp\\nmutsuzawa.chiba.jp\\nnagara.chiba.jp\\nnagareyama.chiba.jp\\nnarashino.chiba.jp\\nnarita.chiba.jp\\nnoda.chiba.jp\\noamishirasato.chiba.jp\\nomigawa.chiba.jp\\nonjuku.chiba.jp\\notaki.chiba.jp\\nsakae.chiba.jp\\nsakura.chiba.jp\\nshimofusa.chiba.jp\\nshirako.chiba.jp\\nshiroi.chiba.jp\\nshisui.chiba.jp\\nsodegaura.chiba.jp\\nsosa.chiba.jp\\ntako.chiba.jp\\ntateyama.chiba.jp\\ntogane.chiba.jp\\ntohnosho.chiba.jp\\ntomisato.chiba.jp\\nurayasu.chiba.jp\\nyachimata.chiba.jp\\nyachiyo.chiba.jp\\nyokaichiba.chiba.jp\\nyokoshibahikari.chiba.jp\\nyotsukaido.chiba.jp\\nainan.ehime.jp\\nhonai.ehime.jp\\nikata.ehime.jp\\nimabari.ehime.jp\\niyo.ehime.jp\\nkamijima.ehime.jp\\nkihoku.ehime.jp\\nkumakogen.ehime.jp\\nmasaki.ehime.jp\\nmatsuno.ehime.jp\\nmatsuyama.ehime.jp\\nnamikata.ehime.jp\\nniihama.ehime.jp\\nozu.ehime.jp\\nsaijo.ehime.jp\\nseiyo.ehime.jp\\nshikokuchuo.ehime.jp\\ntobe.ehime.jp\\ntoon.ehime.jp\\nuchiko.ehime.jp\\nuwajima.ehime.jp\\nyawatahama.ehime.jp\\nechizen.fukui.jp\\neiheiji.fukui.jp\\nfukui.fukui.jp\\nikeda.fukui.jp\\nkatsuyama.fukui.jp\\nmihama.fukui.jp\\nminamiechizen.fukui.jp\\nobama.fukui.jp\\nohi.fukui.jp\\nono.fukui.jp\\nsabae.fukui.jp\\nsakai.fukui.jp\\ntakahama.fukui.jp\\ntsuruga.fukui.jp\\nwakasa.fukui.jp\\nashiya.fukuoka.jp\\nbuzen.fukuoka.jp\\nchikugo.fukuoka.jp\\nchikuho.fukuoka.jp\\nchikujo.fukuoka.jp\\nchikushino.fukuoka.jp\\nchikuzen.fukuoka.jp\\nchuo.fukuoka.jp\\ndazaifu.fukuoka.jp\\nfukuchi.fukuoka.jp\\nhakata.fukuoka.jp\\nhigashi.fukuoka.jp\\nhirokawa.fukuoka.jp\\nhisayama.fukuoka.jp\\niizuka.fukuoka.jp\\ninatsuki.fukuoka.jp\\nkaho.fukuoka.jp\\nkasuga.fukuoka.jp\\nkasuya.fukuoka.jp\\nkawara.fukuoka.jp\\nkeisen.fukuoka.jp\\nkoga.fukuoka.jp\\nkurate.fukuoka.jp\\nkurogi.fukuoka.jp\\nkurume.fukuoka.jp\\nminami.fukuoka.jp\\nmiyako.fukuoka.jp\\nmiyama.fukuoka.jp\\nmiyawaka.fukuoka.jp\\nmizumaki.fukuoka.jp\\nmunakata.fukuoka.jp\\nnakagawa.fukuoka.jp\\nnakama.fukuoka.jp\\nnishi.fukuoka.jp\\nnogata.fukuoka.jp\\nogori.fukuoka.jp\\nokagaki.fukuoka.jp\\nokawa.fukuoka.jp\\noki.fukuoka.jp\\nomuta.fukuoka.jp\\nonga.fukuoka.jp\\nonojo.fukuoka.jp\\noto.fukuoka.jp\\nsaigawa.fukuoka.jp\\nsasaguri.fukuoka.jp\\nshingu.fukuoka.jp\\nshinyoshitomi.fukuoka.jp\\nshonai.fukuoka.jp\\nsoeda.fukuoka.jp\\nsue.fukuoka.jp\\ntachiarai.fukuoka.jp\\ntagawa.fukuoka.jp\\ntakata.fukuoka.jp\\ntoho.fukuoka.jp\\ntoyotsu.fukuoka.jp\\ntsuiki.fukuoka.jp\\nukiha.fukuoka.jp\\numi.fukuoka.jp\\nusui.fukuoka.jp\\nyamada.fukuoka.jp\\nyame.fukuoka.jp\\nyanagawa.fukuoka.jp\\nyukuhashi.fukuoka.jp\\naizubange.fukushima.jp\\naizumisato.fukushima.jp\\naizuwakamatsu.fukushima.jp\\nasakawa.fukushima.jp\\nbandai.fukushima.jp\\ndate.fukushima.jp\\nfukushima.fukushima.jp\\nfurudono.fukushima.jp\\nfutaba.fukushima.jp\\nhanawa.fukushima.jp\\nhigashi.fukushima.jp\\nhirata.fukushima.jp\\nhirono.fukushima.jp\\niitate.fukushima.jp\\ninawashiro.fukushima.jp\\nishikawa.fukushima.jp\\niwaki.fukushima.jp\\nizumizaki.fukushima.jp\\nkagamiishi.fukushima.jp\\nkaneyama.fukushima.jp\\nkawamata.fukushima.jp\\nkitakata.fukushima.jp\\nkitashiobara.fukushima.jp\\nkoori.fukushima.jp\\nkoriyama.fukushima.jp\\nkunimi.fukushima.jp\\nmiharu.fukushima.jp\\nmishima.fukushima.jp\\nnamie.fukushima.jp\\nnango.fukushima.jp\\nnishiaizu.fukushima.jp\\nnishigo.fukushima.jp\\nokuma.fukushima.jp\\nomotego.fukushima.jp\\nono.fukushima.jp\\notama.fukushima.jp\\nsamegawa.fukushima.jp\\nshimogo.fukushima.jp\\nshirakawa.fukushima.jp\\nshowa.fukushima.jp\\nsoma.fukushima.jp\\nsukagawa.fukushima.jp\\ntaishin.fukushima.jp\\ntamakawa.fukushima.jp\\ntanagura.fukushima.jp\\ntenei.fukushima.jp\\nyabuki.fukushima.jp\\nyamato.fukushima.jp\\nyamatsuri.fukushima.jp\\nyanaizu.fukushima.jp\\nyugawa.fukushima.jp\\nanpachi.gifu.jp\\nena.gifu.jp\\ngifu.gifu.jp\\nginan.gifu.jp\\ngodo.gifu.jp\\ngujo.gifu.jp\\nhashima.gifu.jp\\nhichiso.gifu.jp\\nhida.gifu.jp\\nhigashishirakawa.gifu.jp\\nibigawa.gifu.jp\\nikeda.gifu.jp\\nkakamigahara.gifu.jp\\nkani.gifu.jp\\nkasahara.gifu.jp\\nkasamatsu.gifu.jp\\nkawaue.gifu.jp\\nkitagata.gifu.jp\\nmino.gifu.jp\\nminokamo.gifu.jp\\nmitake.gifu.jp\\nmizunami.gifu.jp\\nmotosu.gifu.jp\\nnakatsugawa.gifu.jp\\nogaki.gifu.jp\\nsakahogi.gifu.jp\\nseki.gifu.jp\\nsekigahara.gifu.jp\\nshirakawa.gifu.jp\\ntajimi.gifu.jp\\ntakayama.gifu.jp\\ntarui.gifu.jp\\ntoki.gifu.jp\\ntomika.gifu.jp\\nwanouchi.gifu.jp\\nyamagata.gifu.jp\\nyaotsu.gifu.jp\\nyoro.gifu.jp\\nannaka.gunma.jp\\nchiyoda.gunma.jp\\nfujioka.gunma.jp\\nhigashiagatsuma.gunma.jp\\nisesaki.gunma.jp\\nitakura.gunma.jp\\nkanna.gunma.jp\\nkanra.gunma.jp\\nkatashina.gunma.jp\\nkawaba.gunma.jp\\nkiryu.gunma.jp\\nkusatsu.gunma.jp\\nmaebashi.gunma.jp\\nmeiwa.gunma.jp\\nmidori.gunma.jp\\nminakami.gunma.jp\\nnaganohara.gunma.jp\\nnakanojo.gunma.jp\\nnanmoku.gunma.jp\\nnumata.gunma.jp\\noizumi.gunma.jp\\nora.gunma.jp\\nota.gunma.jp\\nshibukawa.gunma.jp\\nshimonita.gunma.jp\\nshinto.gunma.jp\\nshowa.gunma.jp\\ntakasaki.gunma.jp\\ntakayama.gunma.jp\\ntamamura.gunma.jp\\ntatebayashi.gunma.jp\\ntomioka.gunma.jp\\ntsukiyono.gunma.jp\\ntsumagoi.gunma.jp\\nueno.gunma.jp\\nyoshioka.gunma.jp\\nasaminami.hiroshima.jp\\ndaiwa.hiroshima.jp\\netajima.hiroshima.jp\\nfuchu.hiroshima.jp\\nfukuyama.hiroshima.jp\\nhatsukaichi.hiroshima.jp\\nhigashihiroshima.hiroshima.jp\\nhongo.hiroshima.jp\\njinsekikogen.hiroshima.jp\\nkaita.hiroshima.jp\\nkui.hiroshima.jp\\nkumano.hiroshima.jp\\nkure.hiroshima.jp\\nmihara.hiroshima.jp\\nmiyoshi.hiroshima.jp\\nnaka.hiroshima.jp\\nonomichi.hiroshima.jp\\nosakikamijima.hiroshima.jp\\notake.hiroshima.jp\\nsaka.hiroshima.jp\\nsera.hiroshima.jp\\nseranishi.hiroshima.jp\\nshinichi.hiroshima.jp\\nshobara.hiroshima.jp\\ntakehara.hiroshima.jp\\nabashiri.hokkaido.jp\\nabira.hokkaido.jp\\naibetsu.hokkaido.jp\\nakabira.hokkaido.jp\\nakkeshi.hokkaido.jp\\nasahikawa.hokkaido.jp\\nashibetsu.hokkaido.jp\\nashoro.hokkaido.jp\\nassabu.hokkaido.jp\\natsuma.hokkaido.jp\\nbibai.hokkaido.jp\\nbiei.hokkaido.jp\\nbifuka.hokkaido.jp\\nbihoro.hokkaido.jp\\nbiratori.hokkaido.jp\\nchippubetsu.hokkaido.jp\\nchitose.hokkaido.jp\\ndate.hokkaido.jp\\nebetsu.hokkaido.jp\\nembetsu.hokkaido.jp\\neniwa.hokkaido.jp\\nerimo.hokkaido.jp\\nesan.hokkaido.jp\\nesashi.hokkaido.jp\\nfukagawa.hokkaido.jp\\nfukushima.hokkaido.jp\\nfurano.hokkaido.jp\\nfurubira.hokkaido.jp\\nhaboro.hokkaido.jp\\nhakodate.hokkaido.jp\\nhamatonbetsu.hokkaido.jp\\nhidaka.hokkaido.jp\\nhigashikagura.hokkaido.jp\\nhigashikawa.hokkaido.jp\\nhiroo.hokkaido.jp\\nhokuryu.hokkaido.jp\\nhokuto.hokkaido.jp\\nhonbetsu.hokkaido.jp\\nhorokanai.hokkaido.jp\\nhoronobe.hokkaido.jp\\nikeda.hokkaido.jp\\nimakane.hokkaido.jp\\nishikari.hokkaido.jp\\niwamizawa.hokkaido.jp\\niwanai.hokkaido.jp\\nkamifurano.hokkaido.jp\\nkamikawa.hokkaido.jp\\nkamishihoro.hokkaido.jp\\nkamisunagawa.hokkaido.jp\\nkamoenai.hokkaido.jp\\nkayabe.hokkaido.jp\\nkembuchi.hokkaido.jp\\nkikonai.hokkaido.jp\\nkimobetsu.hokkaido.jp\\nkitahiroshima.hokkaido.jp\\nkitami.hokkaido.jp\\nkiyosato.hokkaido.jp\\nkoshimizu.hokkaido.jp\\nkunneppu.hokkaido.jp\\nkuriyama.hokkaido.jp\\nkuromatsunai.hokkaido.jp\\nkushiro.hokkaido.jp\\nkutchan.hokkaido.jp\\nkyowa.hokkaido.jp\\nmashike.hokkaido.jp\\nmatsumae.hokkaido.jp\\nmikasa.hokkaido.jp\\nminamifurano.hokkaido.jp\\nmombetsu.hokkaido.jp\\nmoseushi.hokkaido.jp\\nmukawa.hokkaido.jp\\nmuroran.hokkaido.jp\\nnaie.hokkaido.jp\\nnakagawa.hokkaido.jp\\nnakasatsunai.hokkaido.jp\\nnakatombetsu.hokkaido.jp\\nnanae.hokkaido.jp\\nnanporo.hokkaido.jp\\nnayoro.hokkaido.jp\\nnemuro.hokkaido.jp\\nniikappu.hokkaido.jp\\nniki.hokkaido.jp\\nnishiokoppe.hokkaido.jp\\nnoboribetsu.hokkaido.jp\\nnumata.hokkaido.jp\\nobihiro.hokkaido.jp\\nobira.hokkaido.jp\\noketo.hokkaido.jp\\nokoppe.hokkaido.jp\\notaru.hokkaido.jp\\notobe.hokkaido.jp\\notofuke.hokkaido.jp\\notoineppu.hokkaido.jp\\noumu.hokkaido.jp\\nozora.hokkaido.jp\\npippu.hokkaido.jp\\nrankoshi.hokkaido.jp\\nrebun.hokkaido.jp\\nrikubetsu.hokkaido.jp\\nrishiri.hokkaido.jp\\nrishirifuji.hokkaido.jp\\nsaroma.hokkaido.jp\\nsarufutsu.hokkaido.jp\\nshakotan.hokkaido.jp\\nshari.hokkaido.jp\\nshibecha.hokkaido.jp\\nshibetsu.hokkaido.jp\\nshikabe.hokkaido.jp\\nshikaoi.hokkaido.jp\\nshimamaki.hokkaido.jp\\nshimizu.hokkaido.jp\\nshimokawa.hokkaido.jp\\nshinshinotsu.hokkaido.jp\\nshintoku.hokkaido.jp\\nshiranuka.hokkaido.jp\\nshiraoi.hokkaido.jp\\nshiriuchi.hokkaido.jp\\nsobetsu.hokkaido.jp\\nsunagawa.hokkaido.jp\\ntaiki.hokkaido.jp\\ntakasu.hokkaido.jp\\ntakikawa.hokkaido.jp\\ntakinoue.hokkaido.jp\\nteshikaga.hokkaido.jp\\ntobetsu.hokkaido.jp\\ntohma.hokkaido.jp\\ntomakomai.hokkaido.jp\\ntomari.hokkaido.jp\\ntoya.hokkaido.jp\\ntoyako.hokkaido.jp\\ntoyotomi.hokkaido.jp\\ntoyoura.hokkaido.jp\\ntsubetsu.hokkaido.jp\\ntsukigata.hokkaido.jp\\nurakawa.hokkaido.jp\\nurausu.hokkaido.jp\\nuryu.hokkaido.jp\\nutashinai.hokkaido.jp\\nwakkanai.hokkaido.jp\\nwassamu.hokkaido.jp\\nyakumo.hokkaido.jp\\nyoichi.hokkaido.jp\\naioi.hyogo.jp\\nakashi.hyogo.jp\\nako.hyogo.jp\\namagasaki.hyogo.jp\\naogaki.hyogo.jp\\nasago.hyogo.jp\\nashiya.hyogo.jp\\nawaji.hyogo.jp\\nfukusaki.hyogo.jp\\ngoshiki.hyogo.jp\\nharima.hyogo.jp\\nhimeji.hyogo.jp\\nichikawa.hyogo.jp\\ninagawa.hyogo.jp\\nitami.hyogo.jp\\nkakogawa.hyogo.jp\\nkamigori.hyogo.jp\\nkamikawa.hyogo.jp\\nkasai.hyogo.jp\\nkasuga.hyogo.jp\\nkawanishi.hyogo.jp\\nmiki.hyogo.jp\\nminamiawaji.hyogo.jp\\nnishinomiya.hyogo.jp\\nnishiwaki.hyogo.jp\\nono.hyogo.jp\\nsanda.hyogo.jp\\nsannan.hyogo.jp\\nsasayama.hyogo.jp\\nsayo.hyogo.jp\\nshingu.hyogo.jp\\nshinonsen.hyogo.jp\\nshiso.hyogo.jp\\nsumoto.hyogo.jp\\ntaishi.hyogo.jp\\ntaka.hyogo.jp\\ntakarazuka.hyogo.jp\\ntakasago.hyogo.jp\\ntakino.hyogo.jp\\ntamba.hyogo.jp\\ntatsuno.hyogo.jp\\ntoyooka.hyogo.jp\\nyabu.hyogo.jp\\nyashiro.hyogo.jp\\nyoka.hyogo.jp\\nyokawa.hyogo.jp\\nami.ibaraki.jp\\nasahi.ibaraki.jp\\nbando.ibaraki.jp\\nchikusei.ibaraki.jp\\ndaigo.ibaraki.jp\\nfujishiro.ibaraki.jp\\nhitachi.ibaraki.jp\\nhitachinaka.ibaraki.jp\\nhitachiomiya.ibaraki.jp\\nhitachiota.ibaraki.jp\\nibaraki.ibaraki.jp\\nina.ibaraki.jp\\ninashiki.ibaraki.jp\\nitako.ibaraki.jp\\niwama.ibaraki.jp\\njoso.ibaraki.jp\\nkamisu.ibaraki.jp\\nkasama.ibaraki.jp\\nkashima.ibaraki.jp\\nkasumigaura.ibaraki.jp\\nkoga.ibaraki.jp\\nmiho.ibaraki.jp\\nmito.ibaraki.jp\\nmoriya.ibaraki.jp\\nnaka.ibaraki.jp\\nnamegata.ibaraki.jp\\noarai.ibaraki.jp\\nogawa.ibaraki.jp\\nomitama.ibaraki.jp\\nryugasaki.ibaraki.jp\\nsakai.ibaraki.jp\\nsakuragawa.ibaraki.jp\\nshimodate.ibaraki.jp\\nshimotsuma.ibaraki.jp\\nshirosato.ibaraki.jp\\nsowa.ibaraki.jp\\nsuifu.ibaraki.jp\\ntakahagi.ibaraki.jp\\ntamatsukuri.ibaraki.jp\\ntokai.ibaraki.jp\\ntomobe.ibaraki.jp\\ntone.ibaraki.jp\\ntoride.ibaraki.jp\\ntsuchiura.ibaraki.jp\\ntsukuba.ibaraki.jp\\nuchihara.ibaraki.jp\\nushiku.ibaraki.jp\\nyachiyo.ibaraki.jp\\nyamagata.ibaraki.jp\\nyawara.ibaraki.jp\\nyuki.ibaraki.jp\\nanamizu.ishikawa.jp\\nhakui.ishikawa.jp\\nhakusan.ishikawa.jp\\nkaga.ishikawa.jp\\nkahoku.ishikawa.jp\\nkanazawa.ishikawa.jp\\nkawakita.ishikawa.jp\\nkomatsu.ishikawa.jp\\nnakanoto.ishikawa.jp\\nnanao.ishikawa.jp\\nnomi.ishikawa.jp\\nnonoichi.ishikawa.jp\\nnoto.ishikawa.jp\\nshika.ishikawa.jp\\nsuzu.ishikawa.jp\\ntsubata.ishikawa.jp\\ntsurugi.ishikawa.jp\\nuchinada.ishikawa.jp\\nwajima.ishikawa.jp\\nfudai.iwate.jp\\nfujisawa.iwate.jp\\nhanamaki.iwate.jp\\nhiraizumi.iwate.jp\\nhirono.iwate.jp\\nichinohe.iwate.jp\\nichinoseki.iwate.jp\\niwaizumi.iwate.jp\\niwate.iwate.jp\\njoboji.iwate.jp\\nkamaishi.iwate.jp\\nkanegasaki.iwate.jp\\nkarumai.iwate.jp\\nkawai.iwate.jp\\nkitakami.iwate.jp\\nkuji.iwate.jp\\nkunohe.iwate.jp\\nkuzumaki.iwate.jp\\nmiyako.iwate.jp\\nmizusawa.iwate.jp\\nmorioka.iwate.jp\\nninohe.iwate.jp\\nnoda.iwate.jp\\nofunato.iwate.jp\\noshu.iwate.jp\\notsuchi.iwate.jp\\nrikuzentakata.iwate.jp\\nshiwa.iwate.jp\\nshizukuishi.iwate.jp\\nsumita.iwate.jp\\ntanohata.iwate.jp\\ntono.iwate.jp\\nyahaba.iwate.jp\\nyamada.iwate.jp\\nayagawa.kagawa.jp\\nhigashikagawa.kagawa.jp\\nkanonji.kagawa.jp\\nkotohira.kagawa.jp\\nmanno.kagawa.jp\\nmarugame.kagawa.jp\\nmitoyo.kagawa.jp\\nnaoshima.kagawa.jp\\nsanuki.kagawa.jp\\ntadotsu.kagawa.jp\\ntakamatsu.kagawa.jp\\ntonosho.kagawa.jp\\nuchinomi.kagawa.jp\\nutazu.kagawa.jp\\nzentsuji.kagawa.jp\\nakune.kagoshima.jp\\namami.kagoshima.jp\\nhioki.kagoshima.jp\\nisa.kagoshima.jp\\nisen.kagoshima.jp\\nizumi.kagoshima.jp\\nkagoshima.kagoshima.jp\\nkanoya.kagoshima.jp\\nkawanabe.kagoshima.jp\\nkinko.kagoshima.jp\\nkouyama.kagoshima.jp\\nmakurazaki.kagoshima.jp\\nmatsumoto.kagoshima.jp\\nminamitane.kagoshima.jp\\nnakatane.kagoshima.jp\\nnishinoomote.kagoshima.jp\\nsatsumasendai.kagoshima.jp\\nsoo.kagoshima.jp\\ntarumizu.kagoshima.jp\\nyusui.kagoshima.jp\\naikawa.kanagawa.jp\\natsugi.kanagawa.jp\\nayase.kanagawa.jp\\nchigasaki.kanagawa.jp\\nebina.kanagawa.jp\\nfujisawa.kanagawa.jp\\nhadano.kanagawa.jp\\nhakone.kanagawa.jp\\nhiratsuka.kanagawa.jp\\nisehara.kanagawa.jp\\nkaisei.kanagawa.jp\\nkamakura.kanagawa.jp\\nkiyokawa.kanagawa.jp\\nmatsuda.kanagawa.jp\\nminamiashigara.kanagawa.jp\\nmiura.kanagawa.jp\\nnakai.kanagawa.jp\\nninomiya.kanagawa.jp\\nodawara.kanagawa.jp\\noi.kanagawa.jp\\noiso.kanagawa.jp\\nsagamihara.kanagawa.jp\\nsamukawa.kanagawa.jp\\ntsukui.kanagawa.jp\\nyamakita.kanagawa.jp\\nyamato.kanagawa.jp\\nyokosuka.kanagawa.jp\\nyugawara.kanagawa.jp\\nzama.kanagawa.jp\\nzushi.kanagawa.jp\\naki.kochi.jp\\ngeisei.kochi.jp\\nhidaka.kochi.jp\\nhigashitsuno.kochi.jp\\nino.kochi.jp\\nkagami.kochi.jp\\nkami.kochi.jp\\nkitagawa.kochi.jp\\nkochi.kochi.jp\\nmihara.kochi.jp\\nmotoyama.kochi.jp\\nmuroto.kochi.jp\\nnahari.kochi.jp\\nnakamura.kochi.jp\\nnankoku.kochi.jp\\nnishitosa.kochi.jp\\nniyodogawa.kochi.jp\\nochi.kochi.jp\\nokawa.kochi.jp\\notoyo.kochi.jp\\notsuki.kochi.jp\\nsakawa.kochi.jp\\nsukumo.kochi.jp\\nsusaki.kochi.jp\\ntosa.kochi.jp\\ntosashimizu.kochi.jp\\ntoyo.kochi.jp\\ntsuno.kochi.jp\\numaji.kochi.jp\\nyasuda.kochi.jp\\nyusuhara.kochi.jp\\namakusa.kumamoto.jp\\narao.kumamoto.jp\\naso.kumamoto.jp\\nchoyo.kumamoto.jp\\ngyokuto.kumamoto.jp\\nkamiamakusa.kumamoto.jp\\nkikuchi.kumamoto.jp\\nkumamoto.kumamoto.jp\\nmashiki.kumamoto.jp\\nmifune.kumamoto.jp\\nminamata.kumamoto.jp\\nminamioguni.kumamoto.jp\\nnagasu.kumamoto.jp\\nnishihara.kumamoto.jp\\noguni.kumamoto.jp\\nozu.kumamoto.jp\\nsumoto.kumamoto.jp\\ntakamori.kumamoto.jp\\nuki.kumamoto.jp\\nuto.kumamoto.jp\\nyamaga.kumamoto.jp\\nyamato.kumamoto.jp\\nyatsushiro.kumamoto.jp\\nayabe.kyoto.jp\\nfukuchiyama.kyoto.jp\\nhigashiyama.kyoto.jp\\nide.kyoto.jp\\nine.kyoto.jp\\njoyo.kyoto.jp\\nkameoka.kyoto.jp\\nkamo.kyoto.jp\\nkita.kyoto.jp\\nkizu.kyoto.jp\\nkumiyama.kyoto.jp\\nkyotamba.kyoto.jp\\nkyotanabe.kyoto.jp\\nkyotango.kyoto.jp\\nmaizuru.kyoto.jp\\nminami.kyoto.jp\\nminamiyamashiro.kyoto.jp\\nmiyazu.kyoto.jp\\nmuko.kyoto.jp\\nnagaokakyo.kyoto.jp\\nnakagyo.kyoto.jp\\nnantan.kyoto.jp\\noyamazaki.kyoto.jp\\nsakyo.kyoto.jp\\nseika.kyoto.jp\\ntanabe.kyoto.jp\\nuji.kyoto.jp\\nujitawara.kyoto.jp\\nwazuka.kyoto.jp\\nyamashina.kyoto.jp\\nyawata.kyoto.jp\\nasahi.mie.jp\\ninabe.mie.jp\\nise.mie.jp\\nkameyama.mie.jp\\nkawagoe.mie.jp\\nkiho.mie.jp\\nkisosaki.mie.jp\\nkiwa.mie.jp\\nkomono.mie.jp\\nkumano.mie.jp\\nkuwana.mie.jp\\nmatsusaka.mie.jp\\nmeiwa.mie.jp\\nmihama.mie.jp\\nminamiise.mie.jp\\nmisugi.mie.jp\\nmiyama.mie.jp\\nnabari.mie.jp\\nshima.mie.jp\\nsuzuka.mie.jp\\ntado.mie.jp\\ntaiki.mie.jp\\ntaki.mie.jp\\ntamaki.mie.jp\\ntoba.mie.jp\\ntsu.mie.jp\\nudono.mie.jp\\nureshino.mie.jp\\nwatarai.mie.jp\\nyokkaichi.mie.jp\\nfurukawa.miyagi.jp\\nhigashimatsushima.miyagi.jp\\nishinomaki.miyagi.jp\\niwanuma.miyagi.jp\\nkakuda.miyagi.jp\\nkami.miyagi.jp\\nkawasaki.miyagi.jp\\nmarumori.miyagi.jp\\nmatsushima.miyagi.jp\\nminamisanriku.miyagi.jp\\nmisato.miyagi.jp\\nmurata.miyagi.jp\\nnatori.miyagi.jp\\nogawara.miyagi.jp\\nohira.miyagi.jp\\nonagawa.miyagi.jp\\nosaki.miyagi.jp\\nrifu.miyagi.jp\\nsemine.miyagi.jp\\nshibata.miyagi.jp\\nshichikashuku.miyagi.jp\\nshikama.miyagi.jp\\nshiogama.miyagi.jp\\nshiroishi.miyagi.jp\\ntagajo.miyagi.jp\\ntaiwa.miyagi.jp\\ntome.miyagi.jp\\ntomiya.miyagi.jp\\nwakuya.miyagi.jp\\nwatari.miyagi.jp\\nyamamoto.miyagi.jp\\nzao.miyagi.jp\\naya.miyazaki.jp\\nebino.miyazaki.jp\\ngokase.miyazaki.jp\\nhyuga.miyazaki.jp\\nkadogawa.miyazaki.jp\\nkawaminami.miyazaki.jp\\nkijo.miyazaki.jp\\nkitagawa.miyazaki.jp\\nkitakata.miyazaki.jp\\nkitaura.miyazaki.jp\\nkobayashi.miyazaki.jp\\nkunitomi.miyazaki.jp\\nkushima.miyazaki.jp\\nmimata.miyazaki.jp\\nmiyakonojo.miyazaki.jp\\nmiyazaki.miyazaki.jp\\nmorotsuka.miyazaki.jp\\nnichinan.miyazaki.jp\\nnishimera.miyazaki.jp\\nnobeoka.miyazaki.jp\\nsaito.miyazaki.jp\\nshiiba.miyazaki.jp\\nshintomi.miyazaki.jp\\ntakaharu.miyazaki.jp\\ntakanabe.miyazaki.jp\\ntakazaki.miyazaki.jp\\ntsuno.miyazaki.jp\\nachi.nagano.jp\\nagematsu.nagano.jp\\nanan.nagano.jp\\naoki.nagano.jp\\nasahi.nagano.jp\\nazumino.nagano.jp\\nchikuhoku.nagano.jp\\nchikuma.nagano.jp\\nchino.nagano.jp\\nfujimi.nagano.jp\\nhakuba.nagano.jp\\nhara.nagano.jp\\nhiraya.nagano.jp\\niida.nagano.jp\\niijima.nagano.jp\\niiyama.nagano.jp\\niizuna.nagano.jp\\nikeda.nagano.jp\\nikusaka.nagano.jp\\nina.nagano.jp\\nkaruizawa.nagano.jp\\nkawakami.nagano.jp\\nkiso.nagano.jp\\nkisofukushima.nagano.jp\\nkitaaiki.nagano.jp\\nkomagane.nagano.jp\\nkomoro.nagano.jp\\nmatsukawa.nagano.jp\\nmatsumoto.nagano.jp\\nmiasa.nagano.jp\\nminamiaiki.nagano.jp\\nminamimaki.nagano.jp\\nminamiminowa.nagano.jp\\nminowa.nagano.jp\\nmiyada.nagano.jp\\nmiyota.nagano.jp\\nmochizuki.nagano.jp\\nnagano.nagano.jp\\nnagawa.nagano.jp\\nnagiso.nagano.jp\\nnakagawa.nagano.jp\\nnakano.nagano.jp\\nnozawaonsen.nagano.jp\\nobuse.nagano.jp\\nogawa.nagano.jp\\nokaya.nagano.jp\\nomachi.nagano.jp\\nomi.nagano.jp\\nookuwa.nagano.jp\\nooshika.nagano.jp\\notaki.nagano.jp\\notari.nagano.jp\\nsakae.nagano.jp\\nsakaki.nagano.jp\\nsaku.nagano.jp\\nsakuho.nagano.jp\\nshimosuwa.nagano.jp\\nshinanomachi.nagano.jp\\nshiojiri.nagano.jp\\nsuwa.nagano.jp\\nsuzaka.nagano.jp\\ntakagi.nagano.jp\\ntakamori.nagano.jp\\ntakayama.nagano.jp\\ntateshina.nagano.jp\\ntatsuno.nagano.jp\\ntogakushi.nagano.jp\\ntogura.nagano.jp\\ntomi.nagano.jp\\nueda.nagano.jp\\nwada.nagano.jp\\nyamagata.nagano.jp\\nyamanouchi.nagano.jp\\nyasaka.nagano.jp\\nyasuoka.nagano.jp\\nchijiwa.nagasaki.jp\\nfutsu.nagasaki.jp\\ngoto.nagasaki.jp\\nhasami.nagasaki.jp\\nhirado.nagasaki.jp\\niki.nagasaki.jp\\nisahaya.nagasaki.jp\\nkawatana.nagasaki.jp\\nkuchinotsu.nagasaki.jp\\nmatsuura.nagasaki.jp\\nnagasaki.nagasaki.jp\\nobama.nagasaki.jp\\nomura.nagasaki.jp\\noseto.nagasaki.jp\\nsaikai.nagasaki.jp\\nsasebo.nagasaki.jp\\nseihi.nagasaki.jp\\nshimabara.nagasaki.jp\\nshinkamigoto.nagasaki.jp\\ntogitsu.nagasaki.jp\\ntsushima.nagasaki.jp\\nunzen.nagasaki.jp\\nando.nara.jp\\ngose.nara.jp\\nheguri.nara.jp\\nhigashiyoshino.nara.jp\\nikaruga.nara.jp\\nikoma.nara.jp\\nkamikitayama.nara.jp\\nkanmaki.nara.jp\\nkashiba.nara.jp\\nkashihara.nara.jp\\nkatsuragi.nara.jp\\nkawai.nara.jp\\nkawakami.nara.jp\\nkawanishi.nara.jp\\nkoryo.nara.jp\\nkurotaki.nara.jp\\nmitsue.nara.jp\\nmiyake.nara.jp\\nnara.nara.jp\\nnosegawa.nara.jp\\noji.nara.jp\\nouda.nara.jp\\noyodo.nara.jp\\nsakurai.nara.jp\\nsango.nara.jp\\nshimoichi.nara.jp\\nshimokitayama.nara.jp\\nshinjo.nara.jp\\nsoni.nara.jp\\ntakatori.nara.jp\\ntawaramoto.nara.jp\\ntenkawa.nara.jp\\ntenri.nara.jp\\nuda.nara.jp\\nyamatokoriyama.nara.jp\\nyamatotakada.nara.jp\\nyamazoe.nara.jp\\nyoshino.nara.jp\\naga.niigata.jp\\nagano.niigata.jp\\ngosen.niigata.jp\\nitoigawa.niigata.jp\\nizumozaki.niigata.jp\\njoetsu.niigata.jp\\nkamo.niigata.jp\\nkariwa.niigata.jp\\nkashiwazaki.niigata.jp\\nminamiuonuma.niigata.jp\\nmitsuke.niigata.jp\\nmuika.niigata.jp\\nmurakami.niigata.jp\\nmyoko.niigata.jp\\nnagaoka.niigata.jp\\nniigata.niigata.jp\\nojiya.niigata.jp\\nomi.niigata.jp\\nsado.niigata.jp\\nsanjo.niigata.jp\\nseiro.niigata.jp\\nseirou.niigata.jp\\nsekikawa.niigata.jp\\nshibata.niigata.jp\\ntagami.niigata.jp\\ntainai.niigata.jp\\ntochio.niigata.jp\\ntokamachi.niigata.jp\\ntsubame.niigata.jp\\ntsunan.niigata.jp\\nuonuma.niigata.jp\\nyahiko.niigata.jp\\nyoita.niigata.jp\\nyuzawa.niigata.jp\\nbeppu.oita.jp\\nbungoono.oita.jp\\nbungotakada.oita.jp\\nhasama.oita.jp\\nhiji.oita.jp\\nhimeshima.oita.jp\\nhita.oita.jp\\nkamitsue.oita.jp\\nkokonoe.oita.jp\\nkuju.oita.jp\\nkunisaki.oita.jp\\nkusu.oita.jp\\noita.oita.jp\\nsaiki.oita.jp\\ntaketa.oita.jp\\ntsukumi.oita.jp\\nusa.oita.jp\\nusuki.oita.jp\\nyufu.oita.jp\\nakaiwa.okayama.jp\\nasakuchi.okayama.jp\\nbizen.okayama.jp\\nhayashima.okayama.jp\\nibara.okayama.jp\\nkagamino.okayama.jp\\nkasaoka.okayama.jp\\nkibichuo.okayama.jp\\nkumenan.okayama.jp\\nkurashiki.okayama.jp\\nmaniwa.okayama.jp\\nmisaki.okayama.jp\\nnagi.okayama.jp\\nniimi.okayama.jp\\nnishiawakura.okayama.jp\\nokayama.okayama.jp\\nsatosho.okayama.jp\\nsetouchi.okayama.jp\\nshinjo.okayama.jp\\nshoo.okayama.jp\\nsoja.okayama.jp\\ntakahashi.okayama.jp\\ntamano.okayama.jp\\ntsuyama.okayama.jp\\nwake.okayama.jp\\nyakage.okayama.jp\\naguni.okinawa.jp\\nginowan.okinawa.jp\\nginoza.okinawa.jp\\ngushikami.okinawa.jp\\nhaebaru.okinawa.jp\\nhigashi.okinawa.jp\\nhirara.okinawa.jp\\niheya.okinawa.jp\\nishigaki.okinawa.jp\\nishikawa.okinawa.jp\\nitoman.okinawa.jp\\nizena.okinawa.jp\\nkadena.okinawa.jp\\nkin.okinawa.jp\\nkitadaito.okinawa.jp\\nkitanakagusuku.okinawa.jp\\nkumejima.okinawa.jp\\nkunigami.okinawa.jp\\nminamidaito.okinawa.jp\\nmotobu.okinawa.jp\\nnago.okinawa.jp\\nnaha.okinawa.jp\\nnakagusuku.okinawa.jp\\nnakijin.okinawa.jp\\nnanjo.okinawa.jp\\nnishihara.okinawa.jp\\nogimi.okinawa.jp\\nokinawa.okinawa.jp\\nonna.okinawa.jp\\nshimoji.okinawa.jp\\ntaketomi.okinawa.jp\\ntarama.okinawa.jp\\ntokashiki.okinawa.jp\\ntomigusuku.okinawa.jp\\ntonaki.okinawa.jp\\nurasoe.okinawa.jp\\nuruma.okinawa.jp\\nyaese.okinawa.jp\\nyomitan.okinawa.jp\\nyonabaru.okinawa.jp\\nyonaguni.okinawa.jp\\nzamami.okinawa.jp\\nabeno.osaka.jp\\nchihayaakasaka.osaka.jp\\nchuo.osaka.jp\\ndaito.osaka.jp\\nfujiidera.osaka.jp\\nhabikino.osaka.jp\\nhannan.osaka.jp\\nhigashiosaka.osaka.jp\\nhigashisumiyoshi.osaka.jp\\nhigashiyodogawa.osaka.jp\\nhirakata.osaka.jp\\nibaraki.osaka.jp\\nikeda.osaka.jp\\nizumi.osaka.jp\\nizumiotsu.osaka.jp\\nizumisano.osaka.jp\\nkadoma.osaka.jp\\nkaizuka.osaka.jp\\nkanan.osaka.jp\\nkashiwara.osaka.jp\\nkatano.osaka.jp\\nkawachinagano.osaka.jp\\nkishiwada.osaka.jp\\nkita.osaka.jp\\nkumatori.osaka.jp\\nmatsubara.osaka.jp\\nminato.osaka.jp\\nminoh.osaka.jp\\nmisaki.osaka.jp\\nmoriguchi.osaka.jp\\nneyagawa.osaka.jp\\nnishi.osaka.jp\\nnose.osaka.jp\\nosakasayama.osaka.jp\\nsakai.osaka.jp\\nsayama.osaka.jp\\nsennan.osaka.jp\\nsettsu.osaka.jp\\nshijonawate.osaka.jp\\nshimamoto.osaka.jp\\nsuita.osaka.jp\\ntadaoka.osaka.jp\\ntaishi.osaka.jp\\ntajiri.osaka.jp\\ntakaishi.osaka.jp\\ntakatsuki.osaka.jp\\ntondabayashi.osaka.jp\\ntoyonaka.osaka.jp\\ntoyono.osaka.jp\\nyao.osaka.jp\\nariake.saga.jp\\narita.saga.jp\\nfukudomi.saga.jp\\ngenkai.saga.jp\\nhamatama.saga.jp\\nhizen.saga.jp\\nimari.saga.jp\\nkamimine.saga.jp\\nkanzaki.saga.jp\\nkaratsu.saga.jp\\nkashima.saga.jp\\nkitagata.saga.jp\\nkitahata.saga.jp\\nkiyama.saga.jp\\nkouhoku.saga.jp\\nkyuragi.saga.jp\\nnishiarita.saga.jp\\nogi.saga.jp\\nomachi.saga.jp\\nouchi.saga.jp\\nsaga.saga.jp\\nshiroishi.saga.jp\\ntaku.saga.jp\\ntara.saga.jp\\ntosu.saga.jp\\nyoshinogari.saga.jp\\narakawa.saitama.jp\\nasaka.saitama.jp\\nchichibu.saitama.jp\\nfujimi.saitama.jp\\nfujimino.saitama.jp\\nfukaya.saitama.jp\\nhanno.saitama.jp\\nhanyu.saitama.jp\\nhasuda.saitama.jp\\nhatogaya.saitama.jp\\nhatoyama.saitama.jp\\nhidaka.saitama.jp\\nhigashichichibu.saitama.jp\\nhigashimatsuyama.saitama.jp\\nhonjo.saitama.jp\\nina.saitama.jp\\niruma.saitama.jp\\niwatsuki.saitama.jp\\nkamiizumi.saitama.jp\\nkamikawa.saitama.jp\\nkamisato.saitama.jp\\nkasukabe.saitama.jp\\nkawagoe.saitama.jp\\nkawaguchi.saitama.jp\\nkawajima.saitama.jp\\nkazo.saitama.jp\\nkitamoto.saitama.jp\\nkoshigaya.saitama.jp\\nkounosu.saitama.jp\\nkuki.saitama.jp\\nkumagaya.saitama.jp\\nmatsubushi.saitama.jp\\nminano.saitama.jp\\nmisato.saitama.jp\\nmiyashiro.saitama.jp\\nmiyoshi.saitama.jp\\nmoroyama.saitama.jp\\nnagatoro.saitama.jp\\nnamegawa.saitama.jp\\nniiza.saitama.jp\\nogano.saitama.jp\\nogawa.saitama.jp\\nogose.saitama.jp\\nokegawa.saitama.jp\\nomiya.saitama.jp\\notaki.saitama.jp\\nranzan.saitama.jp\\nryokami.saitama.jp\\nsaitama.saitama.jp\\nsakado.saitama.jp\\nsatte.saitama.jp\\nsayama.saitama.jp\\nshiki.saitama.jp\\nshiraoka.saitama.jp\\nsoka.saitama.jp\\nsugito.saitama.jp\\ntoda.saitama.jp\\ntokigawa.saitama.jp\\ntokorozawa.saitama.jp\\ntsurugashima.saitama.jp\\nurawa.saitama.jp\\nwarabi.saitama.jp\\nyashio.saitama.jp\\nyokoze.saitama.jp\\nyono.saitama.jp\\nyorii.saitama.jp\\nyoshida.saitama.jp\\nyoshikawa.saitama.jp\\nyoshimi.saitama.jp\\naisho.shiga.jp\\ngamo.shiga.jp\\nhigashiomi.shiga.jp\\nhikone.shiga.jp\\nkoka.shiga.jp\\nkonan.shiga.jp\\nkosei.shiga.jp\\nkoto.shiga.jp\\nkusatsu.shiga.jp\\nmaibara.shiga.jp\\nmoriyama.shiga.jp\\nnagahama.shiga.jp\\nnishiazai.shiga.jp\\nnotogawa.shiga.jp\\nomihachiman.shiga.jp\\notsu.shiga.jp\\nritto.shiga.jp\\nryuoh.shiga.jp\\ntakashima.shiga.jp\\ntakatsuki.shiga.jp\\ntorahime.shiga.jp\\ntoyosato.shiga.jp\\nyasu.shiga.jp\\nakagi.shimane.jp\\nama.shimane.jp\\ngotsu.shimane.jp\\nhamada.shimane.jp\\nhigashiizumo.shimane.jp\\nhikawa.shimane.jp\\nhikimi.shimane.jp\\nizumo.shimane.jp\\nkakinoki.shimane.jp\\nmasuda.shimane.jp\\nmatsue.shimane.jp\\nmisato.shimane.jp\\nnishinoshima.shimane.jp\\nohda.shimane.jp\\nokinoshima.shimane.jp\\nokuizumo.shimane.jp\\nshimane.shimane.jp\\ntamayu.shimane.jp\\ntsuwano.shimane.jp\\nunnan.shimane.jp\\nyakumo.shimane.jp\\nyasugi.shimane.jp\\nyatsuka.shimane.jp\\narai.shizuoka.jp\\natami.shizuoka.jp\\nfuji.shizuoka.jp\\nfujieda.shizuoka.jp\\nfujikawa.shizuoka.jp\\nfujinomiya.shizuoka.jp\\nfukuroi.shizuoka.jp\\ngotemba.shizuoka.jp\\nhaibara.shizuoka.jp\\nhamamatsu.shizuoka.jp\\nhigashiizu.shizuoka.jp\\nito.shizuoka.jp\\niwata.shizuoka.jp\\nizu.shizuoka.jp\\nizunokuni.shizuoka.jp\\nkakegawa.shizuoka.jp\\nkannami.shizuoka.jp\\nkawanehon.shizuoka.jp\\nkawazu.shizuoka.jp\\nkikugawa.shizuoka.jp\\nkosai.shizuoka.jp\\nmakinohara.shizuoka.jp\\nmatsuzaki.shizuoka.jp\\nminamiizu.shizuoka.jp\\nmishima.shizuoka.jp\\nmorimachi.shizuoka.jp\\nnishiizu.shizuoka.jp\\nnumazu.shizuoka.jp\\nomaezaki.shizuoka.jp\\nshimada.shizuoka.jp\\nshimizu.shizuoka.jp\\nshimoda.shizuoka.jp\\nshizuoka.shizuoka.jp\\nsusono.shizuoka.jp\\nyaizu.shizuoka.jp\\nyoshida.shizuoka.jp\\nashikaga.tochigi.jp\\nbato.tochigi.jp\\nhaga.tochigi.jp\\nichikai.tochigi.jp\\niwafune.tochigi.jp\\nkaminokawa.tochigi.jp\\nkanuma.tochigi.jp\\nkarasuyama.tochigi.jp\\nkuroiso.tochigi.jp\\nmashiko.tochigi.jp\\nmibu.tochigi.jp\\nmoka.tochigi.jp\\nmotegi.tochigi.jp\\nnasu.tochigi.jp\\nnasushiobara.tochigi.jp\\nnikko.tochigi.jp\\nnishikata.tochigi.jp\\nnogi.tochigi.jp\\nohira.tochigi.jp\\nohtawara.tochigi.jp\\noyama.tochigi.jp\\nsakura.tochigi.jp\\nsano.tochigi.jp\\nshimotsuke.tochigi.jp\\nshioya.tochigi.jp\\ntakanezawa.tochigi.jp\\ntochigi.tochigi.jp\\ntsuga.tochigi.jp\\nujiie.tochigi.jp\\nutsunomiya.tochigi.jp\\nyaita.tochigi.jp\\naizumi.tokushima.jp\\nanan.tokushima.jp\\nichiba.tokushima.jp\\nitano.tokushima.jp\\nkainan.tokushima.jp\\nkomatsushima.tokushima.jp\\nmatsushige.tokushima.jp\\nmima.tokushima.jp\\nminami.tokushima.jp\\nmiyoshi.tokushima.jp\\nmugi.tokushima.jp\\nnakagawa.tokushima.jp\\nnaruto.tokushima.jp\\nsanagochi.tokushima.jp\\nshishikui.tokushima.jp\\ntokushima.tokushima.jp\\nwajiki.tokushima.jp\\nadachi.tokyo.jp\\nakiruno.tokyo.jp\\nakishima.tokyo.jp\\naogashima.tokyo.jp\\narakawa.tokyo.jp\\nbunkyo.tokyo.jp\\nchiyoda.tokyo.jp\\nchofu.tokyo.jp\\nchuo.tokyo.jp\\nedogawa.tokyo.jp\\nfuchu.tokyo.jp\\nfussa.tokyo.jp\\nhachijo.tokyo.jp\\nhachioji.tokyo.jp\\nhamura.tokyo.jp\\nhigashikurume.tokyo.jp\\nhigashimurayama.tokyo.jp\\nhigashiyamato.tokyo.jp\\nhino.tokyo.jp\\nhinode.tokyo.jp\\nhinohara.tokyo.jp\\ninagi.tokyo.jp\\nitabashi.tokyo.jp\\nkatsushika.tokyo.jp\\nkita.tokyo.jp\\nkiyose.tokyo.jp\\nkodaira.tokyo.jp\\nkoganei.tokyo.jp\\nkokubunji.tokyo.jp\\nkomae.tokyo.jp\\nkoto.tokyo.jp\\nkouzushima.tokyo.jp\\nkunitachi.tokyo.jp\\nmachida.tokyo.jp\\nmeguro.tokyo.jp\\nminato.tokyo.jp\\nmitaka.tokyo.jp\\nmizuho.tokyo.jp\\nmusashimurayama.tokyo.jp\\nmusashino.tokyo.jp\\nnakano.tokyo.jp\\nnerima.tokyo.jp\\nogasawara.tokyo.jp\\nokutama.tokyo.jp\\nome.tokyo.jp\\noshima.tokyo.jp\\nota.tokyo.jp\\nsetagaya.tokyo.jp\\nshibuya.tokyo.jp\\nshinagawa.tokyo.jp\\nshinjuku.tokyo.jp\\nsuginami.tokyo.jp\\nsumida.tokyo.jp\\ntachikawa.tokyo.jp\\ntaito.tokyo.jp\\ntama.tokyo.jp\\ntoshima.tokyo.jp\\nchizu.tottori.jp\\nhino.tottori.jp\\nkawahara.tottori.jp\\nkoge.tottori.jp\\nkotoura.tottori.jp\\nmisasa.tottori.jp\\nnanbu.tottori.jp\\nnichinan.tottori.jp\\nsakaiminato.tottori.jp\\ntottori.tottori.jp\\nwakasa.tottori.jp\\nyazu.tottori.jp\\nyonago.tottori.jp\\nasahi.toyama.jp\\nfuchu.toyama.jp\\nfukumitsu.toyama.jp\\nfunahashi.toyama.jp\\nhimi.toyama.jp\\nimizu.toyama.jp\\ninami.toyama.jp\\njohana.toyama.jp\\nkamiichi.toyama.jp\\nkurobe.toyama.jp\\nnakaniikawa.toyama.jp\\nnamerikawa.toyama.jp\\nnanto.toyama.jp\\nnyuzen.toyama.jp\\noyabe.toyama.jp\\ntaira.toyama.jp\\ntakaoka.toyama.jp\\ntateyama.toyama.jp\\ntoga.toyama.jp\\ntonami.toyama.jp\\ntoyama.toyama.jp\\nunazuki.toyama.jp\\nuozu.toyama.jp\\nyamada.toyama.jp\\narida.wakayama.jp\\naridagawa.wakayama.jp\\ngobo.wakayama.jp\\nhashimoto.wakayama.jp\\nhidaka.wakayama.jp\\nhirogawa.wakayama.jp\\ninami.wakayama.jp\\niwade.wakayama.jp\\nkainan.wakayama.jp\\nkamitonda.wakayama.jp\\nkatsuragi.wakayama.jp\\nkimino.wakayama.jp\\nkinokawa.wakayama.jp\\nkitayama.wakayama.jp\\nkoya.wakayama.jp\\nkoza.wakayama.jp\\nkozagawa.wakayama.jp\\nkudoyama.wakayama.jp\\nkushimoto.wakayama.jp\\nmihama.wakayama.jp\\nmisato.wakayama.jp\\nnachikatsuura.wakayama.jp\\nshingu.wakayama.jp\\nshirahama.wakayama.jp\\ntaiji.wakayama.jp\\ntanabe.wakayama.jp\\nwakayama.wakayama.jp\\nyuasa.wakayama.jp\\nyura.wakayama.jp\\nasahi.yamagata.jp\\nfunagata.yamagata.jp\\nhigashine.yamagata.jp\\niide.yamagata.jp\\nkahoku.yamagata.jp\\nkaminoyama.yamagata.jp\\nkaneyama.yamagata.jp\\nkawanishi.yamagata.jp\\nmamurogawa.yamagata.jp\\nmikawa.yamagata.jp\\nmurayama.yamagata.jp\\nnagai.yamagata.jp\\nnakayama.yamagata.jp\\nnanyo.yamagata.jp\\nnishikawa.yamagata.jp\\nobanazawa.yamagata.jp\\noe.yamagata.jp\\noguni.yamagata.jp\\nohkura.yamagata.jp\\noishida.yamagata.jp\\nsagae.yamagata.jp\\nsakata.yamagata.jp\\nsakegawa.yamagata.jp\\nshinjo.yamagata.jp\\nshirataka.yamagata.jp\\nshonai.yamagata.jp\\ntakahata.yamagata.jp\\ntendo.yamagata.jp\\ntozawa.yamagata.jp\\ntsuruoka.yamagata.jp\\nyamagata.yamagata.jp\\nyamanobe.yamagata.jp\\nyonezawa.yamagata.jp\\nyuza.yamagata.jp\\nabu.yamaguchi.jp\\nhagi.yamaguchi.jp\\nhikari.yamaguchi.jp\\nhofu.yamaguchi.jp\\niwakuni.yamaguchi.jp\\nkudamatsu.yamaguchi.jp\\nmitou.yamaguchi.jp\\nnagato.yamaguchi.jp\\noshima.yamaguchi.jp\\nshimonoseki.yamaguchi.jp\\nshunan.yamaguchi.jp\\ntabuse.yamaguchi.jp\\ntokuyama.yamaguchi.jp\\ntoyota.yamaguchi.jp\\nube.yamaguchi.jp\\nyuu.yamaguchi.jp\\nchuo.yamanashi.jp\\ndoshi.yamanashi.jp\\nfuefuki.yamanashi.jp\\nfujikawa.yamanashi.jp\\nfujikawaguchiko.yamanashi.jp\\nfujiyoshida.yamanashi.jp\\nhayakawa.yamanashi.jp\\nhokuto.yamanashi.jp\\nichikawamisato.yamanashi.jp\\nkai.yamanashi.jp\\nkofu.yamanashi.jp\\nkoshu.yamanashi.jp\\nkosuge.yamanashi.jp\\nminami-alps.yamanashi.jp\\nminobu.yamanashi.jp\\nnakamichi.yamanashi.jp\\nnanbu.yamanashi.jp\\nnarusawa.yamanashi.jp\\nnirasaki.yamanashi.jp\\nnishikatsura.yamanashi.jp\\noshino.yamanashi.jp\\notsuki.yamanashi.jp\\nshowa.yamanashi.jp\\ntabayama.yamanashi.jp\\ntsuru.yamanashi.jp\\nuenohara.yamanashi.jp\\nyamanakako.yamanashi.jp\\nyamanashi.yamanashi.jp\\n\\n// ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains\\nke\\nac.ke\\nco.ke\\ngo.ke\\ninfo.ke\\nme.ke\\nmobi.ke\\nne.ke\\nor.ke\\nsc.ke\\n\\n// kg : http://www.domain.kg/dmn_n.html\\nkg\\norg.kg\\nnet.kg\\ncom.kg\\nedu.kg\\ngov.kg\\nmil.kg\\n\\n// kh : http://www.mptc.gov.kh/dns_registration.htm\\n*.kh\\n\\n// ki : http://www.ki/dns/index.html\\nki\\nedu.ki\\nbiz.ki\\nnet.ki\\norg.ki\\ngov.ki\\ninfo.ki\\ncom.ki\\n\\n// km : https://en.wikipedia.org/wiki/.km\\n// http://www.domaine.km/documents/charte.doc\\nkm\\norg.km\\nnom.km\\ngov.km\\nprd.km\\ntm.km\\nedu.km\\nmil.km\\nass.km\\ncom.km\\n// These are only mentioned as proposed suggestions at domaine.km, but\\n// https://en.wikipedia.org/wiki/.km says they\\'re available for registration:\\ncoop.km\\nasso.km\\npresse.km\\nmedecin.km\\nnotaires.km\\npharmaciens.km\\nveterinaire.km\\ngouv.km\\n\\n// kn : https://en.wikipedia.org/wiki/.kn\\n// http://www.dot.kn/domainRules.html\\nkn\\nnet.kn\\norg.kn\\nedu.kn\\ngov.kn\\n\\n// kp : http://www.kcce.kp/en_index.php\\nkp\\ncom.kp\\nedu.kp\\ngov.kp\\norg.kp\\nrep.kp\\ntra.kp\\n\\n// kr : https://en.wikipedia.org/wiki/.kr\\n// see also: http://domain.nida.or.kr/eng/registration.jsp\\nkr\\nac.kr\\nco.kr\\nes.kr\\ngo.kr\\nhs.kr\\nkg.kr\\nmil.kr\\nms.kr\\nne.kr\\nor.kr\\npe.kr\\nre.kr\\nsc.kr\\n// kr geographical names\\nbusan.kr\\nchungbuk.kr\\nchungnam.kr\\ndaegu.kr\\ndaejeon.kr\\ngangwon.kr\\ngwangju.kr\\ngyeongbuk.kr\\ngyeonggi.kr\\ngyeongnam.kr\\nincheon.kr\\njeju.kr\\njeonbuk.kr\\njeonnam.kr\\nseoul.kr\\nulsan.kr\\n\\n// kw : https://www.nic.kw/policies/\\n// Confirmed by registry <nic.tech@citra.gov.kw>\\nkw\\ncom.kw\\nedu.kw\\nemb.kw\\ngov.kw\\nind.kw\\nnet.kw\\norg.kw\\n\\n// ky : http://www.icta.ky/da_ky_reg_dom.php\\n// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17\\nky\\ncom.ky\\nedu.ky\\nnet.ky\\norg.ky\\n\\n// kz : https://en.wikipedia.org/wiki/.kz\\n// see also: http://www.nic.kz/rules/index.jsp\\nkz\\norg.kz\\nedu.kz\\nnet.kz\\ngov.kz\\nmil.kz\\ncom.kz\\n\\n// la : https://en.wikipedia.org/wiki/.la\\n// Submitted by registry <gavin.brown@nic.la>\\nla\\nint.la\\nnet.la\\ninfo.la\\nedu.la\\ngov.la\\nper.la\\ncom.la\\norg.la\\n\\n// lb : https://en.wikipedia.org/wiki/.lb\\n// Submitted by registry <randy@psg.com>\\nlb\\ncom.lb\\nedu.lb\\ngov.lb\\nnet.lb\\norg.lb\\n\\n// lc : https://en.wikipedia.org/wiki/.lc\\n// see also: http://www.nic.lc/rules.htm\\nlc\\ncom.lc\\nnet.lc\\nco.lc\\norg.lc\\nedu.lc\\ngov.lc\\n\\n// li : https://en.wikipedia.org/wiki/.li\\nli\\n\\n// lk : https://www.nic.lk/index.php/domain-registration/lk-domain-naming-structure\\nlk\\ngov.lk\\nsch.lk\\nnet.lk\\nint.lk\\ncom.lk\\norg.lk\\nedu.lk\\nngo.lk\\nsoc.lk\\nweb.lk\\nltd.lk\\nassn.lk\\ngrp.lk\\nhotel.lk\\nac.lk\\n\\n// lr : http://psg.com/dns/lr/lr.txt\\n// Submitted by registry <randy@psg.com>\\nlr\\ncom.lr\\nedu.lr\\ngov.lr\\norg.lr\\nnet.lr\\n\\n// ls : http://www.nic.ls/\\n// Confirmed by registry <lsadmin@nic.ls>\\nls\\nac.ls\\nbiz.ls\\nco.ls\\nedu.ls\\ngov.ls\\ninfo.ls\\nnet.ls\\norg.ls\\nsc.ls\\n\\n// lt : https://en.wikipedia.org/wiki/.lt\\nlt\\n// gov.lt : http://www.gov.lt/index_en.php\\ngov.lt\\n\\n// lu : http://www.dns.lu/en/\\nlu\\n\\n// lv : http://www.nic.lv/DNS/En/generic.php\\nlv\\ncom.lv\\nedu.lv\\ngov.lv\\norg.lv\\nmil.lv\\nid.lv\\nnet.lv\\nasn.lv\\nconf.lv\\n\\n// ly : http://www.nic.ly/regulations.php\\nly\\ncom.ly\\nnet.ly\\ngov.ly\\nplc.ly\\nedu.ly\\nsch.ly\\nmed.ly\\norg.ly\\nid.ly\\n\\n// ma : https://en.wikipedia.org/wiki/.ma\\n// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf\\nma\\nco.ma\\nnet.ma\\ngov.ma\\norg.ma\\nac.ma\\npress.ma\\n\\n// mc : http://www.nic.mc/\\nmc\\ntm.mc\\nasso.mc\\n\\n// md : https://en.wikipedia.org/wiki/.md\\nmd\\n\\n// me : https://en.wikipedia.org/wiki/.me\\nme\\nco.me\\nnet.me\\norg.me\\nedu.me\\nac.me\\ngov.me\\nits.me\\npriv.me\\n\\n// mg : http://nic.mg/nicmg/?page_id=39\\nmg\\norg.mg\\nnom.mg\\ngov.mg\\nprd.mg\\ntm.mg\\nedu.mg\\nmil.mg\\ncom.mg\\nco.mg\\n\\n// mh : https://en.wikipedia.org/wiki/.mh\\nmh\\n\\n// mil : https://en.wikipedia.org/wiki/.mil\\nmil\\n\\n// mk : https://en.wikipedia.org/wiki/.mk\\n// see also: http://dns.marnet.net.mk/postapka.php\\nmk\\ncom.mk\\norg.mk\\nnet.mk\\nedu.mk\\ngov.mk\\ninf.mk\\nname.mk\\n\\n// ml : http://www.gobin.info/domainname/ml-template.doc\\n// see also: https://en.wikipedia.org/wiki/.ml\\nml\\ncom.ml\\nedu.ml\\ngouv.ml\\ngov.ml\\nnet.ml\\norg.ml\\npresse.ml\\n\\n// mm : https://en.wikipedia.org/wiki/.mm\\n*.mm\\n\\n// mn : https://en.wikipedia.org/wiki/.mn\\nmn\\ngov.mn\\nedu.mn\\norg.mn\\n\\n// mo : http://www.monic.net.mo/\\nmo\\ncom.mo\\nnet.mo\\norg.mo\\nedu.mo\\ngov.mo\\n\\n// mobi : https://en.wikipedia.org/wiki/.mobi\\nmobi\\n\\n// mp : http://www.dot.mp/\\n// Confirmed by registry <dcamacho@saipan.com> 2008-06-17\\nmp\\n\\n// mq : https://en.wikipedia.org/wiki/.mq\\nmq\\n\\n// mr : https://en.wikipedia.org/wiki/.mr\\nmr\\ngov.mr\\n\\n// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf\\nms\\ncom.ms\\nedu.ms\\ngov.ms\\nnet.ms\\norg.ms\\n\\n// mt : https://www.nic.org.mt/go/policy\\n// Submitted by registry <help@nic.org.mt>\\nmt\\ncom.mt\\nedu.mt\\nnet.mt\\norg.mt\\n\\n// mu : https://en.wikipedia.org/wiki/.mu\\nmu\\ncom.mu\\nnet.mu\\norg.mu\\ngov.mu\\nac.mu\\nco.mu\\nor.mu\\n\\n// museum : https://welcome.museum/wp-content/uploads/2018/05/20180525-Registration-Policy-MUSEUM-EN_VF-2.pdf https://welcome.museum/buy-your-dot-museum-2/\\nmuseum\\n\\n// mv : https://en.wikipedia.org/wiki/.mv\\n// \"mv\" included because, contra Wikipedia, google.mv exists.\\nmv\\naero.mv\\nbiz.mv\\ncom.mv\\ncoop.mv\\nedu.mv\\ngov.mv\\ninfo.mv\\nint.mv\\nmil.mv\\nmuseum.mv\\nname.mv\\nnet.mv\\norg.mv\\npro.mv\\n\\n// mw : http://www.registrar.mw/\\nmw\\nac.mw\\nbiz.mw\\nco.mw\\ncom.mw\\ncoop.mw\\nedu.mw\\ngov.mw\\nint.mw\\nmuseum.mw\\nnet.mw\\norg.mw\\n\\n// mx : http://www.nic.mx/\\n// Submitted by registry <farias@nic.mx>\\nmx\\ncom.mx\\norg.mx\\ngob.mx\\nedu.mx\\nnet.mx\\n\\n// my : http://www.mynic.my/\\n// Available strings: https://mynic.my/resources/domains/buying-a-domain/\\nmy\\nbiz.my\\ncom.my\\nedu.my\\ngov.my\\nmil.my\\nname.my\\nnet.my\\norg.my\\n\\n// mz : http://www.uem.mz/\\n// Submitted by registry <antonio@uem.mz>\\nmz\\nac.mz\\nadv.mz\\nco.mz\\nedu.mz\\ngov.mz\\nmil.mz\\nnet.mz\\norg.mz\\n\\n// na : http://www.na-nic.com.na/\\n// http://www.info.na/domain/\\nna\\ninfo.na\\npro.na\\nname.na\\nschool.na\\nor.na\\ndr.na\\nus.na\\nmx.na\\nca.na\\nin.na\\ncc.na\\ntv.na\\nws.na\\nmobi.na\\nco.na\\ncom.na\\norg.na\\n\\n// name : has 2nd-level tlds, but there\\'s no list of them\\nname\\n\\n// nc : http://www.cctld.nc/\\nnc\\nasso.nc\\nnom.nc\\n\\n// ne : https://en.wikipedia.org/wiki/.ne\\nne\\n\\n// net : https://en.wikipedia.org/wiki/.net\\nnet\\n\\n// nf : https://en.wikipedia.org/wiki/.nf\\nnf\\ncom.nf\\nnet.nf\\nper.nf\\nrec.nf\\nweb.nf\\narts.nf\\nfirm.nf\\ninfo.nf\\nother.nf\\nstore.nf\\n\\n// ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds\\nng\\ncom.ng\\nedu.ng\\ngov.ng\\ni.ng\\nmil.ng\\nmobi.ng\\nname.ng\\nnet.ng\\norg.ng\\nsch.ng\\n\\n// ni : http://www.nic.ni/\\nni\\nac.ni\\nbiz.ni\\nco.ni\\ncom.ni\\nedu.ni\\ngob.ni\\nin.ni\\ninfo.ni\\nint.ni\\nmil.ni\\nnet.ni\\nnom.ni\\norg.ni\\nweb.ni\\n\\n// nl : https://en.wikipedia.org/wiki/.nl\\n//      https://www.sidn.nl/\\n//      ccTLD for the Netherlands\\nnl\\n\\n// no : https://www.norid.no/en/om-domenenavn/regelverk-for-no/\\n// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/\\n// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/\\n// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/\\n// RSS feed: https://teknisk.norid.no/en/feed/\\nno\\n// Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/\\nfhs.no\\nvgs.no\\nfylkesbibl.no\\nfolkebibl.no\\nmuseum.no\\nidrett.no\\npriv.no\\n// Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/\\nmil.no\\nstat.no\\ndep.no\\nkommune.no\\nherad.no\\n// Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/\\n// counties\\naa.no\\nah.no\\nbu.no\\nfm.no\\nhl.no\\nhm.no\\njan-mayen.no\\nmr.no\\nnl.no\\nnt.no\\nof.no\\nol.no\\noslo.no\\nrl.no\\nsf.no\\nst.no\\nsvalbard.no\\ntm.no\\ntr.no\\nva.no\\nvf.no\\n// primary and lower secondary schools per county\\ngs.aa.no\\ngs.ah.no\\ngs.bu.no\\ngs.fm.no\\ngs.hl.no\\ngs.hm.no\\ngs.jan-mayen.no\\ngs.mr.no\\ngs.nl.no\\ngs.nt.no\\ngs.of.no\\ngs.ol.no\\ngs.oslo.no\\ngs.rl.no\\ngs.sf.no\\ngs.st.no\\ngs.svalbard.no\\ngs.tm.no\\ngs.tr.no\\ngs.va.no\\ngs.vf.no\\n// cities\\nakrehamn.no\\nåkrehamn.no\\nalgard.no\\nålgård.no\\narna.no\\nbrumunddal.no\\nbryne.no\\nbronnoysund.no\\nbrønnøysund.no\\ndrobak.no\\ndrøbak.no\\negersund.no\\nfetsund.no\\nfloro.no\\nflorø.no\\nfredrikstad.no\\nhokksund.no\\nhonefoss.no\\nhønefoss.no\\njessheim.no\\njorpeland.no\\njørpeland.no\\nkirkenes.no\\nkopervik.no\\nkrokstadelva.no\\nlangevag.no\\nlangevåg.no\\nleirvik.no\\nmjondalen.no\\nmjøndalen.no\\nmo-i-rana.no\\nmosjoen.no\\nmosjøen.no\\nnesoddtangen.no\\norkanger.no\\nosoyro.no\\nosøyro.no\\nraholt.no\\nråholt.no\\nsandnessjoen.no\\nsandnessjøen.no\\nskedsmokorset.no\\nslattum.no\\nspjelkavik.no\\nstathelle.no\\nstavern.no\\nstjordalshalsen.no\\nstjørdalshalsen.no\\ntananger.no\\ntranby.no\\nvossevangen.no\\n// communities\\nafjord.no\\nåfjord.no\\nagdenes.no\\nal.no\\nål.no\\nalesund.no\\nålesund.no\\nalstahaug.no\\nalta.no\\náltá.no\\nalaheadju.no\\nálaheadju.no\\nalvdal.no\\namli.no\\nåmli.no\\namot.no\\nåmot.no\\nandebu.no\\nandoy.no\\nandøy.no\\nandasuolo.no\\nardal.no\\nårdal.no\\naremark.no\\narendal.no\\nås.no\\naseral.no\\nåseral.no\\nasker.no\\naskim.no\\naskvoll.no\\naskoy.no\\naskøy.no\\nasnes.no\\nåsnes.no\\naudnedaln.no\\naukra.no\\naure.no\\naurland.no\\naurskog-holand.no\\naurskog-høland.no\\naustevoll.no\\naustrheim.no\\naveroy.no\\naverøy.no\\nbalestrand.no\\nballangen.no\\nbalat.no\\nbálát.no\\nbalsfjord.no\\nbahccavuotna.no\\nbáhccavuotna.no\\nbamble.no\\nbardu.no\\nbeardu.no\\nbeiarn.no\\nbajddar.no\\nbájddar.no\\nbaidar.no\\nbáidár.no\\nberg.no\\nbergen.no\\nberlevag.no\\nberlevåg.no\\nbearalvahki.no\\nbearalváhki.no\\nbindal.no\\nbirkenes.no\\nbjarkoy.no\\nbjarkøy.no\\nbjerkreim.no\\nbjugn.no\\nbodo.no\\nbodø.no\\nbadaddja.no\\nbådåddjå.no\\nbudejju.no\\nbokn.no\\nbremanger.no\\nbronnoy.no\\nbrønnøy.no\\nbygland.no\\nbykle.no\\nbarum.no\\nbærum.no\\nbo.telemark.no\\nbø.telemark.no\\nbo.nordland.no\\nbø.nordland.no\\nbievat.no\\nbievát.no\\nbomlo.no\\nbømlo.no\\nbatsfjord.no\\nbåtsfjord.no\\nbahcavuotna.no\\nbáhcavuotna.no\\ndovre.no\\ndrammen.no\\ndrangedal.no\\ndyroy.no\\ndyrøy.no\\ndonna.no\\ndønna.no\\neid.no\\neidfjord.no\\neidsberg.no\\neidskog.no\\neidsvoll.no\\neigersund.no\\nelverum.no\\nenebakk.no\\nengerdal.no\\netne.no\\netnedal.no\\nevenes.no\\nevenassi.no\\nevenášši.no\\nevje-og-hornnes.no\\nfarsund.no\\nfauske.no\\nfuossko.no\\nfuoisku.no\\nfedje.no\\nfet.no\\nfinnoy.no\\nfinnøy.no\\nfitjar.no\\nfjaler.no\\nfjell.no\\nflakstad.no\\nflatanger.no\\nflekkefjord.no\\nflesberg.no\\nflora.no\\nfla.no\\nflå.no\\nfolldal.no\\nforsand.no\\nfosnes.no\\nfrei.no\\nfrogn.no\\nfroland.no\\nfrosta.no\\nfrana.no\\nfræna.no\\nfroya.no\\nfrøya.no\\nfusa.no\\nfyresdal.no\\nforde.no\\nførde.no\\ngamvik.no\\ngangaviika.no\\ngáŋgaviika.no\\ngaular.no\\ngausdal.no\\ngildeskal.no\\ngildeskål.no\\ngiske.no\\ngjemnes.no\\ngjerdrum.no\\ngjerstad.no\\ngjesdal.no\\ngjovik.no\\ngjøvik.no\\ngloppen.no\\ngol.no\\ngran.no\\ngrane.no\\ngranvin.no\\ngratangen.no\\ngrimstad.no\\ngrong.no\\nkraanghke.no\\nkråanghke.no\\ngrue.no\\ngulen.no\\nhadsel.no\\nhalden.no\\nhalsa.no\\nhamar.no\\nhamaroy.no\\nhabmer.no\\nhábmer.no\\nhapmir.no\\nhápmir.no\\nhammerfest.no\\nhammarfeasta.no\\nhámmárfeasta.no\\nharam.no\\nhareid.no\\nharstad.no\\nhasvik.no\\naknoluokta.no\\nákŋoluokta.no\\nhattfjelldal.no\\naarborte.no\\nhaugesund.no\\nhemne.no\\nhemnes.no\\nhemsedal.no\\nheroy.more-og-romsdal.no\\nherøy.møre-og-romsdal.no\\nheroy.nordland.no\\nherøy.nordland.no\\nhitra.no\\nhjartdal.no\\nhjelmeland.no\\nhobol.no\\nhobøl.no\\nhof.no\\nhol.no\\nhole.no\\nholmestrand.no\\nholtalen.no\\nholtålen.no\\nhornindal.no\\nhorten.no\\nhurdal.no\\nhurum.no\\nhvaler.no\\nhyllestad.no\\nhagebostad.no\\nhægebostad.no\\nhoyanger.no\\nhøyanger.no\\nhoylandet.no\\nhøylandet.no\\nha.no\\nhå.no\\nibestad.no\\ninderoy.no\\ninderøy.no\\niveland.no\\njevnaker.no\\njondal.no\\njolster.no\\njølster.no\\nkarasjok.no\\nkarasjohka.no\\nkárášjohka.no\\nkarlsoy.no\\ngalsa.no\\ngálsá.no\\nkarmoy.no\\nkarmøy.no\\nkautokeino.no\\nguovdageaidnu.no\\nklepp.no\\nklabu.no\\nklæbu.no\\nkongsberg.no\\nkongsvinger.no\\nkragero.no\\nkragerø.no\\nkristiansand.no\\nkristiansund.no\\nkrodsherad.no\\nkrødsherad.no\\nkvalsund.no\\nrahkkeravju.no\\nráhkkerávju.no\\nkvam.no\\nkvinesdal.no\\nkvinnherad.no\\nkviteseid.no\\nkvitsoy.no\\nkvitsøy.no\\nkvafjord.no\\nkvæfjord.no\\ngiehtavuoatna.no\\nkvanangen.no\\nkvænangen.no\\nnavuotna.no\\nnávuotna.no\\nkafjord.no\\nkåfjord.no\\ngaivuotna.no\\ngáivuotna.no\\nlarvik.no\\nlavangen.no\\nlavagis.no\\nloabat.no\\nloabát.no\\nlebesby.no\\ndavvesiida.no\\nleikanger.no\\nleirfjord.no\\nleka.no\\nleksvik.no\\nlenvik.no\\nleangaviika.no\\nleaŋgaviika.no\\nlesja.no\\nlevanger.no\\nlier.no\\nlierne.no\\nlillehammer.no\\nlillesand.no\\nlindesnes.no\\nlindas.no\\nlindås.no\\nlom.no\\nloppa.no\\nlahppi.no\\nláhppi.no\\nlund.no\\nlunner.no\\nluroy.no\\nlurøy.no\\nluster.no\\nlyngdal.no\\nlyngen.no\\nivgu.no\\nlardal.no\\nlerdal.no\\nlærdal.no\\nlodingen.no\\nlødingen.no\\nlorenskog.no\\nlørenskog.no\\nloten.no\\nløten.no\\nmalvik.no\\nmasoy.no\\nmåsøy.no\\nmuosat.no\\nmuosát.no\\nmandal.no\\nmarker.no\\nmarnardal.no\\nmasfjorden.no\\nmeland.no\\nmeldal.no\\nmelhus.no\\nmeloy.no\\nmeløy.no\\nmeraker.no\\nmeråker.no\\nmoareke.no\\nmoåreke.no\\nmidsund.no\\nmidtre-gauldal.no\\nmodalen.no\\nmodum.no\\nmolde.no\\nmoskenes.no\\nmoss.no\\nmosvik.no\\nmalselv.no\\nmålselv.no\\nmalatvuopmi.no\\nmálatvuopmi.no\\nnamdalseid.no\\naejrie.no\\nnamsos.no\\nnamsskogan.no\\nnaamesjevuemie.no\\nnååmesjevuemie.no\\nlaakesvuemie.no\\nnannestad.no\\nnarvik.no\\nnarviika.no\\nnaustdal.no\\nnedre-eiker.no\\nnes.akershus.no\\nnes.buskerud.no\\nnesna.no\\nnesodden.no\\nnesseby.no\\nunjarga.no\\nunjárga.no\\nnesset.no\\nnissedal.no\\nnittedal.no\\nnord-aurdal.no\\nnord-fron.no\\nnord-odal.no\\nnorddal.no\\nnordkapp.no\\ndavvenjarga.no\\ndavvenjárga.no\\nnordre-land.no\\nnordreisa.no\\nraisa.no\\nráisa.no\\nnore-og-uvdal.no\\nnotodden.no\\nnaroy.no\\nnærøy.no\\nnotteroy.no\\nnøtterøy.no\\nodda.no\\noksnes.no\\nøksnes.no\\noppdal.no\\noppegard.no\\noppegård.no\\norkdal.no\\norland.no\\nørland.no\\norskog.no\\nørskog.no\\norsta.no\\nørsta.no\\nos.hedmark.no\\nos.hordaland.no\\nosen.no\\nosteroy.no\\nosterøy.no\\nostre-toten.no\\nøstre-toten.no\\noverhalla.no\\novre-eiker.no\\nøvre-eiker.no\\noyer.no\\nøyer.no\\noygarden.no\\nøygarden.no\\noystre-slidre.no\\nøystre-slidre.no\\nporsanger.no\\nporsangu.no\\nporsáŋgu.no\\nporsgrunn.no\\nradoy.no\\nradøy.no\\nrakkestad.no\\nrana.no\\nruovat.no\\nrandaberg.no\\nrauma.no\\nrendalen.no\\nrennebu.no\\nrennesoy.no\\nrennesøy.no\\nrindal.no\\nringebu.no\\nringerike.no\\nringsaker.no\\nrissa.no\\nrisor.no\\nrisør.no\\nroan.no\\nrollag.no\\nrygge.no\\nralingen.no\\nrælingen.no\\nrodoy.no\\nrødøy.no\\nromskog.no\\nrømskog.no\\nroros.no\\nrøros.no\\nrost.no\\nrøst.no\\nroyken.no\\nrøyken.no\\nroyrvik.no\\nrøyrvik.no\\nrade.no\\nråde.no\\nsalangen.no\\nsiellak.no\\nsaltdal.no\\nsalat.no\\nsálát.no\\nsálat.no\\nsamnanger.no\\nsande.more-og-romsdal.no\\nsande.møre-og-romsdal.no\\nsande.vestfold.no\\nsandefjord.no\\nsandnes.no\\nsandoy.no\\nsandøy.no\\nsarpsborg.no\\nsauda.no\\nsauherad.no\\nsel.no\\nselbu.no\\nselje.no\\nseljord.no\\nsigdal.no\\nsiljan.no\\nsirdal.no\\nskaun.no\\nskedsmo.no\\nski.no\\nskien.no\\nskiptvet.no\\nskjervoy.no\\nskjervøy.no\\nskierva.no\\nskiervá.no\\nskjak.no\\nskjåk.no\\nskodje.no\\nskanland.no\\nskånland.no\\nskanit.no\\nskánit.no\\nsmola.no\\nsmøla.no\\nsnillfjord.no\\nsnasa.no\\nsnåsa.no\\nsnoasa.no\\nsnaase.no\\nsnåase.no\\nsogndal.no\\nsokndal.no\\nsola.no\\nsolund.no\\nsongdalen.no\\nsortland.no\\nspydeberg.no\\nstange.no\\nstavanger.no\\nsteigen.no\\nsteinkjer.no\\nstjordal.no\\nstjørdal.no\\nstokke.no\\nstor-elvdal.no\\nstord.no\\nstordal.no\\nstorfjord.no\\nomasvuotna.no\\nstrand.no\\nstranda.no\\nstryn.no\\nsula.no\\nsuldal.no\\nsund.no\\nsunndal.no\\nsurnadal.no\\nsveio.no\\nsvelvik.no\\nsykkylven.no\\nsogne.no\\nsøgne.no\\nsomna.no\\nsømna.no\\nsondre-land.no\\nsøndre-land.no\\nsor-aurdal.no\\nsør-aurdal.no\\nsor-fron.no\\nsør-fron.no\\nsor-odal.no\\nsør-odal.no\\nsor-varanger.no\\nsør-varanger.no\\nmatta-varjjat.no\\nmátta-várjjat.no\\nsorfold.no\\nsørfold.no\\nsorreisa.no\\nsørreisa.no\\nsorum.no\\nsørum.no\\ntana.no\\ndeatnu.no\\ntime.no\\ntingvoll.no\\ntinn.no\\ntjeldsund.no\\ndielddanuorri.no\\ntjome.no\\ntjøme.no\\ntokke.no\\ntolga.no\\ntorsken.no\\ntranoy.no\\ntranøy.no\\ntromso.no\\ntromsø.no\\ntromsa.no\\nromsa.no\\ntrondheim.no\\ntroandin.no\\ntrysil.no\\ntrana.no\\ntræna.no\\ntrogstad.no\\ntrøgstad.no\\ntvedestrand.no\\ntydal.no\\ntynset.no\\ntysfjord.no\\ndivtasvuodna.no\\ndivttasvuotna.no\\ntysnes.no\\ntysvar.no\\ntysvær.no\\ntonsberg.no\\ntønsberg.no\\nullensaker.no\\nullensvang.no\\nulvik.no\\nutsira.no\\nvadso.no\\nvadsø.no\\ncahcesuolo.no\\nčáhcesuolo.no\\nvaksdal.no\\nvalle.no\\nvang.no\\nvanylven.no\\nvardo.no\\nvardø.no\\nvarggat.no\\nvárggát.no\\nvefsn.no\\nvaapste.no\\nvega.no\\nvegarshei.no\\nvegårshei.no\\nvennesla.no\\nverdal.no\\nverran.no\\nvestby.no\\nvestnes.no\\nvestre-slidre.no\\nvestre-toten.no\\nvestvagoy.no\\nvestvågøy.no\\nvevelstad.no\\nvik.no\\nvikna.no\\nvindafjord.no\\nvolda.no\\nvoss.no\\nvaroy.no\\nværøy.no\\nvagan.no\\nvågan.no\\nvoagat.no\\nvagsoy.no\\nvågsøy.no\\nvaga.no\\nvågå.no\\nvaler.ostfold.no\\nvåler.østfold.no\\nvaler.hedmark.no\\nvåler.hedmark.no\\n\\n// np : http://www.mos.com.np/register.html\\n*.np\\n\\n// nr : http://cenpac.net.nr/dns/index.html\\n// Submitted by registry <technician@cenpac.net.nr>\\nnr\\nbiz.nr\\ninfo.nr\\ngov.nr\\nedu.nr\\norg.nr\\nnet.nr\\ncom.nr\\n\\n// nu : https://en.wikipedia.org/wiki/.nu\\nnu\\n\\n// nz : https://en.wikipedia.org/wiki/.nz\\n// Submitted by registry <jay@nzrs.net.nz>\\nnz\\nac.nz\\nco.nz\\ncri.nz\\ngeek.nz\\ngen.nz\\ngovt.nz\\nhealth.nz\\niwi.nz\\nkiwi.nz\\nmaori.nz\\nmil.nz\\nmāori.nz\\nnet.nz\\norg.nz\\nparliament.nz\\nschool.nz\\n\\n// om : https://en.wikipedia.org/wiki/.om\\nom\\nco.om\\ncom.om\\nedu.om\\ngov.om\\nmed.om\\nmuseum.om\\nnet.om\\norg.om\\npro.om\\n\\n// onion : https://tools.ietf.org/html/rfc7686\\nonion\\n\\n// org : https://en.wikipedia.org/wiki/.org\\norg\\n\\n// pa : http://www.nic.pa/\\n// Some additional second level \"domains\" resolve directly as hostnames, such as\\n// pannet.pa, so we add a rule for \"pa\".\\npa\\nac.pa\\ngob.pa\\ncom.pa\\norg.pa\\nsld.pa\\nedu.pa\\nnet.pa\\ning.pa\\nabo.pa\\nmed.pa\\nnom.pa\\n\\n// pe : https://www.nic.pe/InformeFinalComision.pdf\\npe\\nedu.pe\\ngob.pe\\nnom.pe\\nmil.pe\\norg.pe\\ncom.pe\\nnet.pe\\n\\n// pf : http://www.gobin.info/domainname/formulaire-pf.pdf\\npf\\ncom.pf\\norg.pf\\nedu.pf\\n\\n// pg : https://en.wikipedia.org/wiki/.pg\\n*.pg\\n\\n// ph : http://www.domains.ph/FAQ2.asp\\n// Submitted by registry <jed@email.com.ph>\\nph\\ncom.ph\\nnet.ph\\norg.ph\\ngov.ph\\nedu.ph\\nngo.ph\\nmil.ph\\ni.ph\\n\\n// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK\\npk\\ncom.pk\\nnet.pk\\nedu.pk\\norg.pk\\nfam.pk\\nbiz.pk\\nweb.pk\\ngov.pk\\ngob.pk\\ngok.pk\\ngon.pk\\ngop.pk\\ngos.pk\\ninfo.pk\\n\\n// pl http://www.dns.pl/english/index.html\\n// Submitted by registry\\npl\\ncom.pl\\nnet.pl\\norg.pl\\n// pl functional domains (http://www.dns.pl/english/index.html)\\naid.pl\\nagro.pl\\natm.pl\\nauto.pl\\nbiz.pl\\nedu.pl\\ngmina.pl\\ngsm.pl\\ninfo.pl\\nmail.pl\\nmiasta.pl\\nmedia.pl\\nmil.pl\\nnieruchomosci.pl\\nnom.pl\\npc.pl\\npowiat.pl\\npriv.pl\\nrealestate.pl\\nrel.pl\\nsex.pl\\nshop.pl\\nsklep.pl\\nsos.pl\\nszkola.pl\\ntargi.pl\\ntm.pl\\ntourism.pl\\ntravel.pl\\nturystyka.pl\\n// Government domains\\ngov.pl\\nap.gov.pl\\ngriw.gov.pl\\nic.gov.pl\\nis.gov.pl\\nkmpsp.gov.pl\\nkonsulat.gov.pl\\nkppsp.gov.pl\\nkwp.gov.pl\\nkwpsp.gov.pl\\nmup.gov.pl\\nmw.gov.pl\\noia.gov.pl\\noirm.gov.pl\\noke.gov.pl\\noow.gov.pl\\noschr.gov.pl\\noum.gov.pl\\npa.gov.pl\\npinb.gov.pl\\npiw.gov.pl\\npo.gov.pl\\npr.gov.pl\\npsp.gov.pl\\npsse.gov.pl\\npup.gov.pl\\nrzgw.gov.pl\\nsa.gov.pl\\nsdn.gov.pl\\nsko.gov.pl\\nso.gov.pl\\nsr.gov.pl\\nstarostwo.gov.pl\\nug.gov.pl\\nugim.gov.pl\\num.gov.pl\\numig.gov.pl\\nupow.gov.pl\\nuppo.gov.pl\\nus.gov.pl\\nuw.gov.pl\\nuzs.gov.pl\\nwif.gov.pl\\nwiih.gov.pl\\nwinb.gov.pl\\nwios.gov.pl\\nwitd.gov.pl\\nwiw.gov.pl\\nwkz.gov.pl\\nwsa.gov.pl\\nwskr.gov.pl\\nwsse.gov.pl\\nwuoz.gov.pl\\nwzmiuw.gov.pl\\nzp.gov.pl\\nzpisdn.gov.pl\\n// pl regional domains (http://www.dns.pl/english/index.html)\\naugustow.pl\\nbabia-gora.pl\\nbedzin.pl\\nbeskidy.pl\\nbialowieza.pl\\nbialystok.pl\\nbielawa.pl\\nbieszczady.pl\\nboleslawiec.pl\\nbydgoszcz.pl\\nbytom.pl\\ncieszyn.pl\\nczeladz.pl\\nczest.pl\\ndlugoleka.pl\\nelblag.pl\\nelk.pl\\nglogow.pl\\ngniezno.pl\\ngorlice.pl\\ngrajewo.pl\\nilawa.pl\\njaworzno.pl\\njelenia-gora.pl\\njgora.pl\\nkalisz.pl\\nkazimierz-dolny.pl\\nkarpacz.pl\\nkartuzy.pl\\nkaszuby.pl\\nkatowice.pl\\nkepno.pl\\nketrzyn.pl\\nklodzko.pl\\nkobierzyce.pl\\nkolobrzeg.pl\\nkonin.pl\\nkonskowola.pl\\nkutno.pl\\nlapy.pl\\nlebork.pl\\nlegnica.pl\\nlezajsk.pl\\nlimanowa.pl\\nlomza.pl\\nlowicz.pl\\nlubin.pl\\nlukow.pl\\nmalbork.pl\\nmalopolska.pl\\nmazowsze.pl\\nmazury.pl\\nmielec.pl\\nmielno.pl\\nmragowo.pl\\nnaklo.pl\\nnowaruda.pl\\nnysa.pl\\nolawa.pl\\nolecko.pl\\nolkusz.pl\\nolsztyn.pl\\nopoczno.pl\\nopole.pl\\nostroda.pl\\nostroleka.pl\\nostrowiec.pl\\nostrowwlkp.pl\\npila.pl\\npisz.pl\\npodhale.pl\\npodlasie.pl\\npolkowice.pl\\npomorze.pl\\npomorskie.pl\\nprochowice.pl\\npruszkow.pl\\nprzeworsk.pl\\npulawy.pl\\nradom.pl\\nrawa-maz.pl\\nrybnik.pl\\nrzeszow.pl\\nsanok.pl\\nsejny.pl\\nslask.pl\\nslupsk.pl\\nsosnowiec.pl\\nstalowa-wola.pl\\nskoczow.pl\\nstarachowice.pl\\nstargard.pl\\nsuwalki.pl\\nswidnica.pl\\nswiebodzin.pl\\nswinoujscie.pl\\nszczecin.pl\\nszczytno.pl\\ntarnobrzeg.pl\\ntgory.pl\\nturek.pl\\ntychy.pl\\nustka.pl\\nwalbrzych.pl\\nwarmia.pl\\nwarszawa.pl\\nwaw.pl\\nwegrow.pl\\nwielun.pl\\nwlocl.pl\\nwloclawek.pl\\nwodzislaw.pl\\nwolomin.pl\\nwroclaw.pl\\nzachpomor.pl\\nzagan.pl\\nzarow.pl\\nzgora.pl\\nzgorzelec.pl\\n\\n// pm : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\npm\\n\\n// pn : http://www.government.pn/PnRegistry/policies.htm\\npn\\ngov.pn\\nco.pn\\norg.pn\\nedu.pn\\nnet.pn\\n\\n// post : https://en.wikipedia.org/wiki/.post\\npost\\n\\n// pr : http://www.nic.pr/index.asp?f=1\\npr\\ncom.pr\\nnet.pr\\norg.pr\\ngov.pr\\nedu.pr\\nisla.pr\\npro.pr\\nbiz.pr\\ninfo.pr\\nname.pr\\n// these aren\\'t mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr\\nest.pr\\nprof.pr\\nac.pr\\n\\n// pro : http://registry.pro/get-pro\\npro\\naaa.pro\\naca.pro\\nacct.pro\\navocat.pro\\nbar.pro\\ncpa.pro\\neng.pro\\njur.pro\\nlaw.pro\\nmed.pro\\nrecht.pro\\n\\n// ps : https://en.wikipedia.org/wiki/.ps\\n// http://www.nic.ps/registration/policy.html#reg\\nps\\nedu.ps\\ngov.ps\\nsec.ps\\nplo.ps\\ncom.ps\\norg.ps\\nnet.ps\\n\\n// pt : https://www.dns.pt/en/domain/pt-terms-and-conditions-registration-rules/\\npt\\nnet.pt\\ngov.pt\\norg.pt\\nedu.pt\\nint.pt\\npubl.pt\\ncom.pt\\nnome.pt\\n\\n// pw : https://en.wikipedia.org/wiki/.pw\\npw\\nco.pw\\nne.pw\\nor.pw\\ned.pw\\ngo.pw\\nbelau.pw\\n\\n// py : http://www.nic.py/pautas.html#seccion_9\\n// Submitted by registry\\npy\\ncom.py\\ncoop.py\\nedu.py\\ngov.py\\nmil.py\\nnet.py\\norg.py\\n\\n// qa : http://domains.qa/en/\\nqa\\ncom.qa\\nedu.qa\\ngov.qa\\nmil.qa\\nname.qa\\nnet.qa\\norg.qa\\nsch.qa\\n\\n// re : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\nre\\nasso.re\\ncom.re\\nnom.re\\n\\n// ro : http://www.rotld.ro/\\nro\\narts.ro\\ncom.ro\\nfirm.ro\\ninfo.ro\\nnom.ro\\nnt.ro\\norg.ro\\nrec.ro\\nstore.ro\\ntm.ro\\nwww.ro\\n\\n// rs : https://www.rnids.rs/en/domains/national-domains\\nrs\\nac.rs\\nco.rs\\nedu.rs\\ngov.rs\\nin.rs\\norg.rs\\n\\n// ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf\\n// Submitted by George Georgievsky <gug@cctld.ru>\\nru\\n\\n// rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf\\nrw\\nac.rw\\nco.rw\\ncoop.rw\\ngov.rw\\nmil.rw\\nnet.rw\\norg.rw\\n\\n// sa : http://www.nic.net.sa/\\nsa\\ncom.sa\\nnet.sa\\norg.sa\\ngov.sa\\nmed.sa\\npub.sa\\nedu.sa\\nsch.sa\\n\\n// sb : http://www.sbnic.net.sb/\\n// Submitted by registry <lee.humphries@telekom.com.sb>\\nsb\\ncom.sb\\nedu.sb\\ngov.sb\\nnet.sb\\norg.sb\\n\\n// sc : http://www.nic.sc/\\nsc\\ncom.sc\\ngov.sc\\nnet.sc\\norg.sc\\nedu.sc\\n\\n// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm\\n// Submitted by registry <admin@isoc.sd>\\nsd\\ncom.sd\\nnet.sd\\norg.sd\\nedu.sd\\nmed.sd\\ntv.sd\\ngov.sd\\ninfo.sd\\n\\n// se : https://en.wikipedia.org/wiki/.se\\n// Submitted by registry <patrik.wallstrom@iis.se>\\nse\\na.se\\nac.se\\nb.se\\nbd.se\\nbrand.se\\nc.se\\nd.se\\ne.se\\nf.se\\nfh.se\\nfhsk.se\\nfhv.se\\ng.se\\nh.se\\ni.se\\nk.se\\nkomforb.se\\nkommunalforbund.se\\nkomvux.se\\nl.se\\nlanbib.se\\nm.se\\nn.se\\nnaturbruksgymn.se\\no.se\\norg.se\\np.se\\nparti.se\\npp.se\\npress.se\\nr.se\\ns.se\\nt.se\\ntm.se\\nu.se\\nw.se\\nx.se\\ny.se\\nz.se\\n\\n// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines\\nsg\\ncom.sg\\nnet.sg\\norg.sg\\ngov.sg\\nedu.sg\\nper.sg\\n\\n// sh : http://nic.sh/rules.htm\\nsh\\ncom.sh\\nnet.sh\\ngov.sh\\norg.sh\\nmil.sh\\n\\n// si : https://en.wikipedia.org/wiki/.si\\nsi\\n\\n// sj : No registrations at this time.\\n// Submitted by registry <jarle@uninett.no>\\nsj\\n\\n// sk : https://en.wikipedia.org/wiki/.sk\\n// list of 2nd level domains ?\\nsk\\n\\n// sl : http://www.nic.sl\\n// Submitted by registry <adam@neoip.com>\\nsl\\ncom.sl\\nnet.sl\\nedu.sl\\ngov.sl\\norg.sl\\n\\n// sm : https://en.wikipedia.org/wiki/.sm\\nsm\\n\\n// sn : https://en.wikipedia.org/wiki/.sn\\nsn\\nart.sn\\ncom.sn\\nedu.sn\\ngouv.sn\\norg.sn\\nperso.sn\\nuniv.sn\\n\\n// so : http://sonic.so/policies/\\nso\\ncom.so\\nedu.so\\ngov.so\\nme.so\\nnet.so\\norg.so\\n\\n// sr : https://en.wikipedia.org/wiki/.sr\\nsr\\n\\n// ss : https://registry.nic.ss/\\n// Submitted by registry <technical@nic.ss>\\nss\\nbiz.ss\\ncom.ss\\nedu.ss\\ngov.ss\\nme.ss\\nnet.ss\\norg.ss\\nsch.ss\\n\\n// st : http://www.nic.st/html/policyrules/\\nst\\nco.st\\ncom.st\\nconsulado.st\\nedu.st\\nembaixada.st\\nmil.st\\nnet.st\\norg.st\\nprincipe.st\\nsaotome.st\\nstore.st\\n\\n// su : https://en.wikipedia.org/wiki/.su\\nsu\\n\\n// sv : http://www.svnet.org.sv/niveldos.pdf\\nsv\\ncom.sv\\nedu.sv\\ngob.sv\\norg.sv\\nred.sv\\n\\n// sx : https://en.wikipedia.org/wiki/.sx\\n// Submitted by registry <jcvignes@openregistry.com>\\nsx\\ngov.sx\\n\\n// sy : https://en.wikipedia.org/wiki/.sy\\n// see also: http://www.gobin.info/domainname/sy.doc\\nsy\\nedu.sy\\ngov.sy\\nnet.sy\\nmil.sy\\ncom.sy\\norg.sy\\n\\n// sz : https://en.wikipedia.org/wiki/.sz\\n// http://www.sispa.org.sz/\\nsz\\nco.sz\\nac.sz\\norg.sz\\n\\n// tc : https://en.wikipedia.org/wiki/.tc\\ntc\\n\\n// td : https://en.wikipedia.org/wiki/.td\\ntd\\n\\n// tel: https://en.wikipedia.org/wiki/.tel\\n// http://www.telnic.org/\\ntel\\n\\n// tf : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\ntf\\n\\n// tg : https://en.wikipedia.org/wiki/.tg\\n// http://www.nic.tg/\\ntg\\n\\n// th : https://en.wikipedia.org/wiki/.th\\n// Submitted by registry <krit@thains.co.th>\\nth\\nac.th\\nco.th\\ngo.th\\nin.th\\nmi.th\\nnet.th\\nor.th\\n\\n// tj : http://www.nic.tj/policy.html\\ntj\\nac.tj\\nbiz.tj\\nco.tj\\ncom.tj\\nedu.tj\\ngo.tj\\ngov.tj\\nint.tj\\nmil.tj\\nname.tj\\nnet.tj\\nnic.tj\\norg.tj\\ntest.tj\\nweb.tj\\n\\n// tk : https://en.wikipedia.org/wiki/.tk\\ntk\\n\\n// tl : https://en.wikipedia.org/wiki/.tl\\ntl\\ngov.tl\\n\\n// tm : http://www.nic.tm/local.html\\ntm\\ncom.tm\\nco.tm\\norg.tm\\nnet.tm\\nnom.tm\\ngov.tm\\nmil.tm\\nedu.tm\\n\\n// tn : http://www.registre.tn/fr/\\n// https://whois.ati.tn/\\ntn\\ncom.tn\\nens.tn\\nfin.tn\\ngov.tn\\nind.tn\\ninfo.tn\\nintl.tn\\nmincom.tn\\nnat.tn\\nnet.tn\\norg.tn\\nperso.tn\\ntourism.tn\\n\\n// to : https://en.wikipedia.org/wiki/.to\\n// Submitted by registry <egullich@colo.to>\\nto\\ncom.to\\ngov.to\\nnet.to\\norg.to\\nedu.to\\nmil.to\\n\\n// tr : https://nic.tr/\\n// https://nic.tr/forms/eng/policies.pdf\\n// https://nic.tr/index.php?USRACTN=PRICELST\\ntr\\nav.tr\\nbbs.tr\\nbel.tr\\nbiz.tr\\ncom.tr\\ndr.tr\\nedu.tr\\ngen.tr\\ngov.tr\\ninfo.tr\\nmil.tr\\nk12.tr\\nkep.tr\\nname.tr\\nnet.tr\\norg.tr\\npol.tr\\ntel.tr\\ntsk.tr\\ntv.tr\\nweb.tr\\n// Used by Northern Cyprus\\nnc.tr\\n// Used by government agencies of Northern Cyprus\\ngov.nc.tr\\n\\n// tt : http://www.nic.tt/\\ntt\\nco.tt\\ncom.tt\\norg.tt\\nnet.tt\\nbiz.tt\\ninfo.tt\\npro.tt\\nint.tt\\ncoop.tt\\njobs.tt\\nmobi.tt\\ntravel.tt\\nmuseum.tt\\naero.tt\\nname.tt\\ngov.tt\\nedu.tt\\n\\n// tv : https://en.wikipedia.org/wiki/.tv\\n// Not listing any 2LDs as reserved since none seem to exist in practice,\\n// Wikipedia notwithstanding.\\ntv\\n\\n// tw : https://en.wikipedia.org/wiki/.tw\\ntw\\nedu.tw\\ngov.tw\\nmil.tw\\ncom.tw\\nnet.tw\\norg.tw\\nidv.tw\\ngame.tw\\nebiz.tw\\nclub.tw\\n網路.tw\\n組織.tw\\n商業.tw\\n\\n// tz : http://www.tznic.or.tz/index.php/domains\\n// Submitted by registry <manager@tznic.or.tz>\\ntz\\nac.tz\\nco.tz\\ngo.tz\\nhotel.tz\\ninfo.tz\\nme.tz\\nmil.tz\\nmobi.tz\\nne.tz\\nor.tz\\nsc.tz\\ntv.tz\\n\\n// ua : https://hostmaster.ua/policy/?ua\\n// Submitted by registry <dk@cctld.ua>\\nua\\n// ua 2LD\\ncom.ua\\nedu.ua\\ngov.ua\\nin.ua\\nnet.ua\\norg.ua\\n// ua geographic names\\n// https://hostmaster.ua/2ld/\\ncherkassy.ua\\ncherkasy.ua\\nchernigov.ua\\nchernihiv.ua\\nchernivtsi.ua\\nchernovtsy.ua\\nck.ua\\ncn.ua\\ncr.ua\\ncrimea.ua\\ncv.ua\\ndn.ua\\ndnepropetrovsk.ua\\ndnipropetrovsk.ua\\ndonetsk.ua\\ndp.ua\\nif.ua\\nivano-frankivsk.ua\\nkh.ua\\nkharkiv.ua\\nkharkov.ua\\nkherson.ua\\nkhmelnitskiy.ua\\nkhmelnytskyi.ua\\nkiev.ua\\nkirovograd.ua\\nkm.ua\\nkr.ua\\nkropyvnytskyi.ua\\nkrym.ua\\nks.ua\\nkv.ua\\nkyiv.ua\\nlg.ua\\nlt.ua\\nlugansk.ua\\nluhansk.ua\\nlutsk.ua\\nlv.ua\\nlviv.ua\\nmk.ua\\nmykolaiv.ua\\nnikolaev.ua\\nod.ua\\nodesa.ua\\nodessa.ua\\npl.ua\\npoltava.ua\\nrivne.ua\\nrovno.ua\\nrv.ua\\nsb.ua\\nsebastopol.ua\\nsevastopol.ua\\nsm.ua\\nsumy.ua\\nte.ua\\nternopil.ua\\nuz.ua\\nuzhgorod.ua\\nuzhhorod.ua\\nvinnica.ua\\nvinnytsia.ua\\nvn.ua\\nvolyn.ua\\nyalta.ua\\nzakarpattia.ua\\nzaporizhzhe.ua\\nzaporizhzhia.ua\\nzhitomir.ua\\nzhytomyr.ua\\nzp.ua\\nzt.ua\\n\\n// ug : https://www.registry.co.ug/\\nug\\nco.ug\\nor.ug\\nac.ug\\nsc.ug\\ngo.ug\\nne.ug\\ncom.ug\\norg.ug\\n\\n// uk : https://en.wikipedia.org/wiki/.uk\\n// Submitted by registry <Michael.Daly@nominet.org.uk>\\nuk\\nac.uk\\nco.uk\\ngov.uk\\nltd.uk\\nme.uk\\nnet.uk\\nnhs.uk\\norg.uk\\nplc.uk\\npolice.uk\\n*.sch.uk\\n\\n// us : https://en.wikipedia.org/wiki/.us\\nus\\ndni.us\\nfed.us\\nisa.us\\nkids.us\\nnsn.us\\n// us geographic names\\nak.us\\nal.us\\nar.us\\nas.us\\naz.us\\nca.us\\nco.us\\nct.us\\ndc.us\\nde.us\\nfl.us\\nga.us\\ngu.us\\nhi.us\\nia.us\\nid.us\\nil.us\\nin.us\\nks.us\\nky.us\\nla.us\\nma.us\\nmd.us\\nme.us\\nmi.us\\nmn.us\\nmo.us\\nms.us\\nmt.us\\nnc.us\\nnd.us\\nne.us\\nnh.us\\nnj.us\\nnm.us\\nnv.us\\nny.us\\noh.us\\nok.us\\nor.us\\npa.us\\npr.us\\nri.us\\nsc.us\\nsd.us\\ntn.us\\ntx.us\\nut.us\\nvi.us\\nvt.us\\nva.us\\nwa.us\\nwi.us\\nwv.us\\nwy.us\\n// The registrar notes several more specific domains available in each state,\\n// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat\\n// haphazard; in some states these domains resolve as addresses, while in others\\n// only subdomains are available, or even nothing at all. We include the\\n// most common ones where it\\'s clear that different sites are different\\n// entities.\\nk12.ak.us\\nk12.al.us\\nk12.ar.us\\nk12.as.us\\nk12.az.us\\nk12.ca.us\\nk12.co.us\\nk12.ct.us\\nk12.dc.us\\nk12.fl.us\\nk12.ga.us\\nk12.gu.us\\n// k12.hi.us  Bug 614565 - Hawaii has a state-wide DOE login\\nk12.ia.us\\nk12.id.us\\nk12.il.us\\nk12.in.us\\nk12.ks.us\\nk12.ky.us\\nk12.la.us\\nk12.ma.us\\nk12.md.us\\nk12.me.us\\nk12.mi.us\\nk12.mn.us\\nk12.mo.us\\nk12.ms.us\\nk12.mt.us\\nk12.nc.us\\n// k12.nd.us  Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov>\\nk12.ne.us\\nk12.nh.us\\nk12.nj.us\\nk12.nm.us\\nk12.nv.us\\nk12.ny.us\\nk12.oh.us\\nk12.ok.us\\nk12.or.us\\nk12.pa.us\\nk12.pr.us\\n// k12.ri.us  Removed at request of Kim Cournoyer <netsupport@staff.ri.net>\\nk12.sc.us\\n// k12.sd.us  Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us>\\nk12.tn.us\\nk12.tx.us\\nk12.ut.us\\nk12.vi.us\\nk12.vt.us\\nk12.va.us\\nk12.wa.us\\nk12.wi.us\\n// k12.wv.us  Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu>\\nk12.wy.us\\ncc.ak.us\\ncc.al.us\\ncc.ar.us\\ncc.as.us\\ncc.az.us\\ncc.ca.us\\ncc.co.us\\ncc.ct.us\\ncc.dc.us\\ncc.de.us\\ncc.fl.us\\ncc.ga.us\\ncc.gu.us\\ncc.hi.us\\ncc.ia.us\\ncc.id.us\\ncc.il.us\\ncc.in.us\\ncc.ks.us\\ncc.ky.us\\ncc.la.us\\ncc.ma.us\\ncc.md.us\\ncc.me.us\\ncc.mi.us\\ncc.mn.us\\ncc.mo.us\\ncc.ms.us\\ncc.mt.us\\ncc.nc.us\\ncc.nd.us\\ncc.ne.us\\ncc.nh.us\\ncc.nj.us\\ncc.nm.us\\ncc.nv.us\\ncc.ny.us\\ncc.oh.us\\ncc.ok.us\\ncc.or.us\\ncc.pa.us\\ncc.pr.us\\ncc.ri.us\\ncc.sc.us\\ncc.sd.us\\ncc.tn.us\\ncc.tx.us\\ncc.ut.us\\ncc.vi.us\\ncc.vt.us\\ncc.va.us\\ncc.wa.us\\ncc.wi.us\\ncc.wv.us\\ncc.wy.us\\nlib.ak.us\\nlib.al.us\\nlib.ar.us\\nlib.as.us\\nlib.az.us\\nlib.ca.us\\nlib.co.us\\nlib.ct.us\\nlib.dc.us\\n// lib.de.us  Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us>\\nlib.fl.us\\nlib.ga.us\\nlib.gu.us\\nlib.hi.us\\nlib.ia.us\\nlib.id.us\\nlib.il.us\\nlib.in.us\\nlib.ks.us\\nlib.ky.us\\nlib.la.us\\nlib.ma.us\\nlib.md.us\\nlib.me.us\\nlib.mi.us\\nlib.mn.us\\nlib.mo.us\\nlib.ms.us\\nlib.mt.us\\nlib.nc.us\\nlib.nd.us\\nlib.ne.us\\nlib.nh.us\\nlib.nj.us\\nlib.nm.us\\nlib.nv.us\\nlib.ny.us\\nlib.oh.us\\nlib.ok.us\\nlib.or.us\\nlib.pa.us\\nlib.pr.us\\nlib.ri.us\\nlib.sc.us\\nlib.sd.us\\nlib.tn.us\\nlib.tx.us\\nlib.ut.us\\nlib.vi.us\\nlib.vt.us\\nlib.va.us\\nlib.wa.us\\nlib.wi.us\\n// lib.wv.us  Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us>\\nlib.wy.us\\n// k12.ma.us contains school districts in Massachusetts. The 4LDs are\\n//  managed independently except for private (PVT), charter (CHTR) and\\n//  parochial (PAROCH) schools.  Those are delegated directly to the\\n//  5LD operators.   <k12-ma-hostmaster _ at _ rsuc.gweep.net>\\npvt.k12.ma.us\\nchtr.k12.ma.us\\nparoch.k12.ma.us\\n// Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following\\n//    see also: http://domreg.merit.edu\\n//    see also: whois -h whois.domreg.merit.edu help\\nann-arbor.mi.us\\ncog.mi.us\\ndst.mi.us\\neaton.mi.us\\ngen.mi.us\\nmus.mi.us\\ntec.mi.us\\nwashtenaw.mi.us\\n\\n// uy : http://www.nic.org.uy/\\nuy\\ncom.uy\\nedu.uy\\ngub.uy\\nmil.uy\\nnet.uy\\norg.uy\\n\\n// uz : http://www.reg.uz/\\nuz\\nco.uz\\ncom.uz\\nnet.uz\\norg.uz\\n\\n// va : https://en.wikipedia.org/wiki/.va\\nva\\n\\n// vc : https://en.wikipedia.org/wiki/.vc\\n// Submitted by registry <kshah@ca.afilias.info>\\nvc\\ncom.vc\\nnet.vc\\norg.vc\\ngov.vc\\nmil.vc\\nedu.vc\\n\\n// ve : https://registro.nic.ve/\\n// Submitted by registry nic@nic.ve and nicve@conatel.gob.ve\\nve\\narts.ve\\nbib.ve\\nco.ve\\ncom.ve\\ne12.ve\\nedu.ve\\nfirm.ve\\ngob.ve\\ngov.ve\\ninfo.ve\\nint.ve\\nmil.ve\\nnet.ve\\nnom.ve\\norg.ve\\nrar.ve\\nrec.ve\\nstore.ve\\ntec.ve\\nweb.ve\\n\\n// vg : https://en.wikipedia.org/wiki/.vg\\nvg\\n\\n// vi : http://www.nic.vi/newdomainform.htm\\n// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other\\n// TLDs are \"reserved\", such as edu.vi and gov.vi, but doesn\\'t actually say they\\n// are available for registration (which they do not seem to be).\\nvi\\nco.vi\\ncom.vi\\nk12.vi\\nnet.vi\\norg.vi\\n\\n// vn : https://www.vnnic.vn/en/domain/cctld-vn\\n// https://vnnic.vn/sites/default/files/tailieu/vn.cctld.domains.txt\\nvn\\nac.vn\\nai.vn\\nbiz.vn\\ncom.vn\\nedu.vn\\ngov.vn\\nhealth.vn\\nid.vn\\ninfo.vn\\nint.vn\\nio.vn\\nname.vn\\nnet.vn\\norg.vn\\npro.vn\\n\\n// vn geographical names\\nangiang.vn\\nbacgiang.vn\\nbackan.vn\\nbaclieu.vn\\nbacninh.vn\\nbaria-vungtau.vn\\nbentre.vn\\nbinhdinh.vn\\nbinhduong.vn\\nbinhphuoc.vn\\nbinhthuan.vn\\ncamau.vn\\ncantho.vn\\ncaobang.vn\\ndaklak.vn\\ndaknong.vn\\ndanang.vn\\ndienbien.vn\\ndongnai.vn\\ndongthap.vn\\ngialai.vn\\nhagiang.vn\\nhaiduong.vn\\nhaiphong.vn\\nhanam.vn\\nhanoi.vn\\nhatinh.vn\\nhaugiang.vn\\nhoabinh.vn\\nhungyen.vn\\nkhanhhoa.vn\\nkiengiang.vn\\nkontum.vn\\nlaichau.vn\\nlamdong.vn\\nlangson.vn\\nlaocai.vn\\nlongan.vn\\nnamdinh.vn\\nnghean.vn\\nninhbinh.vn\\nninhthuan.vn\\nphutho.vn\\nphuyen.vn\\nquangbinh.vn\\nquangnam.vn\\nquangngai.vn\\nquangninh.vn\\nquangtri.vn\\nsoctrang.vn\\nsonla.vn\\ntayninh.vn\\nthaibinh.vn\\nthainguyen.vn\\nthanhhoa.vn\\nthanhphohochiminh.vn\\nthuathienhue.vn\\ntiengiang.vn\\ntravinh.vn\\ntuyenquang.vn\\nvinhlong.vn\\nvinhphuc.vn\\nyenbai.vn\\n\\n// vu : https://en.wikipedia.org/wiki/.vu\\n// http://www.vunic.vu/\\nvu\\ncom.vu\\nedu.vu\\nnet.vu\\norg.vu\\n\\n// wf : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\nwf\\n\\n// ws : https://en.wikipedia.org/wiki/.ws\\n// http://samoanic.ws/index.dhtml\\nws\\ncom.ws\\nnet.ws\\norg.ws\\ngov.ws\\nedu.ws\\n\\n// yt : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf\\nyt\\n\\n// IDN ccTLDs\\n// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then\\n// U-label, and follow this format:\\n// // A-Label (\"<Latin renderings>\", <language name>[, variant info]) : <ISO 3166 ccTLD>\\n// // [sponsoring org]\\n// U-Label\\n\\n// xn--mgbaam7a8h (\"Emerat\", Arabic) : AE\\n// http://nic.ae/english/arabicdomain/rules.jsp\\nامارات\\n\\n// xn--y9a3aq (\"hye\", Armenian) : AM\\n// ISOC AM (operated by .am Registry)\\nհայ\\n\\n// xn--54b7fta0cc (\"Bangla\", Bangla) : BD\\nবাংলা\\n\\n// xn--90ae (\"bg\", Bulgarian) : BG\\nбг\\n\\n// xn--mgbcpq6gpa1a (\"albahrain\", Arabic) : BH\\nالبحرين\\n\\n// xn--90ais (\"bel\", Belarusian/Russian Cyrillic) : BY\\n// Operated by .by registry\\nбел\\n\\n// xn--fiqs8s (\"Zhongguo/China\", Chinese, Simplified) : CN\\n// CNNIC\\n// http://cnnic.cn/html/Dir/2005/10/11/3218.htm\\n中国\\n\\n// xn--fiqz9s (\"Zhongguo/China\", Chinese, Traditional) : CN\\n// CNNIC\\n// http://cnnic.cn/html/Dir/2005/10/11/3218.htm\\n中國\\n\\n// xn--lgbbat1ad8j (\"Algeria/Al Jazair\", Arabic) : DZ\\nالجزائر\\n\\n// xn--wgbh1c (\"Egypt/Masr\", Arabic) : EG\\n// http://www.dotmasr.eg/\\nمصر\\n\\n// xn--e1a4c (\"eu\", Cyrillic) : EU\\n// https://eurid.eu\\nею\\n\\n// xn--qxa6a (\"eu\", Greek) : EU\\n// https://eurid.eu\\nευ\\n\\n// xn--mgbah1a3hjkrd (\"Mauritania\", Arabic) : MR\\nموريتانيا\\n\\n// xn--node (\"ge\", Georgian Mkhedruli) : GE\\nგე\\n\\n// xn--qxam (\"el\", Greek) : GR\\n// Hellenic Ministry of Infrastructure, Transport, and Networks\\nελ\\n\\n// xn--j6w193g (\"Hong Kong\", Chinese) : HK\\n// https://www.hkirc.hk\\n// Submitted by registry <hk.tech@hkirc.hk>\\n// https://www.hkirc.hk/content.jsp?id=30#!/34\\n香港\\n公司.香港\\n教育.香港\\n政府.香港\\n個人.香港\\n網絡.香港\\n組織.香港\\n\\n// xn--2scrj9c (\"Bharat\", Kannada) : IN\\n// India\\nಭಾರತ\\n\\n// xn--3hcrj9c (\"Bharat\", Oriya) : IN\\n// India\\nଭାରତ\\n\\n// xn--45br5cyl (\"Bharatam\", Assamese) : IN\\n// India\\nভাৰত\\n\\n// xn--h2breg3eve (\"Bharatam\", Sanskrit) : IN\\n// India\\nभारतम्\\n\\n// xn--h2brj9c8c (\"Bharot\", Santali) : IN\\n// India\\nभारोत\\n\\n// xn--mgbgu82a (\"Bharat\", Sindhi) : IN\\n// India\\nڀارت\\n\\n// xn--rvc1e0am3e (\"Bharatam\", Malayalam) : IN\\n// India\\nഭാരതം\\n\\n// xn--h2brj9c (\"Bharat\", Devanagari) : IN\\n// India\\nभारत\\n\\n// xn--mgbbh1a (\"Bharat\", Kashmiri) : IN\\n// India\\nبارت\\n\\n// xn--mgbbh1a71e (\"Bharat\", Arabic) : IN\\n// India\\nبھارت\\n\\n// xn--fpcrj9c3d (\"Bharat\", Telugu) : IN\\n// India\\nభారత్\\n\\n// xn--gecrj9c (\"Bharat\", Gujarati) : IN\\n// India\\nભારત\\n\\n// xn--s9brj9c (\"Bharat\", Gurmukhi) : IN\\n// India\\nਭਾਰਤ\\n\\n// xn--45brj9c (\"Bharat\", Bengali) : IN\\n// India\\nভারত\\n\\n// xn--xkc2dl3a5ee0h (\"India\", Tamil) : IN\\n// India\\nஇந்தியா\\n\\n// xn--mgba3a4f16a (\"Iran\", Persian) : IR\\nایران\\n\\n// xn--mgba3a4fra (\"Iran\", Arabic) : IR\\nايران\\n\\n// xn--mgbtx2b (\"Iraq\", Arabic) : IQ\\n// Communications and Media Commission\\nعراق\\n\\n// xn--mgbayh7gpa (\"al-Ordon\", Arabic) : JO\\n// National Information Technology Center (NITC)\\n// Royal Scientific Society, Al-Jubeiha\\nالاردن\\n\\n// xn--3e0b707e (\"Republic of Korea\", Hangul) : KR\\n한국\\n\\n// xn--80ao21a (\"Kaz\", Kazakh) : KZ\\nқаз\\n\\n// xn--q7ce6a (\"Lao\", Lao) : LA\\nລາວ\\n\\n// xn--fzc2c9e2c (\"Lanka\", Sinhalese-Sinhala) : LK\\n// https://nic.lk\\nලංකා\\n\\n// xn--xkc2al3hye2a (\"Ilangai\", Tamil) : LK\\n// https://nic.lk\\nஇலங்கை\\n\\n// xn--mgbc0a9azcg (\"Morocco/al-Maghrib\", Arabic) : MA\\nالمغرب\\n\\n// xn--d1alf (\"mkd\", Macedonian) : MK\\n// MARnet\\nмкд\\n\\n// xn--l1acc (\"mon\", Mongolian) : MN\\nмон\\n\\n// xn--mix891f (\"Macao\", Chinese, Traditional) : MO\\n// MONIC / HNET Asia (Registry Operator for .mo)\\n澳門\\n\\n// xn--mix082f (\"Macao\", Chinese, Simplified) : MO\\n澳门\\n\\n// xn--mgbx4cd0ab (\"Malaysia\", Malay) : MY\\nمليسيا\\n\\n// xn--mgb9awbf (\"Oman\", Arabic) : OM\\nعمان\\n\\n// xn--mgbai9azgqp6j (\"Pakistan\", Urdu/Arabic) : PK\\nپاکستان\\n\\n// xn--mgbai9a5eva00b (\"Pakistan\", Urdu/Arabic, variant) : PK\\nپاكستان\\n\\n// xn--ygbi2ammx (\"Falasteen\", Arabic) : PS\\n// The Palestinian National Internet Naming Authority (PNINA)\\n// http://www.pnina.ps\\nفلسطين\\n\\n// xn--90a3ac (\"srb\", Cyrillic) : RS\\n// https://www.rnids.rs/en/domains/national-domains\\nсрб\\nпр.срб\\nорг.срб\\nобр.срб\\nод.срб\\nупр.срб\\nак.срб\\n\\n// xn--p1ai (\"rf\", Russian-Cyrillic) : RU\\n// https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf\\n// Submitted by George Georgievsky <gug@cctld.ru>\\nрф\\n\\n// xn--wgbl6a (\"Qatar\", Arabic) : QA\\n// http://www.ict.gov.qa/\\nقطر\\n\\n// xn--mgberp4a5d4ar (\"AlSaudiah\", Arabic) : SA\\n// http://www.nic.net.sa/\\nالسعودية\\n\\n// xn--mgberp4a5d4a87g (\"AlSaudiah\", Arabic, variant)  : SA\\nالسعودیة\\n\\n// xn--mgbqly7c0a67fbc (\"AlSaudiah\", Arabic, variant) : SA\\nالسعودیۃ\\n\\n// xn--mgbqly7cvafr (\"AlSaudiah\", Arabic, variant) : SA\\nالسعوديه\\n\\n// xn--mgbpl2fh (\"sudan\", Arabic) : SD\\n// Operated by .sd registry\\nسودان\\n\\n// xn--yfro4i67o Singapore (\"Singapore\", Chinese) : SG\\n新加坡\\n\\n// xn--clchc0ea0b2g2a9gcd (\"Singapore\", Tamil) : SG\\nசிங்கப்பூர்\\n\\n// xn--ogbpf8fl (\"Syria\", Arabic) : SY\\nسورية\\n\\n// xn--mgbtf8fl (\"Syria\", Arabic, variant) : SY\\nسوريا\\n\\n// xn--o3cw4h (\"Thai\", Thai) : TH\\n// http://www.thnic.co.th\\nไทย\\nศึกษา.ไทย\\nธุรกิจ.ไทย\\nรัฐบาล.ไทย\\nทหาร.ไทย\\nเน็ต.ไทย\\nองค์กร.ไทย\\n\\n// xn--pgbs0dh (\"Tunisia\", Arabic) : TN\\n// http://nic.tn\\nتونس\\n\\n// xn--kpry57d (\"Taiwan\", Chinese, Traditional) : TW\\n// http://www.twnic.net/english/dn/dn_07a.htm\\n台灣\\n\\n// xn--kprw13d (\"Taiwan\", Chinese, Simplified) : TW\\n// http://www.twnic.net/english/dn/dn_07a.htm\\n台湾\\n\\n// xn--nnx388a (\"Taiwan\", Chinese, variant) : TW\\n臺灣\\n\\n// xn--j1amh (\"ukr\", Cyrillic) : UA\\nукр\\n\\n// xn--mgb2ddes (\"AlYemen\", Arabic) : YE\\nاليمن\\n\\n// xxx : http://icmregistry.com\\nxxx\\n\\n// ye : http://www.y.net.ye/services/domain_name.htm\\nye\\ncom.ye\\nedu.ye\\ngov.ye\\nnet.ye\\nmil.ye\\norg.ye\\n\\n// za : https://www.zadna.org.za/content/page/domain-information/\\nac.za\\nagric.za\\nalt.za\\nco.za\\nedu.za\\ngov.za\\ngrondar.za\\nlaw.za\\nmil.za\\nnet.za\\nngo.za\\nnic.za\\nnis.za\\nnom.za\\norg.za\\nschool.za\\ntm.za\\nweb.za\\n\\n// zm : https://zicta.zm/\\n// Submitted by registry <info@zicta.zm>\\nzm\\nac.zm\\nbiz.zm\\nco.zm\\ncom.zm\\nedu.zm\\ngov.zm\\ninfo.zm\\nmil.zm\\nnet.zm\\norg.zm\\nsch.zm\\n\\n// zw : https://www.potraz.gov.zw/\\n// Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25\\nzw\\nac.zw\\nco.zw\\ngov.zw\\nmil.zw\\norg.zw\\n\\n\\n// newGTLDs\\n\\n// List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2023-10-20T15:11:50Z\\n// This list is auto-generated, don\\'t edit it manually.\\n// aaa : American Automobile Association, Inc.\\n// https://www.iana.org/domains/root/db/aaa.html\\naaa\\n\\n// aarp : AARP\\n// https://www.iana.org/domains/root/db/aarp.html\\naarp\\n\\n// abb : ABB Ltd\\n// https://www.iana.org/domains/root/db/abb.html\\nabb\\n\\n// abbott : Abbott Laboratories, Inc.\\n// https://www.iana.org/domains/root/db/abbott.html\\nabbott\\n\\n// abbvie : AbbVie Inc.\\n// https://www.iana.org/domains/root/db/abbvie.html\\nabbvie\\n\\n// abc : Disney Enterprises, Inc.\\n// https://www.iana.org/domains/root/db/abc.html\\nabc\\n\\n// able : Able Inc.\\n// https://www.iana.org/domains/root/db/able.html\\nable\\n\\n// abogado : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/abogado.html\\nabogado\\n\\n// abudhabi : Abu Dhabi Systems and Information Centre\\n// https://www.iana.org/domains/root/db/abudhabi.html\\nabudhabi\\n\\n// academy : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/academy.html\\nacademy\\n\\n// accenture : Accenture plc\\n// https://www.iana.org/domains/root/db/accenture.html\\naccenture\\n\\n// accountant : dot Accountant Limited\\n// https://www.iana.org/domains/root/db/accountant.html\\naccountant\\n\\n// accountants : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/accountants.html\\naccountants\\n\\n// aco : ACO Severin Ahlmann GmbH & Co. KG\\n// https://www.iana.org/domains/root/db/aco.html\\naco\\n\\n// actor : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/actor.html\\nactor\\n\\n// ads : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/ads.html\\nads\\n\\n// adult : ICM Registry AD LLC\\n// https://www.iana.org/domains/root/db/adult.html\\nadult\\n\\n// aeg : Aktiebolaget Electrolux\\n// https://www.iana.org/domains/root/db/aeg.html\\naeg\\n\\n// aetna : Aetna Life Insurance Company\\n// https://www.iana.org/domains/root/db/aetna.html\\naetna\\n\\n// afl : Australian Football League\\n// https://www.iana.org/domains/root/db/afl.html\\nafl\\n\\n// africa : ZA Central Registry NPC trading as Registry.Africa\\n// https://www.iana.org/domains/root/db/africa.html\\nafrica\\n\\n// agakhan : Fondation Aga Khan (Aga Khan Foundation)\\n// https://www.iana.org/domains/root/db/agakhan.html\\nagakhan\\n\\n// agency : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/agency.html\\nagency\\n\\n// aig : American International Group, Inc.\\n// https://www.iana.org/domains/root/db/aig.html\\naig\\n\\n// airbus : Airbus S.A.S.\\n// https://www.iana.org/domains/root/db/airbus.html\\nairbus\\n\\n// airforce : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/airforce.html\\nairforce\\n\\n// airtel : Bharti Airtel Limited\\n// https://www.iana.org/domains/root/db/airtel.html\\nairtel\\n\\n// akdn : Fondation Aga Khan (Aga Khan Foundation)\\n// https://www.iana.org/domains/root/db/akdn.html\\nakdn\\n\\n// alibaba : Alibaba Group Holding Limited\\n// https://www.iana.org/domains/root/db/alibaba.html\\nalibaba\\n\\n// alipay : Alibaba Group Holding Limited\\n// https://www.iana.org/domains/root/db/alipay.html\\nalipay\\n\\n// allfinanz : Allfinanz Deutsche Vermögensberatung Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/allfinanz.html\\nallfinanz\\n\\n// allstate : Allstate Fire and Casualty Insurance Company\\n// https://www.iana.org/domains/root/db/allstate.html\\nallstate\\n\\n// ally : Ally Financial Inc.\\n// https://www.iana.org/domains/root/db/ally.html\\nally\\n\\n// alsace : Region Grand Est\\n// https://www.iana.org/domains/root/db/alsace.html\\nalsace\\n\\n// alstom : ALSTOM\\n// https://www.iana.org/domains/root/db/alstom.html\\nalstom\\n\\n// amazon : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/amazon.html\\namazon\\n\\n// americanexpress : American Express Travel Related Services Company, Inc.\\n// https://www.iana.org/domains/root/db/americanexpress.html\\namericanexpress\\n\\n// americanfamily : AmFam, Inc.\\n// https://www.iana.org/domains/root/db/americanfamily.html\\namericanfamily\\n\\n// amex : American Express Travel Related Services Company, Inc.\\n// https://www.iana.org/domains/root/db/amex.html\\namex\\n\\n// amfam : AmFam, Inc.\\n// https://www.iana.org/domains/root/db/amfam.html\\namfam\\n\\n// amica : Amica Mutual Insurance Company\\n// https://www.iana.org/domains/root/db/amica.html\\namica\\n\\n// amsterdam : Gemeente Amsterdam\\n// https://www.iana.org/domains/root/db/amsterdam.html\\namsterdam\\n\\n// analytics : Campus IP LLC\\n// https://www.iana.org/domains/root/db/analytics.html\\nanalytics\\n\\n// android : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/android.html\\nandroid\\n\\n// anquan : Beijing Qihu Keji Co., Ltd.\\n// https://www.iana.org/domains/root/db/anquan.html\\nanquan\\n\\n// anz : Australia and New Zealand Banking Group Limited\\n// https://www.iana.org/domains/root/db/anz.html\\nanz\\n\\n// aol : Oath Inc.\\n// https://www.iana.org/domains/root/db/aol.html\\naol\\n\\n// apartments : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/apartments.html\\napartments\\n\\n// app : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/app.html\\napp\\n\\n// apple : Apple Inc.\\n// https://www.iana.org/domains/root/db/apple.html\\napple\\n\\n// aquarelle : Aquarelle.com\\n// https://www.iana.org/domains/root/db/aquarelle.html\\naquarelle\\n\\n// arab : League of Arab States\\n// https://www.iana.org/domains/root/db/arab.html\\narab\\n\\n// aramco : Aramco Services Company\\n// https://www.iana.org/domains/root/db/aramco.html\\naramco\\n\\n// archi : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/archi.html\\narchi\\n\\n// army : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/army.html\\narmy\\n\\n// art : UK Creative Ideas Limited\\n// https://www.iana.org/domains/root/db/art.html\\nart\\n\\n// arte : Association Relative à la Télévision Européenne G.E.I.E.\\n// https://www.iana.org/domains/root/db/arte.html\\narte\\n\\n// asda : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/asda.html\\nasda\\n\\n// associates : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/associates.html\\nassociates\\n\\n// athleta : The Gap, Inc.\\n// https://www.iana.org/domains/root/db/athleta.html\\nathleta\\n\\n// attorney : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/attorney.html\\nattorney\\n\\n// auction : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/auction.html\\nauction\\n\\n// audi : AUDI Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/audi.html\\naudi\\n\\n// audible : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/audible.html\\naudible\\n\\n// audio : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/audio.html\\naudio\\n\\n// auspost : Australian Postal Corporation\\n// https://www.iana.org/domains/root/db/auspost.html\\nauspost\\n\\n// author : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/author.html\\nauthor\\n\\n// auto : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/auto.html\\nauto\\n\\n// autos : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/autos.html\\nautos\\n\\n// avianca : Avianca Inc.\\n// https://www.iana.org/domains/root/db/avianca.html\\navianca\\n\\n// aws : AWS Registry LLC\\n// https://www.iana.org/domains/root/db/aws.html\\naws\\n\\n// axa : AXA Group Operations SAS\\n// https://www.iana.org/domains/root/db/axa.html\\naxa\\n\\n// azure : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/azure.html\\nazure\\n\\n// baby : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/baby.html\\nbaby\\n\\n// baidu : Baidu, Inc.\\n// https://www.iana.org/domains/root/db/baidu.html\\nbaidu\\n\\n// banamex : Citigroup Inc.\\n// https://www.iana.org/domains/root/db/banamex.html\\nbanamex\\n\\n// bananarepublic : The Gap, Inc.\\n// https://www.iana.org/domains/root/db/bananarepublic.html\\nbananarepublic\\n\\n// band : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/band.html\\nband\\n\\n// bank : fTLD Registry Services LLC\\n// https://www.iana.org/domains/root/db/bank.html\\nbank\\n\\n// bar : Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable\\n// https://www.iana.org/domains/root/db/bar.html\\nbar\\n\\n// barcelona : Municipi de Barcelona\\n// https://www.iana.org/domains/root/db/barcelona.html\\nbarcelona\\n\\n// barclaycard : Barclays Bank PLC\\n// https://www.iana.org/domains/root/db/barclaycard.html\\nbarclaycard\\n\\n// barclays : Barclays Bank PLC\\n// https://www.iana.org/domains/root/db/barclays.html\\nbarclays\\n\\n// barefoot : Gallo Vineyards, Inc.\\n// https://www.iana.org/domains/root/db/barefoot.html\\nbarefoot\\n\\n// bargains : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/bargains.html\\nbargains\\n\\n// baseball : MLB Advanced Media DH, LLC\\n// https://www.iana.org/domains/root/db/baseball.html\\nbaseball\\n\\n// basketball : Fédération Internationale de Basketball (FIBA)\\n// https://www.iana.org/domains/root/db/basketball.html\\nbasketball\\n\\n// bauhaus : Werkhaus GmbH\\n// https://www.iana.org/domains/root/db/bauhaus.html\\nbauhaus\\n\\n// bayern : Bayern Connect GmbH\\n// https://www.iana.org/domains/root/db/bayern.html\\nbayern\\n\\n// bbc : British Broadcasting Corporation\\n// https://www.iana.org/domains/root/db/bbc.html\\nbbc\\n\\n// bbt : BB&T Corporation\\n// https://www.iana.org/domains/root/db/bbt.html\\nbbt\\n\\n// bbva : BANCO BILBAO VIZCAYA ARGENTARIA, S.A.\\n// https://www.iana.org/domains/root/db/bbva.html\\nbbva\\n\\n// bcg : The Boston Consulting Group, Inc.\\n// https://www.iana.org/domains/root/db/bcg.html\\nbcg\\n\\n// bcn : Municipi de Barcelona\\n// https://www.iana.org/domains/root/db/bcn.html\\nbcn\\n\\n// beats : Beats Electronics, LLC\\n// https://www.iana.org/domains/root/db/beats.html\\nbeats\\n\\n// beauty : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/beauty.html\\nbeauty\\n\\n// beer : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/beer.html\\nbeer\\n\\n// bentley : Bentley Motors Limited\\n// https://www.iana.org/domains/root/db/bentley.html\\nbentley\\n\\n// berlin : dotBERLIN GmbH & Co. KG\\n// https://www.iana.org/domains/root/db/berlin.html\\nberlin\\n\\n// best : BestTLD Pty Ltd\\n// https://www.iana.org/domains/root/db/best.html\\nbest\\n\\n// bestbuy : BBY Solutions, Inc.\\n// https://www.iana.org/domains/root/db/bestbuy.html\\nbestbuy\\n\\n// bet : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/bet.html\\nbet\\n\\n// bharti : Bharti Enterprises (Holding) Private Limited\\n// https://www.iana.org/domains/root/db/bharti.html\\nbharti\\n\\n// bible : American Bible Society\\n// https://www.iana.org/domains/root/db/bible.html\\nbible\\n\\n// bid : dot Bid Limited\\n// https://www.iana.org/domains/root/db/bid.html\\nbid\\n\\n// bike : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/bike.html\\nbike\\n\\n// bing : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/bing.html\\nbing\\n\\n// bingo : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/bingo.html\\nbingo\\n\\n// bio : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/bio.html\\nbio\\n\\n// black : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/black.html\\nblack\\n\\n// blackfriday : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/blackfriday.html\\nblackfriday\\n\\n// blockbuster : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/blockbuster.html\\nblockbuster\\n\\n// blog : Knock Knock WHOIS There, LLC\\n// https://www.iana.org/domains/root/db/blog.html\\nblog\\n\\n// bloomberg : Bloomberg IP Holdings LLC\\n// https://www.iana.org/domains/root/db/bloomberg.html\\nbloomberg\\n\\n// blue : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/blue.html\\nblue\\n\\n// bms : Bristol-Myers Squibb Company\\n// https://www.iana.org/domains/root/db/bms.html\\nbms\\n\\n// bmw : Bayerische Motoren Werke Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/bmw.html\\nbmw\\n\\n// bnpparibas : BNP Paribas\\n// https://www.iana.org/domains/root/db/bnpparibas.html\\nbnpparibas\\n\\n// boats : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/boats.html\\nboats\\n\\n// boehringer : Boehringer Ingelheim International GmbH\\n// https://www.iana.org/domains/root/db/boehringer.html\\nboehringer\\n\\n// bofa : Bank of America Corporation\\n// https://www.iana.org/domains/root/db/bofa.html\\nbofa\\n\\n// bom : Núcleo de Informação e Coordenação do Ponto BR - NIC.br\\n// https://www.iana.org/domains/root/db/bom.html\\nbom\\n\\n// bond : ShortDot SA\\n// https://www.iana.org/domains/root/db/bond.html\\nbond\\n\\n// boo : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/boo.html\\nboo\\n\\n// book : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/book.html\\nbook\\n\\n// booking : Booking.com B.V.\\n// https://www.iana.org/domains/root/db/booking.html\\nbooking\\n\\n// bosch : Robert Bosch GMBH\\n// https://www.iana.org/domains/root/db/bosch.html\\nbosch\\n\\n// bostik : Bostik SA\\n// https://www.iana.org/domains/root/db/bostik.html\\nbostik\\n\\n// boston : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/boston.html\\nboston\\n\\n// bot : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/bot.html\\nbot\\n\\n// boutique : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/boutique.html\\nboutique\\n\\n// box : Intercap Registry Inc.\\n// https://www.iana.org/domains/root/db/box.html\\nbox\\n\\n// bradesco : Banco Bradesco S.A.\\n// https://www.iana.org/domains/root/db/bradesco.html\\nbradesco\\n\\n// bridgestone : Bridgestone Corporation\\n// https://www.iana.org/domains/root/db/bridgestone.html\\nbridgestone\\n\\n// broadway : Celebrate Broadway, Inc.\\n// https://www.iana.org/domains/root/db/broadway.html\\nbroadway\\n\\n// broker : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/broker.html\\nbroker\\n\\n// brother : Brother Industries, Ltd.\\n// https://www.iana.org/domains/root/db/brother.html\\nbrother\\n\\n// brussels : DNS.be vzw\\n// https://www.iana.org/domains/root/db/brussels.html\\nbrussels\\n\\n// build : Plan Bee LLC\\n// https://www.iana.org/domains/root/db/build.html\\nbuild\\n\\n// builders : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/builders.html\\nbuilders\\n\\n// business : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/business.html\\nbusiness\\n\\n// buy : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/buy.html\\nbuy\\n\\n// buzz : DOTSTRATEGY CO.\\n// https://www.iana.org/domains/root/db/buzz.html\\nbuzz\\n\\n// bzh : Association www.bzh\\n// https://www.iana.org/domains/root/db/bzh.html\\nbzh\\n\\n// cab : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cab.html\\ncab\\n\\n// cafe : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cafe.html\\ncafe\\n\\n// cal : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/cal.html\\ncal\\n\\n// call : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/call.html\\ncall\\n\\n// calvinklein : PVH gTLD Holdings LLC\\n// https://www.iana.org/domains/root/db/calvinklein.html\\ncalvinklein\\n\\n// cam : Cam Connecting SARL\\n// https://www.iana.org/domains/root/db/cam.html\\ncam\\n\\n// camera : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/camera.html\\ncamera\\n\\n// camp : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/camp.html\\ncamp\\n\\n// canon : Canon Inc.\\n// https://www.iana.org/domains/root/db/canon.html\\ncanon\\n\\n// capetown : ZA Central Registry NPC trading as ZA Central Registry\\n// https://www.iana.org/domains/root/db/capetown.html\\ncapetown\\n\\n// capital : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/capital.html\\ncapital\\n\\n// capitalone : Capital One Financial Corporation\\n// https://www.iana.org/domains/root/db/capitalone.html\\ncapitalone\\n\\n// car : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/car.html\\ncar\\n\\n// caravan : Caravan International, Inc.\\n// https://www.iana.org/domains/root/db/caravan.html\\ncaravan\\n\\n// cards : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cards.html\\ncards\\n\\n// care : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/care.html\\ncare\\n\\n// career : dotCareer LLC\\n// https://www.iana.org/domains/root/db/career.html\\ncareer\\n\\n// careers : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/careers.html\\ncareers\\n\\n// cars : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/cars.html\\ncars\\n\\n// casa : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/casa.html\\ncasa\\n\\n// case : Digity, LLC\\n// https://www.iana.org/domains/root/db/case.html\\ncase\\n\\n// cash : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cash.html\\ncash\\n\\n// casino : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/casino.html\\ncasino\\n\\n// catering : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/catering.html\\ncatering\\n\\n// catholic : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)\\n// https://www.iana.org/domains/root/db/catholic.html\\ncatholic\\n\\n// cba : COMMONWEALTH BANK OF AUSTRALIA\\n// https://www.iana.org/domains/root/db/cba.html\\ncba\\n\\n// cbn : The Christian Broadcasting Network, Inc.\\n// https://www.iana.org/domains/root/db/cbn.html\\ncbn\\n\\n// cbre : CBRE, Inc.\\n// https://www.iana.org/domains/root/db/cbre.html\\ncbre\\n\\n// cbs : CBS Domains Inc.\\n// https://www.iana.org/domains/root/db/cbs.html\\ncbs\\n\\n// center : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/center.html\\ncenter\\n\\n// ceo : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/ceo.html\\nceo\\n\\n// cern : European Organization for Nuclear Research (\"CERN\")\\n// https://www.iana.org/domains/root/db/cern.html\\ncern\\n\\n// cfa : CFA Institute\\n// https://www.iana.org/domains/root/db/cfa.html\\ncfa\\n\\n// cfd : ShortDot SA\\n// https://www.iana.org/domains/root/db/cfd.html\\ncfd\\n\\n// chanel : Chanel International B.V.\\n// https://www.iana.org/domains/root/db/chanel.html\\nchanel\\n\\n// channel : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/channel.html\\nchannel\\n\\n// charity : Public Interest Registry\\n// https://www.iana.org/domains/root/db/charity.html\\ncharity\\n\\n// chase : JPMorgan Chase Bank, National Association\\n// https://www.iana.org/domains/root/db/chase.html\\nchase\\n\\n// chat : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/chat.html\\nchat\\n\\n// cheap : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cheap.html\\ncheap\\n\\n// chintai : CHINTAI Corporation\\n// https://www.iana.org/domains/root/db/chintai.html\\nchintai\\n\\n// christmas : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/christmas.html\\nchristmas\\n\\n// chrome : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/chrome.html\\nchrome\\n\\n// church : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/church.html\\nchurch\\n\\n// cipriani : Hotel Cipriani Srl\\n// https://www.iana.org/domains/root/db/cipriani.html\\ncipriani\\n\\n// circle : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/circle.html\\ncircle\\n\\n// cisco : Cisco Technology, Inc.\\n// https://www.iana.org/domains/root/db/cisco.html\\ncisco\\n\\n// citadel : Citadel Domain LLC\\n// https://www.iana.org/domains/root/db/citadel.html\\ncitadel\\n\\n// citi : Citigroup Inc.\\n// https://www.iana.org/domains/root/db/citi.html\\nciti\\n\\n// citic : CITIC Group Corporation\\n// https://www.iana.org/domains/root/db/citic.html\\ncitic\\n\\n// city : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/city.html\\ncity\\n\\n// claims : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/claims.html\\nclaims\\n\\n// cleaning : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cleaning.html\\ncleaning\\n\\n// click : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/click.html\\nclick\\n\\n// clinic : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/clinic.html\\nclinic\\n\\n// clinique : The Estée Lauder Companies Inc.\\n// https://www.iana.org/domains/root/db/clinique.html\\nclinique\\n\\n// clothing : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/clothing.html\\nclothing\\n\\n// cloud : Aruba PEC S.p.A.\\n// https://www.iana.org/domains/root/db/cloud.html\\ncloud\\n\\n// club : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/club.html\\nclub\\n\\n// clubmed : Club Méditerranée S.A.\\n// https://www.iana.org/domains/root/db/clubmed.html\\nclubmed\\n\\n// coach : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/coach.html\\ncoach\\n\\n// codes : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/codes.html\\ncodes\\n\\n// coffee : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/coffee.html\\ncoffee\\n\\n// college : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/college.html\\ncollege\\n\\n// cologne : dotKoeln GmbH\\n// https://www.iana.org/domains/root/db/cologne.html\\ncologne\\n\\n// comcast : Comcast IP Holdings I, LLC\\n// https://www.iana.org/domains/root/db/comcast.html\\ncomcast\\n\\n// commbank : COMMONWEALTH BANK OF AUSTRALIA\\n// https://www.iana.org/domains/root/db/commbank.html\\ncommbank\\n\\n// community : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/community.html\\ncommunity\\n\\n// company : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/company.html\\ncompany\\n\\n// compare : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/compare.html\\ncompare\\n\\n// computer : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/computer.html\\ncomputer\\n\\n// comsec : VeriSign, Inc.\\n// https://www.iana.org/domains/root/db/comsec.html\\ncomsec\\n\\n// condos : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/condos.html\\ncondos\\n\\n// construction : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/construction.html\\nconstruction\\n\\n// consulting : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/consulting.html\\nconsulting\\n\\n// contact : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/contact.html\\ncontact\\n\\n// contractors : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/contractors.html\\ncontractors\\n\\n// cooking : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/cooking.html\\ncooking\\n\\n// cool : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cool.html\\ncool\\n\\n// corsica : Collectivité de Corse\\n// https://www.iana.org/domains/root/db/corsica.html\\ncorsica\\n\\n// country : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/country.html\\ncountry\\n\\n// coupon : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/coupon.html\\ncoupon\\n\\n// coupons : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/coupons.html\\ncoupons\\n\\n// courses : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/courses.html\\ncourses\\n\\n// cpa : American Institute of Certified Public Accountants\\n// https://www.iana.org/domains/root/db/cpa.html\\ncpa\\n\\n// credit : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/credit.html\\ncredit\\n\\n// creditcard : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/creditcard.html\\ncreditcard\\n\\n// creditunion : DotCooperation LLC\\n// https://www.iana.org/domains/root/db/creditunion.html\\ncreditunion\\n\\n// cricket : dot Cricket Limited\\n// https://www.iana.org/domains/root/db/cricket.html\\ncricket\\n\\n// crown : Crown Equipment Corporation\\n// https://www.iana.org/domains/root/db/crown.html\\ncrown\\n\\n// crs : Federated Co-operatives Limited\\n// https://www.iana.org/domains/root/db/crs.html\\ncrs\\n\\n// cruise : Viking River Cruises (Bermuda) Ltd.\\n// https://www.iana.org/domains/root/db/cruise.html\\ncruise\\n\\n// cruises : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/cruises.html\\ncruises\\n\\n// cuisinella : SCHMIDT GROUPE S.A.S.\\n// https://www.iana.org/domains/root/db/cuisinella.html\\ncuisinella\\n\\n// cymru : Nominet UK\\n// https://www.iana.org/domains/root/db/cymru.html\\ncymru\\n\\n// cyou : ShortDot SA\\n// https://www.iana.org/domains/root/db/cyou.html\\ncyou\\n\\n// dabur : Dabur India Limited\\n// https://www.iana.org/domains/root/db/dabur.html\\ndabur\\n\\n// dad : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/dad.html\\ndad\\n\\n// dance : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/dance.html\\ndance\\n\\n// data : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/data.html\\ndata\\n\\n// date : dot Date Limited\\n// https://www.iana.org/domains/root/db/date.html\\ndate\\n\\n// dating : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/dating.html\\ndating\\n\\n// datsun : NISSAN MOTOR CO., LTD.\\n// https://www.iana.org/domains/root/db/datsun.html\\ndatsun\\n\\n// day : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/day.html\\nday\\n\\n// dclk : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/dclk.html\\ndclk\\n\\n// dds : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/dds.html\\ndds\\n\\n// deal : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/deal.html\\ndeal\\n\\n// dealer : Intercap Registry Inc.\\n// https://www.iana.org/domains/root/db/dealer.html\\ndealer\\n\\n// deals : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/deals.html\\ndeals\\n\\n// degree : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/degree.html\\ndegree\\n\\n// delivery : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/delivery.html\\ndelivery\\n\\n// dell : Dell Inc.\\n// https://www.iana.org/domains/root/db/dell.html\\ndell\\n\\n// deloitte : Deloitte Touche Tohmatsu\\n// https://www.iana.org/domains/root/db/deloitte.html\\ndeloitte\\n\\n// delta : Delta Air Lines, Inc.\\n// https://www.iana.org/domains/root/db/delta.html\\ndelta\\n\\n// democrat : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/democrat.html\\ndemocrat\\n\\n// dental : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/dental.html\\ndental\\n\\n// dentist : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/dentist.html\\ndentist\\n\\n// desi : Desi Networks LLC\\n// https://www.iana.org/domains/root/db/desi.html\\ndesi\\n\\n// design : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/design.html\\ndesign\\n\\n// dev : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/dev.html\\ndev\\n\\n// dhl : Deutsche Post AG\\n// https://www.iana.org/domains/root/db/dhl.html\\ndhl\\n\\n// diamonds : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/diamonds.html\\ndiamonds\\n\\n// diet : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/diet.html\\ndiet\\n\\n// digital : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/digital.html\\ndigital\\n\\n// direct : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/direct.html\\ndirect\\n\\n// directory : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/directory.html\\ndirectory\\n\\n// discount : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/discount.html\\ndiscount\\n\\n// discover : Discover Financial Services\\n// https://www.iana.org/domains/root/db/discover.html\\ndiscover\\n\\n// dish : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/dish.html\\ndish\\n\\n// diy : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/diy.html\\ndiy\\n\\n// dnp : Dai Nippon Printing Co., Ltd.\\n// https://www.iana.org/domains/root/db/dnp.html\\ndnp\\n\\n// docs : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/docs.html\\ndocs\\n\\n// doctor : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/doctor.html\\ndoctor\\n\\n// dog : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/dog.html\\ndog\\n\\n// domains : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/domains.html\\ndomains\\n\\n// dot : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/dot.html\\ndot\\n\\n// download : dot Support Limited\\n// https://www.iana.org/domains/root/db/download.html\\ndownload\\n\\n// drive : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/drive.html\\ndrive\\n\\n// dtv : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/dtv.html\\ndtv\\n\\n// dubai : Dubai Smart Government Department\\n// https://www.iana.org/domains/root/db/dubai.html\\ndubai\\n\\n// dunlop : The Goodyear Tire & Rubber Company\\n// https://www.iana.org/domains/root/db/dunlop.html\\ndunlop\\n\\n// dupont : DuPont Specialty Products USA, LLC\\n// https://www.iana.org/domains/root/db/dupont.html\\ndupont\\n\\n// durban : ZA Central Registry NPC trading as ZA Central Registry\\n// https://www.iana.org/domains/root/db/durban.html\\ndurban\\n\\n// dvag : Deutsche Vermögensberatung Aktiengesellschaft DVAG\\n// https://www.iana.org/domains/root/db/dvag.html\\ndvag\\n\\n// dvr : DISH Technologies L.L.C.\\n// https://www.iana.org/domains/root/db/dvr.html\\ndvr\\n\\n// earth : Interlink Systems Innovation Institute K.K.\\n// https://www.iana.org/domains/root/db/earth.html\\nearth\\n\\n// eat : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/eat.html\\neat\\n\\n// eco : Big Room Inc.\\n// https://www.iana.org/domains/root/db/eco.html\\neco\\n\\n// edeka : EDEKA Verband kaufmännischer Genossenschaften e.V.\\n// https://www.iana.org/domains/root/db/edeka.html\\nedeka\\n\\n// education : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/education.html\\neducation\\n\\n// email : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/email.html\\nemail\\n\\n// emerck : Merck KGaA\\n// https://www.iana.org/domains/root/db/emerck.html\\nemerck\\n\\n// energy : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/energy.html\\nenergy\\n\\n// engineer : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/engineer.html\\nengineer\\n\\n// engineering : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/engineering.html\\nengineering\\n\\n// enterprises : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/enterprises.html\\nenterprises\\n\\n// epson : Seiko Epson Corporation\\n// https://www.iana.org/domains/root/db/epson.html\\nepson\\n\\n// equipment : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/equipment.html\\nequipment\\n\\n// ericsson : Telefonaktiebolaget L M Ericsson\\n// https://www.iana.org/domains/root/db/ericsson.html\\nericsson\\n\\n// erni : ERNI Group Holding AG\\n// https://www.iana.org/domains/root/db/erni.html\\nerni\\n\\n// esq : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/esq.html\\nesq\\n\\n// estate : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/estate.html\\nestate\\n\\n// etisalat : Emirates Telecommunications Corporation (trading as Etisalat)\\n// https://www.iana.org/domains/root/db/etisalat.html\\netisalat\\n\\n// eurovision : European Broadcasting Union (EBU)\\n// https://www.iana.org/domains/root/db/eurovision.html\\neurovision\\n\\n// eus : Puntueus Fundazioa\\n// https://www.iana.org/domains/root/db/eus.html\\neus\\n\\n// events : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/events.html\\nevents\\n\\n// exchange : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/exchange.html\\nexchange\\n\\n// expert : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/expert.html\\nexpert\\n\\n// exposed : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/exposed.html\\nexposed\\n\\n// express : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/express.html\\nexpress\\n\\n// extraspace : Extra Space Storage LLC\\n// https://www.iana.org/domains/root/db/extraspace.html\\nextraspace\\n\\n// fage : Fage International S.A.\\n// https://www.iana.org/domains/root/db/fage.html\\nfage\\n\\n// fail : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fail.html\\nfail\\n\\n// fairwinds : FairWinds Partners, LLC\\n// https://www.iana.org/domains/root/db/fairwinds.html\\nfairwinds\\n\\n// faith : dot Faith Limited\\n// https://www.iana.org/domains/root/db/faith.html\\nfaith\\n\\n// family : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/family.html\\nfamily\\n\\n// fan : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/fan.html\\nfan\\n\\n// fans : ZDNS International Limited\\n// https://www.iana.org/domains/root/db/fans.html\\nfans\\n\\n// farm : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/farm.html\\nfarm\\n\\n// farmers : Farmers Insurance Exchange\\n// https://www.iana.org/domains/root/db/farmers.html\\nfarmers\\n\\n// fashion : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/fashion.html\\nfashion\\n\\n// fast : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/fast.html\\nfast\\n\\n// fedex : Federal Express Corporation\\n// https://www.iana.org/domains/root/db/fedex.html\\nfedex\\n\\n// feedback : Top Level Spectrum, Inc.\\n// https://www.iana.org/domains/root/db/feedback.html\\nfeedback\\n\\n// ferrari : Fiat Chrysler Automobiles N.V.\\n// https://www.iana.org/domains/root/db/ferrari.html\\nferrari\\n\\n// ferrero : Ferrero Trading Lux S.A.\\n// https://www.iana.org/domains/root/db/ferrero.html\\nferrero\\n\\n// fidelity : Fidelity Brokerage Services LLC\\n// https://www.iana.org/domains/root/db/fidelity.html\\nfidelity\\n\\n// fido : Rogers Communications Canada Inc.\\n// https://www.iana.org/domains/root/db/fido.html\\nfido\\n\\n// film : Motion Picture Domain Registry Pty Ltd\\n// https://www.iana.org/domains/root/db/film.html\\nfilm\\n\\n// final : Núcleo de Informação e Coordenação do Ponto BR - NIC.br\\n// https://www.iana.org/domains/root/db/final.html\\nfinal\\n\\n// finance : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/finance.html\\nfinance\\n\\n// financial : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/financial.html\\nfinancial\\n\\n// fire : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/fire.html\\nfire\\n\\n// firestone : Bridgestone Licensing Services, Inc\\n// https://www.iana.org/domains/root/db/firestone.html\\nfirestone\\n\\n// firmdale : Firmdale Holdings Limited\\n// https://www.iana.org/domains/root/db/firmdale.html\\nfirmdale\\n\\n// fish : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fish.html\\nfish\\n\\n// fishing : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/fishing.html\\nfishing\\n\\n// fit : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/fit.html\\nfit\\n\\n// fitness : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fitness.html\\nfitness\\n\\n// flickr : Flickr, Inc.\\n// https://www.iana.org/domains/root/db/flickr.html\\nflickr\\n\\n// flights : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/flights.html\\nflights\\n\\n// flir : FLIR Systems, Inc.\\n// https://www.iana.org/domains/root/db/flir.html\\nflir\\n\\n// florist : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/florist.html\\nflorist\\n\\n// flowers : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/flowers.html\\nflowers\\n\\n// fly : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/fly.html\\nfly\\n\\n// foo : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/foo.html\\nfoo\\n\\n// food : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/food.html\\nfood\\n\\n// football : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/football.html\\nfootball\\n\\n// ford : Ford Motor Company\\n// https://www.iana.org/domains/root/db/ford.html\\nford\\n\\n// forex : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/forex.html\\nforex\\n\\n// forsale : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/forsale.html\\nforsale\\n\\n// forum : Fegistry, LLC\\n// https://www.iana.org/domains/root/db/forum.html\\nforum\\n\\n// foundation : Public Interest Registry\\n// https://www.iana.org/domains/root/db/foundation.html\\nfoundation\\n\\n// fox : FOX Registry, LLC\\n// https://www.iana.org/domains/root/db/fox.html\\nfox\\n\\n// free : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/free.html\\nfree\\n\\n// fresenius : Fresenius Immobilien-Verwaltungs-GmbH\\n// https://www.iana.org/domains/root/db/fresenius.html\\nfresenius\\n\\n// frl : FRLregistry B.V.\\n// https://www.iana.org/domains/root/db/frl.html\\nfrl\\n\\n// frogans : OP3FT\\n// https://www.iana.org/domains/root/db/frogans.html\\nfrogans\\n\\n// frontier : Frontier Communications Corporation\\n// https://www.iana.org/domains/root/db/frontier.html\\nfrontier\\n\\n// ftr : Frontier Communications Corporation\\n// https://www.iana.org/domains/root/db/ftr.html\\nftr\\n\\n// fujitsu : Fujitsu Limited\\n// https://www.iana.org/domains/root/db/fujitsu.html\\nfujitsu\\n\\n// fun : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/fun.html\\nfun\\n\\n// fund : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fund.html\\nfund\\n\\n// furniture : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/furniture.html\\nfurniture\\n\\n// futbol : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/futbol.html\\nfutbol\\n\\n// fyi : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/fyi.html\\nfyi\\n\\n// gal : Asociación puntoGAL\\n// https://www.iana.org/domains/root/db/gal.html\\ngal\\n\\n// gallery : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gallery.html\\ngallery\\n\\n// gallo : Gallo Vineyards, Inc.\\n// https://www.iana.org/domains/root/db/gallo.html\\ngallo\\n\\n// gallup : Gallup, Inc.\\n// https://www.iana.org/domains/root/db/gallup.html\\ngallup\\n\\n// game : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/game.html\\ngame\\n\\n// games : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/games.html\\ngames\\n\\n// gap : The Gap, Inc.\\n// https://www.iana.org/domains/root/db/gap.html\\ngap\\n\\n// garden : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/garden.html\\ngarden\\n\\n// gay : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/gay.html\\ngay\\n\\n// gbiz : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/gbiz.html\\ngbiz\\n\\n// gdn : Joint Stock Company \"Navigation-information systems\"\\n// https://www.iana.org/domains/root/db/gdn.html\\ngdn\\n\\n// gea : GEA Group Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/gea.html\\ngea\\n\\n// gent : Easyhost BV\\n// https://www.iana.org/domains/root/db/gent.html\\ngent\\n\\n// genting : Resorts World Inc Pte. Ltd.\\n// https://www.iana.org/domains/root/db/genting.html\\ngenting\\n\\n// george : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/george.html\\ngeorge\\n\\n// ggee : GMO Internet, Inc.\\n// https://www.iana.org/domains/root/db/ggee.html\\nggee\\n\\n// gift : DotGift, LLC\\n// https://www.iana.org/domains/root/db/gift.html\\ngift\\n\\n// gifts : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gifts.html\\ngifts\\n\\n// gives : Public Interest Registry\\n// https://www.iana.org/domains/root/db/gives.html\\ngives\\n\\n// giving : Public Interest Registry\\n// https://www.iana.org/domains/root/db/giving.html\\ngiving\\n\\n// glass : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/glass.html\\nglass\\n\\n// gle : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/gle.html\\ngle\\n\\n// global : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/global.html\\nglobal\\n\\n// globo : Globo Comunicação e Participações S.A\\n// https://www.iana.org/domains/root/db/globo.html\\nglobo\\n\\n// gmail : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/gmail.html\\ngmail\\n\\n// gmbh : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gmbh.html\\ngmbh\\n\\n// gmo : GMO Internet, Inc.\\n// https://www.iana.org/domains/root/db/gmo.html\\ngmo\\n\\n// gmx : 1&1 Mail & Media GmbH\\n// https://www.iana.org/domains/root/db/gmx.html\\ngmx\\n\\n// godaddy : Go Daddy East, LLC\\n// https://www.iana.org/domains/root/db/godaddy.html\\ngodaddy\\n\\n// gold : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gold.html\\ngold\\n\\n// goldpoint : YODOBASHI CAMERA CO.,LTD.\\n// https://www.iana.org/domains/root/db/goldpoint.html\\ngoldpoint\\n\\n// golf : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/golf.html\\ngolf\\n\\n// goo : NTT Resonant Inc.\\n// https://www.iana.org/domains/root/db/goo.html\\ngoo\\n\\n// goodyear : The Goodyear Tire & Rubber Company\\n// https://www.iana.org/domains/root/db/goodyear.html\\ngoodyear\\n\\n// goog : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/goog.html\\ngoog\\n\\n// google : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/google.html\\ngoogle\\n\\n// gop : Republican State Leadership Committee, Inc.\\n// https://www.iana.org/domains/root/db/gop.html\\ngop\\n\\n// got : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/got.html\\ngot\\n\\n// grainger : Grainger Registry Services, LLC\\n// https://www.iana.org/domains/root/db/grainger.html\\ngrainger\\n\\n// graphics : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/graphics.html\\ngraphics\\n\\n// gratis : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gratis.html\\ngratis\\n\\n// green : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/green.html\\ngreen\\n\\n// gripe : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/gripe.html\\ngripe\\n\\n// grocery : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/grocery.html\\ngrocery\\n\\n// group : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/group.html\\ngroup\\n\\n// guardian : The Guardian Life Insurance Company of America\\n// https://www.iana.org/domains/root/db/guardian.html\\nguardian\\n\\n// gucci : Guccio Gucci S.p.a.\\n// https://www.iana.org/domains/root/db/gucci.html\\ngucci\\n\\n// guge : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/guge.html\\nguge\\n\\n// guide : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/guide.html\\nguide\\n\\n// guitars : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/guitars.html\\nguitars\\n\\n// guru : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/guru.html\\nguru\\n\\n// hair : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/hair.html\\nhair\\n\\n// hamburg : Hamburg Top-Level-Domain GmbH\\n// https://www.iana.org/domains/root/db/hamburg.html\\nhamburg\\n\\n// hangout : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/hangout.html\\nhangout\\n\\n// haus : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/haus.html\\nhaus\\n\\n// hbo : HBO Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/hbo.html\\nhbo\\n\\n// hdfc : HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED\\n// https://www.iana.org/domains/root/db/hdfc.html\\nhdfc\\n\\n// hdfcbank : HDFC Bank Limited\\n// https://www.iana.org/domains/root/db/hdfcbank.html\\nhdfcbank\\n\\n// health : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/health.html\\nhealth\\n\\n// healthcare : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/healthcare.html\\nhealthcare\\n\\n// help : Innovation service Limited\\n// https://www.iana.org/domains/root/db/help.html\\nhelp\\n\\n// helsinki : City of Helsinki\\n// https://www.iana.org/domains/root/db/helsinki.html\\nhelsinki\\n\\n// here : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/here.html\\nhere\\n\\n// hermes : HERMES INTERNATIONAL\\n// https://www.iana.org/domains/root/db/hermes.html\\nhermes\\n\\n// hiphop : Dot Hip Hop, LLC\\n// https://www.iana.org/domains/root/db/hiphop.html\\nhiphop\\n\\n// hisamitsu : Hisamitsu Pharmaceutical Co.,Inc.\\n// https://www.iana.org/domains/root/db/hisamitsu.html\\nhisamitsu\\n\\n// hitachi : Hitachi, Ltd.\\n// https://www.iana.org/domains/root/db/hitachi.html\\nhitachi\\n\\n// hiv : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/hiv.html\\nhiv\\n\\n// hkt : PCCW-HKT DataCom Services Limited\\n// https://www.iana.org/domains/root/db/hkt.html\\nhkt\\n\\n// hockey : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/hockey.html\\nhockey\\n\\n// holdings : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/holdings.html\\nholdings\\n\\n// holiday : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/holiday.html\\nholiday\\n\\n// homedepot : Home Depot Product Authority, LLC\\n// https://www.iana.org/domains/root/db/homedepot.html\\nhomedepot\\n\\n// homegoods : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/homegoods.html\\nhomegoods\\n\\n// homes : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/homes.html\\nhomes\\n\\n// homesense : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/homesense.html\\nhomesense\\n\\n// honda : Honda Motor Co., Ltd.\\n// https://www.iana.org/domains/root/db/honda.html\\nhonda\\n\\n// horse : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/horse.html\\nhorse\\n\\n// hospital : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/hospital.html\\nhospital\\n\\n// host : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/host.html\\nhost\\n\\n// hosting : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/hosting.html\\nhosting\\n\\n// hot : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/hot.html\\nhot\\n\\n// hotels : Booking.com B.V.\\n// https://www.iana.org/domains/root/db/hotels.html\\nhotels\\n\\n// hotmail : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/hotmail.html\\nhotmail\\n\\n// house : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/house.html\\nhouse\\n\\n// how : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/how.html\\nhow\\n\\n// hsbc : HSBC Global Services (UK) Limited\\n// https://www.iana.org/domains/root/db/hsbc.html\\nhsbc\\n\\n// hughes : Hughes Satellite Systems Corporation\\n// https://www.iana.org/domains/root/db/hughes.html\\nhughes\\n\\n// hyatt : Hyatt GTLD, L.L.C.\\n// https://www.iana.org/domains/root/db/hyatt.html\\nhyatt\\n\\n// hyundai : Hyundai Motor Company\\n// https://www.iana.org/domains/root/db/hyundai.html\\nhyundai\\n\\n// ibm : International Business Machines Corporation\\n// https://www.iana.org/domains/root/db/ibm.html\\nibm\\n\\n// icbc : Industrial and Commercial Bank of China Limited\\n// https://www.iana.org/domains/root/db/icbc.html\\nicbc\\n\\n// ice : IntercontinentalExchange, Inc.\\n// https://www.iana.org/domains/root/db/ice.html\\nice\\n\\n// icu : ShortDot SA\\n// https://www.iana.org/domains/root/db/icu.html\\nicu\\n\\n// ieee : IEEE Global LLC\\n// https://www.iana.org/domains/root/db/ieee.html\\nieee\\n\\n// ifm : ifm electronic gmbh\\n// https://www.iana.org/domains/root/db/ifm.html\\nifm\\n\\n// ikano : Ikano S.A.\\n// https://www.iana.org/domains/root/db/ikano.html\\nikano\\n\\n// imamat : Fondation Aga Khan (Aga Khan Foundation)\\n// https://www.iana.org/domains/root/db/imamat.html\\nimamat\\n\\n// imdb : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/imdb.html\\nimdb\\n\\n// immo : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/immo.html\\nimmo\\n\\n// immobilien : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/immobilien.html\\nimmobilien\\n\\n// inc : Intercap Registry Inc.\\n// https://www.iana.org/domains/root/db/inc.html\\ninc\\n\\n// industries : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/industries.html\\nindustries\\n\\n// infiniti : NISSAN MOTOR CO., LTD.\\n// https://www.iana.org/domains/root/db/infiniti.html\\ninfiniti\\n\\n// ing : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/ing.html\\ning\\n\\n// ink : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/ink.html\\nink\\n\\n// institute : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/institute.html\\ninstitute\\n\\n// insurance : fTLD Registry Services LLC\\n// https://www.iana.org/domains/root/db/insurance.html\\ninsurance\\n\\n// insure : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/insure.html\\ninsure\\n\\n// international : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/international.html\\ninternational\\n\\n// intuit : Intuit Administrative Services, Inc.\\n// https://www.iana.org/domains/root/db/intuit.html\\nintuit\\n\\n// investments : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/investments.html\\ninvestments\\n\\n// ipiranga : Ipiranga Produtos de Petroleo S.A.\\n// https://www.iana.org/domains/root/db/ipiranga.html\\nipiranga\\n\\n// irish : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/irish.html\\nirish\\n\\n// ismaili : Fondation Aga Khan (Aga Khan Foundation)\\n// https://www.iana.org/domains/root/db/ismaili.html\\nismaili\\n\\n// ist : Istanbul Metropolitan Municipality\\n// https://www.iana.org/domains/root/db/ist.html\\nist\\n\\n// istanbul : Istanbul Metropolitan Municipality\\n// https://www.iana.org/domains/root/db/istanbul.html\\nistanbul\\n\\n// itau : Itau Unibanco Holding S.A.\\n// https://www.iana.org/domains/root/db/itau.html\\nitau\\n\\n// itv : ITV Services Limited\\n// https://www.iana.org/domains/root/db/itv.html\\nitv\\n\\n// jaguar : Jaguar Land Rover Ltd\\n// https://www.iana.org/domains/root/db/jaguar.html\\njaguar\\n\\n// java : Oracle Corporation\\n// https://www.iana.org/domains/root/db/java.html\\njava\\n\\n// jcb : JCB Co., Ltd.\\n// https://www.iana.org/domains/root/db/jcb.html\\njcb\\n\\n// jeep : FCA US LLC.\\n// https://www.iana.org/domains/root/db/jeep.html\\njeep\\n\\n// jetzt : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/jetzt.html\\njetzt\\n\\n// jewelry : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/jewelry.html\\njewelry\\n\\n// jio : Reliance Industries Limited\\n// https://www.iana.org/domains/root/db/jio.html\\njio\\n\\n// jll : Jones Lang LaSalle Incorporated\\n// https://www.iana.org/domains/root/db/jll.html\\njll\\n\\n// jmp : Matrix IP LLC\\n// https://www.iana.org/domains/root/db/jmp.html\\njmp\\n\\n// jnj : Johnson & Johnson Services, Inc.\\n// https://www.iana.org/domains/root/db/jnj.html\\njnj\\n\\n// joburg : ZA Central Registry NPC trading as ZA Central Registry\\n// https://www.iana.org/domains/root/db/joburg.html\\njoburg\\n\\n// jot : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/jot.html\\njot\\n\\n// joy : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/joy.html\\njoy\\n\\n// jpmorgan : JPMorgan Chase Bank, National Association\\n// https://www.iana.org/domains/root/db/jpmorgan.html\\njpmorgan\\n\\n// jprs : Japan Registry Services Co., Ltd.\\n// https://www.iana.org/domains/root/db/jprs.html\\njprs\\n\\n// juegos : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/juegos.html\\njuegos\\n\\n// juniper : JUNIPER NETWORKS, INC.\\n// https://www.iana.org/domains/root/db/juniper.html\\njuniper\\n\\n// kaufen : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/kaufen.html\\nkaufen\\n\\n// kddi : KDDI CORPORATION\\n// https://www.iana.org/domains/root/db/kddi.html\\nkddi\\n\\n// kerryhotels : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/kerryhotels.html\\nkerryhotels\\n\\n// kerrylogistics : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/kerrylogistics.html\\nkerrylogistics\\n\\n// kerryproperties : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/kerryproperties.html\\nkerryproperties\\n\\n// kfh : Kuwait Finance House\\n// https://www.iana.org/domains/root/db/kfh.html\\nkfh\\n\\n// kia : KIA MOTORS CORPORATION\\n// https://www.iana.org/domains/root/db/kia.html\\nkia\\n\\n// kids : DotKids Foundation Limited\\n// https://www.iana.org/domains/root/db/kids.html\\nkids\\n\\n// kim : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/kim.html\\nkim\\n\\n// kinder : Ferrero Trading Lux S.A.\\n// https://www.iana.org/domains/root/db/kinder.html\\nkinder\\n\\n// kindle : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/kindle.html\\nkindle\\n\\n// kitchen : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/kitchen.html\\nkitchen\\n\\n// kiwi : DOT KIWI LIMITED\\n// https://www.iana.org/domains/root/db/kiwi.html\\nkiwi\\n\\n// koeln : dotKoeln GmbH\\n// https://www.iana.org/domains/root/db/koeln.html\\nkoeln\\n\\n// komatsu : Komatsu Ltd.\\n// https://www.iana.org/domains/root/db/komatsu.html\\nkomatsu\\n\\n// kosher : Kosher Marketing Assets LLC\\n// https://www.iana.org/domains/root/db/kosher.html\\nkosher\\n\\n// kpmg : KPMG International Cooperative (KPMG International Genossenschaft)\\n// https://www.iana.org/domains/root/db/kpmg.html\\nkpmg\\n\\n// kpn : Koninklijke KPN N.V.\\n// https://www.iana.org/domains/root/db/kpn.html\\nkpn\\n\\n// krd : KRG Department of Information Technology\\n// https://www.iana.org/domains/root/db/krd.html\\nkrd\\n\\n// kred : KredTLD Pty Ltd\\n// https://www.iana.org/domains/root/db/kred.html\\nkred\\n\\n// kuokgroup : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/kuokgroup.html\\nkuokgroup\\n\\n// kyoto : Academic Institution: Kyoto Jyoho Gakuen\\n// https://www.iana.org/domains/root/db/kyoto.html\\nkyoto\\n\\n// lacaixa : Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa”\\n// https://www.iana.org/domains/root/db/lacaixa.html\\nlacaixa\\n\\n// lamborghini : Automobili Lamborghini S.p.A.\\n// https://www.iana.org/domains/root/db/lamborghini.html\\nlamborghini\\n\\n// lamer : The Estée Lauder Companies Inc.\\n// https://www.iana.org/domains/root/db/lamer.html\\nlamer\\n\\n// lancaster : LANCASTER\\n// https://www.iana.org/domains/root/db/lancaster.html\\nlancaster\\n\\n// land : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/land.html\\nland\\n\\n// landrover : Jaguar Land Rover Ltd\\n// https://www.iana.org/domains/root/db/landrover.html\\nlandrover\\n\\n// lanxess : LANXESS Corporation\\n// https://www.iana.org/domains/root/db/lanxess.html\\nlanxess\\n\\n// lasalle : Jones Lang LaSalle Incorporated\\n// https://www.iana.org/domains/root/db/lasalle.html\\nlasalle\\n\\n// lat : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/lat.html\\nlat\\n\\n// latino : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/latino.html\\nlatino\\n\\n// latrobe : La Trobe University\\n// https://www.iana.org/domains/root/db/latrobe.html\\nlatrobe\\n\\n// law : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/law.html\\nlaw\\n\\n// lawyer : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/lawyer.html\\nlawyer\\n\\n// lds : IRI Domain Management, LLC\\n// https://www.iana.org/domains/root/db/lds.html\\nlds\\n\\n// lease : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/lease.html\\nlease\\n\\n// leclerc : A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc\\n// https://www.iana.org/domains/root/db/leclerc.html\\nleclerc\\n\\n// lefrak : LeFrak Organization, Inc.\\n// https://www.iana.org/domains/root/db/lefrak.html\\nlefrak\\n\\n// legal : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/legal.html\\nlegal\\n\\n// lego : LEGO Juris A/S\\n// https://www.iana.org/domains/root/db/lego.html\\nlego\\n\\n// lexus : TOYOTA MOTOR CORPORATION\\n// https://www.iana.org/domains/root/db/lexus.html\\nlexus\\n\\n// lgbt : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/lgbt.html\\nlgbt\\n\\n// lidl : Schwarz Domains und Services GmbH & Co. KG\\n// https://www.iana.org/domains/root/db/lidl.html\\nlidl\\n\\n// life : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/life.html\\nlife\\n\\n// lifeinsurance : American Council of Life Insurers\\n// https://www.iana.org/domains/root/db/lifeinsurance.html\\nlifeinsurance\\n\\n// lifestyle : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/lifestyle.html\\nlifestyle\\n\\n// lighting : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/lighting.html\\nlighting\\n\\n// like : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/like.html\\nlike\\n\\n// lilly : Eli Lilly and Company\\n// https://www.iana.org/domains/root/db/lilly.html\\nlilly\\n\\n// limited : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/limited.html\\nlimited\\n\\n// limo : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/limo.html\\nlimo\\n\\n// lincoln : Ford Motor Company\\n// https://www.iana.org/domains/root/db/lincoln.html\\nlincoln\\n\\n// link : Nova Registry Ltd\\n// https://www.iana.org/domains/root/db/link.html\\nlink\\n\\n// lipsy : Lipsy Ltd\\n// https://www.iana.org/domains/root/db/lipsy.html\\nlipsy\\n\\n// live : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/live.html\\nlive\\n\\n// living : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/living.html\\nliving\\n\\n// llc : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/llc.html\\nllc\\n\\n// llp : Intercap Registry Inc.\\n// https://www.iana.org/domains/root/db/llp.html\\nllp\\n\\n// loan : dot Loan Limited\\n// https://www.iana.org/domains/root/db/loan.html\\nloan\\n\\n// loans : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/loans.html\\nloans\\n\\n// locker : Orange Domains LLC\\n// https://www.iana.org/domains/root/db/locker.html\\nlocker\\n\\n// locus : Locus Analytics LLC\\n// https://www.iana.org/domains/root/db/locus.html\\nlocus\\n\\n// lol : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/lol.html\\nlol\\n\\n// london : Dot London Domains Limited\\n// https://www.iana.org/domains/root/db/london.html\\nlondon\\n\\n// lotte : Lotte Holdings Co., Ltd.\\n// https://www.iana.org/domains/root/db/lotte.html\\nlotte\\n\\n// lotto : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/lotto.html\\nlotto\\n\\n// love : Merchant Law Group LLP\\n// https://www.iana.org/domains/root/db/love.html\\nlove\\n\\n// lpl : LPL Holdings, Inc.\\n// https://www.iana.org/domains/root/db/lpl.html\\nlpl\\n\\n// lplfinancial : LPL Holdings, Inc.\\n// https://www.iana.org/domains/root/db/lplfinancial.html\\nlplfinancial\\n\\n// ltd : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/ltd.html\\nltd\\n\\n// ltda : InterNetX, Corp\\n// https://www.iana.org/domains/root/db/ltda.html\\nltda\\n\\n// lundbeck : H. Lundbeck A/S\\n// https://www.iana.org/domains/root/db/lundbeck.html\\nlundbeck\\n\\n// luxe : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/luxe.html\\nluxe\\n\\n// luxury : Luxury Partners, LLC\\n// https://www.iana.org/domains/root/db/luxury.html\\nluxury\\n\\n// madrid : Comunidad de Madrid\\n// https://www.iana.org/domains/root/db/madrid.html\\nmadrid\\n\\n// maif : Mutuelle Assurance Instituteur France (MAIF)\\n// https://www.iana.org/domains/root/db/maif.html\\nmaif\\n\\n// maison : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/maison.html\\nmaison\\n\\n// makeup : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/makeup.html\\nmakeup\\n\\n// man : MAN SE\\n// https://www.iana.org/domains/root/db/man.html\\nman\\n\\n// management : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/management.html\\nmanagement\\n\\n// mango : PUNTO FA S.L.\\n// https://www.iana.org/domains/root/db/mango.html\\nmango\\n\\n// map : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/map.html\\nmap\\n\\n// market : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/market.html\\nmarket\\n\\n// marketing : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/marketing.html\\nmarketing\\n\\n// markets : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/markets.html\\nmarkets\\n\\n// marriott : Marriott Worldwide Corporation\\n// https://www.iana.org/domains/root/db/marriott.html\\nmarriott\\n\\n// marshalls : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/marshalls.html\\nmarshalls\\n\\n// mattel : Mattel Sites, Inc.\\n// https://www.iana.org/domains/root/db/mattel.html\\nmattel\\n\\n// mba : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/mba.html\\nmba\\n\\n// mckinsey : McKinsey Holdings, Inc.\\n// https://www.iana.org/domains/root/db/mckinsey.html\\nmckinsey\\n\\n// med : Medistry LLC\\n// https://www.iana.org/domains/root/db/med.html\\nmed\\n\\n// media : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/media.html\\nmedia\\n\\n// meet : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/meet.html\\nmeet\\n\\n// melbourne : The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation\\n// https://www.iana.org/domains/root/db/melbourne.html\\nmelbourne\\n\\n// meme : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/meme.html\\nmeme\\n\\n// memorial : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/memorial.html\\nmemorial\\n\\n// men : Exclusive Registry Limited\\n// https://www.iana.org/domains/root/db/men.html\\nmen\\n\\n// menu : Dot Menu Registry, LLC\\n// https://www.iana.org/domains/root/db/menu.html\\nmenu\\n\\n// merckmsd : MSD Registry Holdings, Inc.\\n// https://www.iana.org/domains/root/db/merckmsd.html\\nmerckmsd\\n\\n// miami : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/miami.html\\nmiami\\n\\n// microsoft : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/microsoft.html\\nmicrosoft\\n\\n// mini : Bayerische Motoren Werke Aktiengesellschaft\\n// https://www.iana.org/domains/root/db/mini.html\\nmini\\n\\n// mint : Intuit Administrative Services, Inc.\\n// https://www.iana.org/domains/root/db/mint.html\\nmint\\n\\n// mit : Massachusetts Institute of Technology\\n// https://www.iana.org/domains/root/db/mit.html\\nmit\\n\\n// mitsubishi : Mitsubishi Corporation\\n// https://www.iana.org/domains/root/db/mitsubishi.html\\nmitsubishi\\n\\n// mlb : MLB Advanced Media DH, LLC\\n// https://www.iana.org/domains/root/db/mlb.html\\nmlb\\n\\n// mls : The Canadian Real Estate Association\\n// https://www.iana.org/domains/root/db/mls.html\\nmls\\n\\n// mma : MMA IARD\\n// https://www.iana.org/domains/root/db/mma.html\\nmma\\n\\n// mobile : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/mobile.html\\nmobile\\n\\n// moda : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/moda.html\\nmoda\\n\\n// moe : Interlink Systems Innovation Institute K.K.\\n// https://www.iana.org/domains/root/db/moe.html\\nmoe\\n\\n// moi : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/moi.html\\nmoi\\n\\n// mom : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/mom.html\\nmom\\n\\n// monash : Monash University\\n// https://www.iana.org/domains/root/db/monash.html\\nmonash\\n\\n// money : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/money.html\\nmoney\\n\\n// monster : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/monster.html\\nmonster\\n\\n// mormon : IRI Domain Management, LLC\\n// https://www.iana.org/domains/root/db/mormon.html\\nmormon\\n\\n// mortgage : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/mortgage.html\\nmortgage\\n\\n// moscow : Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)\\n// https://www.iana.org/domains/root/db/moscow.html\\nmoscow\\n\\n// moto : Motorola Trademark Holdings, LLC\\n// https://www.iana.org/domains/root/db/moto.html\\nmoto\\n\\n// motorcycles : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/motorcycles.html\\nmotorcycles\\n\\n// mov : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/mov.html\\nmov\\n\\n// movie : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/movie.html\\nmovie\\n\\n// msd : MSD Registry Holdings, Inc.\\n// https://www.iana.org/domains/root/db/msd.html\\nmsd\\n\\n// mtn : MTN Dubai Limited\\n// https://www.iana.org/domains/root/db/mtn.html\\nmtn\\n\\n// mtr : MTR Corporation Limited\\n// https://www.iana.org/domains/root/db/mtr.html\\nmtr\\n\\n// music : DotMusic Limited\\n// https://www.iana.org/domains/root/db/music.html\\nmusic\\n\\n// nab : National Australia Bank Limited\\n// https://www.iana.org/domains/root/db/nab.html\\nnab\\n\\n// nagoya : GMO Registry, Inc.\\n// https://www.iana.org/domains/root/db/nagoya.html\\nnagoya\\n\\n// natura : NATURA COSMÉTICOS S.A.\\n// https://www.iana.org/domains/root/db/natura.html\\nnatura\\n\\n// navy : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/navy.html\\nnavy\\n\\n// nba : NBA REGISTRY, LLC\\n// https://www.iana.org/domains/root/db/nba.html\\nnba\\n\\n// nec : NEC Corporation\\n// https://www.iana.org/domains/root/db/nec.html\\nnec\\n\\n// netbank : COMMONWEALTH BANK OF AUSTRALIA\\n// https://www.iana.org/domains/root/db/netbank.html\\nnetbank\\n\\n// netflix : Netflix, Inc.\\n// https://www.iana.org/domains/root/db/netflix.html\\nnetflix\\n\\n// network : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/network.html\\nnetwork\\n\\n// neustar : NeuStar, Inc.\\n// https://www.iana.org/domains/root/db/neustar.html\\nneustar\\n\\n// new : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/new.html\\nnew\\n\\n// news : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/news.html\\nnews\\n\\n// next : Next plc\\n// https://www.iana.org/domains/root/db/next.html\\nnext\\n\\n// nextdirect : Next plc\\n// https://www.iana.org/domains/root/db/nextdirect.html\\nnextdirect\\n\\n// nexus : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/nexus.html\\nnexus\\n\\n// nfl : NFL Reg Ops LLC\\n// https://www.iana.org/domains/root/db/nfl.html\\nnfl\\n\\n// ngo : Public Interest Registry\\n// https://www.iana.org/domains/root/db/ngo.html\\nngo\\n\\n// nhk : Japan Broadcasting Corporation (NHK)\\n// https://www.iana.org/domains/root/db/nhk.html\\nnhk\\n\\n// nico : DWANGO Co., Ltd.\\n// https://www.iana.org/domains/root/db/nico.html\\nnico\\n\\n// nike : NIKE, Inc.\\n// https://www.iana.org/domains/root/db/nike.html\\nnike\\n\\n// nikon : NIKON CORPORATION\\n// https://www.iana.org/domains/root/db/nikon.html\\nnikon\\n\\n// ninja : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/ninja.html\\nninja\\n\\n// nissan : NISSAN MOTOR CO., LTD.\\n// https://www.iana.org/domains/root/db/nissan.html\\nnissan\\n\\n// nissay : Nippon Life Insurance Company\\n// https://www.iana.org/domains/root/db/nissay.html\\nnissay\\n\\n// nokia : Nokia Corporation\\n// https://www.iana.org/domains/root/db/nokia.html\\nnokia\\n\\n// norton : NortonLifeLock Inc.\\n// https://www.iana.org/domains/root/db/norton.html\\nnorton\\n\\n// now : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/now.html\\nnow\\n\\n// nowruz : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/nowruz.html\\nnowruz\\n\\n// nowtv : Starbucks (HK) Limited\\n// https://www.iana.org/domains/root/db/nowtv.html\\nnowtv\\n\\n// nra : NRA Holdings Company, INC.\\n// https://www.iana.org/domains/root/db/nra.html\\nnra\\n\\n// nrw : Minds + Machines GmbH\\n// https://www.iana.org/domains/root/db/nrw.html\\nnrw\\n\\n// ntt : NIPPON TELEGRAPH AND TELEPHONE CORPORATION\\n// https://www.iana.org/domains/root/db/ntt.html\\nntt\\n\\n// nyc : The City of New York by and through the New York City Department of Information Technology & Telecommunications\\n// https://www.iana.org/domains/root/db/nyc.html\\nnyc\\n\\n// obi : OBI Group Holding SE & Co. KGaA\\n// https://www.iana.org/domains/root/db/obi.html\\nobi\\n\\n// observer : Fegistry, LLC\\n// https://www.iana.org/domains/root/db/observer.html\\nobserver\\n\\n// office : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/office.html\\noffice\\n\\n// okinawa : BRregistry, Inc.\\n// https://www.iana.org/domains/root/db/okinawa.html\\nokinawa\\n\\n// olayan : Competrol (Luxembourg) Sarl\\n// https://www.iana.org/domains/root/db/olayan.html\\nolayan\\n\\n// olayangroup : Competrol (Luxembourg) Sarl\\n// https://www.iana.org/domains/root/db/olayangroup.html\\nolayangroup\\n\\n// oldnavy : The Gap, Inc.\\n// https://www.iana.org/domains/root/db/oldnavy.html\\noldnavy\\n\\n// ollo : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/ollo.html\\nollo\\n\\n// omega : The Swatch Group Ltd\\n// https://www.iana.org/domains/root/db/omega.html\\nomega\\n\\n// one : One.com A/S\\n// https://www.iana.org/domains/root/db/one.html\\none\\n\\n// ong : Public Interest Registry\\n// https://www.iana.org/domains/root/db/ong.html\\nong\\n\\n// onl : iRegistry GmbH\\n// https://www.iana.org/domains/root/db/onl.html\\nonl\\n\\n// online : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/online.html\\nonline\\n\\n// ooo : INFIBEAM AVENUES LIMITED\\n// https://www.iana.org/domains/root/db/ooo.html\\nooo\\n\\n// open : American Express Travel Related Services Company, Inc.\\n// https://www.iana.org/domains/root/db/open.html\\nopen\\n\\n// oracle : Oracle Corporation\\n// https://www.iana.org/domains/root/db/oracle.html\\noracle\\n\\n// orange : Orange Brand Services Limited\\n// https://www.iana.org/domains/root/db/orange.html\\norange\\n\\n// organic : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/organic.html\\norganic\\n\\n// origins : The Estée Lauder Companies Inc.\\n// https://www.iana.org/domains/root/db/origins.html\\norigins\\n\\n// osaka : Osaka Registry Co., Ltd.\\n// https://www.iana.org/domains/root/db/osaka.html\\nosaka\\n\\n// otsuka : Otsuka Holdings Co., Ltd.\\n// https://www.iana.org/domains/root/db/otsuka.html\\notsuka\\n\\n// ott : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/ott.html\\nott\\n\\n// ovh : MédiaBC\\n// https://www.iana.org/domains/root/db/ovh.html\\novh\\n\\n// page : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/page.html\\npage\\n\\n// panasonic : Panasonic Holdings Corporation\\n// https://www.iana.org/domains/root/db/panasonic.html\\npanasonic\\n\\n// paris : City of Paris\\n// https://www.iana.org/domains/root/db/paris.html\\nparis\\n\\n// pars : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/pars.html\\npars\\n\\n// partners : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/partners.html\\npartners\\n\\n// parts : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/parts.html\\nparts\\n\\n// party : Blue Sky Registry Limited\\n// https://www.iana.org/domains/root/db/party.html\\nparty\\n\\n// pay : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/pay.html\\npay\\n\\n// pccw : PCCW Enterprises Limited\\n// https://www.iana.org/domains/root/db/pccw.html\\npccw\\n\\n// pet : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/pet.html\\npet\\n\\n// pfizer : Pfizer Inc.\\n// https://www.iana.org/domains/root/db/pfizer.html\\npfizer\\n\\n// pharmacy : National Association of Boards of Pharmacy\\n// https://www.iana.org/domains/root/db/pharmacy.html\\npharmacy\\n\\n// phd : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/phd.html\\nphd\\n\\n// philips : Koninklijke Philips N.V.\\n// https://www.iana.org/domains/root/db/philips.html\\nphilips\\n\\n// phone : Dish DBS Corporation\\n// https://www.iana.org/domains/root/db/phone.html\\nphone\\n\\n// photo : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/photo.html\\nphoto\\n\\n// photography : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/photography.html\\nphotography\\n\\n// photos : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/photos.html\\nphotos\\n\\n// physio : PhysBiz Pty Ltd\\n// https://www.iana.org/domains/root/db/physio.html\\nphysio\\n\\n// pics : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/pics.html\\npics\\n\\n// pictet : Pictet Europe S.A.\\n// https://www.iana.org/domains/root/db/pictet.html\\npictet\\n\\n// pictures : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/pictures.html\\npictures\\n\\n// pid : Top Level Spectrum, Inc.\\n// https://www.iana.org/domains/root/db/pid.html\\npid\\n\\n// pin : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/pin.html\\npin\\n\\n// ping : Ping Registry Provider, Inc.\\n// https://www.iana.org/domains/root/db/ping.html\\nping\\n\\n// pink : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/pink.html\\npink\\n\\n// pioneer : Pioneer Corporation\\n// https://www.iana.org/domains/root/db/pioneer.html\\npioneer\\n\\n// pizza : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/pizza.html\\npizza\\n\\n// place : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/place.html\\nplace\\n\\n// play : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/play.html\\nplay\\n\\n// playstation : Sony Interactive Entertainment Inc.\\n// https://www.iana.org/domains/root/db/playstation.html\\nplaystation\\n\\n// plumbing : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/plumbing.html\\nplumbing\\n\\n// plus : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/plus.html\\nplus\\n\\n// pnc : PNC Domain Co., LLC\\n// https://www.iana.org/domains/root/db/pnc.html\\npnc\\n\\n// pohl : Deutsche Vermögensberatung Aktiengesellschaft DVAG\\n// https://www.iana.org/domains/root/db/pohl.html\\npohl\\n\\n// poker : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/poker.html\\npoker\\n\\n// politie : Politie Nederland\\n// https://www.iana.org/domains/root/db/politie.html\\npolitie\\n\\n// porn : ICM Registry PN LLC\\n// https://www.iana.org/domains/root/db/porn.html\\nporn\\n\\n// pramerica : Prudential Financial, Inc.\\n// https://www.iana.org/domains/root/db/pramerica.html\\npramerica\\n\\n// praxi : Praxi S.p.A.\\n// https://www.iana.org/domains/root/db/praxi.html\\npraxi\\n\\n// press : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/press.html\\npress\\n\\n// prime : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/prime.html\\nprime\\n\\n// prod : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/prod.html\\nprod\\n\\n// productions : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/productions.html\\nproductions\\n\\n// prof : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/prof.html\\nprof\\n\\n// progressive : Progressive Casualty Insurance Company\\n// https://www.iana.org/domains/root/db/progressive.html\\nprogressive\\n\\n// promo : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/promo.html\\npromo\\n\\n// properties : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/properties.html\\nproperties\\n\\n// property : Digital Property Infrastructure Limited\\n// https://www.iana.org/domains/root/db/property.html\\nproperty\\n\\n// protection : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/protection.html\\nprotection\\n\\n// pru : Prudential Financial, Inc.\\n// https://www.iana.org/domains/root/db/pru.html\\npru\\n\\n// prudential : Prudential Financial, Inc.\\n// https://www.iana.org/domains/root/db/prudential.html\\nprudential\\n\\n// pub : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/pub.html\\npub\\n\\n// pwc : PricewaterhouseCoopers LLP\\n// https://www.iana.org/domains/root/db/pwc.html\\npwc\\n\\n// qpon : dotQPON LLC\\n// https://www.iana.org/domains/root/db/qpon.html\\nqpon\\n\\n// quebec : PointQuébec Inc\\n// https://www.iana.org/domains/root/db/quebec.html\\nquebec\\n\\n// quest : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/quest.html\\nquest\\n\\n// racing : Premier Registry Limited\\n// https://www.iana.org/domains/root/db/racing.html\\nracing\\n\\n// radio : European Broadcasting Union (EBU)\\n// https://www.iana.org/domains/root/db/radio.html\\nradio\\n\\n// read : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/read.html\\nread\\n\\n// realestate : dotRealEstate LLC\\n// https://www.iana.org/domains/root/db/realestate.html\\nrealestate\\n\\n// realtor : Real Estate Domains LLC\\n// https://www.iana.org/domains/root/db/realtor.html\\nrealtor\\n\\n// realty : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/realty.html\\nrealty\\n\\n// recipes : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/recipes.html\\nrecipes\\n\\n// red : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/red.html\\nred\\n\\n// redstone : Redstone Haute Couture Co., Ltd.\\n// https://www.iana.org/domains/root/db/redstone.html\\nredstone\\n\\n// redumbrella : Travelers TLD, LLC\\n// https://www.iana.org/domains/root/db/redumbrella.html\\nredumbrella\\n\\n// rehab : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/rehab.html\\nrehab\\n\\n// reise : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/reise.html\\nreise\\n\\n// reisen : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/reisen.html\\nreisen\\n\\n// reit : National Association of Real Estate Investment Trusts, Inc.\\n// https://www.iana.org/domains/root/db/reit.html\\nreit\\n\\n// reliance : Reliance Industries Limited\\n// https://www.iana.org/domains/root/db/reliance.html\\nreliance\\n\\n// ren : ZDNS International Limited\\n// https://www.iana.org/domains/root/db/ren.html\\nren\\n\\n// rent : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/rent.html\\nrent\\n\\n// rentals : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/rentals.html\\nrentals\\n\\n// repair : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/repair.html\\nrepair\\n\\n// report : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/report.html\\nreport\\n\\n// republican : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/republican.html\\nrepublican\\n\\n// rest : Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable\\n// https://www.iana.org/domains/root/db/rest.html\\nrest\\n\\n// restaurant : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/restaurant.html\\nrestaurant\\n\\n// review : dot Review Limited\\n// https://www.iana.org/domains/root/db/review.html\\nreview\\n\\n// reviews : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/reviews.html\\nreviews\\n\\n// rexroth : Robert Bosch GMBH\\n// https://www.iana.org/domains/root/db/rexroth.html\\nrexroth\\n\\n// rich : iRegistry GmbH\\n// https://www.iana.org/domains/root/db/rich.html\\nrich\\n\\n// richardli : Pacific Century Asset Management (HK) Limited\\n// https://www.iana.org/domains/root/db/richardli.html\\nrichardli\\n\\n// ricoh : Ricoh Company, Ltd.\\n// https://www.iana.org/domains/root/db/ricoh.html\\nricoh\\n\\n// ril : Reliance Industries Limited\\n// https://www.iana.org/domains/root/db/ril.html\\nril\\n\\n// rio : Empresa Municipal de Informática SA - IPLANRIO\\n// https://www.iana.org/domains/root/db/rio.html\\nrio\\n\\n// rip : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/rip.html\\nrip\\n\\n// rocher : Ferrero Trading Lux S.A.\\n// https://www.iana.org/domains/root/db/rocher.html\\nrocher\\n\\n// rocks : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/rocks.html\\nrocks\\n\\n// rodeo : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/rodeo.html\\nrodeo\\n\\n// rogers : Rogers Communications Canada Inc.\\n// https://www.iana.org/domains/root/db/rogers.html\\nrogers\\n\\n// room : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/room.html\\nroom\\n\\n// rsvp : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/rsvp.html\\nrsvp\\n\\n// rugby : World Rugby Strategic Developments Limited\\n// https://www.iana.org/domains/root/db/rugby.html\\nrugby\\n\\n// ruhr : dotSaarland GmbH\\n// https://www.iana.org/domains/root/db/ruhr.html\\nruhr\\n\\n// run : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/run.html\\nrun\\n\\n// rwe : RWE AG\\n// https://www.iana.org/domains/root/db/rwe.html\\nrwe\\n\\n// ryukyu : BRregistry, Inc.\\n// https://www.iana.org/domains/root/db/ryukyu.html\\nryukyu\\n\\n// saarland : dotSaarland GmbH\\n// https://www.iana.org/domains/root/db/saarland.html\\nsaarland\\n\\n// safe : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/safe.html\\nsafe\\n\\n// safety : Safety Registry Services, LLC.\\n// https://www.iana.org/domains/root/db/safety.html\\nsafety\\n\\n// sakura : SAKURA Internet Inc.\\n// https://www.iana.org/domains/root/db/sakura.html\\nsakura\\n\\n// sale : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/sale.html\\nsale\\n\\n// salon : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/salon.html\\nsalon\\n\\n// samsclub : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/samsclub.html\\nsamsclub\\n\\n// samsung : SAMSUNG SDS CO., LTD\\n// https://www.iana.org/domains/root/db/samsung.html\\nsamsung\\n\\n// sandvik : Sandvik AB\\n// https://www.iana.org/domains/root/db/sandvik.html\\nsandvik\\n\\n// sandvikcoromant : Sandvik AB\\n// https://www.iana.org/domains/root/db/sandvikcoromant.html\\nsandvikcoromant\\n\\n// sanofi : Sanofi\\n// https://www.iana.org/domains/root/db/sanofi.html\\nsanofi\\n\\n// sap : SAP AG\\n// https://www.iana.org/domains/root/db/sap.html\\nsap\\n\\n// sarl : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/sarl.html\\nsarl\\n\\n// sas : Research IP LLC\\n// https://www.iana.org/domains/root/db/sas.html\\nsas\\n\\n// save : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/save.html\\nsave\\n\\n// saxo : Saxo Bank A/S\\n// https://www.iana.org/domains/root/db/saxo.html\\nsaxo\\n\\n// sbi : STATE BANK OF INDIA\\n// https://www.iana.org/domains/root/db/sbi.html\\nsbi\\n\\n// sbs : ShortDot SA\\n// https://www.iana.org/domains/root/db/sbs.html\\nsbs\\n\\n// sca : SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ)\\n// https://www.iana.org/domains/root/db/sca.html\\nsca\\n\\n// scb : The Siam Commercial Bank Public Company Limited (\"SCB\")\\n// https://www.iana.org/domains/root/db/scb.html\\nscb\\n\\n// schaeffler : Schaeffler Technologies AG & Co. KG\\n// https://www.iana.org/domains/root/db/schaeffler.html\\nschaeffler\\n\\n// schmidt : SCHMIDT GROUPE S.A.S.\\n// https://www.iana.org/domains/root/db/schmidt.html\\nschmidt\\n\\n// scholarships : Scholarships.com, LLC\\n// https://www.iana.org/domains/root/db/scholarships.html\\nscholarships\\n\\n// school : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/school.html\\nschool\\n\\n// schule : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/schule.html\\nschule\\n\\n// schwarz : Schwarz Domains und Services GmbH & Co. KG\\n// https://www.iana.org/domains/root/db/schwarz.html\\nschwarz\\n\\n// science : dot Science Limited\\n// https://www.iana.org/domains/root/db/science.html\\nscience\\n\\n// scot : Dot Scot Registry Limited\\n// https://www.iana.org/domains/root/db/scot.html\\nscot\\n\\n// search : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/search.html\\nsearch\\n\\n// seat : SEAT, S.A. (Sociedad Unipersonal)\\n// https://www.iana.org/domains/root/db/seat.html\\nseat\\n\\n// secure : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/secure.html\\nsecure\\n\\n// security : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/security.html\\nsecurity\\n\\n// seek : Seek Limited\\n// https://www.iana.org/domains/root/db/seek.html\\nseek\\n\\n// select : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/select.html\\nselect\\n\\n// sener : Sener Ingeniería y Sistemas, S.A.\\n// https://www.iana.org/domains/root/db/sener.html\\nsener\\n\\n// services : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/services.html\\nservices\\n\\n// seven : Seven West Media Ltd\\n// https://www.iana.org/domains/root/db/seven.html\\nseven\\n\\n// sew : SEW-EURODRIVE GmbH & Co KG\\n// https://www.iana.org/domains/root/db/sew.html\\nsew\\n\\n// sex : ICM Registry SX LLC\\n// https://www.iana.org/domains/root/db/sex.html\\nsex\\n\\n// sexy : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/sexy.html\\nsexy\\n\\n// sfr : Societe Francaise du Radiotelephone - SFR\\n// https://www.iana.org/domains/root/db/sfr.html\\nsfr\\n\\n// shangrila : Shangri‐La International Hotel Management Limited\\n// https://www.iana.org/domains/root/db/shangrila.html\\nshangrila\\n\\n// sharp : Sharp Corporation\\n// https://www.iana.org/domains/root/db/sharp.html\\nsharp\\n\\n// shaw : Shaw Cablesystems G.P.\\n// https://www.iana.org/domains/root/db/shaw.html\\nshaw\\n\\n// shell : Shell Information Technology International Inc\\n// https://www.iana.org/domains/root/db/shell.html\\nshell\\n\\n// shia : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/shia.html\\nshia\\n\\n// shiksha : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/shiksha.html\\nshiksha\\n\\n// shoes : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/shoes.html\\nshoes\\n\\n// shop : GMO Registry, Inc.\\n// https://www.iana.org/domains/root/db/shop.html\\nshop\\n\\n// shopping : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/shopping.html\\nshopping\\n\\n// shouji : Beijing Qihu Keji Co., Ltd.\\n// https://www.iana.org/domains/root/db/shouji.html\\nshouji\\n\\n// show : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/show.html\\nshow\\n\\n// showtime : CBS Domains Inc.\\n// https://www.iana.org/domains/root/db/showtime.html\\nshowtime\\n\\n// silk : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/silk.html\\nsilk\\n\\n// sina : Sina Corporation\\n// https://www.iana.org/domains/root/db/sina.html\\nsina\\n\\n// singles : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/singles.html\\nsingles\\n\\n// site : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/site.html\\nsite\\n\\n// ski : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/ski.html\\nski\\n\\n// skin : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/skin.html\\nskin\\n\\n// sky : Sky International AG\\n// https://www.iana.org/domains/root/db/sky.html\\nsky\\n\\n// skype : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/skype.html\\nskype\\n\\n// sling : DISH Technologies L.L.C.\\n// https://www.iana.org/domains/root/db/sling.html\\nsling\\n\\n// smart : Smart Communications, Inc. (SMART)\\n// https://www.iana.org/domains/root/db/smart.html\\nsmart\\n\\n// smile : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/smile.html\\nsmile\\n\\n// sncf : Société Nationale SNCF\\n// https://www.iana.org/domains/root/db/sncf.html\\nsncf\\n\\n// soccer : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/soccer.html\\nsoccer\\n\\n// social : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/social.html\\nsocial\\n\\n// softbank : SoftBank Group Corp.\\n// https://www.iana.org/domains/root/db/softbank.html\\nsoftbank\\n\\n// software : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/software.html\\nsoftware\\n\\n// sohu : Sohu.com Limited\\n// https://www.iana.org/domains/root/db/sohu.html\\nsohu\\n\\n// solar : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/solar.html\\nsolar\\n\\n// solutions : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/solutions.html\\nsolutions\\n\\n// song : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/song.html\\nsong\\n\\n// sony : Sony Corporation\\n// https://www.iana.org/domains/root/db/sony.html\\nsony\\n\\n// soy : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/soy.html\\nsoy\\n\\n// spa : Asia Spa and Wellness Promotion Council Limited\\n// https://www.iana.org/domains/root/db/spa.html\\nspa\\n\\n// space : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/space.html\\nspace\\n\\n// sport : SportAccord\\n// https://www.iana.org/domains/root/db/sport.html\\nsport\\n\\n// spot : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/spot.html\\nspot\\n\\n// srl : InterNetX, Corp\\n// https://www.iana.org/domains/root/db/srl.html\\nsrl\\n\\n// stada : STADA Arzneimittel AG\\n// https://www.iana.org/domains/root/db/stada.html\\nstada\\n\\n// staples : Staples, Inc.\\n// https://www.iana.org/domains/root/db/staples.html\\nstaples\\n\\n// star : Star India Private Limited\\n// https://www.iana.org/domains/root/db/star.html\\nstar\\n\\n// statebank : STATE BANK OF INDIA\\n// https://www.iana.org/domains/root/db/statebank.html\\nstatebank\\n\\n// statefarm : State Farm Mutual Automobile Insurance Company\\n// https://www.iana.org/domains/root/db/statefarm.html\\nstatefarm\\n\\n// stc : Saudi Telecom Company\\n// https://www.iana.org/domains/root/db/stc.html\\nstc\\n\\n// stcgroup : Saudi Telecom Company\\n// https://www.iana.org/domains/root/db/stcgroup.html\\nstcgroup\\n\\n// stockholm : Stockholms kommun\\n// https://www.iana.org/domains/root/db/stockholm.html\\nstockholm\\n\\n// storage : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/storage.html\\nstorage\\n\\n// store : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/store.html\\nstore\\n\\n// stream : dot Stream Limited\\n// https://www.iana.org/domains/root/db/stream.html\\nstream\\n\\n// studio : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/studio.html\\nstudio\\n\\n// study : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/study.html\\nstudy\\n\\n// style : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/style.html\\nstyle\\n\\n// sucks : Vox Populi Registry Ltd.\\n// https://www.iana.org/domains/root/db/sucks.html\\nsucks\\n\\n// supplies : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/supplies.html\\nsupplies\\n\\n// supply : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/supply.html\\nsupply\\n\\n// support : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/support.html\\nsupport\\n\\n// surf : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/surf.html\\nsurf\\n\\n// surgery : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/surgery.html\\nsurgery\\n\\n// suzuki : SUZUKI MOTOR CORPORATION\\n// https://www.iana.org/domains/root/db/suzuki.html\\nsuzuki\\n\\n// swatch : The Swatch Group Ltd\\n// https://www.iana.org/domains/root/db/swatch.html\\nswatch\\n\\n// swiss : Swiss Confederation\\n// https://www.iana.org/domains/root/db/swiss.html\\nswiss\\n\\n// sydney : State of New South Wales, Department of Premier and Cabinet\\n// https://www.iana.org/domains/root/db/sydney.html\\nsydney\\n\\n// systems : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/systems.html\\nsystems\\n\\n// tab : Tabcorp Holdings Limited\\n// https://www.iana.org/domains/root/db/tab.html\\ntab\\n\\n// taipei : Taipei City Government\\n// https://www.iana.org/domains/root/db/taipei.html\\ntaipei\\n\\n// talk : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/talk.html\\ntalk\\n\\n// taobao : Alibaba Group Holding Limited\\n// https://www.iana.org/domains/root/db/taobao.html\\ntaobao\\n\\n// target : Target Domain Holdings, LLC\\n// https://www.iana.org/domains/root/db/target.html\\ntarget\\n\\n// tatamotors : Tata Motors Ltd\\n// https://www.iana.org/domains/root/db/tatamotors.html\\ntatamotors\\n\\n// tatar : Limited Liability Company \"Coordination Center of Regional Domain of Tatarstan Republic\"\\n// https://www.iana.org/domains/root/db/tatar.html\\ntatar\\n\\n// tattoo : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/tattoo.html\\ntattoo\\n\\n// tax : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tax.html\\ntax\\n\\n// taxi : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/taxi.html\\ntaxi\\n\\n// tci : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/tci.html\\ntci\\n\\n// tdk : TDK Corporation\\n// https://www.iana.org/domains/root/db/tdk.html\\ntdk\\n\\n// team : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/team.html\\nteam\\n\\n// tech : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/tech.html\\ntech\\n\\n// technology : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/technology.html\\ntechnology\\n\\n// temasek : Temasek Holdings (Private) Limited\\n// https://www.iana.org/domains/root/db/temasek.html\\ntemasek\\n\\n// tennis : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tennis.html\\ntennis\\n\\n// teva : Teva Pharmaceutical Industries Limited\\n// https://www.iana.org/domains/root/db/teva.html\\nteva\\n\\n// thd : Home Depot Product Authority, LLC\\n// https://www.iana.org/domains/root/db/thd.html\\nthd\\n\\n// theater : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/theater.html\\ntheater\\n\\n// theatre : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/theatre.html\\ntheatre\\n\\n// tiaa : Teachers Insurance and Annuity Association of America\\n// https://www.iana.org/domains/root/db/tiaa.html\\ntiaa\\n\\n// tickets : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/tickets.html\\ntickets\\n\\n// tienda : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tienda.html\\ntienda\\n\\n// tips : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tips.html\\ntips\\n\\n// tires : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tires.html\\ntires\\n\\n// tirol : punkt Tirol GmbH\\n// https://www.iana.org/domains/root/db/tirol.html\\ntirol\\n\\n// tjmaxx : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/tjmaxx.html\\ntjmaxx\\n\\n// tjx : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/tjx.html\\ntjx\\n\\n// tkmaxx : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/tkmaxx.html\\ntkmaxx\\n\\n// tmall : Alibaba Group Holding Limited\\n// https://www.iana.org/domains/root/db/tmall.html\\ntmall\\n\\n// today : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/today.html\\ntoday\\n\\n// tokyo : GMO Registry, Inc.\\n// https://www.iana.org/domains/root/db/tokyo.html\\ntokyo\\n\\n// tools : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tools.html\\ntools\\n\\n// top : .TOP Registry\\n// https://www.iana.org/domains/root/db/top.html\\ntop\\n\\n// toray : Toray Industries, Inc.\\n// https://www.iana.org/domains/root/db/toray.html\\ntoray\\n\\n// toshiba : TOSHIBA Corporation\\n// https://www.iana.org/domains/root/db/toshiba.html\\ntoshiba\\n\\n// total : TotalEnergies SE\\n// https://www.iana.org/domains/root/db/total.html\\ntotal\\n\\n// tours : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/tours.html\\ntours\\n\\n// town : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/town.html\\ntown\\n\\n// toyota : TOYOTA MOTOR CORPORATION\\n// https://www.iana.org/domains/root/db/toyota.html\\ntoyota\\n\\n// toys : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/toys.html\\ntoys\\n\\n// trade : Elite Registry Limited\\n// https://www.iana.org/domains/root/db/trade.html\\ntrade\\n\\n// trading : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/trading.html\\ntrading\\n\\n// training : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/training.html\\ntraining\\n\\n// travel : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/travel.html\\ntravel\\n\\n// travelers : Travelers TLD, LLC\\n// https://www.iana.org/domains/root/db/travelers.html\\ntravelers\\n\\n// travelersinsurance : Travelers TLD, LLC\\n// https://www.iana.org/domains/root/db/travelersinsurance.html\\ntravelersinsurance\\n\\n// trust : Internet Naming Company LLC\\n// https://www.iana.org/domains/root/db/trust.html\\ntrust\\n\\n// trv : Travelers TLD, LLC\\n// https://www.iana.org/domains/root/db/trv.html\\ntrv\\n\\n// tube : Latin American Telecom LLC\\n// https://www.iana.org/domains/root/db/tube.html\\ntube\\n\\n// tui : TUI AG\\n// https://www.iana.org/domains/root/db/tui.html\\ntui\\n\\n// tunes : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/tunes.html\\ntunes\\n\\n// tushu : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/tushu.html\\ntushu\\n\\n// tvs : T V SUNDRAM IYENGAR  & SONS LIMITED\\n// https://www.iana.org/domains/root/db/tvs.html\\ntvs\\n\\n// ubank : National Australia Bank Limited\\n// https://www.iana.org/domains/root/db/ubank.html\\nubank\\n\\n// ubs : UBS AG\\n// https://www.iana.org/domains/root/db/ubs.html\\nubs\\n\\n// unicom : China United Network Communications Corporation Limited\\n// https://www.iana.org/domains/root/db/unicom.html\\nunicom\\n\\n// university : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/university.html\\nuniversity\\n\\n// uno : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/uno.html\\nuno\\n\\n// uol : UBN INTERNET LTDA.\\n// https://www.iana.org/domains/root/db/uol.html\\nuol\\n\\n// ups : UPS Market Driver, Inc.\\n// https://www.iana.org/domains/root/db/ups.html\\nups\\n\\n// vacations : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/vacations.html\\nvacations\\n\\n// vana : Lifestyle Domain Holdings, Inc.\\n// https://www.iana.org/domains/root/db/vana.html\\nvana\\n\\n// vanguard : The Vanguard Group, Inc.\\n// https://www.iana.org/domains/root/db/vanguard.html\\nvanguard\\n\\n// vegas : Dot Vegas, Inc.\\n// https://www.iana.org/domains/root/db/vegas.html\\nvegas\\n\\n// ventures : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/ventures.html\\nventures\\n\\n// verisign : VeriSign, Inc.\\n// https://www.iana.org/domains/root/db/verisign.html\\nverisign\\n\\n// versicherung : tldbox GmbH\\n// https://www.iana.org/domains/root/db/versicherung.html\\nversicherung\\n\\n// vet : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/vet.html\\nvet\\n\\n// viajes : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/viajes.html\\nviajes\\n\\n// video : Dog Beach, LLC\\n// https://www.iana.org/domains/root/db/video.html\\nvideo\\n\\n// vig : VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe\\n// https://www.iana.org/domains/root/db/vig.html\\nvig\\n\\n// viking : Viking River Cruises (Bermuda) Ltd.\\n// https://www.iana.org/domains/root/db/viking.html\\nviking\\n\\n// villas : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/villas.html\\nvillas\\n\\n// vin : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/vin.html\\nvin\\n\\n// vip : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/vip.html\\nvip\\n\\n// virgin : Virgin Enterprises Limited\\n// https://www.iana.org/domains/root/db/virgin.html\\nvirgin\\n\\n// visa : Visa Worldwide Pte. Limited\\n// https://www.iana.org/domains/root/db/visa.html\\nvisa\\n\\n// vision : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/vision.html\\nvision\\n\\n// viva : Saudi Telecom Company\\n// https://www.iana.org/domains/root/db/viva.html\\nviva\\n\\n// vivo : Telefonica Brasil S.A.\\n// https://www.iana.org/domains/root/db/vivo.html\\nvivo\\n\\n// vlaanderen : DNS.be vzw\\n// https://www.iana.org/domains/root/db/vlaanderen.html\\nvlaanderen\\n\\n// vodka : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/vodka.html\\nvodka\\n\\n// volkswagen : Volkswagen Group of America Inc.\\n// https://www.iana.org/domains/root/db/volkswagen.html\\nvolkswagen\\n\\n// volvo : Volvo Holding Sverige Aktiebolag\\n// https://www.iana.org/domains/root/db/volvo.html\\nvolvo\\n\\n// vote : Monolith Registry LLC\\n// https://www.iana.org/domains/root/db/vote.html\\nvote\\n\\n// voting : Valuetainment Corp.\\n// https://www.iana.org/domains/root/db/voting.html\\nvoting\\n\\n// voto : Monolith Registry LLC\\n// https://www.iana.org/domains/root/db/voto.html\\nvoto\\n\\n// voyage : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/voyage.html\\nvoyage\\n\\n// wales : Nominet UK\\n// https://www.iana.org/domains/root/db/wales.html\\nwales\\n\\n// walmart : Wal-Mart Stores, Inc.\\n// https://www.iana.org/domains/root/db/walmart.html\\nwalmart\\n\\n// walter : Sandvik AB\\n// https://www.iana.org/domains/root/db/walter.html\\nwalter\\n\\n// wang : Zodiac Wang Limited\\n// https://www.iana.org/domains/root/db/wang.html\\nwang\\n\\n// wanggou : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/wanggou.html\\nwanggou\\n\\n// watch : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/watch.html\\nwatch\\n\\n// watches : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/watches.html\\nwatches\\n\\n// weather : International Business Machines Corporation\\n// https://www.iana.org/domains/root/db/weather.html\\nweather\\n\\n// weatherchannel : International Business Machines Corporation\\n// https://www.iana.org/domains/root/db/weatherchannel.html\\nweatherchannel\\n\\n// webcam : dot Webcam Limited\\n// https://www.iana.org/domains/root/db/webcam.html\\nwebcam\\n\\n// weber : Saint-Gobain Weber SA\\n// https://www.iana.org/domains/root/db/weber.html\\nweber\\n\\n// website : Radix FZC DMCC\\n// https://www.iana.org/domains/root/db/website.html\\nwebsite\\n\\n// wedding : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/wedding.html\\nwedding\\n\\n// weibo : Sina Corporation\\n// https://www.iana.org/domains/root/db/weibo.html\\nweibo\\n\\n// weir : Weir Group IP Limited\\n// https://www.iana.org/domains/root/db/weir.html\\nweir\\n\\n// whoswho : Who\\'s Who Registry\\n// https://www.iana.org/domains/root/db/whoswho.html\\nwhoswho\\n\\n// wien : punkt.wien GmbH\\n// https://www.iana.org/domains/root/db/wien.html\\nwien\\n\\n// wiki : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/wiki.html\\nwiki\\n\\n// williamhill : William Hill Organization Limited\\n// https://www.iana.org/domains/root/db/williamhill.html\\nwilliamhill\\n\\n// win : First Registry Limited\\n// https://www.iana.org/domains/root/db/win.html\\nwin\\n\\n// windows : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/windows.html\\nwindows\\n\\n// wine : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/wine.html\\nwine\\n\\n// winners : The TJX Companies, Inc.\\n// https://www.iana.org/domains/root/db/winners.html\\nwinners\\n\\n// wme : William Morris Endeavor Entertainment, LLC\\n// https://www.iana.org/domains/root/db/wme.html\\nwme\\n\\n// wolterskluwer : Wolters Kluwer N.V.\\n// https://www.iana.org/domains/root/db/wolterskluwer.html\\nwolterskluwer\\n\\n// woodside : Woodside Petroleum Limited\\n// https://www.iana.org/domains/root/db/woodside.html\\nwoodside\\n\\n// work : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/work.html\\nwork\\n\\n// works : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/works.html\\nworks\\n\\n// world : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/world.html\\nworld\\n\\n// wow : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/wow.html\\nwow\\n\\n// wtc : World Trade Centers Association, Inc.\\n// https://www.iana.org/domains/root/db/wtc.html\\nwtc\\n\\n// wtf : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/wtf.html\\nwtf\\n\\n// xbox : Microsoft Corporation\\n// https://www.iana.org/domains/root/db/xbox.html\\nxbox\\n\\n// xerox : Xerox DNHC LLC\\n// https://www.iana.org/domains/root/db/xerox.html\\nxerox\\n\\n// xfinity : Comcast IP Holdings I, LLC\\n// https://www.iana.org/domains/root/db/xfinity.html\\nxfinity\\n\\n// xihuan : Beijing Qihu Keji Co., Ltd.\\n// https://www.iana.org/domains/root/db/xihuan.html\\nxihuan\\n\\n// xin : Elegant Leader Limited\\n// https://www.iana.org/domains/root/db/xin.html\\nxin\\n\\n// xn--11b4c3d : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--11b4c3d.html\\nकॉम\\n\\n// xn--1ck2e1b : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--1ck2e1b.html\\nセール\\n\\n// xn--1qqw23a : Guangzhou YU Wei Information Technology Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--1qqw23a.html\\n佛山\\n\\n// xn--30rr7y : Excellent First Limited\\n// https://www.iana.org/domains/root/db/xn--30rr7y.html\\n慈善\\n\\n// xn--3bst00m : Eagle Horizon Limited\\n// https://www.iana.org/domains/root/db/xn--3bst00m.html\\n集团\\n\\n// xn--3ds443g : TLD REGISTRY LIMITED OY\\n// https://www.iana.org/domains/root/db/xn--3ds443g.html\\n在线\\n\\n// xn--3pxu8k : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--3pxu8k.html\\n点看\\n\\n// xn--42c2d9a : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--42c2d9a.html\\nคอม\\n\\n// xn--45q11c : Zodiac Gemini Ltd\\n// https://www.iana.org/domains/root/db/xn--45q11c.html\\n八卦\\n\\n// xn--4gbrim : Helium TLDs Ltd\\n// https://www.iana.org/domains/root/db/xn--4gbrim.html\\nموقع\\n\\n// xn--55qw42g : China Organizational Name Administration Center\\n// https://www.iana.org/domains/root/db/xn--55qw42g.html\\n公益\\n\\n// xn--55qx5d : China Internet Network Information Center (CNNIC)\\n// https://www.iana.org/domains/root/db/xn--55qx5d.html\\n公司\\n\\n// xn--5su34j936bgsg : Shangri‐La International Hotel Management Limited\\n// https://www.iana.org/domains/root/db/xn--5su34j936bgsg.html\\n香格里拉\\n\\n// xn--5tzm5g : Global Website TLD Asia Limited\\n// https://www.iana.org/domains/root/db/xn--5tzm5g.html\\n网站\\n\\n// xn--6frz82g : Identity Digital Limited\\n// https://www.iana.org/domains/root/db/xn--6frz82g.html\\n移动\\n\\n// xn--6qq986b3xl : Tycoon Treasure Limited\\n// https://www.iana.org/domains/root/db/xn--6qq986b3xl.html\\n我爱你\\n\\n// xn--80adxhks : Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)\\n// https://www.iana.org/domains/root/db/xn--80adxhks.html\\nмосква\\n\\n// xn--80aqecdr1a : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)\\n// https://www.iana.org/domains/root/db/xn--80aqecdr1a.html\\nкатолик\\n\\n// xn--80asehdb : CORE Association\\n// https://www.iana.org/domains/root/db/xn--80asehdb.html\\nонлайн\\n\\n// xn--80aswg : CORE Association\\n// https://www.iana.org/domains/root/db/xn--80aswg.html\\nсайт\\n\\n// xn--8y0a063a : China United Network Communications Corporation Limited\\n// https://www.iana.org/domains/root/db/xn--8y0a063a.html\\n联通\\n\\n// xn--9dbq2a : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--9dbq2a.html\\nקום\\n\\n// xn--9et52u : RISE VICTORY LIMITED\\n// https://www.iana.org/domains/root/db/xn--9et52u.html\\n时尚\\n\\n// xn--9krt00a : Sina Corporation\\n// https://www.iana.org/domains/root/db/xn--9krt00a.html\\n微博\\n\\n// xn--b4w605ferd : Temasek Holdings (Private) Limited\\n// https://www.iana.org/domains/root/db/xn--b4w605ferd.html\\n淡马锡\\n\\n// xn--bck1b9a5dre4c : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--bck1b9a5dre4c.html\\nファッション\\n\\n// xn--c1avg : Public Interest Registry\\n// https://www.iana.org/domains/root/db/xn--c1avg.html\\nорг\\n\\n// xn--c2br7g : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--c2br7g.html\\nनेट\\n\\n// xn--cck2b3b : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--cck2b3b.html\\nストア\\n\\n// xn--cckwcxetd : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--cckwcxetd.html\\nアマゾン\\n\\n// xn--cg4bki : SAMSUNG SDS CO., LTD\\n// https://www.iana.org/domains/root/db/xn--cg4bki.html\\n삼성\\n\\n// xn--czr694b : Internet DotTrademark Organisation Limited\\n// https://www.iana.org/domains/root/db/xn--czr694b.html\\n商标\\n\\n// xn--czrs0t : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/xn--czrs0t.html\\n商店\\n\\n// xn--czru2d : Zodiac Aquarius Limited\\n// https://www.iana.org/domains/root/db/xn--czru2d.html\\n商城\\n\\n// xn--d1acj3b : The Foundation for Network Initiatives “The Smart Internet”\\n// https://www.iana.org/domains/root/db/xn--d1acj3b.html\\nдети\\n\\n// xn--eckvdtc9d : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--eckvdtc9d.html\\nポイント\\n\\n// xn--efvy88h : Guangzhou YU Wei Information Technology Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--efvy88h.html\\n新闻\\n\\n// xn--fct429k : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--fct429k.html\\n家電\\n\\n// xn--fhbei : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--fhbei.html\\nكوم\\n\\n// xn--fiq228c5hs : TLD REGISTRY LIMITED OY\\n// https://www.iana.org/domains/root/db/xn--fiq228c5hs.html\\n中文网\\n\\n// xn--fiq64b : CITIC Group Corporation\\n// https://www.iana.org/domains/root/db/xn--fiq64b.html\\n中信\\n\\n// xn--fjq720a : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/xn--fjq720a.html\\n娱乐\\n\\n// xn--flw351e : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/xn--flw351e.html\\n谷歌\\n\\n// xn--fzys8d69uvgm : PCCW Enterprises Limited\\n// https://www.iana.org/domains/root/db/xn--fzys8d69uvgm.html\\n電訊盈科\\n\\n// xn--g2xx48c : Nawang Heli(Xiamen) Network Service Co., LTD.\\n// https://www.iana.org/domains/root/db/xn--g2xx48c.html\\n购物\\n\\n// xn--gckr3f0f : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--gckr3f0f.html\\nクラウド\\n\\n// xn--gk3at1e : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--gk3at1e.html\\n通販\\n\\n// xn--hxt814e : Zodiac Taurus Limited\\n// https://www.iana.org/domains/root/db/xn--hxt814e.html\\n网店\\n\\n// xn--i1b6b1a6a2e : Public Interest Registry\\n// https://www.iana.org/domains/root/db/xn--i1b6b1a6a2e.html\\nसंगठन\\n\\n// xn--imr513n : Internet DotTrademark Organisation Limited\\n// https://www.iana.org/domains/root/db/xn--imr513n.html\\n餐厅\\n\\n// xn--io0a7i : China Internet Network Information Center (CNNIC)\\n// https://www.iana.org/domains/root/db/xn--io0a7i.html\\n网络\\n\\n// xn--j1aef : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--j1aef.html\\nком\\n\\n// xn--jlq480n2rg : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--jlq480n2rg.html\\n亚马逊\\n\\n// xn--jvr189m : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--jvr189m.html\\n食品\\n\\n// xn--kcrx77d1x4a : Koninklijke Philips N.V.\\n// https://www.iana.org/domains/root/db/xn--kcrx77d1x4a.html\\n飞利浦\\n\\n// xn--kput3i : Beijing RITT-Net Technology Development Co., Ltd\\n// https://www.iana.org/domains/root/db/xn--kput3i.html\\n手机\\n\\n// xn--mgba3a3ejt : Aramco Services Company\\n// https://www.iana.org/domains/root/db/xn--mgba3a3ejt.html\\nارامكو\\n\\n// xn--mgba7c0bbn0a : Competrol (Luxembourg) Sarl\\n// https://www.iana.org/domains/root/db/xn--mgba7c0bbn0a.html\\nالعليان\\n\\n// xn--mgbaakc7dvf : Emirates Telecommunications Corporation (trading as Etisalat)\\n// https://www.iana.org/domains/root/db/xn--mgbaakc7dvf.html\\nاتصالات\\n\\n// xn--mgbab2bd : CORE Association\\n// https://www.iana.org/domains/root/db/xn--mgbab2bd.html\\nبازار\\n\\n// xn--mgbca7dzdo : Abu Dhabi Systems and Information Centre\\n// https://www.iana.org/domains/root/db/xn--mgbca7dzdo.html\\nابوظبي\\n\\n// xn--mgbi4ecexp : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)\\n// https://www.iana.org/domains/root/db/xn--mgbi4ecexp.html\\nكاثوليك\\n\\n// xn--mgbt3dhd : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.\\n// https://www.iana.org/domains/root/db/xn--mgbt3dhd.html\\nهمراه\\n\\n// xn--mk1bu44c : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--mk1bu44c.html\\n닷컴\\n\\n// xn--mxtq1m : Net-Chinese Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--mxtq1m.html\\n政府\\n\\n// xn--ngbc5azd : International Domain Registry Pty. Ltd.\\n// https://www.iana.org/domains/root/db/xn--ngbc5azd.html\\nشبكة\\n\\n// xn--ngbe9e0a : Kuwait Finance House\\n// https://www.iana.org/domains/root/db/xn--ngbe9e0a.html\\nبيتك\\n\\n// xn--ngbrx : League of Arab States\\n// https://www.iana.org/domains/root/db/xn--ngbrx.html\\nعرب\\n\\n// xn--nqv7f : Public Interest Registry\\n// https://www.iana.org/domains/root/db/xn--nqv7f.html\\n机构\\n\\n// xn--nqv7fs00ema : Public Interest Registry\\n// https://www.iana.org/domains/root/db/xn--nqv7fs00ema.html\\n组织机构\\n\\n// xn--nyqy26a : Stable Tone Limited\\n// https://www.iana.org/domains/root/db/xn--nyqy26a.html\\n健康\\n\\n// xn--otu796d : Jiang Yu Liang Cai Technology Company Limited\\n// https://www.iana.org/domains/root/db/xn--otu796d.html\\n招聘\\n\\n// xn--p1acf : Rusnames Limited\\n// https://www.iana.org/domains/root/db/xn--p1acf.html\\nрус\\n\\n// xn--pssy2u : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--pssy2u.html\\n大拿\\n\\n// xn--q9jyb4c : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/xn--q9jyb4c.html\\nみんな\\n\\n// xn--qcka1pmc : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/xn--qcka1pmc.html\\nグーグル\\n\\n// xn--rhqv96g : Stable Tone Limited\\n// https://www.iana.org/domains/root/db/xn--rhqv96g.html\\n世界\\n\\n// xn--rovu88b : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/xn--rovu88b.html\\n書籍\\n\\n// xn--ses554g : KNET Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--ses554g.html\\n网址\\n\\n// xn--t60b56a : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--t60b56a.html\\n닷넷\\n\\n// xn--tckwe : VeriSign Sarl\\n// https://www.iana.org/domains/root/db/xn--tckwe.html\\nコム\\n\\n// xn--tiq49xqyj : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)\\n// https://www.iana.org/domains/root/db/xn--tiq49xqyj.html\\n天主教\\n\\n// xn--unup4y : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/xn--unup4y.html\\n游戏\\n\\n// xn--vermgensberater-ctb : Deutsche Vermögensberatung Aktiengesellschaft DVAG\\n// https://www.iana.org/domains/root/db/xn--vermgensberater-ctb.html\\nvermögensberater\\n\\n// xn--vermgensberatung-pwb : Deutsche Vermögensberatung Aktiengesellschaft DVAG\\n// https://www.iana.org/domains/root/db/xn--vermgensberatung-pwb.html\\nvermögensberatung\\n\\n// xn--vhquv : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/xn--vhquv.html\\n企业\\n\\n// xn--vuq861b : Beijing Tele-info Technology Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--vuq861b.html\\n信息\\n\\n// xn--w4r85el8fhu5dnra : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/xn--w4r85el8fhu5dnra.html\\n嘉里大酒店\\n\\n// xn--w4rs40l : Kerry Trading Co. Limited\\n// https://www.iana.org/domains/root/db/xn--w4rs40l.html\\n嘉里\\n\\n// xn--xhq521b : Guangzhou YU Wei Information Technology Co., Ltd.\\n// https://www.iana.org/domains/root/db/xn--xhq521b.html\\n广东\\n\\n// xn--zfr164b : China Organizational Name Administration Center\\n// https://www.iana.org/domains/root/db/xn--zfr164b.html\\n政务\\n\\n// xyz : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/xyz.html\\nxyz\\n\\n// yachts : XYZ.COM LLC\\n// https://www.iana.org/domains/root/db/yachts.html\\nyachts\\n\\n// yahoo : Oath Inc.\\n// https://www.iana.org/domains/root/db/yahoo.html\\nyahoo\\n\\n// yamaxun : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/yamaxun.html\\nyamaxun\\n\\n// yandex : Yandex Europe B.V.\\n// https://www.iana.org/domains/root/db/yandex.html\\nyandex\\n\\n// yodobashi : YODOBASHI CAMERA CO.,LTD.\\n// https://www.iana.org/domains/root/db/yodobashi.html\\nyodobashi\\n\\n// yoga : Registry Services, LLC\\n// https://www.iana.org/domains/root/db/yoga.html\\nyoga\\n\\n// yokohama : GMO Registry, Inc.\\n// https://www.iana.org/domains/root/db/yokohama.html\\nyokohama\\n\\n// you : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/you.html\\nyou\\n\\n// youtube : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/youtube.html\\nyoutube\\n\\n// yun : Beijing Qihu Keji Co., Ltd.\\n// https://www.iana.org/domains/root/db/yun.html\\nyun\\n\\n// zappos : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/zappos.html\\nzappos\\n\\n// zara : Industria de Diseño Textil, S.A. (INDITEX, S.A.)\\n// https://www.iana.org/domains/root/db/zara.html\\nzara\\n\\n// zero : Amazon Registry Services, Inc.\\n// https://www.iana.org/domains/root/db/zero.html\\nzero\\n\\n// zip : Charleston Road Registry Inc.\\n// https://www.iana.org/domains/root/db/zip.html\\nzip\\n\\n// zone : Binky Moon, LLC\\n// https://www.iana.org/domains/root/db/zone.html\\nzone\\n\\n// zuerich : Kanton Zürich (Canton of Zurich)\\n// https://www.iana.org/domains/root/db/zuerich.html\\nzuerich\\n\\n\\n// ===END ICANN DOMAINS===\\n// ===BEGIN PRIVATE DOMAINS===\\n// (Note: these are in alphabetical order by company name)\\n\\n// 1GB LLC : https://www.1gb.ua/\\n// Submitted by 1GB LLC <noc@1gb.com.ua>\\ncc.ua\\ninf.ua\\nltd.ua\\n\\n// 611coin : https://611project.org/\\n611.to\\n\\n// Aaron Marais\\' Gitlab pages: https://lab.aaronleem.co.za\\n// Submitted by Aaron Marais <its_me@aaronleem.co.za>\\ngraphox.us\\n\\n// accesso Technology Group, plc. : https://accesso.com/\\n// Submitted by accesso Team <accessoecommerce@accesso.com>\\n*.devcdnaccesso.com\\n\\n// Acorn Labs : https://acorn.io\\n// Submitted by Craig Jellick <domains@acorn.io>\\n*.on-acorn.io\\n\\n// ActiveTrail: https://www.activetrail.biz/\\n// Submitted by Ofer Kalaora <postmaster@activetrail.com>\\nactivetrail.biz\\n\\n// Adobe : https://www.adobe.com/\\n// Submitted by Ian Boston <boston@adobe.com> and Lars Trieloff <trieloff@adobe.com>\\nadobeaemcloud.com\\n*.dev.adobeaemcloud.com\\nhlx.live\\nadobeaemcloud.net\\nhlx.page\\nhlx3.page\\n\\n// Adobe Developer Platform : https://developer.adobe.com\\n// Submitted by Jesse MacFadyen<jessem@adobe.com>\\nadobeio-static.net\\nadobeioruntime.net\\n\\n// Agnat sp. z o.o. : https://domena.pl\\n// Submitted by Przemyslaw Plewa <it-admin@domena.pl>\\nbeep.pl\\n\\n// Airkit : https://www.airkit.com/\\n// Submitted by Grant Cooksey <security@airkit.com>\\nairkitapps.com\\nairkitapps-au.com\\nairkitapps.eu\\n\\n// Aiven: https://aiven.io/\\n// Submitted by Etienne Stalmans <security@aiven.io>\\naivencloud.com\\n\\n// Akamai : https://www.akamai.com/\\n// Submitted by Akamai Team <publicsuffixlist@akamai.com>\\nakadns.net\\nakamai.net\\nakamai-staging.net\\nakamaiedge.net\\nakamaiedge-staging.net\\nakamaihd.net\\nakamaihd-staging.net\\nakamaiorigin.net\\nakamaiorigin-staging.net\\nakamaized.net\\nakamaized-staging.net\\nedgekey.net\\nedgekey-staging.net\\nedgesuite.net\\nedgesuite-staging.net\\n\\n// alboto.ca : http://alboto.ca\\n// Submitted by Anton Avramov <avramov@alboto.ca>\\nbarsy.ca\\n\\n// Alces Software Ltd : http://alces-software.com\\n// Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com>\\n*.compute.estate\\n*.alces.network\\n\\n// all-inkl.com : https://all-inkl.com\\n// Submitted by Werner Kaltofen <wk@all-inkl.com>\\nkasserver.com\\n\\n// Altervista: https://www.altervista.org\\n// Submitted by Carlo Cannas <tech_staff@altervista.it>\\naltervista.org\\n\\n// alwaysdata : https://www.alwaysdata.com\\n// Submitted by Cyril <admin@alwaysdata.com>\\nalwaysdata.net\\n\\n// Amaze Software : https://amaze.co\\n// Submitted by Domain Admin <domainadmin@amaze.co>\\nmyamaze.net\\n\\n// Amazon : https://www.amazon.com/\\n// Submitted by AWS Security <psl-maintainers@amazon.com>\\n// Subsections of Amazon/subsidiaries will appear until \"concludes\" tag\\n\\n// Amazon CloudFront\\n// Submitted by Donavan Miller <donavanm@amazon.com>\\n// Reference: 54144616-fd49-4435-8535-19c6a601bdb3\\ncloudfront.net\\n\\n// Amazon EC2\\n// Submitted by Luke Wells <psl-maintainers@amazon.com>\\n// Reference: 4c38fa71-58ac-4768-99e5-689c1767e537\\n*.compute.amazonaws.com\\n*.compute-1.amazonaws.com\\n*.compute.amazonaws.com.cn\\nus-east-1.amazonaws.com\\n\\n// Amazon S3\\n// Submitted by Luke Wells <psl-maintainers@amazon.com>\\n// Reference: d068bd97-f0a9-4838-a6d8-954b622ef4ae\\ns3.cn-north-1.amazonaws.com.cn\\ns3.dualstack.ap-northeast-1.amazonaws.com\\ns3.dualstack.ap-northeast-2.amazonaws.com\\ns3.ap-northeast-2.amazonaws.com\\ns3-website.ap-northeast-2.amazonaws.com\\ns3.dualstack.ap-south-1.amazonaws.com\\ns3.ap-south-1.amazonaws.com\\ns3-website.ap-south-1.amazonaws.com\\ns3.dualstack.ap-southeast-1.amazonaws.com\\ns3.dualstack.ap-southeast-2.amazonaws.com\\ns3.dualstack.ca-central-1.amazonaws.com\\ns3.ca-central-1.amazonaws.com\\ns3-website.ca-central-1.amazonaws.com\\ns3.dualstack.eu-central-1.amazonaws.com\\ns3.eu-central-1.amazonaws.com\\ns3-website.eu-central-1.amazonaws.com\\ns3.dualstack.eu-west-1.amazonaws.com\\ns3.dualstack.eu-west-2.amazonaws.com\\ns3.eu-west-2.amazonaws.com\\ns3-website.eu-west-2.amazonaws.com\\ns3.dualstack.eu-west-3.amazonaws.com\\ns3.eu-west-3.amazonaws.com\\ns3-website.eu-west-3.amazonaws.com\\ns3.amazonaws.com\\ns3-ap-northeast-1.amazonaws.com\\ns3-ap-northeast-2.amazonaws.com\\ns3-ap-south-1.amazonaws.com\\ns3-ap-southeast-1.amazonaws.com\\ns3-ap-southeast-2.amazonaws.com\\ns3-ca-central-1.amazonaws.com\\ns3-eu-central-1.amazonaws.com\\ns3-eu-west-1.amazonaws.com\\ns3-eu-west-2.amazonaws.com\\ns3-eu-west-3.amazonaws.com\\ns3-external-1.amazonaws.com\\ns3-fips-us-gov-west-1.amazonaws.com\\ns3-sa-east-1.amazonaws.com\\ns3-us-east-2.amazonaws.com\\ns3-us-gov-west-1.amazonaws.com\\ns3-us-west-1.amazonaws.com\\ns3-us-west-2.amazonaws.com\\ns3-website-ap-northeast-1.amazonaws.com\\ns3-website-ap-southeast-1.amazonaws.com\\ns3-website-ap-southeast-2.amazonaws.com\\ns3-website-eu-west-1.amazonaws.com\\ns3-website-sa-east-1.amazonaws.com\\ns3-website-us-east-1.amazonaws.com\\ns3-website-us-west-1.amazonaws.com\\ns3-website-us-west-2.amazonaws.com\\ns3.dualstack.sa-east-1.amazonaws.com\\ns3.dualstack.us-east-1.amazonaws.com\\ns3.dualstack.us-east-2.amazonaws.com\\ns3.us-east-2.amazonaws.com\\ns3-website.us-east-2.amazonaws.com\\n\\n// Analytics on AWS\\n// Submitted by AWS Security <psl-maintainers@amazon.com>\\n// Reference: c02c3a80-f8a0-4fd2-b719-48ea8b7c28de\\nanalytics-gateway.ap-northeast-1.amazonaws.com\\nanalytics-gateway.eu-west-1.amazonaws.com\\nanalytics-gateway.us-east-1.amazonaws.com\\nanalytics-gateway.us-east-2.amazonaws.com\\nanalytics-gateway.us-west-2.amazonaws.com\\n\\n// AWS Cloud9\\n// Submitted by: AWS Security <psl-maintainers@amazon.com>\\n// Reference: 05c44955-977c-4b57-938a-f2af92733f9f\\nwebview-assets.aws-cloud9.af-south-1.amazonaws.com\\nvfs.cloud9.af-south-1.amazonaws.com\\nwebview-assets.cloud9.af-south-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-east-1.amazonaws.com\\nvfs.cloud9.ap-east-1.amazonaws.com\\nwebview-assets.cloud9.ap-east-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-northeast-1.amazonaws.com\\nvfs.cloud9.ap-northeast-1.amazonaws.com\\nwebview-assets.cloud9.ap-northeast-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-northeast-2.amazonaws.com\\nvfs.cloud9.ap-northeast-2.amazonaws.com\\nwebview-assets.cloud9.ap-northeast-2.amazonaws.com\\nwebview-assets.aws-cloud9.ap-northeast-3.amazonaws.com\\nvfs.cloud9.ap-northeast-3.amazonaws.com\\nwebview-assets.cloud9.ap-northeast-3.amazonaws.com\\nwebview-assets.aws-cloud9.ap-south-1.amazonaws.com\\nvfs.cloud9.ap-south-1.amazonaws.com\\nwebview-assets.cloud9.ap-south-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-southeast-1.amazonaws.com\\nvfs.cloud9.ap-southeast-1.amazonaws.com\\nwebview-assets.cloud9.ap-southeast-1.amazonaws.com\\nwebview-assets.aws-cloud9.ap-southeast-2.amazonaws.com\\nvfs.cloud9.ap-southeast-2.amazonaws.com\\nwebview-assets.cloud9.ap-southeast-2.amazonaws.com\\nwebview-assets.aws-cloud9.ca-central-1.amazonaws.com\\nvfs.cloud9.ca-central-1.amazonaws.com\\nwebview-assets.cloud9.ca-central-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-central-1.amazonaws.com\\nvfs.cloud9.eu-central-1.amazonaws.com\\nwebview-assets.cloud9.eu-central-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-north-1.amazonaws.com\\nvfs.cloud9.eu-north-1.amazonaws.com\\nwebview-assets.cloud9.eu-north-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-south-1.amazonaws.com\\nvfs.cloud9.eu-south-1.amazonaws.com\\nwebview-assets.cloud9.eu-south-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-west-1.amazonaws.com\\nvfs.cloud9.eu-west-1.amazonaws.com\\nwebview-assets.cloud9.eu-west-1.amazonaws.com\\nwebview-assets.aws-cloud9.eu-west-2.amazonaws.com\\nvfs.cloud9.eu-west-2.amazonaws.com\\nwebview-assets.cloud9.eu-west-2.amazonaws.com\\nwebview-assets.aws-cloud9.eu-west-3.amazonaws.com\\nvfs.cloud9.eu-west-3.amazonaws.com\\nwebview-assets.cloud9.eu-west-3.amazonaws.com\\nwebview-assets.aws-cloud9.me-south-1.amazonaws.com\\nvfs.cloud9.me-south-1.amazonaws.com\\nwebview-assets.cloud9.me-south-1.amazonaws.com\\nwebview-assets.aws-cloud9.sa-east-1.amazonaws.com\\nvfs.cloud9.sa-east-1.amazonaws.com\\nwebview-assets.cloud9.sa-east-1.amazonaws.com\\nwebview-assets.aws-cloud9.us-east-1.amazonaws.com\\nvfs.cloud9.us-east-1.amazonaws.com\\nwebview-assets.cloud9.us-east-1.amazonaws.com\\nwebview-assets.aws-cloud9.us-east-2.amazonaws.com\\nvfs.cloud9.us-east-2.amazonaws.com\\nwebview-assets.cloud9.us-east-2.amazonaws.com\\nwebview-assets.aws-cloud9.us-west-1.amazonaws.com\\nvfs.cloud9.us-west-1.amazonaws.com\\nwebview-assets.cloud9.us-west-1.amazonaws.com\\nwebview-assets.aws-cloud9.us-west-2.amazonaws.com\\nvfs.cloud9.us-west-2.amazonaws.com\\nwebview-assets.cloud9.us-west-2.amazonaws.com\\n\\n// AWS Elastic Beanstalk\\n// Submitted by Luke Wells <psl-maintainers@amazon.com>\\n// Reference: aa202394-43a0-4857-b245-8db04549137e\\ncn-north-1.eb.amazonaws.com.cn\\ncn-northwest-1.eb.amazonaws.com.cn\\nelasticbeanstalk.com\\nap-northeast-1.elasticbeanstalk.com\\nap-northeast-2.elasticbeanstalk.com\\nap-northeast-3.elasticbeanstalk.com\\nap-south-1.elasticbeanstalk.com\\nap-southeast-1.elasticbeanstalk.com\\nap-southeast-2.elasticbeanstalk.com\\nca-central-1.elasticbeanstalk.com\\neu-central-1.elasticbeanstalk.com\\neu-west-1.elasticbeanstalk.com\\neu-west-2.elasticbeanstalk.com\\neu-west-3.elasticbeanstalk.com\\nsa-east-1.elasticbeanstalk.com\\nus-east-1.elasticbeanstalk.com\\nus-east-2.elasticbeanstalk.com\\nus-gov-west-1.elasticbeanstalk.com\\nus-west-1.elasticbeanstalk.com\\nus-west-2.elasticbeanstalk.com\\n\\n// (AWS) Elastic Load Balancing\\n// Submitted by Luke Wells <psl-maintainers@amazon.com>\\n// Reference: 12a3d528-1bac-4433-a359-a395867ffed2\\n*.elb.amazonaws.com.cn\\n*.elb.amazonaws.com\\n\\n// AWS Global Accelerator\\n// Submitted by Daniel Massaguer <psl-maintainers@amazon.com>\\n// Reference: d916759d-a08b-4241-b536-4db887383a6a\\nawsglobalaccelerator.com\\n\\n// eero\\n// Submitted by Yue Kang <eero-dynamic-dns@amazon.com>\\n// Reference: 264afe70-f62c-4c02-8ab9-b5281ed24461\\neero.online\\neero-stage.online\\n\\n// concludes Amazon\\n\\n// Amune : https://amune.org/\\n// Submitted by Team Amune <cert@amune.org>\\nt3l3p0rt.net\\ntele.amune.org\\n\\n// Apigee : https://apigee.com/\\n// Submitted by Apigee Security Team <security@apigee.com>\\napigee.io\\n\\n// Apphud : https://apphud.com\\n// Submitted by Alexander Selivanov <alex@apphud.com>\\nsiiites.com\\n\\n// Appspace : https://www.appspace.com\\n// Submitted by Appspace Security Team <security@appspace.com>\\nappspacehosted.com\\nappspaceusercontent.com\\n\\n// Appudo UG (haftungsbeschränkt) : https://www.appudo.com\\n// Submitted by Alexander Hochbaum <admin@appudo.com>\\nappudo.net\\n\\n// Aptible : https://www.aptible.com/\\n// Submitted by Thomas Orozco <thomas@aptible.com>\\non-aptible.com\\n\\n// ASEINet : https://www.aseinet.com/\\n// Submitted by Asei SEKIGUCHI <mail@aseinet.com>\\nuser.aseinet.ne.jp\\ngv.vc\\nd.gv.vc\\n\\n// Asociación Amigos de la Informática \"Euskalamiga\" : http://encounter.eus/\\n// Submitted by Hector Martin <marcan@euskalencounter.org>\\nuser.party.eus\\n\\n// Association potager.org : https://potager.org/\\n// Submitted by Lunar <jardiniers@potager.org>\\npimienta.org\\npoivron.org\\npotager.org\\nsweetpepper.org\\n\\n// ASUSTOR Inc. : http://www.asustor.com\\n// Submitted by Vincent Tseng <vincenttseng@asustor.com>\\nmyasustor.com\\n\\n// Atlassian : https://atlassian.com\\n// Submitted by Sam Smyth <devloop@atlassian.com>\\ncdn.prod.atlassian-dev.net\\n\\n// Authentick UG (haftungsbeschränkt) : https://authentick.net\\n// Submitted by Lukas Reschke <lukas@authentick.net>\\ntranslated.page\\n\\n// Autocode : https://autocode.com\\n// Submitted by Jacob Lee <jacob@autocode.com>\\nautocode.dev\\n\\n// AVM : https://avm.de\\n// Submitted by Andreas Weise <a.weise@avm.de>\\nmyfritz.net\\n\\n// AVStack Pte. Ltd. : https://avstack.io\\n// Submitted by Jasper Hugo <jasper@avstack.io>\\nonavstack.net\\n\\n// AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com\\n// Submitted by James Kennedy <domains@advisorwebsites.com>\\n*.awdev.ca\\n*.advisor.ws\\n\\n// AZ.pl sp. z.o.o: https://az.pl\\n// Submitted by Krzysztof Wolski <krzysztof.wolski@home.eu>\\necommerce-shop.pl\\n\\n// b-data GmbH : https://www.b-data.io\\n// Submitted by Olivier Benz <olivier.benz@b-data.ch>\\nb-data.io\\n\\n// backplane : https://www.backplane.io\\n// Submitted by Anthony Voutas <anthony@backplane.io>\\nbackplaneapp.io\\n\\n// Balena : https://www.balena.io\\n// Submitted by Petros Angelatos <petrosagg@balena.io>\\nbalena-devices.com\\n\\n// University of Banja Luka : https://unibl.org\\n// Domains for Republic of Srpska administrative entity.\\n// Submitted by Marko Ivanovic <kormang@hotmail.rs>\\nrs.ba\\n\\n// Banzai Cloud\\n// Submitted by Janos Matyas <info@banzaicloud.com>\\n*.banzai.cloud\\napp.banzaicloud.io\\n*.backyards.banzaicloud.io\\n\\n// BASE, Inc. : https://binc.jp\\n// Submitted by Yuya NAGASAWA <public-suffix-list@binc.jp>\\nbase.ec\\nofficial.ec\\nbuyshop.jp\\nfashionstore.jp\\nhandcrafted.jp\\nkawaiishop.jp\\nsupersale.jp\\ntheshop.jp\\nshopselect.net\\nbase.shop\\n\\n// BeagleBoard.org Foundation : https://beagleboard.org\\n// Submitted by Jason Kridner <jkridner@beagleboard.org>\\nbeagleboard.io\\n\\n// Beget Ltd\\n// Submitted by Lev Nekrasov <lnekrasov@beget.com>\\n*.beget.app\\n\\n// BetaInABox\\n// Submitted by Adrian <adrian@betainabox.com>\\nbetainabox.com\\n\\n// BinaryLane : http://www.binarylane.com\\n// Submitted by Nathan O\\'Sullivan <nathan@mammoth.com.au>\\nbnr.la\\n\\n// Bitbucket : http://bitbucket.org\\n// Submitted by Andy Ortlieb <aortlieb@atlassian.com>\\nbitbucket.io\\n\\n// Blackbaud, Inc. : https://www.blackbaud.com\\n// Submitted by Paul Crowder <paul.crowder@blackbaud.com>\\nblackbaudcdn.net\\n\\n// Blatech : http://www.blatech.net\\n// Submitted by Luke Bratch <luke@bratch.co.uk>\\nof.je\\n\\n// Blue Bite, LLC : https://bluebite.com\\n// Submitted by Joshua Weiss <admin.engineering@bluebite.com>\\nbluebite.io\\n\\n// Boomla : https://boomla.com\\n// Submitted by Tibor Halter <thalter@boomla.com>\\nboomla.net\\n\\n// Boutir : https://www.boutir.com\\n// Submitted by Eric Ng Ka Ka <ngkaka@boutir.com>\\nboutir.com\\n\\n// Boxfuse : https://boxfuse.com\\n// Submitted by Axel Fontaine <axel@boxfuse.com>\\nboxfuse.io\\n\\n// bplaced : https://www.bplaced.net/\\n// Submitted by Miroslav Bozic <security@bplaced.net>\\nsquare7.ch\\nbplaced.com\\nbplaced.de\\nsquare7.de\\nbplaced.net\\nsquare7.net\\n\\n// Brendly : https://brendly.rs\\n// Submitted by Dusan Radovanovic <dusan.radovanovic@brendly.rs>\\nshop.brendly.rs\\n\\n// BrowserSafetyMark\\n// Submitted by Dave Tharp <browsersafetymark.io@quicinc.com>\\nbrowsersafetymark.io\\n\\n// Bytemark Hosting : https://www.bytemark.co.uk\\n// Submitted by Paul Cammish <paul.cammish@bytemark.co.uk>\\nuk0.bigv.io\\ndh.bytemark.co.uk\\nvm.bytemark.co.uk\\n\\n// Caf.js Labs LLC : https://www.cafjs.com\\n// Submitted by Antonio Lain <antlai@cafjs.com>\\ncafjs.com\\n\\n// callidomus : https://www.callidomus.com/\\n// Submitted by Marcus Popp <admin@callidomus.com>\\nmycd.eu\\n\\n// Canva Pty Ltd : https://canva.com/\\n// Submitted by Joel Aquilina <publicsuffixlist@canva.com>\\ncanva-apps.cn\\ncanva-apps.com\\n\\n// Carrd : https://carrd.co\\n// Submitted by AJ <aj@carrd.co>\\ndrr.ac\\nuwu.ai\\ncarrd.co\\ncrd.co\\nju.mp\\n\\n// CentralNic : http://www.centralnic.com/names/domains\\n// Submitted by registry <gavin.brown@centralnic.com>\\nae.org\\nbr.com\\ncn.com\\ncom.de\\ncom.se\\nde.com\\neu.com\\ngb.net\\nhu.net\\njp.net\\njpn.com\\nmex.com\\nru.com\\nsa.com\\nse.net\\nuk.com\\nuk.net\\nus.com\\nza.bz\\nza.com\\n\\n// No longer operated by CentralNic, these entries should be adopted and/or removed by current operators\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nar.com\\nhu.com\\nkr.com\\nno.com\\nqc.com\\nuy.com\\n\\n// Africa.com Web Solutions Ltd : https://registry.africa.com\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nafrica.com\\n\\n// iDOT Services Limited : http://www.domain.gr.com\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\ngr.com\\n\\n// Radix FZC : http://domains.in.net\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nin.net\\nweb.in\\n\\n// US REGISTRY LLC : http://us.org\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nus.org\\n\\n// co.com Registry, LLC : https://registry.co.com\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nco.com\\n\\n// Roar Domains LLC : https://roar.basketball/\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\naus.basketball\\nnz.basketball\\n\\n// BRS Media : https://brsmedia.com/\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nradio.am\\nradio.fm\\n\\n// c.la : http://www.c.la/\\nc.la\\n\\n// certmgr.org : https://certmgr.org\\n// Submitted by B. Blechschmidt <hostmaster@certmgr.org>\\ncertmgr.org\\n\\n// Cityhost LLC  : https://cityhost.ua\\n// Submitted by Maksym Rivtin <support@cityhost.net.ua>\\ncx.ua\\n\\n// Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/\\n// Submitted by Rishabh Nambiar & Michael Brown <team@discourse.org>\\ndiscourse.group\\ndiscourse.team\\n\\n// Clever Cloud : https://www.clever-cloud.com/\\n// Submitted by Quentin Adam <noc@clever-cloud.com>\\ncleverapps.io\\n\\n// Clerk : https://www.clerk.dev\\n// Submitted by Colin Sidoti <systems@clerk.dev>\\nclerk.app\\nclerkstage.app\\n*.lcl.dev\\n*.lclstage.dev\\n*.stg.dev\\n*.stgstage.dev\\n\\n// ClickRising : https://clickrising.com/\\n// Submitted by Umut Gumeli <infrastructure-publicsuffixlist@clickrising.com>\\nclickrising.net\\n\\n// Cloud66 : https://www.cloud66.com/\\n// Submitted by Khash Sajadi <khash@cloud66.com>\\nc66.me\\ncloud66.ws\\ncloud66.zone\\n\\n// CloudAccess.net : https://www.cloudaccess.net/\\n// Submitted by Pawel Panek <noc@cloudaccess.net>\\njdevcloud.com\\nwpdevcloud.com\\ncloudaccess.host\\nfreesite.host\\ncloudaccess.net\\n\\n// cloudControl : https://www.cloudcontrol.com/\\n// Submitted by Tobias Wilken <tw@cloudcontrol.com>\\ncloudcontrolled.com\\ncloudcontrolapp.com\\n\\n// Cloudera, Inc. : https://www.cloudera.com/\\n// Submitted by Kedarnath Waikar <security@cloudera.com>\\n*.cloudera.site\\n\\n// Cloudflare, Inc. : https://www.cloudflare.com/\\n// Submitted by Cloudflare Team <publicsuffixlist@cloudflare.com>\\ncf-ipfs.com\\ncloudflare-ipfs.com\\ntrycloudflare.com\\npages.dev\\nr2.dev\\nworkers.dev\\n\\n// Clovyr : https://clovyr.io\\n// Submitted by Patrick Nielsen <patrick@clovyr.io>\\nwnext.app\\n\\n// co.ca : http://registry.co.ca/\\nco.ca\\n\\n// Co & Co : https://co-co.nl/\\n// Submitted by Govert Versluis <govert@co-co.nl>\\n*.otap.co\\n\\n// i-registry s.r.o. : http://www.i-registry.cz/\\n// Submitted by Martin Semrad <semrad@i-registry.cz>\\nco.cz\\n\\n// CDN77.com : http://www.cdn77.com\\n// Submitted by Jan Krpes <jan.krpes@cdn77.com>\\nc.cdn77.org\\ncdn77-ssl.net\\nr.cdn77.net\\nrsc.cdn77.org\\nssl.origin.cdn77-secure.org\\n\\n// Cloud DNS Ltd : http://www.cloudns.net\\n// Submitted by Aleksander Hristov <noc@cloudns.net>\\ncloudns.asia\\ncloudns.biz\\ncloudns.club\\ncloudns.cc\\ncloudns.eu\\ncloudns.in\\ncloudns.info\\ncloudns.org\\ncloudns.pro\\ncloudns.pw\\ncloudns.us\\n\\n// CNPY : https://cnpy.gdn\\n// Submitted by Angelo Gladding <angelo@lahacker.net>\\ncnpy.gdn\\n\\n// Codeberg e. V. : https://codeberg.org\\n// Submitted by Moritz Marquardt <git@momar.de>\\ncodeberg.page\\n\\n// CoDNS B.V.\\nco.nl\\nco.no\\n\\n// Combell.com : https://www.combell.com\\n// Submitted by Thomas Wouters <thomas.wouters@combellgroup.com>\\nwebhosting.be\\nhosting-cluster.nl\\n\\n// Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/\\n// Submitted by George Georgievsky <gug@cctld.ru>\\nac.ru\\nedu.ru\\ngov.ru\\nint.ru\\nmil.ru\\ntest.ru\\n\\n// COSIMO GmbH : http://www.cosimo.de\\n// Submitted by Rene Marticke <rmarticke@cosimo.de>\\ndyn.cosidns.de\\ndynamisches-dns.de\\ndnsupdater.de\\ninternet-dns.de\\nl-o-g-i-n.de\\ndynamic-dns.info\\nfeste-ip.net\\nknx-server.net\\nstatic-access.net\\n\\n// Craynic, s.r.o. : http://www.craynic.com/\\n// Submitted by Ales Krajnik <ales.krajnik@craynic.com>\\nrealm.cz\\n\\n// Cryptonomic : https://cryptonomic.net/\\n// Submitted by Andrew Cady <public-suffix-list@cryptonomic.net>\\n*.cryptonomic.net\\n\\n// Cupcake : https://cupcake.io/\\n// Submitted by Jonathan Rudenberg <jonathan@cupcake.io>\\ncupcake.is\\n\\n// Curv UG : https://curv-labs.de/\\n// Submitted by Marvin Wiesner <Marvin@curv-labs.de>\\ncurv.dev\\n\\n// Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/\\n// Submitted by Gregory Drake <support@dyn.com>\\n// Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label\\n*.customer-oci.com\\n*.oci.customer-oci.com\\n*.ocp.customer-oci.com\\n*.ocs.customer-oci.com\\n\\n// cyon GmbH : https://www.cyon.ch/\\n// Submitted by Dominic Luechinger <dol@cyon.ch>\\ncyon.link\\ncyon.site\\n\\n// Danger Science Group: https://dangerscience.com/\\n// Submitted by Skylar MacDonald <skylar@dangerscience.com>\\nfnwk.site\\nfolionetwork.site\\nplatform0.app\\n\\n// Daplie, Inc : https://daplie.com\\n// Submitted by AJ ONeal <aj@daplie.com>\\ndaplie.me\\nlocalhost.daplie.me\\n\\n// Datto, Inc. : https://www.datto.com/\\n// Submitted by Philipp Heckel <ph@datto.com>\\ndattolocal.com\\ndattorelay.com\\ndattoweb.com\\nmydatto.com\\ndattolocal.net\\nmydatto.net\\n\\n// Dansk.net : http://www.dansk.net/\\n// Submitted by Anani Voule <digital@digital.co.dk>\\nbiz.dk\\nco.dk\\nfirm.dk\\nreg.dk\\nstore.dk\\n\\n// dappnode.io : https://dappnode.io/\\n// Submitted by Abel Boldu / DAppNode Team <community@dappnode.io>\\ndyndns.dappnode.io\\n\\n// dapps.earth : https://dapps.earth/\\n// Submitted by Daniil Burdakov <icqkill@gmail.com>\\n*.dapps.earth\\n*.bzz.dapps.earth\\n\\n// Dark, Inc. : https://darklang.com\\n// Submitted by Paul Biggar <ops@darklang.com>\\nbuiltwithdark.com\\n\\n// DataDetect, LLC. : https://datadetect.com\\n// Submitted by Andrew Banchich <abanchich@sceven.com>\\ndemo.datadetect.com\\ninstance.datadetect.com\\n\\n// Datawire, Inc : https://www.datawire.io\\n// Submitted by Richard Li <secalert@datawire.io>\\nedgestack.me\\n\\n// DDNS5 : https://ddns5.com\\n// Submitted by Cameron Elliott <cameron@cameronelliott.com>\\nddns5.com\\n\\n// Debian : https://www.debian.org/\\n// Submitted by Peter Palfrader / Debian Sysadmin Team <dsa-publicsuffixlist@debian.org>\\ndebian.net\\n\\n// Deno Land Inc : https://deno.com/\\n// Submitted by Luca Casonato <hostmaster@deno.com>\\ndeno.dev\\ndeno-staging.dev\\n\\n// deSEC : https://desec.io/\\n// Submitted by Peter Thomassen <peter@desec.io>\\ndedyn.io\\n\\n// Deta: https://www.deta.sh/\\n// Submitted by Aavash Shrestha <aavash@deta.sh>\\ndeta.app\\ndeta.dev\\n\\n// Diher Solutions : https://diher.solutions\\n// Submitted by Didi Hermawan <mail@diher.solutions>\\n*.rss.my.id\\n*.diher.solutions\\n\\n// Discord Inc : https://discord.com\\n// Submitted by Sahn Lam <slam@discordapp.com>\\ndiscordsays.com\\ndiscordsez.com\\n\\n// DNS Africa Ltd https://dns.business\\n// Submitted by Calvin Browne <calvin@dns.business>\\njozi.biz\\n\\n// DNShome : https://www.dnshome.de/\\n// Submitted by Norbert Auler <mail@dnshome.de>\\ndnshome.de\\n\\n// DotArai : https://www.dotarai.com/\\n// Submitted by Atsadawat Netcharadsang <atsadawat@dotarai.co.th>\\nonline.th\\nshop.th\\n\\n// DrayTek Corp. : https://www.draytek.com/\\n// Submitted by Paul Fang <mis@draytek.com>\\ndrayddns.com\\n\\n// DreamCommerce : https://shoper.pl/\\n// Submitted by Konrad Kotarba <konrad.kotarba@dreamcommerce.com>\\nshoparena.pl\\n\\n// DreamHost : http://www.dreamhost.com/\\n// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com>\\ndreamhosters.com\\n\\n// Drobo : http://www.drobo.com/\\n// Submitted by Ricardo Padilha <rpadilha@drobo.com>\\nmydrobo.com\\n\\n// Drud Holdings, LLC. : https://www.drud.com/\\n// Submitted by Kevin Bridges <kevin@drud.com>\\ndrud.io\\ndrud.us\\n\\n// DuckDNS : http://www.duckdns.org/\\n// Submitted by Richard Harper <richard@duckdns.org>\\nduckdns.org\\n\\n// Bip : https://bip.sh\\n// Submitted by Joel Kennedy <joel@bip.sh>\\nbip.sh\\n\\n// bitbridge.net : Submitted by Craig Welch, abeliidev@gmail.com\\nbitbridge.net\\n\\n// dy.fi : http://dy.fi/\\n// Submitted by Heikki Hannikainen <hessu@hes.iki.fi>\\ndy.fi\\ntunk.org\\n\\n// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/\\ndyndns-at-home.com\\ndyndns-at-work.com\\ndyndns-blog.com\\ndyndns-free.com\\ndyndns-home.com\\ndyndns-ip.com\\ndyndns-mail.com\\ndyndns-office.com\\ndyndns-pics.com\\ndyndns-remote.com\\ndyndns-server.com\\ndyndns-web.com\\ndyndns-wiki.com\\ndyndns-work.com\\ndyndns.biz\\ndyndns.info\\ndyndns.org\\ndyndns.tv\\nat-band-camp.net\\nath.cx\\nbarrel-of-knowledge.info\\nbarrell-of-knowledge.info\\nbetter-than.tv\\nblogdns.com\\nblogdns.net\\nblogdns.org\\nblogsite.org\\nboldlygoingnowhere.org\\nbroke-it.net\\nbuyshouses.net\\ncechire.com\\ndnsalias.com\\ndnsalias.net\\ndnsalias.org\\ndnsdojo.com\\ndnsdojo.net\\ndnsdojo.org\\ndoes-it.net\\ndoesntexist.com\\ndoesntexist.org\\ndontexist.com\\ndontexist.net\\ndontexist.org\\ndoomdns.com\\ndoomdns.org\\ndvrdns.org\\ndyn-o-saur.com\\ndynalias.com\\ndynalias.net\\ndynalias.org\\ndynathome.net\\ndyndns.ws\\nendofinternet.net\\nendofinternet.org\\nendoftheinternet.org\\nest-a-la-maison.com\\nest-a-la-masion.com\\nest-le-patron.com\\nest-mon-blogueur.com\\nfor-better.biz\\nfor-more.biz\\nfor-our.info\\nfor-some.biz\\nfor-the.biz\\nforgot.her.name\\nforgot.his.name\\nfrom-ak.com\\nfrom-al.com\\nfrom-ar.com\\nfrom-az.net\\nfrom-ca.com\\nfrom-co.net\\nfrom-ct.com\\nfrom-dc.com\\nfrom-de.com\\nfrom-fl.com\\nfrom-ga.com\\nfrom-hi.com\\nfrom-ia.com\\nfrom-id.com\\nfrom-il.com\\nfrom-in.com\\nfrom-ks.com\\nfrom-ky.com\\nfrom-la.net\\nfrom-ma.com\\nfrom-md.com\\nfrom-me.org\\nfrom-mi.com\\nfrom-mn.com\\nfrom-mo.com\\nfrom-ms.com\\nfrom-mt.com\\nfrom-nc.com\\nfrom-nd.com\\nfrom-ne.com\\nfrom-nh.com\\nfrom-nj.com\\nfrom-nm.com\\nfrom-nv.com\\nfrom-ny.net\\nfrom-oh.com\\nfrom-ok.com\\nfrom-or.com\\nfrom-pa.com\\nfrom-pr.com\\nfrom-ri.com\\nfrom-sc.com\\nfrom-sd.com\\nfrom-tn.com\\nfrom-tx.com\\nfrom-ut.com\\nfrom-va.com\\nfrom-vt.com\\nfrom-wa.com\\nfrom-wi.com\\nfrom-wv.com\\nfrom-wy.com\\nftpaccess.cc\\nfuettertdasnetz.de\\ngame-host.org\\ngame-server.cc\\ngetmyip.com\\ngets-it.net\\ngo.dyndns.org\\ngotdns.com\\ngotdns.org\\ngroks-the.info\\ngroks-this.info\\nham-radio-op.net\\nhere-for-more.info\\nhobby-site.com\\nhobby-site.org\\nhome.dyndns.org\\nhomedns.org\\nhomeftp.net\\nhomeftp.org\\nhomeip.net\\nhomelinux.com\\nhomelinux.net\\nhomelinux.org\\nhomeunix.com\\nhomeunix.net\\nhomeunix.org\\niamallama.com\\nin-the-band.net\\nis-a-anarchist.com\\nis-a-blogger.com\\nis-a-bookkeeper.com\\nis-a-bruinsfan.org\\nis-a-bulls-fan.com\\nis-a-candidate.org\\nis-a-caterer.com\\nis-a-celticsfan.org\\nis-a-chef.com\\nis-a-chef.net\\nis-a-chef.org\\nis-a-conservative.com\\nis-a-cpa.com\\nis-a-cubicle-slave.com\\nis-a-democrat.com\\nis-a-designer.com\\nis-a-doctor.com\\nis-a-financialadvisor.com\\nis-a-geek.com\\nis-a-geek.net\\nis-a-geek.org\\nis-a-green.com\\nis-a-guru.com\\nis-a-hard-worker.com\\nis-a-hunter.com\\nis-a-knight.org\\nis-a-landscaper.com\\nis-a-lawyer.com\\nis-a-liberal.com\\nis-a-libertarian.com\\nis-a-linux-user.org\\nis-a-llama.com\\nis-a-musician.com\\nis-a-nascarfan.com\\nis-a-nurse.com\\nis-a-painter.com\\nis-a-patsfan.org\\nis-a-personaltrainer.com\\nis-a-photographer.com\\nis-a-player.com\\nis-a-republican.com\\nis-a-rockstar.com\\nis-a-socialist.com\\nis-a-soxfan.org\\nis-a-student.com\\nis-a-teacher.com\\nis-a-techie.com\\nis-a-therapist.com\\nis-an-accountant.com\\nis-an-actor.com\\nis-an-actress.com\\nis-an-anarchist.com\\nis-an-artist.com\\nis-an-engineer.com\\nis-an-entertainer.com\\nis-by.us\\nis-certified.com\\nis-found.org\\nis-gone.com\\nis-into-anime.com\\nis-into-cars.com\\nis-into-cartoons.com\\nis-into-games.com\\nis-leet.com\\nis-lost.org\\nis-not-certified.com\\nis-saved.org\\nis-slick.com\\nis-uberleet.com\\nis-very-bad.org\\nis-very-evil.org\\nis-very-good.org\\nis-very-nice.org\\nis-very-sweet.org\\nis-with-theband.com\\nisa-geek.com\\nisa-geek.net\\nisa-geek.org\\nisa-hockeynut.com\\nissmarterthanyou.com\\nisteingeek.de\\nistmein.de\\nkicks-ass.net\\nkicks-ass.org\\nknowsitall.info\\nland-4-sale.us\\nlebtimnetz.de\\nleitungsen.de\\nlikes-pie.com\\nlikescandy.com\\nmerseine.nu\\nmine.nu\\nmisconfused.org\\nmypets.ws\\nmyphotos.cc\\nneat-url.com\\noffice-on-the.net\\non-the-web.tv\\npodzone.net\\npodzone.org\\nreadmyblog.org\\nsaves-the-whales.com\\nscrapper-site.net\\nscrapping.cc\\nselfip.biz\\nselfip.com\\nselfip.info\\nselfip.net\\nselfip.org\\nsells-for-less.com\\nsells-for-u.com\\nsells-it.net\\nsellsyourhome.org\\nservebbs.com\\nservebbs.net\\nservebbs.org\\nserveftp.net\\nserveftp.org\\nservegame.org\\nshacknet.nu\\nsimple-url.com\\nspace-to-rent.com\\nstuff-4-sale.org\\nstuff-4-sale.us\\nteaches-yoga.com\\nthruhere.net\\ntraeumtgerade.de\\nwebhop.biz\\nwebhop.info\\nwebhop.net\\nwebhop.org\\nworse-than.tv\\nwritesthisblog.com\\n\\n// ddnss.de : https://www.ddnss.de/\\n// Submitted by Robert Niedziela <webmaster@ddnss.de>\\nddnss.de\\ndyn.ddnss.de\\ndyndns.ddnss.de\\ndyndns1.de\\ndyn-ip24.de\\nhome-webserver.de\\ndyn.home-webserver.de\\nmyhome-server.de\\nddnss.org\\n\\n// Definima : http://www.definima.com/\\n// Submitted by Maxence Bitterli <maxence@definima.com>\\ndefinima.net\\ndefinima.io\\n\\n// DigitalOcean App Platform : https://www.digitalocean.com/products/app-platform/\\n// Submitted by Braxton Huggins <psl-maintainers@digitalocean.com>\\nondigitalocean.app\\n\\n// DigitalOcean Spaces : https://www.digitalocean.com/products/spaces/\\n// Submitted by Robin H. Johnson <psl-maintainers@digitalocean.com>\\n*.digitaloceanspaces.com\\n\\n// dnstrace.pro : https://dnstrace.pro/\\n// Submitted by Chris Partridge <chris@partridge.tech>\\nbci.dnstrace.pro\\n\\n// Dynu.com : https://www.dynu.com/\\n// Submitted by Sue Ye <sue@dynu.com>\\nddnsfree.com\\nddnsgeek.com\\ngiize.com\\ngleeze.com\\nkozow.com\\nloseyourip.com\\nooguy.com\\ntheworkpc.com\\ncasacam.net\\ndynu.net\\naccesscam.org\\ncamdvr.org\\nfreeddns.org\\nmywire.org\\nwebredirect.org\\nmyddns.rocks\\nblogsite.xyz\\n\\n// dynv6 : https://dynv6.com\\n// Submitted by Dominik Menke <dom@digineo.de>\\ndynv6.net\\n\\n// E4YOU spol. s.r.o. : https://e4you.cz/\\n// Submitted by Vladimir Dudr <info@e4you.cz>\\ne4.cz\\n\\n// Easypanel : https://easypanel.io\\n// Submitted by Andrei Canta <andrei@easypanel.io>\\neasypanel.app\\neasypanel.host\\n\\n// Elementor : Elementor Ltd.\\n// Submitted by Anton Barkan <antonb@elementor.com>\\nelementor.cloud\\nelementor.cool\\n\\n// En root‽ : https://en-root.org\\n// Submitted by Emmanuel Raviart <emmanuel@raviart.com>\\nen-root.fr\\n\\n// Enalean SAS: https://www.enalean.com\\n// Submitted by Thomas Cottier <thomas.cottier@enalean.com>\\nmytuleap.com\\ntuleap-partners.com\\n\\n// Encoretivity AB: https://encore.dev\\n// Submitted by André Eriksson <andre@encore.dev>\\nencr.app\\nencoreapi.com\\n\\n// ECG Robotics, Inc: https://ecgrobotics.org\\n// Submitted by <frc1533@ecgrobotics.org>\\nonred.one\\nstaging.onred.one\\n\\n// encoway GmbH : https://www.encoway.de\\n// Submitted by Marcel Daus <cloudops@encoway.de>\\neu.encoway.cloud\\n\\n// EU.org https://eu.org/\\n// Submitted by Pierre Beyssac <hostmaster@eu.org>\\neu.org\\nal.eu.org\\nasso.eu.org\\nat.eu.org\\nau.eu.org\\nbe.eu.org\\nbg.eu.org\\nca.eu.org\\ncd.eu.org\\nch.eu.org\\ncn.eu.org\\ncy.eu.org\\ncz.eu.org\\nde.eu.org\\ndk.eu.org\\nedu.eu.org\\nee.eu.org\\nes.eu.org\\nfi.eu.org\\nfr.eu.org\\ngr.eu.org\\nhr.eu.org\\nhu.eu.org\\nie.eu.org\\nil.eu.org\\nin.eu.org\\nint.eu.org\\nis.eu.org\\nit.eu.org\\njp.eu.org\\nkr.eu.org\\nlt.eu.org\\nlu.eu.org\\nlv.eu.org\\nmc.eu.org\\nme.eu.org\\nmk.eu.org\\nmt.eu.org\\nmy.eu.org\\nnet.eu.org\\nng.eu.org\\nnl.eu.org\\nno.eu.org\\nnz.eu.org\\nparis.eu.org\\npl.eu.org\\npt.eu.org\\nq-a.eu.org\\nro.eu.org\\nru.eu.org\\nse.eu.org\\nsi.eu.org\\nsk.eu.org\\ntr.eu.org\\nuk.eu.org\\nus.eu.org\\n\\n// Eurobyte : https://eurobyte.ru\\n// Submitted by Evgeniy Subbotin <e.subbotin@eurobyte.ru>\\neurodir.ru\\n\\n// Evennode : http://www.evennode.com/\\n// Submitted by Michal Kralik <support@evennode.com>\\neu-1.evennode.com\\neu-2.evennode.com\\neu-3.evennode.com\\neu-4.evennode.com\\nus-1.evennode.com\\nus-2.evennode.com\\nus-3.evennode.com\\nus-4.evennode.com\\n\\n// eDirect Corp. : https://hosting.url.com.tw/\\n// Submitted by C.S. chang <cschang@corp.url.com.tw>\\ntwmail.cc\\ntwmail.net\\ntwmail.org\\nmymailer.com.tw\\nurl.tw\\n\\n// Fabrica Technologies, Inc. : https://www.fabrica.dev/\\n// Submitted by Eric Jiang <eric@fabrica.dev>\\nonfabrica.com\\n\\n// Facebook, Inc.\\n// Submitted by Peter Ruibal <public-suffix@fb.com>\\napps.fbsbx.com\\n\\n// FAITID : https://faitid.org/\\n// Submitted by Maxim Alzoba <tech.contact@faitid.org>\\n// https://www.flexireg.net/stat_info\\nru.net\\nadygeya.ru\\nbashkiria.ru\\nbir.ru\\ncbg.ru\\ncom.ru\\ndagestan.ru\\ngrozny.ru\\nkalmykia.ru\\nkustanai.ru\\nmarine.ru\\nmordovia.ru\\nmsk.ru\\nmytis.ru\\nnalchik.ru\\nnov.ru\\npyatigorsk.ru\\nspb.ru\\nvladikavkaz.ru\\nvladimir.ru\\nabkhazia.su\\nadygeya.su\\naktyubinsk.su\\narkhangelsk.su\\narmenia.su\\nashgabad.su\\nazerbaijan.su\\nbalashov.su\\nbashkiria.su\\nbryansk.su\\nbukhara.su\\nchimkent.su\\ndagestan.su\\neast-kazakhstan.su\\nexnet.su\\ngeorgia.su\\ngrozny.su\\nivanovo.su\\njambyl.su\\nkalmykia.su\\nkaluga.su\\nkaracol.su\\nkaraganda.su\\nkarelia.su\\nkhakassia.su\\nkrasnodar.su\\nkurgan.su\\nkustanai.su\\nlenug.su\\nmangyshlak.su\\nmordovia.su\\nmsk.su\\nmurmansk.su\\nnalchik.su\\nnavoi.su\\nnorth-kazakhstan.su\\nnov.su\\nobninsk.su\\npenza.su\\npokrovsk.su\\nsochi.su\\nspb.su\\ntashkent.su\\ntermez.su\\ntogliatti.su\\ntroitsk.su\\ntselinograd.su\\ntula.su\\ntuva.su\\nvladikavkaz.su\\nvladimir.su\\nvologda.su\\n\\n// Fancy Bits, LLC : http://getchannels.com\\n// Submitted by Aman Gupta <aman@getchannels.com>\\nchannelsdvr.net\\nu.channelsdvr.net\\n\\n// Fastly Inc. : http://www.fastly.com/\\n// Submitted by Fastly Security <security@fastly.com>\\nedgecompute.app\\nfastly-edge.com\\nfastly-terrarium.com\\nfastlylb.net\\nmap.fastlylb.net\\nfreetls.fastly.net\\nmap.fastly.net\\na.prod.fastly.net\\nglobal.prod.fastly.net\\na.ssl.fastly.net\\nb.ssl.fastly.net\\nglobal.ssl.fastly.net\\n\\n// Fastmail : https://www.fastmail.com/\\n// Submitted by Marc Bradshaw <marc@fastmailteam.com>\\n*.user.fm\\n\\n// FASTVPS EESTI OU : https://fastvps.ru/\\n// Submitted by Likhachev Vasiliy <lihachev@fastvps.ru>\\nfastvps-server.com\\nfastvps.host\\nmyfast.host\\nfastvps.site\\nmyfast.space\\n\\n// Fedora : https://fedoraproject.org/\\n// submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org>\\nfedorainfracloud.org\\nfedorapeople.org\\ncloud.fedoraproject.org\\napp.os.fedoraproject.org\\napp.os.stg.fedoraproject.org\\n\\n// FearWorks Media Ltd. : https://fearworksmedia.co.uk\\n// submitted by Keith Fairley <domains@fearworksmedia.co.uk>\\nconn.uk\\ncopro.uk\\nhosp.uk\\n\\n// Fermax : https://fermax.com/\\n// submitted by Koen Van Isterdael <k.vanisterdael@fermax.be>\\nmydobiss.com\\n\\n// FH Muenster : https://www.fh-muenster.de\\n// Submitted by Robin Naundorf <r.naundorf@fh-muenster.de>\\nfh-muenster.io\\n\\n// Filegear Inc. : https://www.filegear.com\\n// Submitted by Jason Zhu <jason@owtware.com>\\nfilegear.me\\nfilegear-au.me\\nfilegear-de.me\\nfilegear-gb.me\\nfilegear-ie.me\\nfilegear-jp.me\\nfilegear-sg.me\\n\\n// Firebase, Inc.\\n// Submitted by Chris Raynor <chris@firebase.com>\\nfirebaseapp.com\\n\\n// Firewebkit : https://www.firewebkit.com\\n// Submitted by Majid Qureshi <mqureshi@amrayn.com>\\nfireweb.app\\n\\n// FLAP : https://www.flap.cloud\\n// Submitted by Louis Chemineau <louis@chmn.me>\\nflap.id\\n\\n// FlashDrive : https://flashdrive.io\\n// Submitted by Eric Chan <support@flashdrive.io>\\nonflashdrive.app\\nfldrv.com\\n\\n// fly.io: https://fly.io\\n// Submitted by Kurt Mackey <kurt@fly.io>\\nfly.dev\\nedgeapp.net\\nshw.io\\n\\n// Flynn : https://flynn.io\\n// Submitted by Jonathan Rudenberg <jonathan@flynn.io>\\nflynnhosting.net\\n\\n// Forgerock : https://www.forgerock.com\\n// Submitted by Roderick Parr <roderick.parr@forgerock.com>\\nforgeblocks.com\\nid.forgerock.io\\n\\n// Framer : https://www.framer.com\\n// Submitted by Koen Rouwhorst <koenrh@framer.com>\\nframer.app\\nframercanvas.com\\nframer.media\\nframer.photos\\nframer.website\\nframer.wiki\\n\\n// Frusky MEDIA&PR : https://www.frusky.de\\n// Submitted by Victor Pupynin <hallo@frusky.de>\\n*.frusky.de\\n\\n// RavPage : https://www.ravpage.co.il\\n// Submitted by Roni Horowitz <roni@responder.co.il>\\nravpage.co.il\\n\\n// Frederik Braun https://frederik-braun.com\\n// Submitted by Frederik Braun <fb@frederik-braun.com>\\n0e.vc\\n\\n// Freebox : http://www.freebox.fr\\n// Submitted by Romain Fliedel <rfliedel@freebox.fr>\\nfreebox-os.com\\nfreeboxos.com\\nfbx-os.fr\\nfbxos.fr\\nfreebox-os.fr\\nfreeboxos.fr\\n\\n// freedesktop.org : https://www.freedesktop.org\\n// Submitted by Daniel Stone <daniel@fooishbar.org>\\nfreedesktop.org\\n\\n// freemyip.com : https://freemyip.com\\n// Submitted by Cadence <contact@freemyip.com>\\nfreemyip.com\\n\\n// FunkFeuer - Verein zur Förderung freier Netze : https://www.funkfeuer.at\\n// Submitted by Daniel A. Maierhofer <vorstand@funkfeuer.at>\\nwien.funkfeuer.at\\n\\n// Futureweb OG : http://www.futureweb.at\\n// Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at>\\n*.futurecms.at\\n*.ex.futurecms.at\\n*.in.futurecms.at\\nfuturehosting.at\\nfuturemailing.at\\n*.ex.ortsinfo.at\\n*.kunden.ortsinfo.at\\n*.statics.cloud\\n\\n// GDS : https://www.gov.uk/service-manual/technology/managing-domain-names\\n// Submitted by Stephen Ford <hostmaster@digital.cabinet-office.gov.uk>\\nindependent-commission.uk\\nindependent-inquest.uk\\nindependent-inquiry.uk\\nindependent-panel.uk\\nindependent-review.uk\\npublic-inquiry.uk\\nroyal-commission.uk\\ncampaign.gov.uk\\nservice.gov.uk\\n\\n// CDDO : https://www.gov.uk/guidance/get-an-api-domain-on-govuk\\n// Submitted by Jamie Tanna <jamie.tanna@digital.cabinet-office.gov.uk>\\napi.gov.uk\\n\\n// Gehirn Inc. : https://www.gehirn.co.jp/\\n// Submitted by Kohei YOSHIDA <tech@gehirn.co.jp>\\ngehirn.ne.jp\\nusercontent.jp\\n\\n// Gentlent, Inc. : https://www.gentlent.com\\n// Submitted by Tom Klein <tom@gentlent.com>\\ngentapps.com\\ngentlentapis.com\\nlab.ms\\ncdn-edges.net\\n\\n// Ghost Foundation : https://ghost.org\\n// Submitted by Matt Hanley <security@ghost.org>\\nghost.io\\n\\n// GignoSystemJapan: http://gsj.bz\\n// Submitted by GignoSystemJapan <kakutou-ec@gsj.bz>\\ngsj.bz\\n\\n// GitHub, Inc.\\n// Submitted by Patrick Toomey <security@github.com>\\ngithubusercontent.com\\ngithubpreview.dev\\ngithub.io\\n\\n// GitLab, Inc.\\n// Submitted by Alex Hanselka <alex@gitlab.com>\\ngitlab.io\\n\\n// Gitplac.si - https://gitplac.si\\n// Submitted by Aljaž Starc <me@aljaxus.eu>\\ngitapp.si\\ngitpage.si\\n\\n// Glitch, Inc : https://glitch.com\\n// Submitted by Mads Hartmann <mads@glitch.com>\\nglitch.me\\n\\n// Global NOG Alliance : https://nogalliance.org/\\n// Submitted by Sander Steffann <sander@nogalliance.org>\\nnog.community\\n\\n// Globe Hosting SRL : https://www.globehosting.com/\\n// Submitted by Gavin Brown <gavin.brown@centralnic.com>\\nco.ro\\nshop.ro\\n\\n// GMO Pepabo, Inc. : https://pepabo.com/\\n// Submitted by Hosting Div <admin@pepabo.com>\\nlolipop.io\\nangry.jp\\nbabyblue.jp\\nbabymilk.jp\\nbackdrop.jp\\nbambina.jp\\nbitter.jp\\nblush.jp\\nboo.jp\\nboy.jp\\nboyfriend.jp\\nbut.jp\\ncandypop.jp\\ncapoo.jp\\ncatfood.jp\\ncheap.jp\\nchicappa.jp\\nchillout.jp\\nchips.jp\\nchowder.jp\\nchu.jp\\nciao.jp\\ncocotte.jp\\ncoolblog.jp\\ncranky.jp\\ncutegirl.jp\\ndaa.jp\\ndeca.jp\\ndeci.jp\\ndigick.jp\\negoism.jp\\nfakefur.jp\\nfem.jp\\nflier.jp\\nfloppy.jp\\nfool.jp\\nfrenchkiss.jp\\ngirlfriend.jp\\ngirly.jp\\ngloomy.jp\\ngonna.jp\\ngreater.jp\\nhacca.jp\\nheavy.jp\\nher.jp\\nhiho.jp\\nhippy.jp\\nholy.jp\\nhungry.jp\\nicurus.jp\\nitigo.jp\\njellybean.jp\\nkikirara.jp\\nkill.jp\\nkilo.jp\\nkuron.jp\\nlittlestar.jp\\nlolipopmc.jp\\nlolitapunk.jp\\nlomo.jp\\nlovepop.jp\\nlovesick.jp\\nmain.jp\\nmods.jp\\nmond.jp\\nmongolian.jp\\nmoo.jp\\nnamaste.jp\\nnikita.jp\\nnobushi.jp\\nnoor.jp\\noops.jp\\nparallel.jp\\nparasite.jp\\npecori.jp\\npeewee.jp\\npenne.jp\\npepper.jp\\nperma.jp\\npigboat.jp\\npinoko.jp\\npunyu.jp\\npupu.jp\\npussycat.jp\\npya.jp\\nraindrop.jp\\nreadymade.jp\\nsadist.jp\\nschoolbus.jp\\nsecret.jp\\nstaba.jp\\nstripper.jp\\nsub.jp\\nsunnyday.jp\\nthick.jp\\ntonkotsu.jp\\nunder.jp\\nupper.jp\\nvelvet.jp\\nverse.jp\\nversus.jp\\nvivian.jp\\nwatson.jp\\nweblike.jp\\nwhitesnow.jp\\nzombie.jp\\nheteml.net\\n\\n// GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/\\n// Submitted by Tom Whitwell <gov-uk-paas-support@digital.cabinet-office.gov.uk>\\ncloudapps.digital\\nlondon.cloudapps.digital\\n\\n// GOV.UK Pay : https://www.payments.service.gov.uk/\\n// Submitted by Richard Baker <richard.baker@digital.cabinet-office.gov.uk>\\npymnt.uk\\n\\n// UKHomeOffice : https://www.gov.uk/government/organisations/home-office\\n// Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk>\\nhomeoffice.gov.uk\\n\\n// GlobeHosting, Inc.\\n// Submitted by Zoltan Egresi <egresi@globehosting.com>\\nro.im\\n\\n// GoIP DNS Services : http://www.goip.de\\n// Submitted by Christian Poulter <milchstrasse@goip.de>\\ngoip.de\\n\\n// Google, Inc.\\n// Submitted by Eduardo Vela <evn@google.com>\\nrun.app\\na.run.app\\nweb.app\\n*.0emm.com\\nappspot.com\\n*.r.appspot.com\\ncodespot.com\\ngoogleapis.com\\ngooglecode.com\\npagespeedmobilizer.com\\npublishproxy.com\\nwithgoogle.com\\nwithyoutube.com\\n*.gateway.dev\\ncloud.goog\\ntranslate.goog\\n*.usercontent.goog\\ncloudfunctions.net\\nblogspot.ae\\nblogspot.al\\nblogspot.am\\nblogspot.ba\\nblogspot.be\\nblogspot.bg\\nblogspot.bj\\nblogspot.ca\\nblogspot.cf\\nblogspot.ch\\nblogspot.cl\\nblogspot.co.at\\nblogspot.co.id\\nblogspot.co.il\\nblogspot.co.ke\\nblogspot.co.nz\\nblogspot.co.uk\\nblogspot.co.za\\nblogspot.com\\nblogspot.com.ar\\nblogspot.com.au\\nblogspot.com.br\\nblogspot.com.by\\nblogspot.com.co\\nblogspot.com.cy\\nblogspot.com.ee\\nblogspot.com.eg\\nblogspot.com.es\\nblogspot.com.mt\\nblogspot.com.ng\\nblogspot.com.tr\\nblogspot.com.uy\\nblogspot.cv\\nblogspot.cz\\nblogspot.de\\nblogspot.dk\\nblogspot.fi\\nblogspot.fr\\nblogspot.gr\\nblogspot.hk\\nblogspot.hr\\nblogspot.hu\\nblogspot.ie\\nblogspot.in\\nblogspot.is\\nblogspot.it\\nblogspot.jp\\nblogspot.kr\\nblogspot.li\\nblogspot.lt\\nblogspot.lu\\nblogspot.md\\nblogspot.mk\\nblogspot.mr\\nblogspot.mx\\nblogspot.my\\nblogspot.nl\\nblogspot.no\\nblogspot.pe\\nblogspot.pt\\nblogspot.qa\\nblogspot.re\\nblogspot.ro\\nblogspot.rs\\nblogspot.ru\\nblogspot.se\\nblogspot.sg\\nblogspot.si\\nblogspot.sk\\nblogspot.sn\\nblogspot.td\\nblogspot.tw\\nblogspot.ug\\nblogspot.vn\\n\\n// Goupile : https://goupile.fr\\n// Submitted by Niels Martignene <hello@goupile.fr>\\ngoupile.fr\\n\\n// Government of the Netherlands: https://www.government.nl\\n// Submitted by <domeinnaam@minaz.nl>\\ngov.nl\\n\\n// Group 53, LLC : https://www.group53.com\\n// Submitted by Tyler Todd <noc@nova53.net>\\nawsmppl.com\\n\\n// GünstigBestellen : https://günstigbestellen.de\\n// Submitted by Furkan Akkoc <info@hendelzon.de>\\ngünstigbestellen.de\\ngünstigliefern.de\\n\\n// Hakaran group: http://hakaran.cz\\n// Submitted by Arseniy Sokolov <security@hakaran.cz>\\nfin.ci\\nfree.hr\\ncaa.li\\nua.rs\\nconf.se\\n\\n// Handshake : https://handshake.org\\n// Submitted by Mike Damm <md@md.vc>\\nhs.zone\\nhs.run\\n\\n// Hashbang : https://hashbang.sh\\nhashbang.sh\\n\\n// Hasura : https://hasura.io\\n// Submitted by Shahidh K Muhammed <shahidh@hasura.io>\\nhasura.app\\nhasura-app.io\\n\\n// Heilbronn University of Applied Sciences - Faculty Informatics (GitLab Pages): https://www.hs-heilbronn.de\\n// Submitted by Richard Zowalla <mi-admin@hs-heilbronn.de>\\npages.it.hs-heilbronn.de\\n\\n// Hepforge : https://www.hepforge.org\\n// Submitted by David Grellscheid <admin@hepforge.org>\\nhepforge.org\\n\\n// Heroku : https://www.heroku.com/\\n// Submitted by Tom Maher <tmaher@heroku.com>\\nherokuapp.com\\nherokussl.com\\n\\n// Hibernating Rhinos\\n// Submitted by Oren Eini <oren@ravendb.net>\\nravendb.cloud\\nravendb.community\\nravendb.me\\ndevelopment.run\\nravendb.run\\n\\n// home.pl S.A.: https://home.pl\\n// Submitted by Krzysztof Wolski <krzysztof.wolski@home.eu>\\nhomesklep.pl\\n\\n// Hong Kong Productivity Council: https://www.hkpc.org/\\n// Submitted by SECaaS Team <summchan@hkpc.org>\\nsecaas.hk\\n\\n// Hoplix : https://www.hoplix.com\\n// Submitted by Danilo De Franco<info@hoplix.shop>\\nhoplix.shop\\n\\n\\n// HOSTBIP REGISTRY : https://www.hostbip.com/\\n// Submitted by Atanunu Igbunuroghene <publicsuffixlist@hostbip.com>\\norx.biz\\nbiz.gl\\ncol.ng\\nfirm.ng\\ngen.ng\\nltd.ng\\nngo.ng\\nedu.scot\\nsch.so\\n\\n// HostFly : https://www.ie.ua\\n// Submitted by Bohdan Dub <support@hostfly.com.ua>\\nie.ua\\n\\n// HostyHosting (hostyhosting.com)\\nhostyhosting.io\\n\\n// Häkkinen.fi\\n// Submitted by Eero Häkkinen <Eero+psl@Häkkinen.fi>\\nhäkkinen.fi\\n\\n// Ici la Lune : http://www.icilalune.com/\\n// Submitted by Simon Morvan <simon@icilalune.com>\\n*.moonscale.io\\nmoonscale.net\\n\\n// iki.fi\\n// Submitted by Hannu Aronsson <haa@iki.fi>\\niki.fi\\n\\n// iliad italia: https://www.iliad.it\\n// Submitted by Marios Makassikis <mmakassikis@freebox.fr>\\nibxos.it\\niliadboxos.it\\n\\n// Impertrix Solutions : <https://impertrixcdn.com>\\n// Submitted by Zhixiang Zhao <csuite@impertrix.com>\\nimpertrixcdn.com\\nimpertrix.com\\n\\n// Incsub, LLC: https://incsub.com/\\n// Submitted by Aaron Edwards <sysadmins@incsub.com>\\nsmushcdn.com\\nwphostedmail.com\\nwpmucdn.com\\ntempurl.host\\nwpmudev.host\\n\\n// Individual Network Berlin e.V. : https://www.in-berlin.de/\\n// Submitted by Christian Seitz <chris@in-berlin.de>\\ndyn-berlin.de\\nin-berlin.de\\nin-brb.de\\nin-butter.de\\nin-dsl.de\\nin-dsl.net\\nin-dsl.org\\nin-vpn.de\\nin-vpn.net\\nin-vpn.org\\n\\n// info.at : http://www.info.at/\\nbiz.at\\ninfo.at\\n\\n// info.cx : http://info.cx\\n// Submitted by Jacob Slater <whois@igloo.to>\\ninfo.cx\\n\\n// Interlegis : http://www.interlegis.leg.br\\n// Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br>\\nac.leg.br\\nal.leg.br\\nam.leg.br\\nap.leg.br\\nba.leg.br\\nce.leg.br\\ndf.leg.br\\nes.leg.br\\ngo.leg.br\\nma.leg.br\\nmg.leg.br\\nms.leg.br\\nmt.leg.br\\npa.leg.br\\npb.leg.br\\npe.leg.br\\npi.leg.br\\npr.leg.br\\nrj.leg.br\\nrn.leg.br\\nro.leg.br\\nrr.leg.br\\nrs.leg.br\\nsc.leg.br\\nse.leg.br\\nsp.leg.br\\nto.leg.br\\n\\n// intermetrics GmbH : https://pixolino.com/\\n// Submitted by Wolfgang Schwarz <admin@intermetrics.de>\\npixolino.com\\n\\n// Internet-Pro, LLP: https://netangels.ru/\\n// Submitted by Vasiliy Sheredeko <piphon@gmail.com>\\nna4u.ru\\n\\n// iopsys software solutions AB : https://iopsys.eu/\\n// Submitted by Roman Azarenko <roman.azarenko@iopsys.eu>\\niopsys.se\\n\\n// IPiFony Systems, Inc. : https://www.ipifony.com/\\n// Submitted by Matthew Hardeman <mhardeman@ipifony.com>\\nipifony.net\\n\\n// IServ GmbH : https://iserv.de\\n// Submitted by Mario Hoberg <info@iserv.de>\\niservschule.de\\nmein-iserv.de\\nschulplattform.de\\nschulserver.de\\ntest-iserv.de\\niserv.dev\\n\\n// I-O DATA DEVICE, INC. : http://www.iodata.com/\\n// Submitted by Yuji Minagawa <domains-admin@iodata.jp>\\niobb.net\\n\\n// Jelastic, Inc. : https://jelastic.com/\\n// Submitted by Ihor Kolodyuk <ik@jelastic.com>\\nmel.cloudlets.com.au\\ncloud.interhostsolutions.be\\nmycloud.by\\nalp1.ae.flow.ch\\nappengine.flow.ch\\nes-1.axarnet.cloud\\ndiadem.cloud\\nvip.jelastic.cloud\\njele.cloud\\nit1.eur.aruba.jenv-aruba.cloud\\nit1.jenv-aruba.cloud\\nkeliweb.cloud\\ncs.keliweb.cloud\\noxa.cloud\\ntn.oxa.cloud\\nuk.oxa.cloud\\nprimetel.cloud\\nuk.primetel.cloud\\nca.reclaim.cloud\\nuk.reclaim.cloud\\nus.reclaim.cloud\\nch.trendhosting.cloud\\nde.trendhosting.cloud\\njele.club\\namscompute.com\\ndopaas.com\\npaas.hosted-by-previder.com\\nrag-cloud.hosteur.com\\nrag-cloud-ch.hosteur.com\\njcloud.ik-server.com\\njcloud-ver-jpc.ik-server.com\\ndemo.jelastic.com\\nkilatiron.com\\npaas.massivegrid.com\\njed.wafaicloud.com\\nlon.wafaicloud.com\\nryd.wafaicloud.com\\nj.scaleforce.com.cy\\njelastic.dogado.eu\\nfi.cloudplatform.fi\\ndemo.datacenter.fi\\npaas.datacenter.fi\\njele.host\\nmircloud.host\\npaas.beebyte.io\\nsekd1.beebyteapp.io\\njele.io\\ncloud-fr1.unispace.io\\njc.neen.it\\ncloud.jelastic.open.tim.it\\njcloud.kz\\nupaas.kazteleport.kz\\ncloudjiffy.net\\nfra1-de.cloudjiffy.net\\nwest1-us.cloudjiffy.net\\njls-sto1.elastx.net\\njls-sto2.elastx.net\\njls-sto3.elastx.net\\nfaststacks.net\\nfr-1.paas.massivegrid.net\\nlon-1.paas.massivegrid.net\\nlon-2.paas.massivegrid.net\\nny-1.paas.massivegrid.net\\nny-2.paas.massivegrid.net\\nsg-1.paas.massivegrid.net\\njelastic.saveincloud.net\\nnordeste-idc.saveincloud.net\\nj.scaleforce.net\\njelastic.tsukaeru.net\\nsdscloud.pl\\nunicloud.pl\\nmircloud.ru\\njelastic.regruhosting.ru\\nenscaled.sg\\njele.site\\njelastic.team\\norangecloud.tn\\nj.layershift.co.uk\\nphx.enscaled.us\\nmircloud.us\\n\\n// Jino : https://www.jino.ru\\n// Submitted by Sergey Ulyashin <ulyashin@jino.ru>\\nmyjino.ru\\n*.hosting.myjino.ru\\n*.landing.myjino.ru\\n*.spectrum.myjino.ru\\n*.vps.myjino.ru\\n\\n// Jotelulu S.L. : https://jotelulu.com\\n// Submitted by Daniel Fariña <ingenieria@jotelulu.com>\\njotelulu.cloud\\n\\n// Joyent : https://www.joyent.com/\\n// Submitted by Brian Bennett <brian.bennett@joyent.com>\\n*.triton.zone\\n*.cns.joyent.com\\n\\n// JS.ORG : http://dns.js.org\\n// Submitted by Stefan Keim <admin@js.org>\\njs.org\\n\\n// KaasHosting : http://www.kaashosting.nl/\\n// Submitted by Wouter Bakker <hostmaster@kaashosting.nl>\\nkaas.gg\\nkhplay.nl\\n\\n// Kakao : https://www.kakaocorp.com/\\n// Submitted by JaeYoong Lee <cec@kakaocorp.com>\\nktistory.com\\n\\n// Kapsi : https://kapsi.fi\\n// Submitted by Tomi Juntunen <erani@kapsi.fi>\\nkapsi.fi\\n\\n// Keyweb AG : https://www.keyweb.de\\n// Submitted by Martin Dannehl <postmaster@keymachine.de>\\nkeymachine.de\\n\\n// KingHost : https://king.host\\n// Submitted by Felipe Keller Braz <felipebraz@kinghost.com.br>\\nkinghost.net\\nuni5.net\\n\\n// KnightPoint Systems, LLC : http://www.knightpoint.com/\\n// Submitted by Roy Keene <rkeene@knightpoint.com>\\nknightpoint.systems\\n\\n// KoobinEvent, SL: https://www.koobin.com\\n// Submitted by Iván Oliva <ivan.oliva@koobin.com>\\nkoobin.events\\n\\n// KUROKU LTD : https://kuroku.ltd/\\n// Submitted by DisposaBoy <security@oya.to>\\noya.to\\n\\n// Katholieke Universiteit Leuven: https://www.kuleuven.be\\n// Submitted by Abuse KU Leuven <abuse@kuleuven.be>\\nkuleuven.cloud\\nezproxy.kuleuven.be\\n\\n// .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf\\nco.krd\\nedu.krd\\n\\n// Krellian Ltd. : https://krellian.com\\n// Submitted by Ben Francis <ben@krellian.com>\\nkrellian.net\\nwebthings.io\\n\\n// LCube - Professional hosting e.K. : https://www.lcube-webhosting.de\\n// Submitted by Lars Laehn <info@lcube.de>\\ngit-repos.de\\nlcube-server.de\\nsvn-repos.de\\n\\n// Leadpages : https://www.leadpages.net\\n// Submitted by Greg Dallavalle <domains@leadpages.net>\\nleadpages.co\\nlpages.co\\nlpusercontent.com\\n\\n// Lelux.fi : https://lelux.fi/\\n// Submitted by Lelux Admin <publisuffix@lelux.site>\\nlelux.site\\n\\n// Lifetime Hosting : https://Lifetime.Hosting/\\n// Submitted by Mike Fillator <support@lifetime.hosting>\\nco.business\\nco.education\\nco.events\\nco.financial\\nco.network\\nco.place\\nco.technology\\n\\n// Lightmaker Property Manager, Inc. : https://app.lmpm.com/\\n// Submitted by Greg Holland <greg.holland@lmpm.com>\\napp.lmpm.com\\n\\n// linkyard ldt: https://www.linkyard.ch/\\n// Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch>\\nlinkyard.cloud\\nlinkyard-cloud.ch\\n\\n// Linode : https://linode.com\\n// Submitted by <security@linode.com>\\nmembers.linode.com\\n*.nodebalancer.linode.com\\n*.linodeobjects.com\\nip.linodeusercontent.com\\n\\n// LiquidNet Ltd : http://www.liquidnetlimited.com/\\n// Submitted by Victor Velchev <admin@liquidnetlimited.com>\\nwe.bs\\n\\n// Localcert : https://localcert.dev\\n// Submitted by Lann Martin <security@localcert.dev>\\n*.user.localcert.dev\\n\\n// localzone.xyz\\n// Submitted by Kenny Niehage <hello@yahe.sh>\\nlocalzone.xyz\\n\\n// Log\\'in Line : https://www.loginline.com/\\n// Submitted by Rémi Mach <remi.mach@loginline.com>\\nloginline.app\\nloginline.dev\\nloginline.io\\nloginline.services\\nloginline.site\\n\\n// Lokalized : https://lokalized.nl\\n// Submitted by Noah Taheij <noah@lokalized.nl>\\nservers.run\\n\\n// Lõhmus Family, The\\n// Submitted by Heiki Lõhmus <hostmaster at lohmus dot me>\\nlohmus.me\\n\\n// LubMAN UMCS Sp. z o.o : https://lubman.pl/\\n// Submitted by Ireneusz Maliszewski <ireneusz.maliszewski@lubman.pl>\\nkrasnik.pl\\nleczna.pl\\nlubartow.pl\\nlublin.pl\\nponiatowa.pl\\nswidnik.pl\\n\\n// Lug.org.uk : https://lug.org.uk\\n// Submitted by Jon Spriggs <admin@lug.org.uk>\\nglug.org.uk\\nlug.org.uk\\nlugs.org.uk\\n\\n// Lukanet Ltd : https://lukanet.com\\n// Submitted by Anton Avramov <register@lukanet.com>\\nbarsy.bg\\nbarsy.co.uk\\nbarsyonline.co.uk\\nbarsycenter.com\\nbarsyonline.com\\nbarsy.club\\nbarsy.de\\nbarsy.eu\\nbarsy.in\\nbarsy.info\\nbarsy.io\\nbarsy.me\\nbarsy.menu\\nbarsy.mobi\\nbarsy.net\\nbarsy.online\\nbarsy.org\\nbarsy.pro\\nbarsy.pub\\nbarsy.ro\\nbarsy.shop\\nbarsy.site\\nbarsy.support\\nbarsy.uk\\n\\n// Magento Commerce\\n// Submitted by Damien Tournoud <dtournoud@magento.cloud>\\n*.magentosite.cloud\\n\\n// May First - People Link : https://mayfirst.org/\\n// Submitted by Jamie McClelland <info@mayfirst.org>\\nmayfirst.info\\nmayfirst.org\\n\\n// Mail.Ru Group : https://hb.cldmail.ru\\n// Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru>\\nhb.cldmail.ru\\n\\n// Mail Transfer Platform : https://www.neupeer.com\\n// Submitted by Li Hui <lihui@neupeer.com>\\ncn.vu\\n\\n// Maze Play: https://www.mazeplay.com\\n// Submitted by Adam Humpherys <adam@mws.dev>\\nmazeplay.com\\n\\n// mcpe.me : https://mcpe.me\\n// Submitted by Noa Heyl <hi@noa.dev>\\nmcpe.me\\n\\n// McHost : https://mchost.ru\\n// Submitted by Evgeniy Subbotin <e.subbotin@mchost.ru>\\nmcdir.me\\nmcdir.ru\\nmcpre.ru\\nvps.mcdir.ru\\n\\n// Mediatech : https://mediatech.by\\n// Submitted by Evgeniy Kozhuhovskiy <ugenk@mediatech.by>\\nmediatech.by\\nmediatech.dev\\n\\n// Medicom Health : https://medicomhealth.com\\n// Submitted by Michael Olson <molson@medicomhealth.com>\\nhra.health\\n\\n// Memset hosting : https://www.memset.com\\n// Submitted by Tom Whitwell <domains@memset.com>\\nminiserver.com\\nmemset.net\\n\\n// Messerli Informatik AG : https://www.messerli.ch/\\n// Submitted by Ruben Schmidmeister <psl-maintainers@messerli.ch>\\nmesserli.app\\n\\n// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/\\n// Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz>\\n*.cloud.metacentrum.cz\\ncustom.metacentrum.cz\\n\\n// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/\\n// Submitted by Radim Janča <janca@cesnet.cz>\\nflt.cloud.muni.cz\\nusr.cloud.muni.cz\\n\\n// Meteor Development Group : https://www.meteor.com/hosting\\n// Submitted by Pierre Carrier <pierre@meteor.com>\\nmeteorapp.com\\neu.meteorapp.com\\n\\n// Michau Enterprises Limited : http://www.co.pl/\\nco.pl\\n\\n// Microsoft Corporation : http://microsoft.com\\n// Submitted by Public Suffix List Admin <msftpsladmin@microsoft.com>\\n*.azurecontainer.io\\nazurewebsites.net\\nazure-mobile.net\\ncloudapp.net\\nazurestaticapps.net\\n1.azurestaticapps.net\\n2.azurestaticapps.net\\n3.azurestaticapps.net\\ncentralus.azurestaticapps.net\\neastasia.azurestaticapps.net\\neastus2.azurestaticapps.net\\nwesteurope.azurestaticapps.net\\nwestus2.azurestaticapps.net\\n\\n// minion.systems : http://minion.systems\\n// Submitted by Robert Böttinger <r@minion.systems>\\ncsx.cc\\n\\n// Mintere : https://mintere.com/\\n// Submitted by Ben Aubin <security@mintere.com>\\nmintere.site\\n\\n// MobileEducation, LLC : https://joinforte.com\\n// Submitted by Grayson Martin <grayson.martin@mobileeducation.us>\\nforte.id\\n\\n// Mozilla Corporation : https://mozilla.com\\n// Submitted by Ben Francis <bfrancis@mozilla.com>\\nmozilla-iot.org\\n\\n// Mozilla Foundation : https://mozilla.org/\\n// Submitted by glob <glob@mozilla.com>\\nbmoattachments.org\\n\\n// MSK-IX : https://www.msk-ix.ru/\\n// Submitted by Khannanov Roman <r.khannanov@msk-ix.ru>\\nnet.ru\\norg.ru\\npp.ru\\n\\n// Mythic Beasts : https://www.mythic-beasts.com\\n// Submitted by Paul Cammish <kelduum@mythic-beasts.com>\\nhostedpi.com\\ncustomer.mythic-beasts.com\\ncaracal.mythic-beasts.com\\nfentiger.mythic-beasts.com\\nlynx.mythic-beasts.com\\nocelot.mythic-beasts.com\\noncilla.mythic-beasts.com\\nonza.mythic-beasts.com\\nsphinx.mythic-beasts.com\\nvs.mythic-beasts.com\\nx.mythic-beasts.com\\nyali.mythic-beasts.com\\ncust.retrosnub.co.uk\\n\\n// Nabu Casa : https://www.nabucasa.com\\n// Submitted by Paulus Schoutsen <infra@nabucasa.com>\\nui.nabu.casa\\n\\n// Net at Work Gmbh : https://www.netatwork.de\\n// Submitted by Jan Jaeschke <jan.jaeschke@netatwork.de>\\ncloud.nospamproxy.com\\n\\n// Netlify : https://www.netlify.com\\n// Submitted by Jessica Parsons <jessica@netlify.com>\\nnetlify.app\\n\\n// Neustar Inc.\\n// Submitted by Trung Tran <Trung.Tran@neustar.biz>\\n4u.com\\n\\n// ngrok : https://ngrok.com/\\n// Submitted by Alan Shreve <alan@ngrok.com>\\nngrok.app\\nngrok-free.app\\nngrok.dev\\nngrok-free.dev\\nngrok.io\\nap.ngrok.io\\nau.ngrok.io\\neu.ngrok.io\\nin.ngrok.io\\njp.ngrok.io\\nsa.ngrok.io\\nus.ngrok.io\\nngrok.pizza\\n\\n// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/\\n// Submitted by Nicholas Ford <nick@nimbushosting.co.uk>\\nnh-serv.co.uk\\n\\n// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/\\n// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net>\\nnfshost.com\\n\\n// Noop : https://noop.app\\n// Submitted by Nathaniel Schweinberg <noop@rearc.io>\\n*.developer.app\\nnoop.app\\n\\n// Northflank Ltd. : https://northflank.com/\\n// Submitted by Marco Suter <marco@northflank.com>\\n*.northflank.app\\n*.build.run\\n*.code.run\\n*.database.run\\n*.migration.run\\n\\n// Noticeable : https://noticeable.io\\n// Submitted by Laurent Pellegrino <security@noticeable.io>\\nnoticeable.news\\n\\n// Now-DNS : https://now-dns.com\\n// Submitted by Steve Russell <steve@now-dns.com>\\ndnsking.ch\\nmypi.co\\nn4t.co\\n001www.com\\nddnslive.com\\nmyiphost.com\\nforumz.info\\n16-b.it\\n32-b.it\\n64-b.it\\nsoundcast.me\\ntcp4.me\\ndnsup.net\\nhicam.net\\nnow-dns.net\\nownip.net\\nvpndns.net\\ndynserv.org\\nnow-dns.org\\nx443.pw\\nnow-dns.top\\nntdll.top\\nfreeddns.us\\ncrafting.xyz\\nzapto.xyz\\n\\n// nsupdate.info : https://www.nsupdate.info/\\n// Submitted by Thomas Waldmann <info@nsupdate.info>\\nnsupdate.info\\nnerdpol.ovh\\n\\n// No-IP.com : https://noip.com/\\n// Submitted by Deven Reza <publicsuffixlist@noip.com>\\nblogsyte.com\\nbrasilia.me\\ncable-modem.org\\nciscofreak.com\\ncollegefan.org\\ncouchpotatofries.org\\ndamnserver.com\\nddns.me\\nditchyourip.com\\ndnsfor.me\\ndnsiskinky.com\\ndvrcam.info\\ndynns.com\\neating-organic.net\\nfantasyleague.cc\\ngeekgalaxy.com\\ngolffan.us\\nhealth-carereform.com\\nhomesecuritymac.com\\nhomesecuritypc.com\\nhopto.me\\nilovecollege.info\\nloginto.me\\nmlbfan.org\\nmmafan.biz\\nmyactivedirectory.com\\nmydissent.net\\nmyeffect.net\\nmymediapc.net\\nmypsx.net\\nmysecuritycamera.com\\nmysecuritycamera.net\\nmysecuritycamera.org\\nnet-freaks.com\\nnflfan.org\\nnhlfan.net\\nno-ip.ca\\nno-ip.co.uk\\nno-ip.net\\nnoip.us\\nonthewifi.com\\npgafan.net\\npoint2this.com\\npointto.us\\nprivatizehealthinsurance.net\\nquicksytes.com\\nread-books.org\\nsecuritytactics.com\\nserveexchange.com\\nservehumour.com\\nservep2p.com\\nservesarcasm.com\\nstufftoread.com\\nufcfan.org\\nunusualperson.com\\nworkisboring.com\\n3utilities.com\\nbounceme.net\\nddns.net\\nddnsking.com\\ngotdns.ch\\nhopto.org\\nmyftp.biz\\nmyftp.org\\nmyvnc.com\\nno-ip.biz\\nno-ip.info\\nno-ip.org\\nnoip.me\\nredirectme.net\\nservebeer.com\\nserveblog.net\\nservecounterstrike.com\\nserveftp.com\\nservegame.com\\nservehalflife.com\\nservehttp.com\\nserveirc.com\\nserveminecraft.net\\nservemp3.com\\nservepics.com\\nservequake.com\\nsytes.net\\nwebhop.me\\nzapto.org\\n\\n// NodeArt : https://nodeart.io\\n// Submitted by Konstantin Nosov <Nosov@nodeart.io>\\nstage.nodeart.io\\n\\n// Nucleos Inc. : https://nucleos.com\\n// Submitted by Piotr Zduniak <piotr@nucleos.com>\\npcloud.host\\n\\n// NYC.mn : http://www.information.nyc.mn\\n// Submitted by Matthew Brown <mattbrown@nyc.mn>\\nnyc.mn\\n\\n// Observable, Inc. : https://observablehq.com\\n// Submitted by Mike Bostock <dns@observablehq.com>\\nstatic.observableusercontent.com\\n\\n// Octopodal Solutions, LLC. : https://ulterius.io/\\n// Submitted by Andrew Sampson <andrew@ulterius.io>\\ncya.gg\\n\\n// OMG.LOL : <https://omg.lol>\\n// Submitted by Adam Newbold <adam@omg.lol>\\nomg.lol\\n\\n// Omnibond Systems, LLC. : https://www.omnibond.com\\n// Submitted by Cole Estep <cole@omnibond.com>\\ncloudycluster.net\\n\\n// OmniWe Limited: https://omniwe.com\\n// Submitted by Vicary Archangel <vicary@omniwe.com>\\nomniwe.site\\n\\n// One.com: https://www.one.com/\\n// Submitted by Jacob Bunk Nielsen <jbn@one.com>\\n123hjemmeside.dk\\n123hjemmeside.no\\n123homepage.it\\n123kotisivu.fi\\n123minsida.se\\n123miweb.es\\n123paginaweb.pt\\n123sait.ru\\n123siteweb.fr\\n123webseite.at\\n123webseite.de\\n123website.be\\n123website.ch\\n123website.lu\\n123website.nl\\nservice.one\\nsimplesite.com\\nsimplesite.com.br\\nsimplesite.gr\\nsimplesite.pl\\n\\n// One Fold Media : http://www.onefoldmedia.com/\\n// Submitted by Eddie Jones <eddie@onefoldmedia.com>\\nnid.io\\n\\n// Open Social : https://www.getopensocial.com/\\n// Submitted by Alexander Varwijk <security@getopensocial.com>\\nopensocial.site\\n\\n// OpenCraft GmbH : http://opencraft.com/\\n// Submitted by Sven Marnach <sven@opencraft.com>\\nopencraft.hosting\\n\\n// OpenResearch GmbH: https://openresearch.com/\\n// Submitted by Philipp Schmid <ops@openresearch.com>\\norsites.com\\n\\n// Opera Software, A.S.A.\\n// Submitted by Yngve Pettersen <yngve@opera.com>\\noperaunite.com\\n\\n// Orange : https://www.orange.com\\n// Submitted by Alexandre Linte <alexandre.linte@orange.com>\\ntech.orange\\n\\n// Oursky Limited : https://authgear.com/, https://skygear.io/\\n// Submitted by Authgear Team <hello@authgear.com>, Skygear Developer <hello@skygear.io>\\nauthgear-staging.com\\nauthgearapps.com\\nskygearapp.com\\n\\n// OutSystems\\n// Submitted by Duarte Santos <domain-admin@outsystemscloud.com>\\noutsystemscloud.com\\n\\n// OVHcloud: https://ovhcloud.com\\n// Submitted by Vincent Cassé <vincent.casse@ovhcloud.com>\\n*.webpaas.ovh.net\\n*.hosting.ovh.net\\n\\n// OwnProvider GmbH: http://www.ownprovider.com\\n// Submitted by Jan Moennich <jan.moennich@ownprovider.com>\\nownprovider.com\\nown.pm\\n\\n// OwO : https://whats-th.is/\\n// Submitted by Dean Sheather <dean@deansheather.com>\\n*.owo.codes\\n\\n// OX : http://www.ox.rs\\n// Submitted by Adam Grand <webmaster@mail.ox.rs>\\nox.rs\\n\\n// oy.lc\\n// Submitted by Charly Coste <changaco@changaco.oy.lc>\\noy.lc\\n\\n// Pagefog : https://pagefog.com/\\n// Submitted by Derek Myers <derek@pagefog.com>\\npgfog.com\\n\\n// Pagefront : https://www.pagefronthq.com/\\n// Submitted by Jason Kriss <jason@pagefronthq.com>\\npagefrontapp.com\\n\\n// PageXL : https://pagexl.com\\n// Submitted by Yann Guichard <yann@pagexl.com>\\npagexl.com\\n\\n// Paywhirl, Inc : https://paywhirl.com/\\n// Submitted by Daniel Netzer <dan@paywhirl.com>\\n*.paywhirl.com\\n\\n// pcarrier.ca Software Inc: https://pcarrier.ca/\\n// Submitted by Pierre Carrier <pc@rrier.ca>\\nbar0.net\\nbar1.net\\nbar2.net\\nrdv.to\\n\\n// .pl domains (grandfathered)\\nart.pl\\ngliwice.pl\\nkrakow.pl\\npoznan.pl\\nwroc.pl\\nzakopane.pl\\n\\n// Pantheon Systems, Inc. : https://pantheon.io/\\n// Submitted by Gary Dylina <gary@pantheon.io>\\npantheonsite.io\\ngotpantheon.com\\n\\n// Peplink | Pepwave : http://peplink.com/\\n// Submitted by Steve Leung <steveleung@peplink.com>\\nmypep.link\\n\\n// Perspecta : https://perspecta.com/\\n// Submitted by Kenneth Van Alstyne <kvanalstyne@perspecta.com>\\nperspecta.cloud\\n\\n// PE Ulyanov Kirill Sergeevich : https://airy.host\\n// Submitted by Kirill Ulyanov <k.ulyanov@airy.host>\\nlk3.ru\\n\\n// Planet-Work : https://www.planet-work.com/\\n// Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com>\\non-web.fr\\n\\n// Platform.sh : https://platform.sh\\n// Submitted by Nikola Kotur <nikola@platform.sh>\\nbc.platform.sh\\nent.platform.sh\\neu.platform.sh\\nus.platform.sh\\n*.platformsh.site\\n*.tst.site\\n\\n// Platter: https://platter.dev\\n// Submitted by Patrick Flor <patrick@platter.dev>\\nplatter-app.com\\nplatter-app.dev\\nplatterp.us\\n\\n// Plesk : https://www.plesk.com/\\n// Submitted by Anton Akhtyamov <program-managers@plesk.com>\\npdns.page\\nplesk.page\\npleskns.com\\n\\n// Port53 : https://port53.io/\\n// Submitted by Maximilian Schieder <maxi@zeug.co>\\ndyn53.io\\n\\n// Porter : https://porter.run/\\n// Submitted by Rudraksh MK <rudi@porter.run>\\nonporter.run\\n\\n// Positive Codes Technology Company : http://co.bn/faq.html\\n// Submitted by Zulfais <pc@co.bn>\\nco.bn\\n\\n// Postman, Inc : https://postman.com\\n// Submitted by Rahul Dhawan <security@postman.com>\\npostman-echo.com\\npstmn.io\\nmock.pstmn.io\\nhttpbin.org\\n\\n//prequalifyme.today : https://prequalifyme.today\\n//Submitted by DeepakTiwari deepak@ivylead.io\\nprequalifyme.today\\n\\n// prgmr.com : https://prgmr.com/\\n// Submitted by Sarah Newman <owner@prgmr.com>\\nxen.prgmr.com\\n\\n// priv.at : http://www.nic.priv.at/\\n// Submitted by registry <lendl@nic.at>\\npriv.at\\n\\n// privacytools.io : https://www.privacytools.io/\\n// Submitted by Jonah Aragon <jonah@privacytools.io>\\nprvcy.page\\n\\n// Protocol Labs : https://protocol.ai/\\n// Submitted by Michael Burns <noc@protocol.ai>\\n*.dweb.link\\n\\n// Protonet GmbH : http://protonet.io\\n// Submitted by Martin Meier <admin@protonet.io>\\nprotonet.io\\n\\n// Publication Presse Communication SARL : https://ppcom.fr\\n// Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr>\\nchirurgiens-dentistes-en-france.fr\\nbyen.site\\n\\n// pubtls.org: https://www.pubtls.org\\n// Submitted by Kor Nielsen <kor@pubtls.org>\\npubtls.org\\n\\n// PythonAnywhere LLP: https://www.pythonanywhere.com\\n// Submitted by Giles Thomas <giles@pythonanywhere.com>\\npythonanywhere.com\\neu.pythonanywhere.com\\n\\n// QOTO, Org.\\n// Submitted by Jeffrey Phillips Freeman <jeffrey.freeman@qoto.org>\\nqoto.io\\n\\n// Qualifio : https://qualifio.com/\\n// Submitted by Xavier De Cock <xdecock@gmail.com>\\nqualifioapp.com\\n\\n// Quality Unit: https://qualityunit.com\\n// Submitted by Vasyl Tsalko <vtsalko@qualityunit.com>\\nladesk.com\\n\\n// QuickBackend: https://www.quickbackend.com\\n// Submitted by Dani Biro <dani@pymet.com>\\nqbuser.com\\n\\n// Rad Web Hosting: https://radwebhosting.com\\n// Submitted by Scott Claeys <s.claeys@radwebhosting.com>\\ncloudsite.builders\\n\\n// Redgate Software: https://red-gate.com\\n// Submitted by Andrew Farries <andrew.farries@red-gate.com>\\ninstances.spawn.cc\\n\\n// Redstar Consultants : https://www.redstarconsultants.com/\\n// Submitted by Jons Slemmer <jons@redstarconsultants.com>\\ninstantcloud.cn\\n\\n// Russian Academy of Sciences\\n// Submitted by Tech Support <support@rasnet.ru>\\nras.ru\\n\\n// QA2\\n// Submitted by Daniel Dent (https://www.danieldent.com/)\\nqa2.com\\n\\n// QCX\\n// Submitted by Cassandra Beelen <cassandra@beelen.one>\\nqcx.io\\n*.sys.qcx.io\\n\\n// QNAP System Inc : https://www.qnap.com\\n// Submitted by Nick Chang <nickchang@qnap.com>\\ndev-myqnapcloud.com\\nalpha-myqnapcloud.com\\nmyqnapcloud.com\\n\\n// Quip : https://quip.com\\n// Submitted by Patrick Linehan <plinehan@quip.com>\\n*.quipelements.com\\n\\n// Qutheory LLC : http://qutheory.io\\n// Submitted by Jonas Schwartz <jonas@qutheory.io>\\nvapor.cloud\\nvaporcloud.io\\n\\n// Rackmaze LLC : https://www.rackmaze.com\\n// Submitted by Kirill Pertsev <kika@rackmaze.com>\\nrackmaze.com\\nrackmaze.net\\n\\n// Rakuten Games, Inc : https://dev.viberplay.io\\n// Submitted by Joshua Zhang <public-suffix@rgames.jp>\\ng.vbrplsbx.io\\n\\n// Rancher Labs, Inc : https://rancher.com\\n// Submitted by Vincent Fiduccia <domains@rancher.com>\\n*.on-k3s.io\\n*.on-rancher.cloud\\n*.on-rio.io\\n\\n// Read The Docs, Inc : https://www.readthedocs.org\\n// Submitted by David Fischer <team@readthedocs.org>\\nreadthedocs.io\\n\\n// Red Hat, Inc. OpenShift : https://openshift.redhat.com/\\n// Submitted by Tim Kramer <tkramer@rhcloud.com>\\nrhcloud.com\\n\\n// Render : https://render.com\\n// Submitted by Anurag Goel <dev@render.com>\\napp.render.com\\nonrender.com\\n\\n// Repl.it : https://repl.it\\n// Submitted by Lincoln Bergeson <lincoln@replit.com>\\nfirewalledreplit.co\\nid.firewalledreplit.co\\nrepl.co\\nid.repl.co\\nrepl.run\\n\\n// Resin.io : https://resin.io\\n// Submitted by Tim Perry <tim@resin.io>\\nresindevice.io\\ndevices.resinstaging.io\\n\\n// RethinkDB : https://www.rethinkdb.com/\\n// Submitted by Chris Kastorff <info@rethinkdb.com>\\nhzc.io\\n\\n// Revitalised Limited : http://www.revitalised.co.uk\\n// Submitted by Jack Price <jack@revitalised.co.uk>\\nwellbeingzone.eu\\nwellbeingzone.co.uk\\n\\n// Rico Developments Limited : https://adimo.co\\n// Submitted by Colin Brown <hello@adimo.co>\\nadimo.co.uk\\n\\n// Riseup Networks : https://riseup.net\\n// Submitted by Micah Anderson <micah@riseup.net>\\nitcouldbewor.se\\n\\n// Rochester Institute of Technology : http://www.rit.edu/\\n// Submitted by Jennifer Herting <jchits@rit.edu>\\ngit-pages.rit.edu\\n\\n// Rocky Enterprise Software Foundation : https://resf.org\\n// Submitted by Neil Hanlon <neil@resf.org>\\nrocky.page\\n\\n// Rusnames Limited: http://rusnames.ru/\\n// Submitted by Sergey Zotov <admin@rusnames.ru>\\nбиз.рус\\nком.рус\\nкрым.рус\\nмир.рус\\nмск.рус\\nорг.рус\\nсамара.рус\\nсочи.рус\\nспб.рус\\nя.рус\\n\\n// SAKURA Internet Inc. : https://www.sakura.ad.jp/\\n// Submitted by Internet Service Department <rs-vendor-ml@sakura.ad.jp>\\n180r.com\\ndojin.com\\nsakuratan.com\\nsakuraweb.com\\nx0.com\\n2-d.jp\\nbona.jp\\ncrap.jp\\ndaynight.jp\\neek.jp\\nflop.jp\\nhalfmoon.jp\\njeez.jp\\nmatrix.jp\\nmimoza.jp\\nivory.ne.jp\\nmail-box.ne.jp\\nmints.ne.jp\\nmokuren.ne.jp\\nopal.ne.jp\\nsakura.ne.jp\\nsumomo.ne.jp\\ntopaz.ne.jp\\nnetgamers.jp\\nnyanta.jp\\no0o0.jp\\nrdy.jp\\nrgr.jp\\nrulez.jp\\ns3.isk01.sakurastorage.jp\\ns3.isk02.sakurastorage.jp\\nsaloon.jp\\nsblo.jp\\nskr.jp\\ntank.jp\\nuh-oh.jp\\nundo.jp\\nrs.webaccel.jp\\nuser.webaccel.jp\\nwebsozai.jp\\nxii.jp\\nsquares.net\\njpn.org\\nkirara.st\\nx0.to\\nfrom.tv\\nsakura.tv\\n\\n// Salesforce.com, Inc. https://salesforce.com/\\n// Submitted by Michael Biven <mbiven@salesforce.com>\\n*.builder.code.com\\n*.dev-builder.code.com\\n*.stg-builder.code.com\\n\\n// Sandstorm Development Group, Inc. : https://sandcats.io/\\n// Submitted by Asheesh Laroia <asheesh@sandstorm.io>\\nsandcats.io\\n\\n// SBE network solutions GmbH : https://www.sbe.de/\\n// Submitted by Norman Meilick <nm@sbe.de>\\nlogoip.de\\nlogoip.com\\n\\n// Scaleway : https://www.scaleway.com/\\n// Submitted by Rémy Léone <rleone@scaleway.com>\\nfr-par-1.baremetal.scw.cloud\\nfr-par-2.baremetal.scw.cloud\\nnl-ams-1.baremetal.scw.cloud\\nfnc.fr-par.scw.cloud\\nfunctions.fnc.fr-par.scw.cloud\\nk8s.fr-par.scw.cloud\\nnodes.k8s.fr-par.scw.cloud\\ns3.fr-par.scw.cloud\\ns3-website.fr-par.scw.cloud\\nwhm.fr-par.scw.cloud\\npriv.instances.scw.cloud\\npub.instances.scw.cloud\\nk8s.scw.cloud\\nk8s.nl-ams.scw.cloud\\nnodes.k8s.nl-ams.scw.cloud\\ns3.nl-ams.scw.cloud\\ns3-website.nl-ams.scw.cloud\\nwhm.nl-ams.scw.cloud\\nk8s.pl-waw.scw.cloud\\nnodes.k8s.pl-waw.scw.cloud\\ns3.pl-waw.scw.cloud\\ns3-website.pl-waw.scw.cloud\\nscalebook.scw.cloud\\nsmartlabeling.scw.cloud\\ndedibox.fr\\n\\n// schokokeks.org GbR : https://schokokeks.org/\\n// Submitted by Hanno Böck <hanno@schokokeks.org>\\nschokokeks.net\\n\\n// Scottish Government: https://www.gov.scot\\n// Submitted by Martin Ellis <martin.ellis@gov.scot>\\ngov.scot\\nservice.gov.scot\\n\\n// Scry Security : http://www.scrysec.com\\n// Submitted by Shante Adam <shante@skyhat.io>\\nscrysec.com\\n\\n// Securepoint GmbH : https://www.securepoint.de\\n// Submitted by Erik Anders <erik.anders@securepoint.de>\\nfirewall-gateway.com\\nfirewall-gateway.de\\nmy-gateway.de\\nmy-router.de\\nspdns.de\\nspdns.eu\\nfirewall-gateway.net\\nmy-firewall.org\\nmyfirewall.org\\nspdns.org\\n\\n// Seidat : https://www.seidat.com\\n// Submitted by Artem Kondratev <accounts@seidat.com>\\nseidat.net\\n\\n// Sellfy : https://sellfy.com\\n// Submitted by Yuriy Romadin <contact@sellfy.com>\\nsellfy.store\\n\\n// Senseering GmbH : https://www.senseering.de\\n// Submitted by Felix Mönckemeyer <f.moenckemeyer@senseering.de>\\nsenseering.net\\n\\n// Sendmsg: https://www.sendmsg.co.il\\n// Submitted by Assaf Stern <domains@comstar.co.il>\\nminisite.ms\\n\\n// Service Magnet : https://myservicemagnet.com\\n// Submitted by Dave Sanders <dave@myservicemagnet.com>\\nmagnet.page\\n\\n// Service Online LLC : http://drs.ua/\\n// Submitted by Serhii Bulakh <support@drs.ua>\\nbiz.ua\\nco.ua\\npp.ua\\n\\n// Shift Crypto AG : https://shiftcrypto.ch\\n// Submitted by alex <alex@shiftcrypto.ch>\\nshiftcrypto.dev\\nshiftcrypto.io\\n\\n// ShiftEdit : https://shiftedit.net/\\n// Submitted by Adam Jimenez <adam@shiftcreate.com>\\nshiftedit.io\\n\\n// Shopblocks : http://www.shopblocks.com/\\n// Submitted by Alex Bowers <alex@shopblocks.com>\\nmyshopblocks.com\\n\\n// Shopify : https://www.shopify.com\\n// Submitted by Alex Richter <alex.richter@shopify.com>\\nmyshopify.com\\n\\n// Shopit : https://www.shopitcommerce.com/\\n// Submitted by Craig McMahon <craig@shopitcommerce.com>\\nshopitsite.com\\n\\n// shopware AG : https://shopware.com\\n// Submitted by Jens Küper <cloud@shopware.com>\\nshopware.store\\n\\n// Siemens Mobility GmbH\\n// Submitted by Oliver Graebner <security@mo-siemens.io>\\nmo-siemens.io\\n\\n// SinaAppEngine : http://sae.sina.com.cn/\\n// Submitted by SinaAppEngine <saesupport@sinacloud.com>\\n1kapp.com\\nappchizi.com\\napplinzi.com\\nsinaapp.com\\nvipsinaapp.com\\n\\n// Siteleaf : https://www.siteleaf.com/\\n// Submitted by Skylar Challand <support@siteleaf.com>\\nsiteleaf.net\\n\\n// Skyhat : http://www.skyhat.io\\n// Submitted by Shante Adam <shante@skyhat.io>\\nbounty-full.com\\nalpha.bounty-full.com\\nbeta.bounty-full.com\\n\\n// Smallregistry by Promopixel SARL: https://www.smallregistry.net\\n// Former AFNIC\\'s SLDs \\n// Submitted by Jérôme Lipowicz <support@promopixel.com>\\naeroport.fr\\navocat.fr\\nchambagri.fr\\nchirurgiens-dentistes.fr\\nexperts-comptables.fr\\nmedecin.fr\\nnotaires.fr\\npharmacien.fr\\nport.fr\\nveterinaire.fr\\n\\n// Small Technology Foundation : https://small-tech.org\\n// Submitted by Aral Balkan <aral@small-tech.org>\\nsmall-web.org\\n\\n// Smoove.io : https://www.smoove.io/\\n// Submitted by Dan Kozak <dan@smoove.io>\\nvp4.me\\n\\n// Snowflake Inc : https://www.snowflake.com/\\n// Submitted by Faith Olapade <faith.olapade@snowflake.com>\\nsnowflake.app\\nprivatelink.snowflake.app\\nstreamlit.app\\nstreamlitapp.com\\n\\n// Snowplow Analytics : https://snowplowanalytics.com/\\n// Submitted by Ian Streeter <ian@snowplowanalytics.com>\\ntry-snowplow.com\\n\\n// SourceHut : https://sourcehut.org\\n// Submitted by Drew DeVault <sir@cmpwn.com>\\nsrht.site\\n\\n// Stackhero : https://www.stackhero.io\\n// Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io>\\nstackhero-network.com\\n\\n// Staclar : https://staclar.com\\n// Submitted by Q Misell <q@staclar.com>\\nmusician.io\\n// Submitted by Matthias Merkel <matthias.merkel@staclar.com>\\nnovecore.site\\n\\n// staticland : https://static.land\\n// Submitted by Seth Vincent <sethvincent@gmail.com>\\nstatic.land\\ndev.static.land\\nsites.static.land\\n\\n// Storebase : https://www.storebase.io\\n// Submitted by Tony Schirmer <tony@storebase.io>\\nstorebase.store\\n\\n// Strategic System Consulting (eApps Hosting): https://www.eapps.com/\\n// Submitted by Alex Oancea <aoancea@cloudscale365.com>\\nvps-host.net\\natl.jelastic.vps-host.net\\nnjs.jelastic.vps-host.net\\nric.jelastic.vps-host.net\\n\\n// Sony Interactive Entertainment LLC : https://sie.com/\\n// Submitted by David Coles <david.coles@sony.com>\\nplaystation-cloud.com\\n\\n// SourceLair PC : https://www.sourcelair.com\\n// Submitted by Antonis Kalipetis <akalipetis@sourcelair.com>\\napps.lair.io\\n*.stolos.io\\n\\n// SpaceKit : https://www.spacekit.io/\\n// Submitted by Reza Akhavan <spacekit.io@gmail.com>\\nspacekit.io\\n\\n// SpeedPartner GmbH: https://www.speedpartner.de/\\n// Submitted by Stefan Neufeind <info@speedpartner.de>\\ncustomer.speedpartner.de\\n\\n// Spreadshop (sprd.net AG) : https://www.spreadshop.com/\\n// Submitted by Martin Breest <security@spreadshop.com>\\nmyspreadshop.at\\nmyspreadshop.com.au\\nmyspreadshop.be\\nmyspreadshop.ca\\nmyspreadshop.ch\\nmyspreadshop.com\\nmyspreadshop.de\\nmyspreadshop.dk\\nmyspreadshop.es\\nmyspreadshop.fi\\nmyspreadshop.fr\\nmyspreadshop.ie\\nmyspreadshop.it\\nmyspreadshop.net\\nmyspreadshop.nl\\nmyspreadshop.no\\nmyspreadshop.pl\\nmyspreadshop.se\\nmyspreadshop.co.uk\\n\\n// Standard Library : https://stdlib.com\\n// Submitted by Jacob Lee <jacob@stdlib.com>\\napi.stdlib.com\\n\\n// Storipress : https://storipress.com\\n// Submitted by Benno Liu <benno@storipress.com>\\nstoripress.app\\n\\n// Storj Labs Inc. : https://storj.io/\\n// Submitted by Philip Hutchins <hostmaster@storj.io>\\nstorj.farm\\n\\n// Studenten Net Twente : http://www.snt.utwente.nl/\\n// Submitted by Silke Hofstra <syscom@snt.utwente.nl>\\nutwente.io\\n\\n// Student-Run Computing Facility : https://www.srcf.net/\\n// Submitted by Edwin Balani <sysadmins@srcf.net>\\nsoc.srcf.net\\nuser.srcf.net\\n\\n// Sub 6 Limited: http://www.sub6.com\\n// Submitted by Dan Miller <dm@sub6.com>\\ntemp-dns.com\\n\\n// Supabase : https://supabase.io\\n// Submitted by Inian Parameshwaran <security@supabase.io>\\nsupabase.co\\nsupabase.in\\nsupabase.net\\nsu.paba.se\\n\\n// Symfony, SAS : https://symfony.com/\\n// Submitted by Fabien Potencier <fabien@symfony.com>\\n*.s5y.io\\n*.sensiosite.cloud\\n\\n// Syncloud : https://syncloud.org\\n// Submitted by Boris Rybalkin <syncloud@syncloud.it>\\nsyncloud.it\\n\\n// Synology, Inc. : https://www.synology.com/\\n// Submitted by Rony Weng <ronyweng@synology.com>\\ndscloud.biz\\ndirect.quickconnect.cn\\ndsmynas.com\\nfamilyds.com\\ndiskstation.me\\ndscloud.me\\ni234.me\\nmyds.me\\nsynology.me\\ndscloud.mobi\\ndsmynas.net\\nfamilyds.net\\ndsmynas.org\\nfamilyds.org\\nvpnplus.to\\ndirect.quickconnect.to\\n\\n// Tabit Technologies Ltd. : https://tabit.cloud/\\n// Submitted by Oren Agiv <oren@tabit.cloud>\\ntabitorder.co.il\\nmytabit.co.il\\nmytabit.com\\n\\n// TAIFUN Software AG : http://taifun-software.de\\n// Submitted by Bjoern Henke <dev-server@taifun-software.de>\\ntaifun-dns.de\\n\\n// Tailscale Inc. : https://www.tailscale.com\\n// Submitted by David Anderson <danderson@tailscale.com>\\nbeta.tailscale.net\\nts.net\\n\\n// TASK geographical domains (www.task.gda.pl/uslugi/dns)\\ngda.pl\\ngdansk.pl\\ngdynia.pl\\nmed.pl\\nsopot.pl\\n\\n// team.blue https://team.blue\\n// Submitted by Cedric Dubois <cedric.dubois@team.blue>\\nsite.tb-hosting.com\\n\\n// Teckids e.V. : https://www.teckids.org\\n// Submitted by Dominik George <dominik.george@teckids.org>\\nedugit.io\\ns3.teckids.org\\n\\n// Telebit : https://telebit.cloud\\n// Submitted by AJ ONeal <aj@telebit.cloud>\\ntelebit.app\\ntelebit.io\\n*.telebit.xyz\\n\\n// Thingdust AG : https://thingdust.com/\\n// Submitted by Adrian Imboden <adi@thingdust.com>\\n*.firenet.ch\\n*.svc.firenet.ch\\nreservd.com\\nthingdustdata.com\\ncust.dev.thingdust.io\\ncust.disrec.thingdust.io\\ncust.prod.thingdust.io\\ncust.testing.thingdust.io\\nreservd.dev.thingdust.io\\nreservd.disrec.thingdust.io\\nreservd.testing.thingdust.io\\n\\n// ticket i/O GmbH : https://ticket.io\\n// Submitted by Christian Franke <it@ticket.io>\\ntickets.io\\n\\n// Tlon.io : https://tlon.io\\n// Submitted by Mark Staarink <mark@tlon.io>\\narvo.network\\nazimuth.network\\ntlon.network\\n\\n// Tor Project, Inc. : https://torproject.org\\n// Submitted by Antoine Beaupré <anarcat@torproject.org\\ntorproject.net\\npages.torproject.net\\n\\n// TownNews.com : http://www.townnews.com\\n// Submitted by Dustin Ward <dward@townnews.com>\\nbloxcms.com\\ntownnews-staging.com\\n\\n// TrafficPlex GmbH : https://www.trafficplex.de/\\n// Submitted by Phillipp Röll <phillipp.roell@trafficplex.de>\\n12hp.at\\n2ix.at\\n4lima.at\\nlima-city.at\\n12hp.ch\\n2ix.ch\\n4lima.ch\\nlima-city.ch\\ntrafficplex.cloud\\nde.cool\\n12hp.de\\n2ix.de\\n4lima.de\\nlima-city.de\\n1337.pictures\\nclan.rip\\nlima-city.rocks\\nwebspace.rocks\\nlima.zone\\n\\n// TransIP : https://www.transip.nl\\n// Submitted by Rory Breuk <rbreuk@transip.nl>\\n*.transurl.be\\n*.transurl.eu\\n*.transurl.nl\\n\\n// TransIP: https://www.transip.nl\\n// Submitted by Cedric Dubois <cedric.dubois@team.blue>\\nsite.transip.me\\n\\n// TuxFamily : http://tuxfamily.org\\n// Submitted by TuxFamily administrators <adm@staff.tuxfamily.org>\\ntuxfamily.org\\n\\n// TwoDNS : https://www.twodns.de/\\n// Submitted by TwoDNS-Support <support@two-dns.de>\\ndd-dns.de\\ndiskstation.eu\\ndiskstation.org\\ndray-dns.de\\ndraydns.de\\ndyn-vpn.de\\ndynvpn.de\\nmein-vigor.de\\nmy-vigor.de\\nmy-wan.de\\nsyno-ds.de\\nsynology-diskstation.de\\nsynology-ds.de\\n\\n// Typedream : https://typedream.com\\n// Submitted by Putri Karunia <putri@typedream.com>\\ntypedream.app\\n\\n// Typeform : https://www.typeform.com\\n// Submitted by Sergi Ferriz <sergi.ferriz@typeform.com>\\npro.typeform.com\\n\\n// Uberspace : https://uberspace.de\\n// Submitted by Moritz Werner <mwerner@jonaspasche.com>\\nuber.space\\n*.uberspace.de\\n\\n// UDR Limited : http://www.udr.hk.com\\n// Submitted by registry <hostmaster@udr.hk.com>\\nhk.com\\nhk.org\\nltd.hk\\ninc.hk\\n\\n// UK Intis Telecom LTD : https://it.com\\n// Submitted by ITComdomains <to@it.com>\\nit.com\\n\\n// UNIVERSAL DOMAIN REGISTRY : https://www.udr.org.yt/\\n// see also: whois -h whois.udr.org.yt help\\n// Submitted by Atanunu Igbunuroghene <publicsuffixlist@udr.org.yt>\\nname.pm\\nsch.tf\\nbiz.wf\\nsch.wf\\norg.yt\\n\\n// United Gameserver GmbH : https://united-gameserver.de\\n// Submitted by Stefan Schwarz <sysadm@united-gameserver.de>\\nvirtualuser.de\\nvirtual-user.de\\n\\n// Upli : https://upli.io\\n// Submitted by Lenny Bakkalian <lenny.bakkalian@gmail.com>\\nupli.io\\n\\n// urown.net : https://urown.net\\n// Submitted by Hostmaster <hostmaster@urown.net>\\nurown.cloud\\ndnsupdate.info\\n\\n// .US\\n// Submitted by Ed Moore <Ed.Moore@lib.de.us>\\nlib.de.us\\n\\n// VeryPositive SIA : http://very.lv\\n// Submitted by Danko Aleksejevs <danko@very.lv>\\n2038.io\\n\\n// Vercel, Inc : https://vercel.com/\\n// Submitted by Connor Davis <security@vercel.com>\\nvercel.app\\nvercel.dev\\nnow.sh\\n\\n// Viprinet Europe GmbH : http://www.viprinet.com\\n// Submitted by Simon Kissel <hostmaster@viprinet.com>\\nrouter.management\\n\\n// Virtual-Info : https://www.virtual-info.info/\\n// Submitted by Adnan RIHAN <hostmaster@v-info.info>\\nv-info.info\\n\\n// Voorloper.com: https://voorloper.com\\n// Submitted by Nathan van Bakel <info@voorloper.com>\\nvoorloper.cloud\\n\\n// Voxel.sh DNS : https://voxel.sh/dns/\\n// Submitted by Mia Rehlinger <dns@voxel.sh>\\nneko.am\\nnyaa.am\\nbe.ax\\ncat.ax\\nes.ax\\neu.ax\\ngg.ax\\nmc.ax\\nus.ax\\nxy.ax\\nnl.ci\\nxx.gl\\napp.gp\\nblog.gt\\nde.gt\\nto.gt\\nbe.gy\\ncc.hn\\nblog.kg\\nio.kg\\njp.kg\\ntv.kg\\nuk.kg\\nus.kg\\nde.ls\\nat.md\\nde.md\\njp.md\\nto.md\\nindie.porn\\nvxl.sh\\nch.tc\\nme.tc\\nwe.tc\\nnyan.to\\nat.vg\\nblog.vu\\ndev.vu\\nme.vu\\n\\n// V.UA Domain Administrator : https://domain.v.ua/\\n// Submitted by Serhii Rostilo <sergey@rostilo.kiev.ua>\\nv.ua\\n\\n// Vultr Objects : https://www.vultr.com/products/object-storage/\\n// Submitted by Niels Maumenee <storage@vultr.com>\\n*.vultrobjects.com\\n\\n// Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com\\n// Submitted by Masayuki Note <masa@blade.wafflecell.com>\\nwafflecell.com\\n\\n// WebHare bv: https://www.webhare.com/\\n// Submitted by Arnold Hendriks <info@webhare.com>\\n*.webhare.dev\\n\\n// WebHotelier Technologies Ltd: https://www.webhotelier.net/\\n// Submitted by Apostolos Tsakpinis <apostolos.tsakpinis@gmail.com>\\nreserve-online.net\\nreserve-online.com\\nbookonline.app\\nhotelwithflight.com\\n\\n// WeDeploy by Liferay, Inc. : https://www.wedeploy.com\\n// Submitted by Henrique Vicente <security@wedeploy.com>\\nwedeploy.io\\nwedeploy.me\\nwedeploy.sh\\n\\n// Western Digital Technologies, Inc : https://www.wdc.com\\n// Submitted by Jung Jin <jungseok.jin@wdc.com>\\nremotewd.com\\n\\n// WIARD Enterprises : https://wiardweb.com\\n// Submitted by Kidd Hustle <kiddhustle@wiardweb.com>\\npages.wiardweb.com\\n\\n// Wikimedia Labs : https://wikitech.wikimedia.org\\n// Submitted by Arturo Borrero Gonzalez <aborrero@wikimedia.org>\\nwmflabs.org\\ntoolforge.org\\nwmcloud.org\\n\\n// WISP : https://wisp.gg\\n// Submitted by Stepan Fedotov <stepan@wisp.gg>\\npanel.gg\\ndaemon.panel.gg\\n\\n// Wizard Zines : https://wizardzines.com\\n// Submitted by Julia Evans <julia@wizardzines.com>\\nmesswithdns.com\\n\\n// WoltLab GmbH : https://www.woltlab.com\\n// Submitted by Tim Düsterhus <security@woltlab.cloud>\\nwoltlab-demo.com\\nmyforum.community\\ncommunity-pro.de\\ndiskussionsbereich.de\\ncommunity-pro.net\\nmeinforum.net\\n\\n// Woods Valldata : https://www.woodsvalldata.co.uk/\\n// Submitted by Chris Whittle <chris.whittle@woodsvalldata.co.uk>\\naffinitylottery.org.uk\\nraffleentry.org.uk\\nweeklylottery.org.uk\\n\\n// WP Engine : https://wpengine.com/\\n// Submitted by Michael Smith <michael.smith@wpengine.com>\\n// Submitted by Brandon DuRette <brandon.durette@wpengine.com>\\nwpenginepowered.com\\njs.wpenginepowered.com\\n\\n// Wix.com, Inc. : https://www.wix.com\\n// Submitted by Shahar Talmi <shahar@wix.com>\\nwixsite.com\\neditorx.io\\nwixstudio.io\\nwix.run\\n\\n// XenonCloud GbR: https://xenoncloud.net\\n// Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net>\\nhalf.host\\n\\n// XnBay Technology : http://www.xnbay.com/\\n// Submitted by XnBay Developer <developer.xncloud@gmail.com>\\nxnbay.com\\nu2.xnbay.com\\nu2-local.xnbay.com\\n\\n// XS4ALL Internet bv : https://www.xs4all.nl/\\n// Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net>\\ncistron.nl\\ndemon.nl\\nxs4all.space\\n\\n// Yandex.Cloud LLC: https://cloud.yandex.com\\n// Submitted by Alexander Lodin <security+psl@yandex-team.ru>\\nyandexcloud.net\\nstorage.yandexcloud.net\\nwebsite.yandexcloud.net\\n\\n// YesCourse Pty Ltd : https://yescourse.com\\n// Submitted by Atul Bhouraskar <atul@yescourse.com>\\nofficial.academy\\n\\n// Yola : https://www.yola.com/\\n// Submitted by Stefano Rivera <stefano@yola.com>\\nyolasite.com\\n\\n// Yombo : https://yombo.net\\n// Submitted by Mitch Schwenk <mitch@yombo.net>\\nybo.faith\\nyombo.me\\nhomelink.one\\nybo.party\\nybo.review\\nybo.science\\nybo.trade\\n\\n// Yunohost : https://yunohost.org\\n// Submitted by Valentin Grimaud <security@yunohost.org>\\nynh.fr\\nnohost.me\\nnoho.st\\n\\n// ZaNiC : http://www.za.net/\\n// Submitted by registry <hostmaster@nic.za.net>\\nza.net\\nza.org\\n\\n// Zine EOOD : https://zine.bg/\\n// Submitted by Martin Angelov <martin@zine.bg>\\nbss.design\\n\\n// Zitcom A/S : https://www.zitcom.dk\\n// Submitted by Emil Stahl <esp@zitcom.dk>\\nbasicserver.io\\nvirtualserver.io\\nenterprisecloud.nu\\n\\n// ===END PRIVATE DOMAINS===\\n'.split(\"\\n\").filter(n=>!n.startsWith(\"//\")&&n.trim().length>0).sort((n,e)=>e.length-n.length);async function Sj(n,e,t){let a=await jj(t.filenameTemplate,t,n,e)||\"\";a=a.trim(),t.replaceEmojisInFilename&&kj.forEach(n=>a=xj(a,n,\" _\"+yj[n]+\"_ \"));const{filenameReplacementCharacter:o,filenameReplacedCharacters:i,filenameReplacementCharacters:r}=t;if(a=lr(a,i,o,r),t.backgroundSave||(a=a.replace(/\\//g,o)),!t.keepFilename&&(\"bytes\"==t.filenameMaxLengthUnit&&or(a)>t.filenameMaxLength||a.length>t.filenameMaxLength)){const n=a.match(/(\\.[^.]{3,4})$/),e=n&&n[0]&&n[0].length>1?n[0]:\"\";a=\"bytes\"==t.filenameMaxLengthUnit?await zj(a,t.filenameMaxLength-e.length):a.substring(0,t.filenameMaxLength-e.length),a=a+\"…\"+e}return a||(a=\"Unnamed page\"),a.startsWith(\".\")&&(a=\"Unnamed page\"+a),a.trim()}async function jj(n=\"\",e,t,a,o={}){const{dontReplaceSlash:i}=o;o.currentDate=new Date;const r=new uj(e.saveUrl||e.url),s=Aj(r.href),l=Array.from(new wj(r.search)),c=e.bookmarkFolders&&e.bookmarkFolders.join(\"/\")||\"\",d=void 0===i||i,m=vj.find(n=>r.hostname.endsWith(\".\"+n)&&n),h=m?r.hostname.substring(0,r.hostname.length-m.length-1):r.hostname,p=h.lastIndexOf(\".\");let u=h.substring(0,-1==p?0:p);const g=h.substring(u.length?u.length+1:0),w=g+\".\"+m;u.startsWith(\"www.\")?u=u.substring(4):\"www\"==u&&(u=\"\");const b={\"navigator-language\":{getter:()=>bj.language},\"page-title\":{getter:()=>e.title},\"page-heading\":{getter:()=>e.info.heading},\"page-language\":{getter:()=>e.info.lang},\"page-description\":{getter:()=>e.info.description},\"page-author\":{getter:()=>e.info.author},\"page-creator\":{getter:()=>e.info.creator},\"page-publisher\":{getter:()=>e.info.publisher},\"url-hash\":{getter:()=>r.hash.substring(1)},\"url-host\":{getter:()=>r.host.replace(/\\/$/,\"\")},\"url-hostname\":{getter:()=>r.hostname.replace(/\\/$/,\"\")},\"url-hostname-suffix\":{getter:()=>m},\"url-hostname-domain\":{getter:()=>g},\"url-hostname-root\":{getter:()=>w},\"url-hostname-subdomains\":{getter:()=>u},\"url-href\":{getter:()=>s,dontReplaceSlash:d},\"url-href-digest-sha-1\":{getter:s?async()=>ir(\"SHA-1\",s):\"\"},\"url-href-flat\":{getter:()=>Aj(r.href),dontReplaceSlash:!1},\"url-referrer\":{getter:()=>Aj(e.referrer),dontReplaceSlash:d},\"url-referrer-flat\":{getter:()=>Aj(e.referrer),dontReplaceSlash:!1},\"url-password\":{getter:()=>r.password},\"url-pathname\":{getter:()=>Aj(r.pathname).replace(/^\\//,\"\").replace(/\\/$/,\"\"),dontReplaceSlash:d},\"url-pathname-flat\":{getter:()=>Aj(r.pathname),dontReplaceSlash:!1},\"url-port\":{getter:()=>r.port},\"url-protocol\":{getter:()=>r.protocol},\"url-search\":{getter:()=>r.search.substring(1)},\"url-username\":{getter:()=>r.username},\"url-original\":{getter:()=>e.originalUrl},\"tab-id\":{getter:()=>String(e.tabId)},\"tab-index\":{getter:()=>String(e.tabIndex)},\"url-last-segment\":{getter:()=>Aj(Lj(r,e.filenameReplacementCharacter))},\"url-filename\":{getter:()=>{const n=r.pathname,e=n.split(\"/\");if(n.endsWith(\"/\"))return\"\";return Aj(e[e.length-1])},dontReplaceSlash:d},\"bookmark-pathname\":{getter:()=>c,dontReplaceSlash:d},\"bookmark-pathname-flat\":{getter:()=>c,dontReplaceSlash:!1},\"profile-name\":{getter:()=>e.profileName},\"filename-extension\":{getter:()=>function(n){return n.compressContent?n.selfExtractingArchive?n.extractDataFromPage?\"u.zip.html\":\"zip.html\":\"zip\":\"html\"}(e)},\"save-action\":{getter:()=>e.selected?\"selection\":\"page\"},\"options-json\":{getter:()=>JSON.stringify(Tj(e))},\"options-text\":{getter:()=>function(n){const e=[];for(const t in n){const a=n[t];\"function\"!=typeof a&&null!=a&&\"\"!==a&&e.push(t+\": \"+JSON.stringify(a))}return e.join(\"\\n\")}(Tj(e))}};t&&(b[\"digest-sha-256\"]={getter:async()=>ir(\"SHA-256\",t)},b[\"digest-sha-384\"]={getter:async()=>ir(\"SHA-384\",t)},b[\"digest-sha-512\"]={getter:async()=>ir(\"SHA-512\",t)}),e.saveDate&&k(e.saveDate),e.visitDate&&k(e.visitDate,\"visit-\");const f={\"if-empty\":(...n)=>{const e=n.pop(),t=n.find(n=>n);return t||e},\"if-not-empty\":(...n)=>{const e=n.pop(),t=n.find(n=>n);return t?e:t},\"if-equals\":(n,e,t,a)=>n==e?t:a,\"if-not-equals\":(n,e,t,a)=>n!=e?t:a,\"if-contains\":(n,e,t,a)=>e&&n.includes(e)?t:a,\"if-not-contains\":(n,e,t,a)=>e&&!n.includes(e)?t:a,substring:(n,e,t)=>n.substring(e,t),lowercase:n=>n.toLowerCase(),uppercase:n=>n.toUpperCase(),capitalize:n=>n.charAt(0).toUpperCase()+n.slice(1),replace:(n,e,t)=>e&&t?xj(n,e,t):n,trim:n=>n.trim(),\"trim-left\":n=>n.trimLeft(),\"trim-right\":n=>n.trimRight(),\"pad-left\":(n,e,t)=>e>0?n.padStart(e,t):n,\"pad-right\":(n,e,t)=>e>0?n.padEnd(e,t):n,repeat:(n,e)=>e>0?n.repeat(e):\"\",\"index-of\":(n,e,t)=>n.indexOf(e,t),\"last-index-of\":(n,e,t)=>n.lastIndexOf(e,t),length:n=>n.length,\"url-search-name\":(n=0)=>l[n]&&l[n][0],\"url-search-value\":(n=0)=>l[n]&&l[n][1],\"url-search-named-value\":n=>{const e=l.find(e=>e[0]==n);return e&&e[1]},\"url-search\":n=>{const e=l.find(e=>e[0]==n);return e&&e[1]},\"url-segment\":(n=0)=>{const t=Aj(r.pathname).split(\"/\");return t.pop(),t.push(Lj(r,e.filenameReplacementCharacter)),t[n]},\"url-hostname-subdomain\":(n=0)=>{const e=u.split(\".\");return e[e.length-n-1]},stringify:n=>{try{return JSON.stringify(n)}catch(e){return n}},\"encode-base64\":n=>function(n){const e=Array.from(n,n=>String.fromCodePoint(n)).join(\"\");return btoa(e)}((new TextEncoder).encode(n)),\"decode-base64\":n=>{try{const e=function(n){const e=atob(n);return Uint8Array.from(e,n=>n.codePointAt(0))}(n);return new TextDecoder(\"utf-8\").decode(e)}catch(e){return n}},\"encode-uri\":n=>{try{return encodeURI(n)}catch(e){return n}},\"decode-uri\":n=>{try{return decodeURI(n)}catch(e){return n}},\"encode-uri-component\":n=>{try{return encodeURIComponent(n)}catch(e){return n}},\"decode-uri-component\":n=>{try{return decodeURIComponent(n)}catch(e){return n}},\"date-locale\":n=>o.currentDate.toLocaleDateString(n),\"time-locale\":n=>o.currentDate.toLocaleTimeString(n),\"datetime-locale\":n=>o.currentDate.toLocaleString(n),\"datetime-custom\":(n,e,t,a,i,r,s,l,c,d,m,h,p,u,g)=>{const w=o.currentDate,b={};return f(b,\"year\",e),f(b,\"month\",t),f(b,\"day\",a),f(b,\"weekday\",i),f(b,\"hour\",r),f(b,\"minute\",s),f(b,\"second\",l),f(b,\"hour12\",c),b.hour12=\"true\"==c,f(b,\"timeZone\",d),f(b,\"fractionalSecondDigits\",m),f(b,\"timeZoneName\",h),f(b,\"dayPeriod\",p),f(b,\"era\",u),f(b,\"localeMatcher\",g),new gj.DateTimeFormat(n,b).format(w);function f(n,e,t){\" \"==t?n[e]=void 0:t&&(n[e]=t)}},\"option-value\":n=>{const t=Tj(e)[n];return null==t?\"\":JSON.stringify(t)}};f[\"date-locale\"].dontReplaceSlash=!0,f[\"time-locale\"].dontReplaceSlash=!0,f[\"datetime-locale\"].dontReplaceSlash=!0,f[\"datetime-custom\"].dontReplaceSlash=!0,a&&(f[\"page-element-text\"]=n=>{const e=a.querySelector(n);return e&&e.textContent},f[\"page-element-attribute\"]=(n,e)=>{const t=a.querySelector(n);return t&&t.getAttribute(e)}),n=xj(n,\"\\\\%\",\"\\\\\\\\%\"),n=xj(n,\"\\\\{\",\"\\\\\\\\{\"),n=xj(n,\"\\\\|\",\"\\\\\\\\|\"),n=xj(n,\"\\\\>\",\"\\\\\\\\>\");let y=await mj(n,{async callFunction(n,[t,a],o){const i=f[n];if(!i)return\"\";if(t=t.replace(/\\\\\\\\(.)/g,\"$1\"),a||(a=[]),a=a.map(n=>n.replace(/\\\\\\\\(.)/g,\"$1\")).filter(n=>null!=n&&null!=n).map(n=>\"\"==n?void 0:n),!(null!=t&&null!=t&&\"\"!=t||a.length>0))return\"\";try{const n=void 0===i.dontReplaceSlash||i.dontReplaceSlash;return await Cj(()=>i(t,...a),n,e.filenameReplacementCharacter,o)}catch(n){return\"\"}},getVariableValue(n,t){const a=b[n];return a?Cj(a.getter,a.dontReplaceSlash,e.filenameReplacementCharacter,t):\"\"}});return y=xj(y,\"\\\\\\\\%\",\"%\"),y=xj(y,\"\\\\\\\\{\",\"{\"),y=xj(y,\"\\\\\\\\|\",\"|\"),y=xj(y,\"\\\\\\\\>\",\">\"),y;function k(n,e=\"\"){b[e+\"datetime-iso\"]={getter:()=>n.toISOString()},b[e+\"date-iso\"]={getter:()=>n.toISOString().split(\"T\")[0]},b[e+\"time-iso\"]={getter:()=>n.toISOString().split(\"T\")[1].split(\"Z\")[0]},b[e+\"date-locale\"]={getter:()=>n.toLocaleDateString()},b[e+\"time-locale\"]={getter:()=>n.toLocaleTimeString()},b[e+\"day-locale\"]={getter:()=>String(n.getDate()).padStart(2,\"0\")},b[e+\"month-locale\"]={getter:()=>String(n.getMonth()+1).padStart(2,\"0\")},b[e+\"year-locale\"]={getter:()=>String(n.getFullYear())},b[e+\"datetime-locale\"]={getter:()=>n.toLocaleString()},b[e+\"datetime-utc\"]={getter:()=>n.toUTCString()},b[e+\"day-utc\"]={getter:()=>String(n.getUTCDate()).padStart(2,\"0\")},b[e+\"month-utc\"]={getter:()=>String(n.getUTCMonth()+1).padStart(2,\"0\")},b[e+\"year-utc\"]={getter:()=>String(n.getUTCFullYear())},b[e+\"hours-locale\"]={getter:()=>String(n.getHours()).padStart(2,\"0\")},b[e+\"minutes-locale\"]={getter:()=>String(n.getMinutes()).padStart(2,\"0\")},b[e+\"seconds-locale\"]={getter:()=>String(n.getSeconds()).padStart(2,\"0\")},b[e+\"hours-utc\"]={getter:()=>String(n.getUTCHours()).padStart(2,\"0\")},b[e+\"minutes-utc\"]={getter:()=>String(n.getUTCMinutes()).padStart(2,\"0\")},b[e+\"seconds-utc\"]={getter:()=>String(n.getUTCSeconds()).padStart(2,\"0\")},b[e+\"time-ms\"]={getter:()=>String(n.getTime())}}}function xj(n,e,t){if(\"function\"==typeof n.replaceAll)return n.replaceAll(e,t);{const a=new RegExp(e.replace(fj,\"\\\\$1\"),\"g\");return n.replace(a,t)}}async function Cj(n,e,t,a){const{maxLength:o,maxCharLength:i}=function(n){if(n){const{unit:e,length:t}=n;let a,o;return\"char\"==e?o=t:a=t,{maxLength:a,maxCharLength:o}}return{}}(a);let r=await n()||\"\";return e||(r=r.replace(/\\/+/g,t)),o?r=await zj(r,o):i&&(r=r.substring(0,i)),r}function Aj(n){try{return decodeURI(n)}catch(e){return n}}function Lj(n,e){let t=n.pathname.match(/\\/([^/]+)$/),a=t&&t[0];return a||(t=n.href.match(/([^/]+)\\/?$/),a=t&&t[0]),a||(t=a.match(/(.*)\\.[^.]+$/),a=t&&t[0]),a||(a=n.hostname.replace(/\\/+/g,e).replace(/\\/$/,\"\")),t=a.match(/(.*)\\.[^.]+$/),t&&t[1]&&(a=t[1]),a=a.replace(/\\/$/,\"\").replace(/^\\//,\"\"),a}function zj(n,e){const t=new hj([n]),a=new pj;return a.readAsText(t.slice(0,e)),new Promise((t,o)=>{a.addEventListener(\"load\",()=>{n.startsWith(a.result)?t(a.result):zj(n,e-1).then(t).catch(o)},!1),a.addEventListener(\"error\",o,!1)})}function Tj(n){const e=Object.assign({},n);return delete e.content,delete e.usedFonts,delete e.extensionScriptFiles,delete e.taskId,delete e.updatedResources,delete e.visitDate,delete e.keepFilename,delete e.insertCanonicalLink,delete e.frames,delete e.win,delete e.doc,delete e.url,delete e.resourceReferrer,delete e.baseURI,delete e.rootDocument,delete e.fontTests,delete e.canvases,delete e.fonts,delete e.worklets,delete e.stylesheets,delete e.images,delete e.posters,delete e.videos,delete e.shadowRoots,delete e.referrer,delete e.adoptedStyleSheets,delete e.tabId,delete e.tabIndex,delete e.saveDate,delete e.saveUrl,delete e.title,delete e.info,e}var Ej=Object.freeze({__proto__:null,evalTemplate:jj,formatFilename:Sj}),Rj=Object.freeze({__proto__:null,cssRulesMinifier:PS,fontsMinifier:fv,htmlMinifier:nj,imagesAltMinifier:US,mediasAltMinifier:zv,serializer:cj,templateFormatter:Ej});const Ij=\"data:\",Dj=/(#.+?)$/,Mj=\"blob:\",Pj=/^https?:\\/\\//,Nj=/^file:\\/\\//,_j=/^https?:\\/\\/+\\s*$/,Bj=/^(https?:\\/\\/|file:\\/\\/|blob:).+/,Oj=/(url|local|-sf-url-original)\\(.*?\\)\\s*(,|$)/g,Fj=/url\\s*\\(\\s*'(.*?)'\\s*\\)/i,Uj=/url\\s*\\(\\s*\"(.*?)\"\\s*\\)/i,qj=/url\\s*\\(\\s*(.*?)\\s*\\)/i,Hj=/^'(.*?)'$/,Wj=/^\"(.*?)\"$/,Gj=/^url\\(\\s*[\"']?data:font\\/(woff2?)/,Vj=/^url\\(\\s*[\"']?data:application\\/x-font-(woff)/,Kj=/\\.([^.?#]+)((\\?|#).*?)?$/,Jj=/format\\((.*?)\\)\\s*,?$/,Yj=/(.*?)\\s*,?$/,Zj={\"ultra-condensed\":\"50%\",\"extra-condensed\":\"62.5%\",condensed:\"75%\",\"semi-condensed\":\"87.5%\",normal:\"100%\",\"semi-expanded\":\"112.5%\",expanded:\"125%\",\"extra-expanded\":\"150%\",\"ultra-expanded\":\"200%\"},$j=globalThis.Blob,Xj=globalThis.FileReader,Qj=globalThis.Image,nx=globalThis.OffscreenCanvas;let ex,tx;function ax(n,e){return ex=n,tx=e,ox}class ox{async processPageResources(n,e,t,a,o,i){t.blockImages&&n.querySelectorAll(\"svg\").forEach(n=>n.remove());let r=[['link[href][rel*=\"icon\"]',\"href\",!0],['object[type=\"image/svg+xml\"], object[type=\"image/svg-xml\"], object[data*=\".svg\"]',\"data\"],[\"img[src], input[src][type=image]\",\"src\",!1,!0],['embed[src*=\".svg\"]',\"src\"],[\"video[poster]\",\"poster\"],[\"*[background]\",\"background\"],[\"image, feImage\",\"xlink:href\"],[\"image, feImage\",\"href\"]].map(([r,s,l,c])=>this.processAttribute(n,n.querySelectorAll(r),s,e,t,\"image\",a,l,i,o,c));r=r.concat([this.processXLinks(n.querySelectorAll(\"use\"),n,e,t,i,\"xlink:href\"),this.processXLinks(n.querySelectorAll(\"use\"),n,e,t,i,\"href\"),this.processSrcset(n.querySelectorAll(\"img[srcset], source[srcset]\"),e,t,a,i)]),r.push(this.processAttribute(n,n.querySelectorAll('object[data*=\".pdf\"]'),\"data\",e,t,null,a,!1,i,o)),r.push(this.processAttribute(n,n.querySelectorAll('embed[src*=\".pdf\"]'),\"src\",e,t,null,a,!1,i,o)),r.push(this.processAttribute(n,n.querySelectorAll(\"audio[src], audio > source[src]\"),\"src\",e,t,\"audio\",a,!1,i,o)),r.push(this.processAttribute(n,n.querySelectorAll(\"video[src], video > source[src]\"),\"src\",e,t,\"video\",a,!1,i,o)),r.push(this.processAttribute(n,n.querySelectorAll(\"audio track[src], video track[src]\"),\"src\",e,t,null,a,!1,i,o)),r.push(this.processAttribute(n,n.querySelectorAll(\"model[src]\"),\"src\",e,t,null,a,!1,i,o)),await Promise.all(r),t.saveFavicon&&this.processShortcutIcons(n)}async processXLinks(n,e,t,a,o,i){await Promise.all(Array.from(n).map(async n=>{let e=n.getAttribute(i);null==e&&(i=\"href\",e=n.getAttribute(i)),a.saveOriginalURLs&&!px(e)&&n.setAttribute(\"data-sf-original-href\",e);let r=sx(e);if(a.blockImages)n.setAttribute(i,ex.EMPTY_RESOURCE);else if(wx(r)&&!gx(r)){n.setAttribute(i,ex.EMPTY_RESOURCE);try{r=ex.resolveURL(r,t)}catch(n){}if(bx(r)){const a=e.match(Dj);if(e.startsWith(t+\"#\"))n.setAttribute(i,a[0]);else{const e=await o.addURL(r,{expectedType:\"image\"}),t=ex.parseSVGContent(e.content);if(a&&a[0]){let e;try{e=t.querySelector(a[0])}catch(n){}e&&(n.setAttribute(i,a[0]),n.parentElement.insertBefore(e,n.parentElement.firstChild))}else n.setAttribute(i,\"data:image/svg+xml,\"+e.content)}}}else r==a.url&&n.setAttribute(i,e.substring(r.length))}))}async processStylesheet(n,e,t,a,o){const i=[],r=[],s=this;for(let c=n.head;c;c=c.next){const n=c.data;\"Atrule\"==n.type&&\"charset\"==n.name?r.push(c):n.block&&n.block.children&&(\"Rule\"==n.type?i.push(s.processStyle(n,t,a,o)):\"Atrule\"!=n.type||\"media\"!=n.name&&\"supports\"!=n.name&&\"layer\"!=n.name&&\"container\"!=n.name?\"Atrule\"==n.type&&\"font-face\"==n.name&&i.push(l(n)):i.push(s.processStylesheet(n.block.children,e,t,a,o)))}async function l(n){const i=dx(n);await Promise.all(i.map(async n=>{const i=n.value;if(t.blockFonts)n.value=ex.EMPTY_RESOURCE;else{const r=sx(i);!gx(r)&&bx(r)&&await s.processFont(r,n,i,e,t,a,o)}}))}r.forEach(e=>n.remove(e)),await Promise.all(i)}async processSrcset(n,e,t,a,o){await Promise.all(Array.from(n).map(async n=>{const i=n.getAttribute(\"srcset\"),r=ex.parseSrcset(i);if(t.saveOriginalURLs&&!px(i)&&n.setAttribute(\"data-sf-original-srcset\",i),t.blockImages||t.blockAlternativeImages)n.setAttribute(\"srcset\",\"\");else{const t=await Promise.all(r.map(async n=>{let t=sx(n.url);if(gx(t))return t+(n.w?\" \"+n.w+\"w\":n.d?\" \"+n.d+\"x\":\"\");if(wx(t)){try{t=ex.resolveURL(t,e)}catch(n){}return bx(t)?this.processImageSrcset(t,n,a,o):\"\"}return\"\"}));n.setAttribute(\"srcset\",t.join(\", \"))}}))}setBackgroundImage(n,e,t){n.style.setProperty(\"background-blend-mode\",\"normal\",\"important\"),n.style.setProperty(\"background-clip\",\"content-box\",\"important\"),n.style.setProperty(\"background-position\",t&&t[\"background-position\"]?t[\"background-position\"]:\"center\",\"important\"),n.style.setProperty(\"background-color\",t&&t[\"background-color\"]?t[\"background-color\"]:\"transparent\",\"important\"),n.style.setProperty(\"background-image\",e,\"important\"),n.style.setProperty(\"background-size\",t&&t[\"background-size\"]?t[\"background-size\"]:\"100% 100%\",\"important\"),n.style.setProperty(\"background-origin\",\"content-box\",\"important\"),n.style.setProperty(\"background-repeat\",\"no-repeat\",\"important\")}async getStylesheetContent(n,e){const t=await ex.getContent(n,{inline:!e.compressContent,maxResourceSize:e.maxResourceSize,maxResourceSizeEnabled:e.maxResourceSizeEnabled,validateTextContentType:!0,frameId:e.frameId,charset:e.charset,resourceReferrer:e.resourceReferrer,baseURI:e.baseURI,blockMixedContent:e.blockMixedContent,expectedType:\"stylesheet\",acceptHeaders:e.acceptHeaders,networkTimeout:e.networkTimeout});return lx(t.data,t.charset)||lx(t.data,e.charset)?t:(e=Object.assign({},e,{charset:cx(t.data)}),ex.getContent(n,{inline:!e.compressContent,maxResourceSize:e.maxResourceSize,maxResourceSizeEnabled:e.maxResourceSizeEnabled,validateTextContentType:!0,frameId:e.frameId,charset:e.charset,resourceReferrer:e.resourceReferrer,baseURI:e.baseURI,blockMixedContent:e.blockMixedContent,expectedType:\"stylesheet\",acceptHeaders:e.acceptHeaders,networkTimeout:e.networkTimeout}))}processShortcutIcons(n){let e=hx(Array.from(n.querySelectorAll('link[href][rel=\"shortcut icon\"]')));e||(e=hx(Array.from(n.querySelectorAll('link[href][rel=\"icon\"]')))),e||(e=hx(Array.from(n.querySelectorAll('link[href][rel*=\"icon\"]'))),e&&(e.rel=\"shortcut icon\")),e&&n.querySelectorAll('link[href][rel*=\"icon\"]').forEach(n=>{n!=e&&n.remove()})}removeSingleLineCssComments(n){if(n.children){const e=[];for(let t=n.children.head;t;t=t.next){const n=t.data;\"Raw\"==n.type&&n.value&&n.value.trim().startsWith(\"//\")&&e.push(t)}e.forEach(e=>n.children.remove(e))}}replacePseudoClassDefined(n){tx.walk(n,{enter:function(n,e,t){\"PseudoClassSelector\"==n.type&&\"defined\"==n.name&&(null==e.prev||\"Combinator\"==e.prev.data.type||\"WhiteSpace\"==e.prev.data.type?t.replace(e,tx.parse(\"*\",{context:\"selector\"}).children.head):t.remove(e))}})}resolveStylesheetURLs(n,e,t){dx(n).map(n=>{const a=n.value;let o=sx(a);if(!gx(o)&&(t.textContent='tmp { content:\"'+o+'\"}',t.sheet&&t.sheet.cssRules&&(o=ex.removeQuotes(t.sheet.cssRules[0].style.getPropertyValue(\"content\"))),!gx(o)))if(!o||wx(o)){let t;if(!a.startsWith(\"#\"))try{t=ex.resolveURL(o,e)}catch(n){}bx(t)&&(n.value=t)}else n.value=ex.EMPTY_RESOURCE})}async removeAlternativeFonts(n,e,t,a){const o={fonts:new Map,medias:new Map,supports:new Map,layers:new Map},i={rules:{processed:0,discarded:0},fonts:{processed:0,discarded:0}};let r=0;return e.forEach(e=>{if(e.stylesheet){const t=e.stylesheet.children;if(t)if(i.rules.processed+=t.size,i.rules.discarded+=t.size,e.mediaText&&\"all\"!=e.mediaText){const a=this.createFontsDetailsInfo();o.medias.set(\"media-\"+r+\"-\"+e.mediaText,a),this.getFontsDetails(n,t,r,a)}else this.getFontsDetails(n,t,r,o)}r++}),ix(o),await Promise.all([...e].map(async([,n],e)=>{if(n.stylesheet){const r=n.stylesheet.children,s=n.mediaText;r&&(s&&\"all\"!=s?await this.processFontFaceRules(r,e,o.medias.get(\"media-\"+e+\"-\"+s),t,a,i):await this.processFontFaceRules(r,e,o,t,a,i),i.rules.discarded-=r.size)}})),i}async processFontFaceRules(n,e,t,a,o,i){const r=[];let s=0,l=0,c=0;for(let d=n.head;d;d=d.next){const n=d.data;if(\"Atrule\"==n.type&&\"media\"==n.name&&n.block&&n.block.children&&n.prelude){const r=tx.generate(n.prelude);await this.processFontFaceRules(n.block.children,e,t.medias.get(\"media-\"+e+\"-\"+s+\"-\"+r),a,o,i),s++}else if(\"Atrule\"==n.type&&\"supports\"==n.name&&n.block&&n.block.children&&n.prelude){const r=tx.generate(n.prelude);await this.processFontFaceRules(n.block.children,e,t.supports.get(\"supports-\"+e+\"-\"+l+\"-\"+r),a,o,i),l++}else if(\"Atrule\"==n.type&&\"layer\"==n.name&&n.block&&n.block.children&&n.prelude){const r=tx.generate(n.prelude);await this.processFontFaceRules(n.block.children,e,t.layers.get(\"layer-\"+e+\"-\"+c+\"-\"+r),a,o,i),c++}else if(\"Atrule\"==n.type&&\"font-face\"==n.name){const e=this.getFontKey(n),s=t.fonts.get(e);s?await this.processFontFaceRule(n,s,a,o,i):r.push(d)}}r.forEach(e=>n.remove(e))}getFontsDetails(n,e,t,a){let o=0,i=0,r=0;e.forEach(e=>{if(\"Atrule\"==e.type&&\"media\"==e.name&&e.block&&e.block.children&&e.prelude){const i=tx.generate(e.prelude),r=this.createFontsDetailsInfo();a.medias.set(\"media-\"+t+\"-\"+o+\"-\"+i,r),o++,this.getFontsDetails(n,e.block.children,t,r)}else if(\"Atrule\"==e.type&&\"supports\"==e.name&&e.block&&e.block.children&&e.prelude){const o=tx.generate(e.prelude),r=this.createFontsDetailsInfo();a.supports.set(\"supports-\"+t+\"-\"+i+\"-\"+o,r),i++,this.getFontsDetails(n,e.block.children,t,r)}else if(\"Atrule\"==e.type&&\"layer\"==e.name&&e.block&&e.block.children&&e.prelude){const o=tx.generate(e.prelude),i=this.createFontsDetailsInfo();a.layers.set(\"layer-\"+t+\"-\"+r+\"-\"+o,i),r++,this.getFontsDetails(n,e.block.children,t,i)}else if(\"Atrule\"==e.type&&\"font-face\"==e.name&&e.block&&e.block.children){const n=this.getFontKey(e);let t=a.fonts.get(n);t||(t=[],a.fonts.set(n,t));const o=this.getPropertyValue(e,\"src\");if(o){const n=o.match(Oj);n&&n.forEach(n=>{t.includes(n)&&t.splice(t.indexOf(n),1),t.unshift(n)})}}})}createFontsDetailsInfo(){return{fonts:new Map,medias:new Map,supports:new Map,layers:new Map}}getFontKey(n){return JSON.stringify([Zi(this.getPropertyValue(n,\"font-family\")),ar(this.getPropertyValue(n,\"font-weight\")||\"400\"),this.getPropertyValue(n,\"font-style\")||\"normal\",this.getPropertyValue(n,\"unicode-range\"),(e=this.getPropertyValue(n,\"font-stretch\"),Zj[e]||e),this.getPropertyValue(n,\"font-variant\")||\"normal\",this.getPropertyValue(n,\"font-feature-settings\"),this.getPropertyValue(n,\"font-variation-settings\")]);var e}getPropertyValue(n,e){let t;if(n.block.children&&(t=n.block.children.filter(n=>{try{return n.property==e&&!tx.generate(n.value).match(/\\\\9$/)}catch(t){return n.property==e}}).tail),t)try{return tx.generate(t.data.value)}catch(n){}}}function ix(n,e){n.fonts.forEach((e,t)=>{n.fonts.set(t,e.map(n=>{const e=n.match(Jj);let t;const a=function(n){const e=(n=n.replace(/url\\(-sf-url-original\\\\\\(\\\\\"(.*?)\\\\\"\\\\\\)\\\\ /g,\"\")).match(Fj)||n.match(Uj)||n.match(qj);return e&&e[1]}(n);if(e&&e[1]&&(t=e[1].replace(Hj,\"$1\").replace(Wj,\"$1\").toLowerCase()),!t){const e=n.match(Gj);if(e&&e[1])t=e[1];else{const e=n.match(Vj);e&&e[1]&&(t=e[1])}}if(!t&&a){const n=a.match(Kj);n&&n[1]&&(t=n[1])}return{src:n.match(Yj)[1],fontUrl:a,format:t}}))}),n.medias.forEach(n=>ix(n)),n.supports.forEach(n=>ix(n)),n.layers.forEach(n=>ix(n))}function rx(n,e){if(e.rootDocument&&e.updatedResources[n])return e.updatedResources[n].retrieved=!0,e.updatedResources[n].content}function sx(n){return!n||n.startsWith(Ij)?n:n.split(\"#\")[0]}function lx(n=\"\",e=\"utf-8\"){const t=cx(n);return!t||t==e.toLowerCase()}function cx(n=\"\"){const e=n.match(/^@charset\\s+\"([^\"]*)\";/i);if(e&&e[1])return e[1].toLowerCase().trim()}function dx(n){return tx.findAll(n,n=>\"Url\"==n.type)}function mx(n){return tx.findAll(n,n=>\"Atrule\"==n.type&&\"import\"==n.name)}function hx(n){return(n=n.filter(n=>n.href!=ex.EMPTY_RESOURCE)).sort((n,e)=>(parseInt(e.sizes,10)||16)-(parseInt(n.sizes,10)||16)),n[0]}function px(n){return n&&(n.startsWith(Ij)||n.startsWith(Mj))}function ux(n){return n.replace(/url\\(-sf-url-original\\\\\\(\\\\\"(.*?)\\\\\"\\\\\\)\\\\ /g,\"/* original URL: $1 */url(\")}function gx(n){return n&&(n.startsWith(Ij)||\"about:blank\"==n)}function wx(n){return n&&!n.match(_j)}function bx(n){return wx(n)&&(n.match(Pj)||n.match(Nj)||n.startsWith(Mj))&&n.match(Bj)}async function fx(n,e,{imageReductionFactor:t}){if(e){const a=e.substring(5,e.indexOf(\";\"));if(\"image/jpeg\"==a||\"image/png\"==a||\"image/webp\"==a)try{const o=new Qj;o.src=e,await new Promise((n,e)=>{o.onload=n,o.onerror=e});const i=o.naturalWidth/t,r=o.naturalHeight/t;let s;try{const n=new nx(i,r);n.getContext(\"2d\").drawImage(o,0,0,i,r),s=await n.convertToBlob({type:a})}catch{const e=n.createElement(\"canvas\");e.width=i,e.height=r;e.getContext(\"2d\").drawImage(o,0,0,i,r),s=await new Promise(n=>e.toBlob(e=>{if(!e)throw new Error(\"Canvas toBlob failed\");n(e)},a))}s.type==a&&(e=await yx(s,a))}catch{}}return e}function yx(n,e,t){const a=n instanceof $j?n:new $j([n],{type:(e||\"\")+(t?\";charset=\"+t:\"\")});return new Promise((n,e)=>{const t=new Xj;t.onload=()=>n(t.result),t.onerror=()=>e(new Error(t.error)),t.readAsDataURL(a)})}const kx=globalThis.JSON,vx=globalThis.FontFace,Sx=globalThis.Set,jx=globalThis.setTimeout,xx=globalThis.clearTimeout,Cx=globalThis.Image,Ax=\"utf-8\",Lx=\"data:image/svg+xml\",zx=[\"data:text/\"],Tx=/<script/gi,Ex=/<noscript/gi,Rx=/<canvas/gi,Ix=\"--sf-img-\",Dx=524288,Mx=/^url\\([\"']?data:[^,]*,?[\"']?\\)/,Px=\"local(\",Nx=\"data-sf-duplicate-stylesheet-ref\";let _x;const Bx=globalThis.JSON,Ox=globalThis.FontFace,Fx=globalThis.Blob,Ux=\"utf-8\",qx=/<script/gi,Hx=/<noscript/gi,Wx=/<canvas/gi,Gx=/^url\\([\"']?data:[^,]*,?[\"']?\\)/,Vx=\"local(\";let Kx;function Jx(n,e){return n.compressContent?function(n){Kx=n;const e=ax(Kx,Xf);return class extends e{async resolveStylesheets(n,e,t,a,o,i,r){\"LINK\"==n.tagName.toUpperCase()&&(n.removeAttribute(\"integrity\"),n.charset&&(o.charset=n.charset),e.url=n.href),await this.resolveStylesheetElement(n,e,t,a,o,i,r)}async resolveStylesheetElement(n,e,t,a,o,i,r){!o.blockStylesheets||o.keepPrintStyleSheets&&\"print\"==e.mediaText?(t.set({element:n},e),o.inlineStylesheetsRefs.has(n)||(\"LINK\"==n.tagName.toUpperCase()?await this.resolveLinkStylesheetURLs(e,n,n.href,a,o,i,r,t):(e.stylesheet=Uf(n.textContent,{context:\"stylesheet\",parseCustomProperty:!0}),await this.resolveImportURLs(e,a,o,i,r,t)))):\"LINK\"==n.tagName.toUpperCase()?n.href=Kx.EMPTY_RESOURCE:n.textContent=\"\"}replaceStylesheets(n,e,t,a){const o=Array.from(e).reverse(),i=new Map;Array.from(new Set(t.inlineStylesheetsRefs.values())).forEach(e=>{const o=n.createElement(\"link\");o.setAttribute(\"rel\",\"stylesheet\"),o.setAttribute(\"type\",\"text/css\");const r=\"stylesheet_\"+a.stylesheets.size+\".css\";o.setAttribute(\"href\",r);let{content:s}=t.inlineStylesheets.get(e);const l=Uf(s,{context:\"stylesheet\",parseCustomProperty:!0});this.replacePseudoClassDefined(l),s=this.generateStylesheetContent(l,t),a.stylesheets.set(a.stylesheets.size,{name:r,content:s}),i.set(e,o)});for(const[n,e]of o)if(n.urlNode){const o=\"stylesheet_\"+a.stylesheets.size+\".css\";!px(e.url)&&t.saveOriginalURLs?n.urlNode.value=\"-sf-url-original(\"+Bx.stringify(e.url)+\") \"+o:n.urlNode.value=o,a.stylesheets.set(a.stylesheets.size,{name:o,stylesheet:e.stylesheet,url:e.url})}else if(\"LINK\"==n.element.tagName.toUpperCase()){const t=n.element,o=\"stylesheet_\"+a.stylesheets.size+\".css\";t.setAttribute(\"href\",o),a.stylesheets.set(a.stylesheets.size,{name:o,stylesheet:e.stylesheet,url:e.url})}else{const a=n.element,o=t.inlineStylesheetsRefs.get(a);if(void 0===o)a.textContent=this.generateStylesheetContent(e.stylesheet,t);else{const t=i.get(o).cloneNode(!0);e.mediaText&&(t.media=e.mediaText),a.replaceWith(t),n.element=t}}for(const[,n]of a.stylesheets)n.stylesheet&&(n.content=this.generateStylesheetContent(n.stylesheet,t),n.stylesheet=null)}async resolveImportURLs(n,e,t,a,o,i){const r=n.stylesheet,s=n.scoped;this.resolveStylesheetURLs(r,e,a);const l=mx(r);await Promise.all(l.map(async n=>{const r=Vf(n,n=>\"Url\"==n.type)||Vf(n,n=>\"String\"==n.type);if(r){let l=sx(r.value);if(!gx(l)&&wx(l)){r.value=Kx.EMPTY_RESOURCE;try{l=Kx.resolveURL(l,e)}catch(n){}if(bx(l)){const e=Vf(n,n=>\"MediaQueryList\"==n.type);let c,d,m;e&&(c=qf(e));const h=Vf(n,n=>\"Layer\"==n.type);h&&(d=h.name);const p=Vf(n,n=>\"Supports\"==n.type);p&&(m=qf(p));const u=Array.from(i).find(([,n])=>n.resourceURL==l);let g;if(u)g=u[1].stylesheet,i.set({urlNode:r},{url:l,stylesheet:g,scoped:s});else{const n={scoped:s,mediaText:c,layerName:d,supportsCondition:m},e=await this.getStylesheetContent(l,t);n.url=l=e.resourceURL,e.data=rx(l,t)||e.data,n.stylesheet=Uf(e.data,{context:\"stylesheet\",parseCustomProperty:!0}),g=n.stylesheet,await this.resolveImportURLs(n,l,t,a,o,i),i.set({urlNode:r},n)}r.importedChildren=g.children,r.importedMediaText=c,r.importedLayerName=d,r.importedSupportsCondition=m}}}}))}async resolveLinkStylesheetURLs(n,e,t,a,o,i,r,s){if((t=sx(t))&&t!=a&&\"about:blank\"!=t){const l=Array.from(s).find(([,n])=>n.resourceURL==t);if(l)s.set({element:e},{url:t,stylesheet:l[1].stylesheet,mediaText:n.mediaText});else{const l=await Kx.getContent(t,{maxResourceSize:o.maxResourceSize,maxResourceSizeEnabled:o.maxResourceSizeEnabled,charset:o.charset,frameId:o.frameId,resourceReferrer:o.resourceReferrer,validateTextContentType:!0,baseURI:a,blockMixedContent:o.blockMixedContent,expectedType:\"stylesheet\",acceptHeaders:o.acceptHeaders,networkTimeout:o.networkTimeout});lx(l.data,l.charset)||lx(l.data,o.charset)?(t=l.resourceURL,l.data=rx(l.resourceURL,o)||l.data,n.stylesheet=Uf(l.data,{context:\"stylesheet\",parseCustomProperty:!0}),await this.resolveImportURLs(n,t,o,i,r,s)):(o=Object.assign({},o,{charset:cx(l.data)}),await this.resolveLinkStylesheetURLs(n,e,t,a,o,i,r,s))}}}async processFrame(n,e,t,a,o,i){const r=\"frames/\"+a.frames.size+\"/\";let s=\"allow-popups allow-top-navigation-by-user-activation allow-scripts\";(e.content.match(Hx)||e.content.match(Wx)||e.content.match(qx)||t.saveRawPage)&&(s+=\" allow-modals allow-popups allow-downloads allow-pointer-lock allow-presentation\"),n.setAttribute(\"sandbox\",s),\"OBJECT\"==n.tagName.toUpperCase()?n.setAttribute(\"data\",r+\"index.html\"):n.setAttribute(\"src\",r+\"index.html\"),a.frames.set(o,{name:r,content:e.content,resources:e.resources,url:i.url})}async processFont(n,e,t,a,o,i,r){let{content:s,extension:l,indexResource:c,contentType:d}=await r.addURL(n,{asBinary:!0,expectedType:\"font\",baseURI:a,blockMixedContent:o.blockMixedContent});const m=\"fonts/\"+c+l;!px(n)&&o.saveOriginalURLs?e.value=\"-sf-url-original(\"+Bx.stringify(t)+\") \"+m:e.value=m,i.fonts.set(c,{name:m,content:s,extension:l,contentType:d,url:n})}async processStyle(n,e,t,a){const o=dx(n);await Promise.all(o.map(async n=>{const o=n.value;if(e.blockImages)n.value=Kx.EMPTY_RESOURCE;else{const i=sx(o);if(!gx(i)&&bx(i)){let{content:r,indexResource:s,contentType:l,extension:c}=await a.addURL(i,{asBinary:!0,expectedType:\"image\"});const d=\"images/\"+s+c;!px(i)&&e.saveOriginalURLs?n.value=\"-sf-url-original(\"+Bx.stringify(o)+\") \"+d:n.value=d,t.images.set(s,{name:d,content:r,extension:c,contentType:l,url:i})}}}))}async processAttribute(n,e,t,a,o,i,r,s,l){function c(n,e,t){\"video\"==t||\"audio\"==t?n.removeAttribute(e):n.setAttribute(e,Kx.EMPTY_RESOURCE)}await Promise.all(Array.from(e).map(async e=>{let d=e.getAttribute(t);if(null!=d){d=sx(d);let m=e.dataset.singleFileOriginURL;if(o.saveOriginalURLs&&!px(d)&&e.setAttribute(\"data-sf-original-\"+t,d),delete e.dataset.singleFileOriginURL,i&&o[\"block\"+i.charAt(0).toUpperCase()+i.substring(1)+\"s\"])c(e,t,i);else if(!gx(d)&&(c(e,t,i),wx(d))){try{d=Kx.resolveURL(d,a)}catch(n){}if(bx(d)){const c=[\"OBJECT\",\"EMBED\"].includes(e.tagName.toUpperCase())?e.getAttribute(\"type\"):\"\";let{content:h,indexResource:p,extension:u,contentType:g,charset:w}=await l.addURL(d,{asBinary:!0,expectedType:i,contentType:c});if(m&&this.testEmptyResource(h)){try{m=Kx.resolveURL(m,a)}catch(n){}try{d=m,h=(await Kx.getContent(d,{asBinary:!0,expectedType:i,contentType:c,maxResourceSize:o.maxResourceSize,maxResourceSizeEnabled:o.maxResourceSizeEnabled,frameId:o.windowId,resourceReferrer:o.resourceReferrer,acceptHeaders:o.acceptHeaders,networkTimeout:o.networkTimeout})).data}catch(n){}}if(o.imageReductionFactor>1&&\"image\"==i){const e=await fx(n,await yx(new Fx([h],{type:g}),w),o);h=(await Kx.getContent(e,{asBinary:!0})).data}if(s&&this.testEmptyResource(h))e.remove();else if(!this.testEmptyResource(h)){const n=\"images/\"+p+u;e.setAttribute(t,n),r.images.set(p,{name:n,content:h,extension:u,contentType:g,url:d})}}}}}))}async processImageSrcset(n,e,t,a){const{content:o,indexResource:i,extension:r,contentType:s}=await a.addURL(n,{asBinary:!0,expectedType:\"image\"}),l=\"images/\"+i+r;return t.images.set(i,{name:l,content:o,extension:r,contentType:s,url:n}),l+(e.w?\" \"+e.w+\"w\":e.h?\" \"+e.h+\"h\":e.d?\" \"+e.d+\"x\":\"\")}testEmptyResource(n){return!n}generateStylesheetContent(n,e){e.compressCSS&&this.removeSingleLineCssComments(n),this.replacePseudoClassDefined(n);let t=qf(n);return e.compressCSS&&(t=Kx.compressCSS(t)),e.saveOriginalURLs&&(t=ux(t)),t}getAdditionalPageData(n,e,t){const a={};let o=e;t.stylesheets.forEach(n=>o+=n.content),Object.keys(t).forEach(n=>{Array.from(t[n]).filter(([,n])=>!o.includes(n.name)).forEach(([e])=>t[n].delete(e)),a[n]=Array.from(t[n].values())});const i=n.head.querySelector(\"meta[name=viewport]\"),r=i?i.content:null;return{doctype:Kx.getDoctypeString(n),resources:a,viewport:r}}async processScript(n,e,t,a,o,i){let{content:r,indexResource:s,extension:l,contentType:c}=await o.addURL(e,{asBinary:!0,charset:a!=Ux&&a,maxResourceSize:t.maxResourceSize,maxResourceSizeEnabled:t.maxResourceSizeEnabled,frameId:t.windowId,resourceReferrer:t.resourceReferrer,baseURI:t.baseURI,blockMixedContent:t.blockMixedContent,expectedType:\"script\",acceptHeaders:t.acceptHeaders,networkTimeout:t.networkTimeout});r=rx(e,t)||r;const d=\"scripts/\"+s+l;n.setAttribute(\"src\",d),i.scripts.set(s,{name:d,content:r,extension:l,contentType:c,url:e})}async processWorklet(n,e,t,a,o,i,r){let{content:s,indexResource:l,extension:c,contentType:d}=await i.addURL(e,{asBinary:!0,charset:o!=Ux&&o,maxResourceSize:a.maxResourceSize,maxResourceSizeEnabled:a.maxResourceSizeEnabled,frameId:a.windowId,resourceReferrer:a.resourceReferrer,baseURI:a.baseURI,blockMixedContent:a.blockMixedContent,expectedType:\"script\",acceptHeaders:a.acceptHeaders,networkTimeout:a.networkTimeout});const m=\"scripts/\"+l+c;n.textContent+=t?`  CSS.paintWorklet.addModule(\"${m}\", ${Bx.stringify(t)});\\n`:`  CSS.paintWorklet.addModule(\"${m}\");\\n`,r.worklets.set(l,{name:m,workletOptions:t,content:s,extension:c,contentType:d,url:e})}setMetaCSP(n){n.content=\"default-src 'none'; connect-src 'self' data: blob:; font-src 'self' data: blob:; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline' data: blob:; frame-src 'self' data: blob:; media-src 'self' data: blob:; script-src 'self' 'unsafe-inline' data: blob:; object-src 'self' data: blob:;\"}removeUnusedStylesheets(){}async processFontFaceRule(n,e,t,a,o){await Promise.all(e.map(async n=>{if(a.has(n.src))n.valid=a.get(n.src);else{if(Ox&&n.fontUrl){const e=[...t].find(([,e])=>n.fontUrl&&e.name==n.fontUrl);if(e){const t=e[1],a=new Ox(\"test-font\",new Uint8Array(t.content).buffer);try{let e;await Promise.race([a.load().then(()=>a.loaded).then(()=>{n.valid=!0,globalThis.clearTimeout(e)}),new Promise(t=>e=globalThis.setTimeout(()=>{n.valid=!0,t()},5e3))])}catch(e){if(\"NetworkError\"==e.name)n.valid=!0;else{const e=new Ox(\"test-font\",\"url(\"+t.url+\")\");try{let t;await Promise.race([e.load().then(()=>e.loaded).then(()=>{n.valid=!0,globalThis.clearTimeout(t)}),new Promise(e=>t=globalThis.setTimeout(()=>{n.valid=!0,e()},5e3))])}catch(n){}}}}else n.valid=!0}else n.valid=!0;a.set(n.src,n.valid)}}));const i=(n,t)=>Kx.findLast(e,e=>!e.src.match(Gx)&&e.format==n&&(!t||e.valid)),r=(n,t)=>Kx.findLast(e,e=>!e.src.match(Gx)&&e.contentType==n&&(!t||e.valid)),s=n=>e.filter(e=>e==n||e.src.startsWith(Vx));o.fonts.processed+=e.length,o.fonts.discarded+=e.length;const l=i(\"woff2-variations\",!0)||i(\"woff2\",!0)||i(\"woff\",!0)||r(\"font/woff2\",!0)||r(\"font/woff\",!0)||r(\"application/font-woff\",!0)||r(\"application/x-font-woff\",!0);if(l)e=s(l);else{const n=i(\"truetype-variations\",!0)||i(\"truetype\",!0)||r(\"font/ttf\",!0)||r(\"application/x-font-ttf\",!0)||r(\"application/x-font-ttf\",!0)||r(\"application/x-font-truetype\",!0);if(n)e=s(n);else{const n=i(\"opentype\")||i(\"embedded-opentype\")||r(\"font/otf\")||r(\"application/x-font-opentype\")||r(\"application/font-sfnt\");e=n?s(n):e.filter(n=>!n.src.match(Gx)&&n.valid||n.src.startsWith(Vx))}}o.fonts.discarded-=e.length;const c=[];for(let e=n.block.children.head;e;e=e.next)\"src\"==e.data.property&&c.push(e);c.pop(),c.forEach(e=>n.block.children.remove(e));const d=n.block.children.filter(n=>\"src\"==n.property).tail;if(d){e.reverse();try{d.data.value=Uf(e.map(n=>n.src).join(\",\"),{context:\"value\",parseCustomProperty:!0})}catch(n){}}}}}(e):function(n){_x=n;const e=ax(_x,Xf);return class extends e{async resolveStylesheets(n,e,t,a,o,i){\"LINK\"==n.tagName.toUpperCase()&&n.charset&&(o.charset=n.charset),await this.resolveStylesheetElement(n,e,t,a,o,i)}async resolveStylesheetElement(n,e,t,a,o,i){let r;t.set(n,e),o.inlineStylesheetsRefs.has(n)||((!o.blockStylesheets||o.keepPrintStyleSheets&&\"print\"==e.mediaText)&&(\"LINK\"==n.tagName.toUpperCase()?r=await this.resolveLinkStylesheetURLs(n.href,a,o,i):(r=Uf(n.textContent,{context:\"stylesheet\",parseCustomProperty:!0}),await this.resolveImportURLs(r,a,o,i)&&(r=Uf(qf(r),{context:\"stylesheet\",parseCustomProperty:!0})))),r&&r.children?(o.compressCSS&&this.removeSingleLineCssComments(r),this.replacePseudoClassDefined(r),o.inlineStylesheets.forEach(({content:e,styleElement:t},a)=>{e===n.textContent&&o.inlineStylesheets.set(a,{styleElement:t,content:this.generateStylesheetContent(r,o)})}),e.stylesheet=r):t.delete(n))}replaceStylesheets(n,e,t){if(n.querySelectorAll(\"style\").forEach(a=>{const o=e.get(a);if(o){e.delete(a);const i=t.inlineStylesheetsRefs.get(a);if(void 0===i)a.textContent=this.generateStylesheetContent(o.stylesheet,t),t.inlineStylesheets.forEach(({styleElement:n},e)=>{n===a&&t.inlineStylesheets.set(e,{styleElement:n,content:a.textContent})});else if(t.groupDuplicateStylesheets){if(!n.querySelector(\"style[\"+Nx+'=\"'+i+'\"]')){const e=n.createElement(\"style\");e.textContent=t.inlineStylesheets.get(i).content,e.setAttribute(\"media\",\"not all\"),e.setAttribute(Nx,i),n.head.appendChild(e)}a.textContent=\"/* */\",a.setAttribute(\"onload\",\"this.textContent=document.querySelector('style[\"+Nx+'=\"'+i+\"\\\"]')?.textContent;this.removeAttribute('onload')\")}else a.textContent=t.inlineStylesheets.get(i).content;o.mediaText&&(a.media=o.mediaText)}else a.remove()}),t.groupDuplicateStylesheets&&n.querySelector(\"style[\"+Nx+\"]\")){const e=n.createElement(\"script\");e.textContent='document.currentScript.remove();addEventListener(\"load\",()=>document.querySelectorAll(\"style['+Nx+']\").forEach(e=>e.remove()))',n.body.appendChild(e)}n.querySelectorAll(\"link[rel*=stylesheet]\").forEach(a=>{const o=e.get(a);if(o){e.delete(a);const i=n.createElement(\"style\");o.mediaText&&(i.media=o.mediaText),i.textContent=this.generateStylesheetContent(o.stylesheet,t),a.parentElement.replaceChild(i,a)}else a.remove()})}async resolveImportURLs(n,e,t,a,o=new Sx){let i;this.resolveStylesheetURLs(n,e,a);const r=mx(n);return await Promise.all(r.map(async n=>{const r=Vf(n,n=>\"Url\"==n.type)||Vf(n,n=>\"String\"==n.type);if(r){let s=sx(r.value);if(!gx(s)&&wx(s)){r.value=_x.EMPTY_RESOURCE;try{s=_x.resolveURL(s,e)}catch(n){}if(bx(s)&&!o.has(s)){t.inline=!0;const e=await this.getStylesheetContent(s,t);s=e.resourceURL,e.data=rx(s,t)||e.data,e.data&&e.data.match(/^<!doctype /i)&&(e.data=\"\");const r=Vf(n,n=>\"MediaQueryList\"==n.type);r&&(e.data=this.wrapMediaQuery(e.data,qf(r)));const l=Vf(n,n=>\"LayerList\"==n.type);if(l){const n=[];l.children.forEach(e=>{\"Identifier\"==e.type&&n.push(e.name)}),1==n.length&&(e.data=this.wrapLayer(e.data,n[0]))}const c=Vf(n,n=>\"Supports\"==n.type);c&&(e.data=\"@supports \"+qf(c)+\" { \"+e.data+\" }\");const d=Uf(e.data,{context:\"stylesheet\",parseCustomProperty:!0}),m=new Sx(o);m.add(s),await this.resolveImportURLs(d,s,t,a,m);for(let e of Object.keys(d))n[e]=d[e];i=!0}}}})),i}async resolveLinkStylesheetURLs(n,e,t,a){if((n=sx(n))&&n!=e&&\"about:blank\"!=n){const o=await _x.getContent(n,{inline:!0,maxResourceSize:t.maxResourceSize,maxResourceSizeEnabled:t.maxResourceSizeEnabled,charset:t.charset,frameId:t.frameId,resourceReferrer:t.resourceReferrer,validateTextContentType:!0,baseURI:e,blockMixedContent:t.blockMixedContent,expectedType:\"stylesheet\",acceptHeaders:t.acceptHeaders,networkTimeout:t.networkTimeout});if(!lx(o.data,o.charset)&&!lx(o.data,t.charset))return t=Object.assign({},t,{charset:cx(o.data)}),this.resolveLinkStylesheetURLs(n,e,t,a);n=o.resourceURL,o.data=rx(o.resourceURL,t)||o.data,o.data&&o.data.match(/^<!doctype /i)&&(o.data=\"\");let i=Uf(o.data,{context:\"stylesheet\",parseCustomProperty:!0});return await this.resolveImportURLs(i,n,t,a)&&(i=Uf(qf(i),{context:\"stylesheet\",parseCustomProperty:!0})),i}}async processFrame(n,e,t){let a=\"allow-popups allow-top-navigation-by-user-activation\";(e.content.match(Ex)||e.content.match(Rx)||e.content.match(Tx)||t.saveRawPage)&&(a+=\" allow-scripts allow-modals allow-popups allow-downloads allow-pointer-lock allow-presentation\"),n.setAttribute(\"sandbox\",a),\"OBJECT\"==n.tagName.toUpperCase()?n.setAttribute(\"data\",\"data:text/html,\"+e.content):\"FRAME\"==n.tagName.toUpperCase()?n.setAttribute(\"src\",\"data:text/html,\"+e.content.replace(/%/g,\"%25\").replace(/#/g,\"%23\")):(n.setAttribute(\"srcdoc\",e.content),n.removeAttribute(\"src\"))}async processFont(n,e,t,a,o,i,r){let{content:s}=await r.addURL(n,{asBinary:!0,expectedType:\"font\",baseURI:a,blockMixedContent:o.blockMixedContent}),l=i.fonts.get(e);l||(l=[],i.fonts.set(e,l)),l.push(n),!px(n)&&o.saveOriginalURLs?e.value=\"-sf-url-original(\"+kx.stringify(t)+\") \"+s:e.value=s}async processStyle(n,e,t,a){const o=dx(n);await Promise.all(o.map(async n=>{const o=n.value;if(e.blockImages)n.value=_x.EMPTY_RESOURCE;else{const i=sx(o);if(!gx(i)&&bx(i)){let{content:r,indexResource:s,duplicate:l}=await a.addURL(i,{asBinary:!0,expectedType:\"image\",groupDuplicates:e.groupDuplicateImages});if(!o.startsWith(\"#\")){const a=e.maxSizeDuplicateImages||Dx;if(l&&e.groupDuplicateImages&&_x.getContentSize(r)<a){const e=Uf(\"var(\"+Ix+s+\")\",{context:\"value\"});for(let t of Object.keys(e.children.head.data))n[t]=e.children.head.data[t];t.cssVariables.set(s,{content:r,url:o})}else!px(i)&&e.saveOriginalURLs?n.value=\"-sf-url-original(\"+kx.stringify(o)+\") \"+r:n.value=r}}}}))}async processAttribute(n,e,t,a,o,i,r,s,l,c,d){function m(n,e,t){\"video\"==t||\"audio\"==t?n.removeAttribute(e):n.setAttribute(e,_x.EMPTY_RESOURCE)}await Promise.all(Array.from(e).map(async e=>{let h=e.getAttribute(t);if(null!=h){h=sx(h);let p=e.dataset.singleFileOriginURL;if(o.saveOriginalURLs&&!px(h)&&e.setAttribute(\"data-sf-original-\"+t,h),delete e.dataset.singleFileOriginURL,i&&o[\"block\"+i.charAt(0).toUpperCase()+i.substring(1)+\"s\"])m(e,t,i);else if(!gx(h)&&(m(e,t,i),wx(h))){try{h=_x.resolveURL(h,a)}catch(n){}if(bx(h)){const m=[\"OBJECT\",\"EMBED\"].includes(e.tagName.toUpperCase())?e.getAttribute(\"type\"):\"\",u=o.groupDuplicateImages&&\"IMG\"==e.tagName.toUpperCase()&&\"src\"==t;let{content:g,indexResource:w,duplicate:b}=await l.addURL(h,{asBinary:!0,expectedType:i,contentType:m,groupDuplicates:u});if(p&&this.testEmptyResource(g)){try{p=_x.resolveURL(p,a)}catch(n){}try{h=p,g=(await _x.getContent(h,{asBinary:!0,inline:!0,expectedType:i,contentType:m,maxResourceSize:o.maxResourceSize,maxResourceSizeEnabled:o.maxResourceSizeEnabled,frameId:o.windowId,resourceReferrer:o.resourceReferrer,acceptHeaders:o.acceptHeaders,networkTimeout:o.networkTimeout})).data}catch(n){}}if(s&&this.testEmptyResource(g))e.remove();else if(!this.testEmptyResource(g)){let a=zx.filter(n=>g.startsWith(n)).length;if(\"image\"==i){if(a&&Cx&&(a=await new Promise(n=>{const e=new Cx,t=jx(()=>n(!0),100);function a(e){xx(t),n(e)}e.src=g,e.onload=()=>a(),e.onerror=()=>a(!0)})),!a){const a=g.startsWith(Lx),s=o.maxSizeDuplicateImages||Dx;if(d&&b&&!a&&_x.getContentSize(g)<s)if(o.imageReductionFactor>1&&\"image\"==i&&(g=await fx(n,g,o)),this.replaceImageSource(e,Ix+w,o)){r.cssVariables.set(w,{content:g,url:p});const n=Uf(e.getAttribute(\"style\"),{context:\"declarationList\",parseCustomProperty:!0});c.set(e,n)}else e.setAttribute(t,g);else e.setAttribute(t,g)}}else e.setAttribute(t,g)}}}}}))}async processImageSrcset(n,e,t,a){const{content:o}=await a.addURL(n,{asBinary:!0,expectedType:\"image\"});return zx.filter(n=>o.startsWith(n)).length?\"\":o+(e.w?\" \"+e.w+\"w\":e.h?\" \"+e.h+\"h\":e.d?\" \"+e.d+\"x\":\"\")}testEmptyResource(n){return n==_x.EMPTY_RESOURCE}generateStylesheetContent(n,e){let t=qf(n);return e.compressCSS&&(t=_x.compressCSS(t)),e.saveOriginalURLs&&(t=ux(t)),t}replaceImageSource(n,e,t){if(n.getAttribute(_x.IMAGE_ATTRIBUTE_NAME)){const a=t.images[Number(n.getAttribute(_x.IMAGE_ATTRIBUTE_NAME))];if(a&&a.replaceable){n.setAttribute(\"src\",`${Lx},<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${a.size.pxWidth}\" height=\"${a.size.pxHeight}\"><rect fill-opacity=\"0\"/></svg>`);const t={};return(\"content\"==a.objectFit||\"cover\"==a.objectFit||\"contain\"==a.objectFit)&&a.objectFit&&(t[\"background-size\"]=a.objectFit),a.objectPosition&&(t[\"background-position\"]=a.objectPosition),a.backgroundColor&&(t[\"background-color\"]=a.backgroundColor),this.setBackgroundImage(n,\"var(\"+e+\")\",t),n.removeAttribute(_x.IMAGE_ATTRIBUTE_NAME),!0}}}wrapMediaQuery(n,e){return e?\"@media \"+e+\"{ \"+n+\" }\":n}wrapLayer(n,e){return e?\"@layer \"+e+\" { \"+n+\" }\":n}getAdditionalPageData(){return{}}async processScript(n,e,t,a,o){let i=rx(e,t);i=i?await yx(i,\"text/javascript\",a):(await o.addURL(e,{asBinary:!0,inline:!0,charset:a!=Ax&&a,maxResourceSize:t.maxResourceSize,maxResourceSizeEnabled:t.maxResourceSizeEnabled,frameId:t.windowId,resourceReferrer:t.resourceReferrer,baseURI:t.baseURI,blockMixedContent:t.blockMixedContent,expectedType:\"script\",acceptHeaders:t.acceptHeaders,networkTimeout:t.networkTimeout})).content,n.setAttribute(\"src\",i)}async processWorklet(n,e,t,a,o,i){let{content:r}=await i.addURL(e,{asBinary:!0,charset:o!=Ax&&o,maxResourceSize:a.maxResourceSize,maxResourceSizeEnabled:a.maxResourceSizeEnabled,frameId:a.windowId,resourceReferrer:a.resourceReferrer,baseURI:a.baseURI,blockMixedContent:a.blockMixedContent,expectedType:\"script\",acceptHeaders:a.acceptHeaders,networkTimeout:a.networkTimeout});n.textContent+=t?`  CSS.paintWorklet.addModule(\"${r}\", ${kx.stringify(t)});\\n`:`  CSS.paintWorklet.addModule(\"${r}\");\\n`}setMetaCSP(n){n.content=\"default-src 'none'; font-src 'self' data:; img-src 'self' data:; style-src 'unsafe-inline'; media-src 'self' data:; script-src 'unsafe-inline' data:; object-src 'self' data:; frame-src 'self' data:;\"}removeUnusedStylesheets(n){n.querySelectorAll(\"link[rel*=stylesheet][rel*=alternate][title]\").forEach(n=>n.remove())}async processFontFaceRule(n,e,t,a,o){const i=[];for(let e=n.block.children.head;e;e=e.next)\"src\"==e.data.property&&i.push(e);i.pop(),i.forEach(e=>n.block.children.remove(e));const r=n.block.children.filter(n=>\"src\"==n.property).tail;if(r){await Promise.all(e.map(async n=>{if(a.has(n.src))n.valid=a.get(n.src);else{if(vx&&n.fontUrl){const e=new vx(\"test-font\",n.src);try{let t;await Promise.race([e.load().then(()=>e.loaded).then(()=>{n.valid=!0,globalThis.clearTimeout(t)}),new Promise(e=>t=globalThis.setTimeout(()=>{n.valid=!0,e()},5e3))])}catch(e){if(\"NetworkError\"==e.name)n.valid=!0;else{const e=Jf(r.data,n=>\"Url\"==n.type),a=Array.from(t).find(([t])=>e.includes(t)&&t.value==n.fontUrl);if(a&&a[1].length){const e=a[1][0];if(e){const t=new vx(\"test-font\",\"url(\"+e+\")\");try{let e;await Promise.race([t.load().then(()=>t.loaded).then(()=>{n.valid=!0,globalThis.clearTimeout(e)}),new Promise(t=>e=globalThis.setTimeout(()=>{n.valid=!0,t()},5e3))])}catch(n){}}}else n.valid=!0}}}else n.valid=!0;a.set(n.src,n.valid)}}));const n=(n,t)=>_x.findLast(e,e=>!e.src.match(Mx)&&e.format==n&&(!t||e.valid)),i=n=>e.filter(e=>e==n||e.src.startsWith(Px));o.fonts.processed+=e.length,o.fonts.discarded+=e.length;const s=n(\"woff2-variations\",!0)||n(\"woff2\",!0)||n(\"woff\",!0);if(s)e=i(s);else{const t=n(\"truetype-variations\",!0)||n(\"truetype\",!0);if(t)e=i(t);else{const t=n(\"opentype\")||n(\"embedded-opentype\");e=t?i(t):e.filter(n=>!n.src.match(Mx)&&n.valid||n.src.startsWith(Px))}}o.fonts.discarded-=e.length,e.reverse();try{r.data.value=Uf(e.map(n=>n.src).join(\",\"),{context:\"value\",parseCustomProperty:!0})}catch(n){}}}}}(e)}const Yx=globalThis.Set,Zx=globalThis.Map,$x=globalThis.JSON;let Xx;class Qx{constructor(n){this.options=n;const e=Jx(n,Xx);this.processorHelper=new e}async run(){const n=globalThis[Xx.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];this.options.userScriptEnabled&&n&&await n(Xx.ON_BEFORE_CAPTURE_EVENT_NAME,this.options),this.runner=new dC(this.options,this.processorHelper,!0),await this.runner.loadPage(),await this.runner.initialize(),this.options.userScriptEnabled&&n&&await n(Xx.ON_AFTER_CAPTURE_EVENT_NAME,this.options),await this.runner.run()}cancel(){this.cancelled=!0,this.runner&&this.runner.cancel()}getPageData(){return this.runner.getPageData()}}const nC=\"page-loading\",eC=\"page-loaded\",tC=\"resource-initializing\",aC=\"resources-initialized\",oC=\"resource-loaded\",iC=\"page-ended\",rC=\"stage-started\",sC=\"stage-ended\";class lC{constructor(n,e){return{type:n,detail:e,PAGE_LOADING:nC,PAGE_LOADED:eC,RESOURCES_INITIALIZING:tC,RESOURCES_INITIALIZED:aC,RESOURCE_LOADED:oC,PAGE_ENDED:iC,STAGE_STARTED:rC,STAGE_ENDED:sC}}}const cC=[{sequential:[{action:\"preProcessPage\"},{option:\"loadDeferredImagesKeepZoomLevel\",action:\"resetZoomLevel\"},{action:\"replaceStyleContents\"},{action:\"replaceInvalidElements\"},{action:\"resetCharsetMeta\"},{action:\"resetReferrerMeta\"},{option:\"saveFavicon\",action:\"saveFavicon\"},{action:\"insertFonts\"},{action:\"insertShadowRootContents\"},{action:\"replaceCanvasElements\"},{action:\"setInputValues\"},{option:\"moveStylesInHead\",action:\"moveStylesInHead\"},{option:\"blockScripts\",action:\"removeEmbedScripts\"},{option:\"selected\",action:\"removeUnselectedElements\"},{option:\"blockVideos\",action:\"insertVideoPosters\"},{option:\"blockVideos\",action:\"insertVideoLinks\"},{option:\"removeFrames\",action:\"removeFrames\"},{action:\"removeDiscardedResources\"},{option:\"removeHiddenElements\",action:\"removeHiddenElements\"},{action:\"saveScrollPosition\"},{action:\"resolveHrefs\"},{action:\"resolveStyleAttributeURLs\"}],parallel:[{option:\"blockVideos\",action:\"insertMissingVideoPosters\"},{action:\"resolveStylesheetsURLs\"},{option:\"!removeFrames\",action:\"resolveFrameURLs\"}]},{sequential:[{option:\"removeUnusedStyles\",action:\"removeUnusedStyles\"},{option:\"removeAlternativeMedias\",action:\"removeAlternativeMedias\"},{option:\"removeUnusedFonts\",action:\"removeUnusedFonts\"}],parallel:[{action:\"processStylesheets\"},{action:\"processStyleAttributes\"},{action:\"processPageResources\"},{action:\"processScripts\"},{action:\"processWorklets\"}]},{sequential:[{option:\"removeAlternativeImages\",action:\"removeAlternativeImages\"}],parallel:[{option:\"removeAlternativeFonts\",action:\"removeAlternativeFonts\"},{option:\"!removeFrames\",action:\"processFrames\"}]},{sequential:[{action:\"replaceStylesheets\"},{action:\"replaceStyleAttributes\"},{action:\"insertVariables\"},{option:\"compressHTML\",action:\"compressHTML\"},{action:\"cleanupPage\"}],parallel:[{option:\"enableMaff\",action:\"insertMAFFMetaData\"},{action:\"setDocInfo\"}]},{sequential:[{action:\"loadOptionsFromPage\"},{option:\"saveFilenameTemplateData\",action:\"saveFilenameTemplateData\"}]}];class dC{constructor(n,e,t){const a=t&&n.doc;this.root=t,this.options=n,this.options.url=this.options.url||a&&this.options.doc.documentURI;const o=this.options.url.match(/^.*\\//);if(this.options.resourceReferrer=this.options.passReferrerOnError&&o&&o[0],this.options.baseURI=a&&(TC(this.options.doc.baseURI)?this.options.doc.baseURI:this.options.url),this.options.rootDocument=t,this.options.updatedResources=this.options.updatedResources||{},this.options.fontTests=new Zx,this.batchRequest=new mC,this.processor=new bC(n,e,this.batchRequest),a){const n=Xx.preProcessDoc(this.options.doc,this.options.win,this.options);this.options.canvases=n.canvases,this.options.fonts=n.fonts,this.options.worklets=n.worklets,this.options.stylesheets=n.stylesheets,this.options.images=n.images,this.options.posters=n.posters,this.options.videos=n.videos,this.options.usedFonts=n.usedFonts,this.options.shadowRoots=n.shadowRoots,this.options.referrer=n.referrer,this.options.adoptedStyleSheets=n.adoptedStyleSheets,this.markedElements=n.markedElements,this.invalidElements=n.invalidElements}this.options.saveRawPage&&!this.options.removeFrames&&(this.options.frames=[]),this.options.content=this.options.content||(a?Xx.serialize(this.options.doc):null),this.onprogress=n.onprogress||(()=>{})}async loadPage(){await this.onprogress(new lC(nC,{pageURL:this.options.url,frame:!this.root,options:this.options})),await this.processor.loadPage(this.options.content),await this.onprogress(new lC(eC,{pageURL:this.options.url,frame:!this.root,options:this.options}))}async initialize(){await this.onprogress(new lC(tC,{pageURL:this.options.url,options:this.options})),await this.executeStage(0),this.pendingPromises=this.executeStage(1),this.root&&this.options.doc&&Xx.postProcessDoc(this.options.doc,this.markedElements,this.invalidElements)}cancel(){this.cancelled=!0,this.batchRequest.cancel(),this.root&&this.options.frames&&this.options.frames.forEach(function(n){n.runner&&n.runner.cancel()})}async run(){this.root&&(this.processor.initialize(this.batchRequest),await this.onprogress(new lC(aC,{pageURL:this.options.url,max:this.processor.maxResources,options:this.options}))),await this.batchRequest.run(async n=>{n.pageURL=this.options.url,n.options=this.options,await this.onprogress(new lC(oC,n))},this.options),await this.pendingPromises,this.options.doc=null,this.options.win=null,await this.executeStage(2),await this.executeStage(3),await this.executeStage(4),this.processor.finalize()}getDocument(){return this.processor.doc}getStyleSheets(){return this.processor.stylesheets}async getPageData(){return this.root&&await this.onprogress(new lC(iC,{pageURL:this.options.url,options:this.options})),this.processor.getPageData()}async executeStage(n){const e=!this.root;await this.onprogress(new lC(rC,{pageURL:this.options.url,step:n,frame:e,options:this.options}));for(const e of cC[n].sequential)this.cancelled||this.executeTask(e);let t;return t=cC[n].parallel?await Promise.all(cC[n].parallel.map(async n=>{this.cancelled||await this.executeTask(n)})):Promise.resolve(),await this.onprogress(new lC(sC,{pageURL:this.options.url,step:n,frame:e,options:this.options})),t}executeTask(n){if(!n.option||n.option.startsWith(\"!\")&&!this.options[n.option]||this.options[n.option])return this.processor[n.action]()}}class mC{constructor(){this.requests=new Zx,this.duplicates=new Zx}addURL(n,{asBinary:e,expectedType:t,groupDuplicates:a,baseURI:o,blockMixedContent:i,contentType:r}={}){return new Promise((s,l)=>{const c=$x.stringify([n,e,t,o,i,r]);let d=this.requests.get(c);d||(d=[],this.requests.set(c,d));const m={resolve:s,reject:l};if(d.push(m),a){let n=this.duplicates.get(c);n||(n=[],this.duplicates.set(c,n)),n.push(m)}})}getMaxResources(){return this.requests.size}run(n,e){const t=[...this.requests.keys()];let a=0;return Promise.all(t.map(async t=>{const[o,i,r,s,l,c]=$x.parse(t),d=this.requests.get(t);try{const m=a;a+=1;const h=await Xx.getContent(o,{asBinary:i,inline:!e.compressContent,expectedType:r,contentType:c,maxResourceSize:e.maxResourceSize,maxResourceSizeEnabled:e.maxResourceSizeEnabled,frameId:e.windowId,resourceReferrer:e.resourceReferrer,baseURI:s,blockMixedContent:l,acceptHeaders:e.acceptHeaders,networkTimeout:e.networkTimeout});if(await n({url:o}),!this.cancelled){const n=Xx.getContentTypeExtension(h.contentType)||Xx.getFilenameExtension(o,e.filenameReplacedCharacters,e.filenameReplacementCharacter,e.filenameReplacementCharacters);d.forEach(e=>{const a=this.duplicates.get(t),o=a&&a.length>1&&a.includes(e);e.resolve({content:h.data,indexResource:m,duplicate:o,contentType:h.contentType,extension:n})})}}catch(e){a+=1,await n({url:o}),d.forEach(n=>n.reject(e))}this.requests.delete(t)}))}cancel(){this.cancelled=!0;[...this.requests.keys()].forEach(n=>{this.requests.get(n).forEach(n=>n.reject()),this.requests.delete(n)})}}const hC=\"shadowrootmode\",pC=\"shadowrootdelegatesfocus\",uC=\"shadowrootclonable\",gC=\"shadowrootserializable\",wC=\"data-single-file-options\";class bC{constructor(n,e,t){this.options=n,this.processorHelper=e,this.stats=new RC(n),this.baseURI=AC(n.baseURI||n.url),this.batchRequest=t,this.stylesheets=new Zx,this.styles=new Zx,this.resources={cssVariables:new Zx,fonts:new Zx,worklets:new Zx,stylesheets:new Zx,scripts:new Zx,images:new Zx,frames:new Zx},this.fontTests=n.fontTests}initialize(){this.options.saveDate=new Date,this.options.saveUrl=this.options.url,this.options.enableMaff&&(this.maffMetaDataPromise=this.batchRequest.addURL(Xx.resolveURL(\"index.rdf\",this.options.baseURI||this.options.url),{expectedType:\"document\"})),this.maxResources=this.batchRequest.getMaxResources(),!this.options.removeFrames&&this.options.frames&&this.options.frames.forEach(n=>this.maxResources+=n.maxResources||0),this.stats.set(\"processed\",\"resources\",this.maxResources)}async loadPage(n,e){let t;if(n&&!this.options.saveRawPage||(t=await Xx.getContent(this.baseURI,{inline:!this.options.compressContent,maxResourceSize:this.options.maxResourceSize,maxResourceSizeEnabled:this.options.maxResourceSizeEnabled,charset:e,frameId:this.options.windowId,resourceReferrer:this.options.resourceReferrer,expectedType:\"document\",acceptHeaders:this.options.acceptHeaders,networkTimeout:this.options.networkTimeout}),n=t.data||\"\"),this.doc=Xx.parseDocContent(n,this.baseURI),Xx.fixInvalidNesting(this.doc),this.options.saveRawPage){let e;if(this.doc.querySelectorAll(\"meta[charset]\").forEach(n=>{e||(e=n.getAttribute(\"charset\").trim().toLowerCase())}),e||this.doc.querySelectorAll('meta[http-equiv=\"content-type\"]').forEach(n=>{const t=n.content.split(\";\")[1];t&&!e&&(e=t.split(\"=\")[1].trim().toLowerCase())}),e&&t.charset&&e!=t.charset.toLowerCase())return this.loadPage(n,e)}this.workStyleElement=this.doc.createElement(\"style\"),this.doc.body.appendChild(this.workStyleElement),this.onEventAttributeNames=function(n){const e=n.body||n.createElement(\"div\"),t=[];for(const n in e)n.startsWith(\"on\")&&t.push(n);return t}(this.doc)}finalize(){this.workStyleElement.parentNode&&this.workStyleElement.remove()}async getPageData(){let n;Xx.postProcessDoc(this.doc);const e=Xx.parseURL(this.baseURI);if(this.options.insertSingleFileComment){const e=this.doc.documentElement.firstChild;let t=this.options.saveUrl,a=this.options.saveDate;if(8==e.nodeType&&(e.textContent.includes(Xx.COMMENT_HEADER_LEGACY)||e.textContent.includes(Xx.COMMENT_HEADER))){const n=this.doc.documentElement.firstChild.textContent.split(\"\\n\");try{const[,,o,i]=n;t=o.split(\"url: \")[1].trim(),a=i.split(\"saved date: \")[1],e.remove()}catch(n){}}const o=(this.options.infobarContent||\"\").replace(/\\\\n/g,\"\\n\").replace(/\\\\t/g,\"\\t\");n=\"\\n \"+(this.options.useLegacyCommentHeader?Xx.COMMENT_HEADER_LEGACY:Xx.COMMENT_HEADER)+\" \\n url: \"+t+(this.options.removeSavedDate?\" \":\" \\n saved date: \"+a)+(o?\" \\n info: \"+o:\"\")+\"\\n\";const i=this.doc.createComment(n);this.doc.documentElement.insertBefore(i,this.doc.documentElement.firstChild)}const t=this.doc.querySelector(\"singlefile-infobar\");t&&t.remove();const a=this.doc.querySelector(Xx.INFOBAR_TAGNAME);if(a&&a.remove(),this.options.includeInfobar&&Xx.appendInfobar(this.doc,this.options),this.options.insertCanonicalLink&&this.options.saveUrl.match(vC)){let n=this.doc.querySelector(\"link[rel=canonical]\");n||(n=this.doc.createElement(\"link\"),n.setAttribute(\"rel\",\"canonical\"),this.doc.head.appendChild(n)),n&&!n.href&&(n.href=this.options.saveUrl)}if(this.options.insertMetaCSP){const n=this.doc.createElement(\"meta\");n.httpEquiv=\"content-security-policy\",this.processorHelper.setMetaCSP(n),this.doc.head.appendChild(n)}if(this.options.insertMetaNoIndex){let n=this.doc.querySelector(\"meta[name=robots][content*=noindex]\");n||(n=this.doc.createElement(\"meta\"),n.setAttribute(\"name\",\"robots\"),n.setAttribute(\"content\",\"noindex\"),this.doc.head.appendChild(n))}const o=this.doc.createElement(\"style\");let i;if(this.doc.querySelector('img[src=\"data:,\"],source[src=\"data:,\"]')&&(o.textContent='img[src=\"data:,\"],source[src=\"data:,\"]{display:none!important}',this.doc.head.appendChild(o)),this.options.displayStats&&(i=Xx.getContentSize(this.doc.documentElement.outerHTML)),this.doc.querySelector(`[${Xx.NESTING_TRACK_ID_ATTRIBUTE_NAME}]`)){const n=this.doc.createElement(\"script\");n.textContent=`(${Xx.getFixInvalidNestingSource()})(document, \"${Xx.NESTING_TRACK_ID_ATTRIBUTE_NAME}\");`,this.doc.body.appendChild(n)}const r=Xx.serialize(this.doc,this.options.compressHTML);if(this.options.displayStats){const n=Xx.getContentSize(r);this.stats.set(\"processed\",\"HTML bytes\",n),this.stats.add(\"discarded\",\"HTML bytes\",i-n)}const s=await Xx.formatFilename(r,this.doc,this.options),l=Xx.getMimeType(this.options),c=this.baseURI.match(/([^/]*)\\/?(\\.html?.*)$/)||this.baseURI.match(/\\/\\/([^/]*)\\/?$/),d=this.processorHelper.getAdditionalPageData(this.doc,r,this.resources),m=Object.assign({stats:this.stats.data,title:this.options.title||(this.baseURI&&c?c[1]:e.hostname?e.hostname:\"\"),filename:s,mimeType:l,content:r,comment:n},d);return this.options.addProof&&(m.hash=await Xx.digest(\"SHA-256\",r)),this.options.retrieveLinks&&(m.links=Array.from(new Yx(Array.from(this.doc.links).map(n=>n.href)))),m}preProcessPage(){this.doc.body.querySelectorAll(':not(svg) title, meta, link[href][rel*=\"icon\"]').forEach(n=>{(this.options.win&&n instanceof this.options.win.HTMLElement||n instanceof globalThis.HTMLElement)&&this.doc.head.appendChild(n)}),this.options.images&&!this.options.saveRawPage&&(this.doc.querySelectorAll(\"img[\"+Xx.IMAGE_ATTRIBUTE_NAME+\"]\").forEach(n=>{const e=n.getAttribute(Xx.IMAGE_ATTRIBUTE_NAME);if(e){const t=this.options.images[Number(e)];t&&(this.options.removeHiddenElements&&(t.size&&!t.size.pxWidth&&!t.size.pxHeight||\"\"==n.getAttribute(Xx.HIDDEN_CONTENT_ATTRIBUTE_NAME))?n.setAttribute(\"src\",Xx.EMPTY_RESOURCE):(t.currentSrc&&(n.dataset.singleFileOriginURL=n.getAttribute(\"src\"),n.setAttribute(\"src\",t.currentSrc)),this.options.loadDeferredImages&&(n.getAttribute(\"src\")&&n.getAttribute(\"src\")!=Xx.EMPTY_RESOURCE||!n.getAttribute(\"data-src\")||(t.src=n.dataset.src,n.setAttribute(\"src\",n.dataset.src),n.removeAttribute(\"data-src\")))))}}),this.options.loadDeferredImages&&this.doc.querySelectorAll(\"img[data-srcset]\").forEach(n=>{!n.getAttribute(\"srcset\")&&n.getAttribute(\"data-srcset\")&&(n.setAttribute(\"srcset\",n.dataset.srcset),n.removeAttribute(\"data-srcset\"))}))}loadOptionsFromPage(){const n=this.doc.body.querySelector('script[type=\"application/json\"]['+wC+\"]\");if(n){const e=$x.parse(n.textContent);Object.keys(e).forEach(n=>this.options[n]=e[n]),this.options.saveDate=new Date(this.options.saveDate),this.options.visitDate=new Date(this.options.visitDate)}}saveFilenameTemplateData(){if(!this.doc.querySelector(\"script[\"+wC+'][type=\"application/json\"]')){const n=this.doc.createElement(\"script\");n.type=\"application/json\",n.setAttribute(wC,\"\"),n.textContent=$x.stringify({saveUrl:this.options.url,saveDate:this.options.saveDate.getTime(),visitDate:this.options.visitDate.getTime(),filenameTemplate:this.options.filenameTemplate,filenameReplacedCharacters:this.options.filenameReplacedCharacters,filenameReplacementCharacter:this.options.filenameReplacementCharacter,filenameReplacementCharacters:this.options.filenameReplacementCharacters,filenameMaxLengthUnit:this.options.filenameMaxLengthUnit,filenameMaxLength:this.options.filenameMaxLength,replaceEmojisInFilename:this.options.replaceEmojisInFilename,compressContent:this.options.compressContent,selfExtractingArchive:this.options.selfExtractingArchive,disableCompression:this.options.disableCompression,extractDataFromPage:this.options.extractDataFromPage,referrer:this.options.referrer,title:this.options.title,info:this.options.info}),this.doc.body.firstChild?this.doc.body.insertBefore(n,this.doc.body.firstChild):this.doc.body.appendChild(n)}}replaceStyleContents(){if(this.options.stylesheets&&this.doc.querySelectorAll(\"style\").forEach((n,e)=>{if(n.getAttribute(Xx.STYLESHEET_ATTRIBUTE_NAME)){const t=this.options.stylesheets[Number(e)];t&&(n.textContent=t)}}),this.options.adoptedStyleSheets&&this.options.adoptedStyleSheets.length){const n=this.doc.createElement(\"style\");n.textContent=this.options.adoptedStyleSheets.join(\"\\n\"),this.doc.body.appendChild(n)}}removeUnselectedElements(){function n(n){1==n.nodeType&&n.querySelector(\"svg,style,link\")||!t(n)?e(n):n.remove()}function e(e){t(e)&&(e.style.setProperty(\"display\",\"none\",\"important\"),e.removeAttribute(\"src\"),e.removeAttribute(\"srcset\"),e.removeAttribute(\"srcdoc\"),Array.from(e.childNodes).forEach(n))}function t(n){if(1==n.nodeType){const e=n.tagName&&n.tagName.toUpperCase();return\"SVG\"!=e&&\"STYLE\"!=e&&\"LINK\"!=e}}!function t(a){let o=!1;Array.from(a.childNodes).forEach(a=>{if(1==a.nodeType){const i=\"\"==a.getAttribute(Xx.SELECTED_CONTENT_ATTRIBUTE_NAME);o=o||i,i?(a.removeAttribute(Xx.SELECTED_CONTENT_ATTRIBUTE_NAME),t(a)):o?n(a):e(a)}})}(this.doc.body),this.doc.body.removeAttribute(Xx.SELECTED_CONTENT_ATTRIBUTE_NAME)}insertVideoPosters(){this.options.posters&&this.doc.querySelectorAll(\"video, video > source\").forEach(n=>{let e;e=\"VIDEO\"==n.tagName.toUpperCase()?n:n.parentElement;const t=n.getAttribute(Xx.POSTER_ATTRIBUTE_NAME);if(t){const n=this.options.posters[Number(t)];!e.getAttribute(\"poster\")&&n&&e.setAttribute(\"poster\",n)}})}insertVideoLinks(){const n=\"16px\";this.doc.querySelectorAll(\"video\").forEach(e=>{const t=e.getAttribute(Xx.VIDEO_ATTRIBUTE_NAME);if(t){const a=this.options.videos[Number(t)],o=a&&a.src||e.src;if(e&&o){const t=this.doc.createElement(\"a\"),i=this.doc.createElement(\"img\");t.href=o,t.target=\"_blank\",t.style.setProperty(\"z-index\",2147483647,\"important\"),t.style.setProperty(\"position\",\"absolute\",\"important\"),t.style.setProperty(\"top\",\"8px\",\"important\"),t.style.setProperty(\"left\",\"8px\",\"important\"),t.style.setProperty(\"width\",n,\"important\"),t.style.setProperty(\"height\",n,\"important\"),t.style.setProperty(\"min-width\",n,\"important\"),t.style.setProperty(\"min-height\",n,\"important\"),t.style.setProperty(\"max-width\",n,\"important\"),t.style.setProperty(\"max-height\",n,\"important\"),i.src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8H+DhhoQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJJJREFUOI3t070NRCEMA2CnYAOyDyPwpHj/Va7hJ3FzV7zy3ET5JIwoAF6Jk4wzAJAkzxAYG9YRTgB+24wBgKmfrGAKTcEfAY4KRlRoIeBTgKOCERVaCPgU4Khge2GqKOBTgKOCERVaAEC/4PNcnyoSWHpjqkhwKxbcig0Q6AorXYF/+A6eIYD1lVbwG/jdA6/kA2THRAURVubcAAAAAElFTkSuQmCC\",i.style.setProperty(\"width\",n,\"important\"),i.style.setProperty(\"height\",n,\"important\"),i.style.setProperty(\"min-width\",n,\"important\"),i.style.setProperty(\"min-height\",n,\"important\"),i.style.setProperty(\"max-width\",n,\"important\"),i.style.setProperty(\"max-height\",n,\"important\"),t.appendChild(i),e.insertAdjacentElement(\"afterend\",t);const r=e.parentNode.style.getPropertyValue(\"position\");(a.positionParent||r&&\"static\"==r)&&\"static\"!=a.positionParent||e.parentNode.style.setProperty(\"position\",\"relative\",\"important\")}}})}removeFrames(){const n=this.doc.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]');this.stats.set(\"discarded\",\"frames\",n.length),this.stats.set(\"processed\",\"frames\",n.length),this.doc.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]').forEach(n=>n.remove())}removeEmbedScripts(){const n=\"javascript:\",e=\"javascript:void(0)\";this.onEventAttributeNames.forEach(n=>this.doc.querySelectorAll(\"[\"+n+\"]\").forEach(e=>e.removeAttribute(n))),this.doc.querySelectorAll(\"[href]\").forEach(t=>{t.href&&t.href.match&&t.href.trim().startsWith(n)&&t.setAttribute(\"href\",e)}),this.doc.querySelectorAll(\"[src]\").forEach(t=>{t.src&&t.src.trim().startsWith(n)&&t.setAttribute(\"src\",e)});const t=this.doc.querySelectorAll('script:not([type=\"application/ld+json\"]):not(['+wC+\"])\");this.stats.set(\"discarded\",\"scripts\",t.length),this.stats.set(\"processed\",\"scripts\",t.length),t.forEach(n=>n.remove())}removeDiscardedResources(){if(this.doc.querySelectorAll(\".\"+Xx.SINGLE_FILE_UI_ELEMENT_CLASS).forEach(n=>n.remove()),!1===this.options.removeNoScriptTags){const n=new Zx;this.doc.querySelectorAll(\"noscript\").forEach(e=>{const t=this.doc.createElement(\"div\");t.innerHTML=e.dataset[Xx.NO_SCRIPT_PROPERTY_NAME],e.replaceWith(t),n.set(t,e)}),n.forEach((n,e)=>{n.dataset[Xx.NO_SCRIPT_PROPERTY_NAME]=e.innerHTML,e.replaceWith(n)})}else this.doc.querySelectorAll(\"noscript\").forEach(n=>n.remove());this.doc.querySelectorAll(\"meta[http-equiv=refresh], meta[disabled-http-equiv]\").forEach(n=>n.remove()),this.doc.querySelectorAll('meta[http-equiv=\"content-security-policy\"]').forEach(n=>n.remove());const n=this.doc.querySelectorAll('applet, object[data]:not([type=\"image/svg+xml\"]):not([type=\"image/svg-xml\"]):not([type=\"text/html\"]):not([data*=\".svg\"]):not([data*=\".pdf\"]), embed[src]:not([src*=\".svg\"]):not([src*=\".pdf\"])');this.stats.set(\"discarded\",\"objects\",n.length),this.stats.set(\"processed\",\"objects\",n.length),n.forEach(n=>n.remove());if(this.doc.querySelectorAll(\"link[rel~=preconnect], link[rel~=prerender], link[rel~=dns-prefetch], link[rel~=preload], link[rel~=manifest], link[rel~=prefetch], link[rel~=modulepreload]\").forEach(n=>{const e=n.getAttribute(\"rel\").replace(/(preconnect|prerender|dns-prefetch|preload|prefetch|manifest|modulepreload)/g,\"\").trim();e.length?n.setAttribute(\"rel\",e):n.remove()}),this.processorHelper.removeUnusedStylesheets(this.doc),this.doc.querySelectorAll('link[rel*=stylesheet]:not([href]),link[rel*=stylesheet][href=\"\"]').forEach(n=>n.remove()),this.options.removeHiddenElements&&this.doc.querySelectorAll(\"input[type=hidden]\").forEach(n=>n.remove()),this.options.removedElementsSelector)try{this.doc.querySelectorAll(this.options.removedElementsSelector).forEach(n=>n.remove())}catch{}this.options.saveFavicon||this.doc.querySelectorAll('link[rel*=\"icon\"]').forEach(n=>n.remove()),this.doc.querySelectorAll(\"a[ping], area[ping]\").forEach(n=>n.removeAttribute(\"ping\")),this.doc.querySelectorAll(\"a[attributionsrc], img[attributionsrc], script[attributionsrc]\").forEach(n=>n.removeAttribute(\"attributionsrc\")),this.doc.querySelectorAll(\"link[rel=import][href]\").forEach(n=>n.remove()),this.doc.querySelectorAll(\"link[rel=compression-dictionary]\").forEach(n=>n.remove())}replaceInvalidElements(){this.doc.querySelectorAll(\"template[\"+Xx.INVALID_ELEMENT_ATTRIBUTE_NAME+\"]\").forEach(n=>{const e=this.doc.createElement(\"span\");if(n.content){const t=n.content.firstChild;t&&(t.hasAttributes()&&Array.from(t.attributes).forEach(n=>{try{e.setAttribute(n.name,n.value)}catch(n){}}),t.childNodes.forEach(n=>e.appendChild(n.cloneNode(!0))));try{n.replaceWith(e)}catch(e){t?n.replaceWith(t):n.remove()}}})}resetCharsetMeta(){let n;this.doc.querySelectorAll('meta[charset], meta[http-equiv=\"content-type\"]').forEach(e=>{const t=e.content.split(\";\")[1];t&&!n&&(n=t.split(\"=\")[1],n&&(this.charset=n.trim().toLowerCase())),e.remove()});const e=this.doc.createElement(\"meta\");e.setAttribute(\"charset\",\"utf-8\"),this.doc.head.firstChild?this.doc.head.insertBefore(e,this.doc.head.firstChild):this.doc.head.appendChild(e)}resetReferrerMeta(){this.doc.querySelectorAll(\"meta[name=referrer]\").forEach(n=>n.remove());const n=this.doc.createElement(\"meta\");n.setAttribute(\"name\",\"referrer\"),n.setAttribute(\"content\",\"no-referrer\"),this.doc.head.appendChild(n)}setInputValues(){this.options.saveRawPage||(this.doc.querySelectorAll(\"input, textarea\").forEach(n=>{const e=n.getAttribute(Xx.INPUT_VALUE_ATTRIBUTE_NAME);null!=e?\"TEXTAREA\"==n.tagName.toUpperCase()?n.textContent=e:n.setAttribute(\"value\",e):n.removeAttribute(\"value\")}),this.doc.querySelectorAll(\"input[type=radio], input[type=checkbox]\").forEach(n=>{\"true\"==n.getAttribute(Xx.INPUT_CHECKED_ATTRIBUTE_NAME)?n.setAttribute(\"checked\",\"\"):n.removeAttribute(\"checked\")}),this.doc.querySelectorAll(\"select\").forEach(n=>{n.querySelectorAll(\"option\").forEach(n=>{null!=n.getAttribute(Xx.INPUT_VALUE_ATTRIBUTE_NAME)?n.setAttribute(\"selected\",\"\"):n.removeAttribute(\"selected\")})}))}moveStylesInHead(){this.doc.querySelectorAll(\"style\").forEach(n=>{\"\"==n.getAttribute(Xx.STYLE_ATTRIBUTE_NAME)&&this.doc.head.appendChild(n)})}saveFavicon(){let n=this.doc.querySelector('link[href][rel=\"shortcut icon\"]');n||(n=this.doc.querySelector('link[href][rel=\"icon\"]')),n||(n=this.doc.createElement(\"link\"),n.setAttribute(\"type\",\"image/x-icon\"),n.setAttribute(\"rel\",\"shortcut icon\"),n.setAttribute(\"href\",\"/favicon.ico\")),this.doc.head.appendChild(n)}saveScrollPosition(){if(this.options.scrollPosition&&\"no\"==this.options.scrolling&&(this.options.scrollPosition.x||this.options.scrollPosition.y)){const n=this.doc.createElement(\"script\");n.textContent='document.currentScript.remove();addEventListener(\"load\",()=>scrollTo('+this.options.scrollPosition.x+\",\"+this.options.scrollPosition.y+\"))\",this.doc.body.appendChild(n)}}replaceCanvasElements(){this.options.canvases&&this.doc.querySelectorAll(\"canvas\").forEach(n=>{const e=n.getAttribute(Xx.CANVAS_ATTRIBUTE_NAME);if(e){const t=this.options.canvases[Number(e)];if(t){const e={};t.backgroundColor&&(e[\"background-color\"]=t.backgroundColor),this.processorHelper.setBackgroundImage(n,\"url(\"+t.dataURI+\")\",e),this.stats.add(\"processed\",\"canvas\",1)}}})}insertFonts(){if(this.options.fonts&&this.options.fonts.length){let n,e=this.doc.querySelector(\"style, link[rel=stylesheet]\");this.options.fonts.forEach(t=>{if(t[\"font-family\"]&&t.src){let a=\"@font-face{\",o=\"\";Object.keys(t).forEach(n=>{o&&(o+=\";\"),o+=n+\":\"+t[n]}),a+=o+\"}\";const i=this.doc.createElement(\"style\");i.textContent=a,n?n.insertAdjacentElement(\"afterend\",i):e?e.parentElement.insertBefore(i,e):this.doc.head.appendChild(i),n=i}})}}removeHiddenElements(){const n=this.doc.querySelectorAll(\"[\"+Xx.HIDDEN_CONTENT_ATTRIBUTE_NAME+\"]\"),e=this.doc.querySelectorAll(\"[\"+Xx.REMOVED_CONTENT_ATTRIBUTE_NAME+\"]\");if(this.stats.set(\"discarded\",\"hidden elements\",e.length),this.stats.set(\"processed\",\"hidden elements\",e.length),n.length){const e=\"sf-hidden\",t=\".\"+e+\"{display:none!important}\";let a=!1;if(this.doc.querySelectorAll(\"style\").forEach(n=>{n.textContent==t&&(a=!0)}),!a){const n=this.doc.createElement(\"style\");n.textContent=t,this.doc.head.appendChild(n)}n.forEach(n=>{\"none\"!=n.style.getPropertyValue(\"display\")&&(\"important\"==n.style.getPropertyPriority(\"display\")?n.style.setProperty(\"display\",\"none\",\"important\"):n.classList.contains(e)||n.classList.add(e))})}e.forEach(n=>n.remove())}resolveHrefs(){(void 0===this.options.resolveLinks||this.options.resolveLinks)&&this.doc.querySelectorAll(\"a[href], area[href]\").forEach(n=>{const e=n.getAttribute(\"href\").trim();if(!zC(e)){let t;try{t=Xx.resolveURL(e,this.options.baseURI||this.options.url)}catch(n){}if(t){const e=AC(this.options.url);!t.startsWith(e+\"#\")||t.startsWith(e+\"#!\")||this.options.resolveFragmentIdentifierURLs||(t=t.substring(e.length));try{n.setAttribute(\"href\",t)}catch(n){}}}}),this.doc.querySelectorAll(\"link[href]\").forEach(n=>{const e=n.getAttribute(\"href\").trim();if(n.rel.includes(\"stylesheet\")&&this.options.saveOriginalURLs&&!LC(e)&&n.setAttribute(\"data-sf-original-href\",e),!zC(e)){let t;try{t=Xx.resolveURL(e,this.options.baseURI||this.options.url)}catch(n){}if(t)try{n.setAttribute(\"href\",t)}catch(n){}}})}async insertMissingVideoPosters(){await Promise.all(Array.from(this.doc.querySelectorAll(\"video[src], video > source[src]\")).map(async n=>{let e;if(e=\"VIDEO\"==n.tagName.toUpperCase()?n:n.parentElement,!e.poster){const n=e.getAttribute(Xx.VIDEO_ATTRIBUTE_NAME);if(n){const t=this.options.videos[Number(n)],a=t.src||e.src;if(a){const n=this.doc.createElement(\"video\");n.src=a,n.style.setProperty(\"width\",t.size.pxWidth+\"px\",\"important\"),n.style.setProperty(\"height\",t.size.pxHeight+\"px\",\"important\"),n.style.setProperty(\"display\",\"none\",\"important\"),n.crossOrigin=\"anonymous\";const o=this.doc.createElement(\"canvas\"),i=o.getContext(\"2d\");return this.options.doc.body.appendChild(n),new Promise(a=>{n.currentTime=t.currentTime,n.oncanplay=()=>{o.width=t.size.videoWidth,o.height=t.size.videoHeight,i.drawImage(n,0,0,o.width,o.height);try{e.poster=o.toDataURL(\"image/png\")}catch(n){e.poster=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='\"+t.size.videoWidth+\"' height='\"+t.size.videoHeight+\"'%3E%3C/svg%3E\"}n.remove(),a()},n.onerror=()=>{e.poster=\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='\"+t.size.videoWidth+\"' height='\"+t.size.videoHeight+\"'%3E%3C/svg%3E\",n.remove(),a()}})}}}}))}resolveStyleAttributeURLs(){this.doc.querySelectorAll(\"[style]\").forEach(n=>{if(this.options.blockStylesheets)n.removeAttribute(\"style\");else{const e=n.getAttribute(\"style\"),t=Uf(e,{context:\"declarationList\",parseCustomProperty:!0});this.processorHelper.resolveStylesheetURLs(t,this.baseURI,this.workStyleElement),this.styles.set(n,t)}})}async resolveStylesheetsURLs(){const n=[];if(this.options.inlineStylesheets=new Zx,this.options.inlineStylesheetsRefs=new Zx,this.doc.querySelectorAll(\"style\").forEach(e=>{if(e.textContent){const t=n.indexOf(e.textContent);-1==t?(this.options.inlineStylesheets.set(n.length,{styleElement:e,content:e.textContent}),n.push(e.textContent)):this.options.inlineStylesheetsRefs.set(e,t)}}),await Promise.all(Array.from(this.doc.querySelectorAll(\"style, link[rel*=stylesheet]:not([disabled])\")).map(async n=>{const e=Object.assign({},this.options,{charset:this.charset});let t;n.media&&(t=n.media.toLowerCase());const a={mediaText:t,scoped:Boolean(n.closest(\"[\"+hC+\"]\"))};await this.processorHelper.resolveStylesheets(n,a,this.stylesheets,this.baseURI,e,this.workStyleElement,this.resources)})),this.options.rootDocument){const n=Object.keys(this.options.updatedResources).filter(n=>\"stylesheet\"==this.options.updatedResources[n].type&&!this.options.updatedResources[n].retrieved).map(n=>this.options.updatedResources[n]);await Promise.all(n.map(async n=>{if(n.retrieved=!0,!this.options.blockStylesheets){const e={},t=this.doc.createElement(\"style\");this.doc.body.appendChild(t),t.textContent=n.content,await this.processorHelper.resolveStylesheetElement(t,e,this.stylesheets,this.baseURI,this.options,this.workStyleElement,this.resources)}}))}}async resolveFrameURLs(){const n=this.processorHelper,e=Array.from(this.doc.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]'));async function t(e,t,a,o,i){i.insertSingleFileComment=!1,i.insertCanonicalLink=!1,i.insertMetaNoIndex=!1,i.saveFavicon=!1,i.includeInfobar=!1,i.saveFilenameTemplateData=!1,i.selected=!1,i.embeddedImage=null,i.embeddedPdf=null,i.url=e.baseURI,i.windowId=a,i.content=e.content,i.canvases=e.canvases,i.fonts=e.fonts,i.worklets=e.worklets,i.stylesheets=e.stylesheets,i.images=e.images,i.posters=e.posters,i.videos=e.videos,i.usedFonts=e.usedFonts,i.shadowRoots=e.shadowRoots,i.scrollPosition=e.scrollPosition,i.scrolling=e.scrolling,i.adoptedStyleSheets=e.adoptedStyleSheets,e.runner=new dC(i,n),e.frameElement=t,await e.runner.loadPage(),await e.runner.initialize(),e.maxResources=o.getMaxResources()}await Promise.all(e.map(async n=>{const e=n.getAttribute(\"src\");let a;if(\"OBJECT\"==n.tagName.toUpperCase()?n.setAttribute(\"data\",\"data:text/html,\"):(n.removeAttribute(\"src\"),n.removeAttribute(\"srcdoc\")),Array.from(n.childNodes).forEach(n=>n.remove()),e&&!zC(e)){try{a=Xx.resolveURL(e,this.baseURI)}catch(n){}this.options.saveOriginalURLs&&e&&!LC(e)&&n.setAttribute(\"data-sf-original-src\",a)}if(this.options.saveRawPage&&a&&TC(a)){const e={adoptedStyleSheets:[],baseURI:a,canvases:[],fonts:[],images:[],posters:[],scrollPosition:{x:0,y:0},shadowRoots:[],stylesheets:[],url:a,usedFonts:[],videos:[],worklets:[]};this.options.frames.push(e),e.windowId=(this.options.windowId||\"0\")+\".\"+this.options.frames.length,n.setAttribute(Xx.WIN_ID_ATTRIBUTE_NAME,e.windowId),await t(e,n,null,this.batchRequest,Object.assign({},this.options))}else{const e=n.getAttribute(Xx.WIN_ID_ATTRIBUTE_NAME);if(this.options.frames&&e){const a=this.options.frames.find(n=>n.windowId==e);a&&a.content&&await t(a,n,e,this.batchRequest,Object.assign({},this.options))}}}))}insertShadowRootContents(){const n=this.doc,e=this.options;e.shadowRoots&&e.shadowRoots.length&&function t(a){Array.from(a.querySelectorAll(\"[\"+Xx.SHADOW_ROOT_ATTRIBUTE_NAME+\"]\")).forEach(a=>{const o=a.getAttribute(Xx.SHADOW_ROOT_ATTRIBUTE_NAME);if(o){const i=e.shadowRoots[Number(o)];if(i){const e=n.createElement(\"template\");e.setAttribute(hC,i.mode),i.delegatesFocus&&e.setAttribute(pC,i.delegatesFocus),i.clonable&&e.setAttribute(uC,i.clonable),i.serializable&&e.setAttribute(gC,i.serializable),i.adoptedStyleSheets&&i.adoptedStyleSheets.length&&i.adoptedStyleSheets.forEach(t=>{const a=n.createElement(\"style\");a.textContent=t,e.appendChild(a)});const o=Xx.parseDocContent(i.content);if(o.head){const n=o.head.querySelector(\"meta[charset]\");n&&n.remove(),o.head.childNodes.forEach(n=>e.appendChild(o.importNode(n,!0)))}o.body&&o.body.childNodes.forEach(n=>e.appendChild(o.importNode(n,!0))),t(e),a.firstChild?a.insertBefore(e,a.firstChild):a.appendChild(e)}}})}(this.doc)}removeUnusedStyles(){const n=Xx.minifyCSSRules(this.doc,this.stylesheets);this.stats.set(\"processed\",\"CSS rules\",n.processed),this.stats.set(\"discarded\",\"CSS rules\",n.discarded)}removeUnusedFonts(){Xx.removeUnusedFonts(this.doc,this.stylesheets,this.styles,this.options)}removeAlternativeMedias(){const n=Xx.minifyMedias(this.stylesheets,{keepPrintStyleSheets:this.options.keepPrintStyleSheets});this.stats.set(\"processed\",\"medias\",n.processed),this.stats.set(\"discarded\",\"medias\",n.discarded)}async processStylesheets(){await Promise.all([...this.stylesheets].map(async([,n])=>{n.stylesheet&&await this.processorHelper.processStylesheet(n.stylesheet.children,this.baseURI,this.options,this.resources,this.batchRequest)}))}async processStyleAttributes(){return Promise.all([...this.styles].map(([,n])=>this.processorHelper.processStyle(n,this.options,this.resources,this.batchRequest)))}async processPageResources(){await this.processorHelper.processPageResources(this.doc,this.baseURI,this.options,this.resources,this.styles,this.batchRequest)}async processScripts(){await Promise.all(Array.from(this.doc.querySelectorAll(\"script[src]\")).map(async n=>{let e,t;if(t=n.getAttribute(\"src\"),this.options.saveOriginalURLs&&!LC(t)&&n.setAttribute(\"data-sf-original-src\",t),n.removeAttribute(\"integrity\"),this.options.blockScripts)n.removeAttribute(\"src\");else{n.textContent=\"\";try{e=Xx.resolveURL(t,this.baseURI)}catch(n){}TC(e)&&(n.removeAttribute(\"src\"),await this.processorHelper.processScript(n,e,this.options,this.charset,this.batchRequest,this.resources),\"async\"!=n.getAttribute(\"async\")&&\"\"!=n.getAttribute(Xx.ASYNC_SCRIPT_ATTRIBUTE_NAME)||n.setAttribute(\"async\",\"\"))}this.stats.add(\"processed\",\"scripts\",1)}))}async processWorklets(){if(this.options.worklets.length){const n=this.doc.createElement(\"script\");n.textContent=\"if (CSS && CSS.paintWorklet && CSS.paintWorklet.addModule) {\\n\",await Promise.all(this.options.worklets.map(async({moduleURL:e,options:t})=>{await this.processorHelper.processWorklet(n,e,t,this.options,this.charset,this.batchRequest,this.resources)})),n.textContent+=\"}\",this.doc.head.appendChild(n)}}removeAlternativeImages(){Xx.removeAlternativeImages(this.doc)}async removeAlternativeFonts(){await this.processorHelper.removeAlternativeFonts(this.doc,this.stylesheets,this.resources.fonts,this.options.fontTests)}async processFrames(){if(this.options.frames){const n=Array.from(this.doc.querySelectorAll('iframe, frame, object[type=\"text/html\"][data]'));await Promise.all(n.map(async n=>{const e=n.getAttribute(Xx.WIN_ID_ATTRIBUTE_NAME);if(e){const t=this.options.frames.find(n=>n.windowId==e);if(t)if(this.options.frames=this.options.frames.filter(n=>n.windowId!=e),t.runner&&\"\"!=n.getAttribute(Xx.HIDDEN_FRAME_ATTRIBUTE_NAME)){this.stats.add(\"processed\",\"frames\",1),await t.runner.run();const a=await t.runner.getPageData();n.removeAttribute(Xx.WIN_ID_ATTRIBUTE_NAME),this.processorHelper.processFrame(n,a,this.options,this.resources,e,t),this.stats.addAll(a)}else n.removeAttribute(Xx.WIN_ID_ATTRIBUTE_NAME),this.stats.add(\"discarded\",\"frames\",1)}}))}}replaceStylesheets(){this.processorHelper.replaceStylesheets(this.doc,this.stylesheets,this.options,this.resources),delete this.options.inlineStylesheetsRefs,delete this.options.inlineStylesheets}replaceStyleAttributes(){this.doc.querySelectorAll(\"[style]\").forEach(n=>{const e=this.styles.get(n);e?(this.styles.delete(n),n.setAttribute(\"style\",this.processorHelper.generateStylesheetContent(e,this.options))):n.setAttribute(\"style\",\"\")})}insertVariables(){const{cssVariables:n}=this.resources;if(n.size){const e=this.doc.createElement(\"style\"),t=this.doc.head.querySelector(\"style\");t?this.doc.head.insertBefore(e,t):this.doc.head.appendChild(e);let a=\"\";n.forEach(({content:e,url:t},o)=>{n.delete(o),a&&(a+=\";\"),a+=`${CC+o}: `,this.options.saveOriginalURLs&&(a+=`/* original URL: ${t} */ `),a+=`url(\"${e}\")`}),e.textContent=\":root{\"+a+\"}\"}}compressHTML(){let n;this.options.displayStats&&(n=Xx.getContentSize(this.doc.documentElement.outerHTML)),Xx.minifyHTML(this.doc,{PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME:Xx.PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME}),this.options.displayStats&&this.stats.add(\"discarded\",\"HTML bytes\",n-Xx.getContentSize(this.doc.documentElement.outerHTML))}cleanupPage(){this.doc.querySelectorAll(\"base\").forEach(n=>n.remove());const n=this.doc.head.querySelector(\"meta[charset]\");n&&(this.doc.head.insertBefore(n,this.doc.head.firstChild),1==this.doc.head.querySelectorAll(\"*\").length&&0==this.doc.body.childNodes.length&&this.doc.head.querySelector(\"meta[charset]\").remove())}resetZoomLevel(){const n=this.doc.documentElement.style.getPropertyValue(\"-sf-transform\"),e=this.doc.documentElement.style.getPropertyPriority(\"-sf-transform\"),t=this.doc.documentElement.style.getPropertyValue(\"-sf-transform-origin\"),a=this.doc.documentElement.style.getPropertyPriority(\"-sf-transform-origin\"),o=this.doc.documentElement.style.getPropertyValue(\"-sf-min-height\"),i=this.doc.documentElement.style.getPropertyPriority(\"-sf-min-height\");this.doc.documentElement.style.setProperty(\"transform\",n,e),this.doc.documentElement.style.setProperty(\"transform-origin\",t,a),this.doc.documentElement.style.setProperty(\"min-height\",o,i),this.doc.documentElement.style.removeProperty(\"-sf-transform\"),this.doc.documentElement.style.removeProperty(\"-sf-transform-origin\"),this.doc.documentElement.style.removeProperty(\"-sf-min-height\")}async insertMAFFMetaData(){const n=await this.maffMetaDataPromise;if(n&&n.content){const e=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\",t=Xx.parseXMLContent(n.content),a=t.querySelector(\"RDF > Description > originalurl\"),o=t.querySelector(\"RDF > Description > archivetime\");if(a&&(this.options.saveUrl=a.getAttributeNS(e,\"resource\")),o){const n=o.getAttributeNS(e,\"resource\");if(n){const e=new Date(n);isNaN(e.getTime())||(this.options.saveDate=new Date(n))}}}}async setDocInfo(){const n=this.doc.querySelector(\"title\"),e=this.doc.querySelector(\"meta[name=description]\"),t=this.doc.querySelector(\"meta[name=author]\"),a=this.doc.querySelector(\"meta[name=creator]\"),o=this.doc.querySelector(\"meta[name=publisher]\"),i=this.doc.querySelector(\"h1\");this.options.title=n?n.textContent.trim():\"\",this.options.info={description:e&&e.content?e.content.trim():\"\",lang:this.doc.documentElement.lang,author:t&&t.content?t.content.trim():\"\",creator:a&&a.content?a.content.trim():\"\",publisher:o&&o.content?o.content.trim():\"\",heading:i&&i.textContent?i.textContent.trim():\"\"},this.options.infobarContent=await Xx.evalTemplate(this.options.infobarTemplate,this.options,null,this.doc,{dontReplaceSlash:!0})}}const fC=\"data:\",yC=\"about:blank\",kC=\"blob:\",vC=/^https?:\\/\\//,SC=/^file:\\/\\//,jC=/^https?:\\/\\/+\\s*$/,xC=/^(https?:\\/\\/|file:\\/\\/|blob:).+/,CC=\"--sf-img-\";function AC(n){return!n||n.startsWith(fC)?n:n.split(\"#\")[0]}function LC(n){return n&&(n.startsWith(fC)||n.startsWith(kC))}function zC(n){return n&&(n.startsWith(fC)||n==yC)}function TC(n){return function(n){return n&&!n.match(jC)}(n)&&(n.match(vC)||n.match(SC)||n.startsWith(kC))&&n.match(xC)}const EC={discarded:{\"HTML bytes\":0,\"hidden elements\":0,scripts:0,objects:0,\"audio sources\":0,\"video sources\":0,frames:0,\"CSS rules\":0,canvas:0,stylesheets:0,resources:0,medias:0},processed:{\"HTML bytes\":0,\"hidden elements\":0,scripts:0,objects:0,\"audio sources\":0,\"video sources\":0,frames:0,\"CSS rules\":0,canvas:0,stylesheets:0,resources:0,medias:0}};class RC{constructor(n){this.options=n,n.displayStats&&(this.data=$x.parse($x.stringify(EC)))}set(n,e,t){this.options.displayStats&&(this.data[n][e]=t)}add(n,e,t){this.options.displayStats&&(this.data[n][e]+=t)}addAll(n){this.options.displayStats&&(Object.keys(this.data.discarded).forEach(e=>this.add(\"discarded\",e,n.stats.discarded[e]||0)),Object.keys(this.data.processed).forEach(e=>this.add(\"processed\",e,n.stats.processed[e]||0)))}}const IC=1048576,DC={\"image/svg+xml\":\".svg\",\"image/png\":\".png\",\"image/gif\":\".gif\",\"image/tiff\":\".tiff\",\"image/bmp\":\".bmp\",\"image/x-icon\":\".ico\",\"image/heif\":\".heif\",\"image/heic\":\".heic\",\"image/avif\":\".avif\",\"image/apng\":\".apng\",\"image/jpeg\":\".jpg\",\"image/webp\":\".webp\",\"audio/mpeg\":\".mp3\",\"audio/ogg\":\".ogg\",\"audio/wav\":\".wav\",\"audio/webm\":\".webm\",\"video/3gpp\":\".3gp\",\"video/3gpp2\":\".3g2\",\"video/mpeg\":\".mpeg\",\"video/quicktime\":\".mov\",\"video/x-msvideo\":\".avi\",\"video/webm\":\".webm\",\"video/ogg\":\".ogv\",\"video/mp4\":\".mp4\",\"video/mp2t\":\".ts\",\"font/otf\":\".otf\",\"font/ttf\":\".ttf\",\"font/woff\":\".woff\",\"font/woff2\":\".woff2\",\"application/vnd.ms-fontobject\":\".eot\",\"font/collection\":\".ttc\"},MC=\"application/octet-stream\",PC=globalThis.URL,NC=globalThis.DOMParser,_C=globalThis.Blob,BC=globalThis.FileReader,OC=(n,e)=>(e.cache=\"force-cache\",e.referrerPolicy=\"strict-origin-when-cross-origin\",globalThis.fetch(n,e)),FC=globalThis.TextDecoder,UC=globalThis.URLSearchParams;function qC(n){return(n=n||{}).fetch=n.fetch||OC,n.frameFetch=n.frameFetch||n.fetch||OC,{getDoctypeString:WC,getFilenameExtension(n,e,t,a){let o;try{o=new PC(n).pathname.match(/(\\.[^\\\\/.]*)$/)}catch(n){}return(o&&o[1]&&this.getValidFilename(o[1],e,t,a)||\"\").toLowerCase()},getContentTypeExtension:n=>DC[n]||\"\",getContent:async function(e,t){let a,o,i,r;const s=n.fetch,l=n.frameFetch;if(t.blockMixedContent&&/^https:/i.test(t.baseURI)&&!/^https:/i.test(e))return HC(e,t);i=t.networkTimeout?new Promise((n,e)=>{r=n,o=globalThis.setTimeout(()=>e(new Error(\"network timeout\")),t.networkTimeout)}):new Promise(n=>{r=n});try{const n=t.acceptHeaders?t.acceptHeaders[t.expectedType]:\"*/*\";if(t.frameId)try{a=await Promise.race([l(e,{frameId:t.frameId,referrer:t.resourceReferrer,headers:{accept:n}}),i])}catch(t){a=await Promise.race([s(e,{headers:{accept:n}}),i])}else a=await Promise.race([s(e,{referrer:t.resourceReferrer,headers:{accept:n}}),i])}catch(n){return HC(e,t)}finally{r(),t.networkTimeout&&globalThis.clearTimeout(o)}let c;try{c=await a.arrayBuffer()}catch(n){return t.inline?{data:t.asBinary?Li:\"\",resourceURL:e}:{resourceURL:e}}e=a.url||e;let d,m=\"\";try{const n=new Kk(a.headers.get(\"content-type\"));m=n.type+\"/\"+n.subtype,d=n.parameters.get(\"charset\")}catch(n){}(!m||m==MC&&t.asBinary)&&(m=function(n,e){if(\"image\"==n){if(t([255,255,255,255],[0,0,1,0]))return\"image/x-icon\";if(t([255,255,255,255],[0,0,2,0]))return\"image/x-icon\";if(t([255,255],[78,77]))return\"image/bmp\";if(t([255,255,255,255,255,255],[71,73,70,56,57,97]))return\"image/gif\";if(t([255,255,255,255,255,255],[71,73,70,56,59,97]))return\"image/gif\";if(t([255,255,255,255,0,0,0,0,255,255,255,255,255,255],[82,73,70,70,0,0,0,0,87,69,66,80,86,80]))return\"image/webp\";if(t([255,255,255,255,255,255,255,255],[137,80,78,71,13,10,26,10]))return\"image/png\";if(t([255,255,255],[255,216,255]))return\"image/jpeg\"}if(\"font\"==n){if(t([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,80]))return\"application/vnd.ms-fontobject\";if(t([255,255,255,255],[0,1,0,0]))return\"font/ttf\";if(t([255,255,255,255],[79,84,84,79]))return\"font/otf\";if(t([255,255,255,255],[116,116,99,102]))return\"font/collection\";if(t([255,255,255,255],[119,79,70,70]))return\"font/woff\";if(t([255,255,255,255],[119,79,70,50]))return\"font/woff2\"}if(\"video\"==n){if(t([0,0,0,0,255,255,255,255,255,255,255,255],[0,0,0,0,102,116,121,112,105,115,111,109]))return\"video/mp4\";if(t([255,255,255,255,0,0,0,0,255,255,255,255],[82,73,70,70,0,0,0,0,87,65,86,69]))return\"video/x-msvideo\";if(t([255,255,255,255],[0,0,1,179])||t([255,255,255,255],[0,0,1,186]))return\"video/mpeg\";if(t([255,255,255,255],[79,103,103,83]))return\"video/ogg\";if(t([255],[71]))return\"video/mp2t\";if(t([255,255,255,255],[26,69,223,163]))return\"video/webm\";if(t([0,0,0,0,255,255,255,255,255,255],[0,0,0,0,102,116,121,112,51,103]))return\"video/3gpp\"}if(\"audio\"==n){if(t([255,255],[255,249])||t([255,255],[255,254]))return\"audio/aac\";if(t([255,255,255,255],[77,84,104,100]))return\"audio/midi\";if(t([255,255,255,255],[0,0,1,179])||t([255,255,255,255],[0,0,1,186]))return\"audio/mpeg\";if(t([255,255],[255,251])||t([255,255],[255,243])||t([255,255],[255,242])||t([255,255,255],[73,68,51]))return\"audio/mpeg\";if(t([255,255,255,255],[79,103,103,83]))return\"audio/ogg\";if(t([255,255,255,255,0,0,0,0,255,255,255,255],[82,73,70,70,0,0,0,0,87,65,86,69]))return\"audio/wav\";if(t([255,255,255,255],[26,69,223,163]))return\"audio/webm\";if(t([0,0,0,0,255,255,255,255,255,255],[0,0,0,0,102,116,121,112,51,103]))return\"audio/3gpp\"}function t(n,t){let a=!0,o=0;if(e.byteLength>=t.length){const i=new Uint8Array(e,0,n.length);for(o=0;o<n.length&&a;o++)a=a&&(i[o]&n[o])==t[o];return a}}}(t.expectedType,c),m||(m=t.contentType?t.contentType:t.asBinary?MC:\"\"));!d&&t.charset&&(d=t.charset);if(t.asBinary){if(a.status>=400)return HC(e,t);try{return t.maxResourceSizeEnabled&&c.byteLength>t.maxResourceSize*IC?HC(e,t):HC(e,t,c,null,m)}catch(n){return HC(e,t)}}else{if(a.status>=400||t.validateTextContentType&&m&&!m.startsWith(\"text/\"))return HC(e,t);if(d||(d=\"utf-8\"),t.maxResourceSizeEnabled&&c.byteLength>t.maxResourceSize*IC)return HC(e,t,null,d);try{return HC(e,t,c,d,m)}catch(n){return HC(e,t,null,d)}}},parseURL:(n,e)=>void 0===e?new PC(n):new PC(n,e),resolveURL(n,e){return this.parseURL(n,e).href},getSearchParams:n=>Array.from(new UC(n)),getValidFilename:(n,e,t,a)=>lr(n,e,t,a),parseDocContent:(n,e)=>cr(n,e),parseXMLContent:n=>(new NC).parseFromString(n,\"text/xml\"),parseSVGContent(n){const e=(new NC).parseFromString(n,\"image/svg+xml\");return e.querySelector(\"parsererror\")?(new NC).parseFromString(n,\"text/html\"):e},fixInvalidNesting(n,e=!0){Wi(n,Ei,e)},markInvalidNesting(n){Hi(n)},getFixInvalidNestingSource:()=>Wi.toString().replace(/\\s+/g,\" \"),digest:async(n,e)=>ir(n,e),getContentSize:n=>or(n),formatFilename:(n,e,t)=>Sj(n,e,t),getMimeType:n=>!n.compressContent||n.selfExtractingArchive?\"text/html\":\"application/zip\",evalTemplate:async(n,e,t,a,o)=>jj(n,e,t,a,o),minifyHTML:(n,e)=>$S(n,e),minifyCSSRules:(n,e)=>sS(n,e),removeUnusedFonts:(n,e,t,a)=>ev(n,e,t,a),compressCSS:(n,e)=>Fk(n,e),minifyMedias:(n,e)=>Cv(n,e),removeAlternativeImages:n=>_S(n),parseSrcset:n=>qk(n),preProcessDoc:(n,e,t)=>qi(n,e,t),postProcessDoc(n,e,t){Xi(n,e,t)},serialize:(n,e)=>ij(n,e),removeQuotes:n=>tr(n),appendInfobar:(n,e)=>Yi(n,e),findLast(n,e){if(n.findLast&&\"function\"==typeof n.findLast)return n.findLast(e);{let t=n.length;for(;t--;)if(e(n[t],t,n))return n[t]}},ON_BEFORE_CAPTURE_EVENT_NAME:Vo,ON_AFTER_CAPTURE_EVENT_NAME:Ko,WIN_ID_ATTRIBUTE_NAME:oi,REMOVED_CONTENT_ATTRIBUTE_NAME:Xo,HIDDEN_CONTENT_ATTRIBUTE_NAME:Qo,HIDDEN_FRAME_ATTRIBUTE_NAME:ei,IMAGE_ATTRIBUTE_NAME:ii,POSTER_ATTRIBUTE_NAME:ri,VIDEO_ATTRIBUTE_NAME:si,CANVAS_ATTRIBUTE_NAME:li,STYLE_ATTRIBUTE_NAME:ci,INPUT_VALUE_ATTRIBUTE_NAME:di,INPUT_CHECKED_ATTRIBUTE_NAME:mi,SHADOW_ROOT_ATTRIBUTE_NAME:ai,PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME:ti,STYLESHEET_ATTRIBUTE_NAME:pi,SELECTED_CONTENT_ATTRIBUTE_NAME:gi,INVALID_ELEMENT_ATTRIBUTE_NAME:wi,COMMENT_HEADER:No,COMMENT_HEADER_LEGACY:xi,SINGLE_FILE_UI_ELEMENT_CLASS:Ci,EMPTY_RESOURCE:Li,INFOBAR_TAGNAME:Ai,WAIT_FOR_USERSCRIPT_PROPERTY_NAME:Bo,NO_SCRIPT_PROPERTY_NAME:Fo,NESTING_TRACK_ID_ATTRIBUTE_NAME:Ei}}async function HC(n,e,t,a,o){if(t)if(e.asBinary)if(e.inline){const n=new BC;n.readAsDataURL(new _C([t],{type:o+(e.charset?\";charset=\"+e.charset:\"\")})),t=await new Promise((e,t)=>{n.addEventListener(\"load\",()=>e(n.result),!1),n.addEventListener(\"error\",t,!1)})}else t=new Uint8Array(t);else{const n=new Uint8Array(t.slice(0,4));132==n[0]&&49==n[1]&&149==n[2]&&51==n[3]?a=\"gb18030\":255==n[0]&&254==n[1]?a=\"utf-16le\":254==n[0]&&255==n[1]&&(a=\"utf-16be\");try{t=new FC(a).decode(t)}catch(n){t=new FC(a=\"utf-8\").decode(t)}t=t.replace(/\\ufeff/gi,\"\")}else e.inline&&(t=e.asBinary?Li:\"\");return{data:t,resourceURL:n,charset:a,contentType:o}}function WC(n){const e=n.doctype;let t=\"\";return e&&(t=\"<!DOCTYPE \"+e.nodeName,e.publicId?(t+=' PUBLIC \"'+e.publicId+'\"',e.systemId&&(t+=' \"'+e.systemId+'\"')):e.systemId&&(t+=' SYSTEM \"'+e.systemId+'\"'),e.internalSubset&&(t+=\" [\"+e.internalSubset+\"]\"),t+=\"> \"),t}function GC(e){void 0===n.SingleFile&&(n.SingleFile=function(...n){return[Xx]=n,Qx}(qC(e)))}n.SingleFile=void 0,n.getPageData=async function(e={},t,a,o){void 0===a&&(a=globalThis.document),void 0===o&&(o=globalThis);const i=os;let r;if(GC(t),a&&o){Ui(a);const n=[];if(!e.saveRawPage){let t;if(e.loadDeferredImages&&(t=fr(e),e.loadDeferredImagesBeforeFrames&&await t),!e.removeFrames&&i&&globalThis.frames){let t;t=e.loadDeferredImages?new Promise(n=>globalThis.setTimeout(()=>n(i.getAsync(e)),e.loadDeferredImagesBeforeFrames||!e.loadDeferredImages?0:e.loadDeferredImagesMaxIdleTime)):i.getAsync(e),e.loadDeferredImagesBeforeFrames?e.frames=await t:n.push(t)}e.loadDeferredImages&&!e.loadDeferredImagesBeforeFrames&&n.push(t)}e.loadDeferredImagesBeforeFrames||([e.frames]=await Promise.all(n)),r=e.frames&&e.frames.sessionId}e.doc=a,e.win=o,e.insertCanonicalLink=!0;const s=e.onprogress;e.onprogress=async n=>{n.type===n.RESOURCES_INITIALIZED&&a&&o&&e.loadDeferredImages&&yr(e),s&&await s(n)};const l=new n.SingleFile(e);await l.run(),r&&i.cleanup(r);const c=await l.getPageData();if(e.compressContent){const n=await Qa(c,{insertTextBody:e.insertTextBody,url:e.url,createRootDirectory:e.createRootDirectory,selfExtractingArchive:e.selfExtractingArchive,disableCompression:e.disableCompression,extractDataFromPage:e.extractDataFromPage,preventAppendedData:e.preventAppendedData,insertCanonicalLink:e.insertCanonicalLink,insertMetaNoIndex:e.insertMetaNoIndex,insertMetaCSP:e.insertMetaCSP,password:e.password,zipScript:e.zipScript,embeddedImage:e.embeddedImage,embeddedPdf:e.embeddedPdf});delete c.resources;const t=new globalThis.FileReader;t.readAsArrayBuffer(n);const a=await new Promise((n,e)=>{t.addEventListener(\"load\",()=>n(t.result),!1),t.addEventListener(\"error\",n=>e(n.detail.error),!1)});c.content=Array.from(new Uint8Array(a))}return c},n.helper=dr,n.init=GC,n.modules=Rj,n.processors=is,n.vendor=Jk});\n"
  },
  {
    "path": "manifest.json",
    "content": "{\n\t\"name\": \"SingleFile\",\n\t\"author\": \"Gildas Lormeau\",\n\t\"homepage_url\": \"https://www.getsinglefile.com\",\n\t\"icons\": {\n\t\t\"16\": \"src/ui/resources/icon_16.png\",\n\t\t\"32\": \"src/ui/resources/icon_32.png\",\n\t\t\"48\": \"src/ui/resources/icon_48.png\",\n\t\t\"64\": \"src/ui/resources/icon_64.png\",\n\t\t\"128\": \"src/ui/resources/icon_128.png\"\n\t},\n\t\"version\": \"1.22.98\",\n\t\"description\": \"__MSG_extensionDescription__\",\n\t\"content_scripts\": [\n\t\t{\n\t\t\t\"matches\": [\n\t\t\t\t\"<all_urls>\"\n\t\t\t],\n\t\t\t\"run_at\": \"document_start\",\n\t\t\t\"js\": [\n\t\t\t\t\"lib/single-file-frames.bundle.js\"\n\t\t\t],\n\t\t\t\"all_frames\": true,\n\t\t\t\"match_about_blank\": true,\n\t\t\t\"match_origin_as_fallback\": true\n\t\t},\n\t\t{\n\t\t\t\"matches\": [\n\t\t\t\t\"<all_urls>\"\n\t\t\t],\n\t\t\t\"run_at\": \"document_start\",\n\t\t\t\"js\": [\n\t\t\t\t\"lib/single-file-hooks-frames.js\"\n\t\t\t],\n\t\t\t\"all_frames\": true,\n\t\t\t\"match_about_blank\": true,\n\t\t\t\"match_origin_as_fallback\": true,\n\t\t\t\"world\": \"MAIN\"\n\t\t},\n\t\t{\n\t\t\t\"matches\": [\n\t\t\t\t\"<all_urls>\"\n\t\t\t],\n\t\t\t\"run_at\": \"document_start\",\n\t\t\t\"js\": [\n\t\t\t\t\"lib/single-file-bootstrap.bundle.js\"\n\t\t\t]\n\t\t}\n\t],\n\t\"background\": {\n\t\t\"service_worker\": \"lib/single-file-extension-background.js\"\n\t},\n\t\"side_panel\": {\n\t\t\"default_path\": \"src/ui/pages/panel.html\"\n\t},\n\t\"options_ui\": {\n\t\t\"browser_style\": true,\n\t\t\"page\": \"src/ui/pages/options.html\",\n\t\t\"open_in_tab\": false\n\t},\n\t\"action\": {\n\t\t\"default_icon\": {\n\t\t\t\"16\": \"src/ui/resources/icon_16.png\",\n\t\t\t\"32\": \"src/ui/resources/icon_32.png\",\n\t\t\t\"48\": \"src/ui/resources/icon_48.png\",\n\t\t\t\"64\": \"src/ui/resources/icon_64.png\",\n\t\t\t\"128\": \"src/ui/resources/icon_128.png\"\n\t\t},\n\t\t\"default_title\": \"__MSG_buttonDefaultTooltip__\"\n\t},\n\t\"commands\": {\n\t\t\"save-selected-tabs\": {\n\t\t\t\"suggested_key\": {\n\t\t\t\t\"default\": \"Ctrl+Shift+Y\"\n\t\t\t},\n\t\t\t\"description\": \"__MSG_commandSaveSelectedTabs__\"\n\t\t},\n\t\t\"save-all-tabs\": {\n\t\t\t\"suggested_key\": {\n\t\t\t\t\"default\": \"Ctrl+Shift+U\"\n\t\t\t},\n\t\t\t\"description\": \"__MSG_commandSaveAllTabs__\"\n\t\t},\n\t\t\"custom-command-0\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut0__\"\n\t\t},\n\t\t\"custom-command-1\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut1__\"\n\t\t},\n\t\t\"custom-command-2\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut2__\"\n\t\t},\n\t\t\"custom-command-3\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut3__\"\n\t\t},\n\t\t\"custom-command-4\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut4__\"\n\t\t},\n\t\t\"custom-command-5\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut5__\"\n\t\t},\n\t\t\"custom-command-6\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut6__\"\n\t\t},\n\t\t\"custom-command-7\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut7__\"\n\t\t},\n\t\t\"custom-command-8\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut8__\"\n\t\t},\n\t\t\"custom-command-9\": {\n\t\t\t\"description\": \"__MSG_commandCustomShortcut9__\"\n\t\t}\n\t},\n\t\"web_accessible_resources\": [\n\t\t{\n\t\t\t\"matches\": [\n\t\t\t\t\"<all_urls>\"\n\t\t\t],\n\t\t\t\"resources\": [\n\t\t\t\t\"lib/single-file-infobar.js\",\n\t\t\t\t\"lib/single-file-extension-editor.js\",\n\t\t\t\t\"lib/single-file-extension-editor-helper.js\",\n\t\t\t\t\"lib/single-file-zip.min.js\",\n\t\t\t\t\"lib/single-file-z-worker.js\",\n\t\t\t\t\"src/lib/readability/Readability.js\",\n\t\t\t\t\"src/lib/readability/Readability-readerable.js\",\n\t\t\t\t\"src/ui/pages/editor-note-web.css\",\n\t\t\t\t\"src/ui/pages/editor-mask-web.css\",\n\t\t\t\t\"src/ui/pages/editor-frame-web.css\"\n\t\t\t]\n\t\t}\n\t],\n\t\"oauth2\": {\n\t\t\"client_id\": \"207618107333-7tjs1im1pighftpoepea2kvkubnfjj44.apps.googleusercontent.com\",\n\t\t\"scopes\": [\n\t\t\t\"https://www.googleapis.com/auth/drive.file\"\n\t\t]\n\t},\n\t\"permissions\": [\n\t\t\"contextMenus\",\n\t\t\"downloads\",\n\t\t\"storage\",\n\t\t\"tabs\",\n\t\t\"activeTab\",\n\t\t\"scripting\",\n\t\t\"offscreen\",\n\t\t\"sidePanel\",\n\t\t\"declarativeNetRequest\"\n\t],\n\t\"optional_permissions\": [\n\t\t\"identity\",\n\t\t\"clipboardWrite\",\n\t\t\"nativeMessaging\",\n\t\t\"bookmarks\"\n\t],\n\t\"host_permissions\": [\n\t\t\"<all_urls>\"\n\t],\n\t\"devtools_page\": \"src/core/devtools/devtools.html\",\n\t\"incognito\": \"spanning\",\n\t\"manifest_version\": 3,\n\t\"default_locale\": \"en\"\n}"
  },
  {
    "path": "package.json",
    "content": "{\n\t\"name\": \"single-file-mv3\",\n\t\"version\": \"1.0.0\",\n\t\"description\": \"SingleFile\",\n\t\"author\": \"Gildas Lormeau\",\n\t\"license\": \"AGPL-3.0-or-later\",\n\t\"scripts\": {\n\t\t\"dev\": \"./build-dev.sh\",\n\t\t\"build\": \"./build-extension.sh\"\n\t},\n\t\"type\": \"module\",\n\t\"dependencies\": {\n\t\t\"single-file-core\": \"1.5.84\"\n\t},\n\t\"devDependencies\": {\n\t\t\"eslint\": \"^10.0.0\",\n\t\t\"@rollup/plugin-node-resolve\": \"16.0.3\",\n\t\t\"@rollup/plugin-terser\": \"0.4.4\",\n\t\t\"rollup\": \"^4.57.1\"\n\t},\n\t\"overrides\": {\n\t\t\"terser\": \"^5.15.0\"\n\t}\n}\n"
  },
  {
    "path": "privacy.md",
    "content": "# Privacy Policy\r\nYour data always belongs to you, and only you. SingleFile does not collect any data.\r\n\r\n## How your data is protected and used\r\n- By default, SingleFile does not send any data to our servers or any third parties. All your data is processed and stored locally on your device. \r\n- If you connect SingleFile to your Google Drive account, data is only transmitted from your browser to servers belonging to Google. \r\n- If you connect SingleFile to your Dropbox account, data is only transmitted from your browser to servers belonging to Dropbox. \r\n- If you save pages on GitHub, data is only transmitted from your browser to servers belonging to GitHub. \r\n- If you enable the \"synchronize options\" setting, your options will be sent to servers belonging to the vendor of the browser you are using. \r\n- If you enable the \"add proof of existence\" setting, a SHA256 hash of each saved page will be sent to servers belonging to Woleet. \r\n- When processing a page, SingleFile needs to inject temporary data into the page to save it accurately. SingleFile can download resources that are not displayed or not already cached but present in the page. When using SingleFile in Chromium-based browsers, websites can fetch resources declared in the \"web_accessible_resources\" section of the manifest.json file. Because of this, a website may be able to detect you are using SingleFile or have saved a page on the website with SingleFile.\r\n\r\n## Customer support\r\nWhen you request for customer support, we may ask for your email address to get back to you.\r\n\r\n## Changes to our privacy policy\r\nWe keep our privacy notice under regular review and we will place any updates on this document. This privacy notice was last updated on December 2019.\r\n\r\n## How to contact us\r\nPlease contact us if you have any questions about our privacy policy by email to gildas.lormeau &lt;at&gt; gmail.com.\r\n\r\n## History\r\ncf. https://github.com/gildas-lormeau/SingleFile/commits/master/privacy.md\r\n"
  },
  {
    "path": "rollup.config.dev.js",
    "content": "import resolve from \"@rollup/plugin-node-resolve\";\nimport terser from \"@rollup/plugin-terser\";\n\nconst PLUGINS = [resolve({ moduleDirectories: [\"..\"] })];\nconst EXTERNAL = [\"single-file-core\"];\n\nexport default [{\n\tinput: [\"single-file-core/single-file.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file.js\",\n\t\tformat: \"umd\",\n\t\tname: \"singlefile\",\n\t\tplugins: []\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-frames.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-frames.js\",\n\t\tformat: \"umd\",\n\t\tname: \"singlefile\",\n\t\tplugins: []\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-bootstrap.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-bootstrap.js\",\n\t\tformat: \"umd\",\n\t\tname: \"singlefileBootstrap\",\n\t\tplugins: []\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-hooks-frames.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-hooks-frames.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-infobar.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-infobar.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/vendor/zip/z-worker.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-z-worker.js\",\n\t\tformat: \"es\",\n\t\tplugins: []\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/vendor/zip/zip.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-zip.js\",\n\t\tformat: \"es\",\n\t\tplugins: []\n\t}],\n\tcontext: \"this\",\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/vendor/zip/zip.min.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-zip.min.js\",\n\t\tformat: \"es\",\n\t\tplugins: []\n\t}],\n\tcontext: \"this\",\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"src/core/content/content-bootstrap.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-bootstrap.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}]\n}, {\n\tinput: [\"src/core/content/content-frames.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-frames.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}]\n}, {\n\tinput: [\"src/index.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-core.js\",\n\t\tformat: \"iife\",\n\t\tname: \"extension\",\n\t\tplugins: []\n\t}]\n}, {\n\tinput: [\"src/core/content/content.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}]\n}, {\n\tinput: [\"src/ui/content/content-ui-editor-web.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-editor.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-editor-helper.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-editor-helper.js\",\n\t\tformat: \"umd\",\n\t\tname: \"singlefile\",\n\t\tplugins: []\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"src/lib/single-file/browser-polyfill/chrome-browser-polyfill.js\"],\n\toutput: [{\n\t\tfile: \"lib/chrome-browser-polyfill.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}]\n}, {\n\tinput: [\"src/core/bg/index.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-background.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}]\n}, {\n\tinput: [\"src/core/bg/offscreen-document.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-offscreen-document.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}]\n}, {\n\tinput: [\"src/lib/single-file/background.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-background.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}]\n}];"
  },
  {
    "path": "rollup.config.js",
    "content": "import resolve from \"@rollup/plugin-node-resolve\";\nimport terser from \"@rollup/plugin-terser\";\n\nconst PLUGINS = [resolve({ moduleDirectories: [\"node_modules\"] })];\nconst EXTERNAL = [\"single-file-core\"];\nconst TERSER_HOOKS_OPTIONS = {\n\tmangle: {\n\t\tkeep_fnames: true\n\t}\n};\n\nexport default [{\n\tinput: [\"single-file-core/single-file.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file.js\",\n\t\tformat: \"umd\",\n\t\tname: \"singlefile\",\n\t\tplugins: [terser()]\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-frames.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-frames.js\",\n\t\tformat: \"umd\",\n\t\tname: \"singlefile\",\n\t\tplugins: [terser()]\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-bootstrap.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-bootstrap.js\",\n\t\tformat: \"umd\",\n\t\tname: \"singlefileBootstrap\",\n\t\tplugins: [terser()]\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-hooks-frames.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-hooks-frames.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser(TERSER_HOOKS_OPTIONS)]\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-infobar.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-infobar.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/vendor/zip/z-worker.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-z-worker.js\",\n\t\tformat: \"es\",\n\t\tplugins: [terser()]\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/vendor/zip/zip.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-zip.js\",\n\t\tformat: \"es\",\n\t\tplugins: [terser()]\n\t}],\n\tcontext: \"this\",\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/vendor/zip/zip.min.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-zip.min.js\",\n\t\tformat: \"es\",\n\t\tplugins: [terser()]\n\t}],\n\tcontext: \"this\",\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"src/core/content/content-bootstrap.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-bootstrap.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}]\n}, {\n\tinput: [\"src/core/content/content-frames.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-frames.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}]\n}, {\n\tinput: [\"src/index.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-core.js\",\n\t\tformat: \"iife\",\n\t\tname: \"extension\",\n\t\tplugins: [terser()]\n\t}]\n}, {\n\tinput: [\"src/core/content/content.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}]\n}, {\n\tinput: [\"src/ui/content/content-ui-editor-web.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-editor.js\",\n\t\tformat: \"iife\",\n\t\tplugins: []\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"single-file-core/single-file-editor-helper.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-editor-helper.js\",\n\t\tformat: \"umd\",\n\t\tname: \"singlefile\",\n\t\tplugins: [terser()]\n\t}],\n\tplugins: PLUGINS,\n\texternal: EXTERNAL\n}, {\n\tinput: [\"src/lib/single-file/browser-polyfill/chrome-browser-polyfill.js\"],\n\toutput: [{\n\t\tfile: \"lib/chrome-browser-polyfill.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}]\n}, {\n\tinput: [\"src/core/bg/index.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-background.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}]\n}, {\n\tinput: [\"src/core/bg/offscreen-document.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-extension-offscreen-document.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}]\n}, {\n\tinput: [\"src/lib/single-file/background.js\"],\n\toutput: [{\n\t\tfile: \"lib/single-file-background.js\",\n\t\tformat: \"iife\",\n\t\tplugins: [terser()]\n\t}]\n}];"
  },
  {
    "path": "src/core/bg/autosave-util.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nimport * as config from \"./config.js\";\nimport * as tabsData from \"./tabs-data.js\";\n\nexport {\n\tautoSaveIsEnabled,\n\trefreshAutoSaveTabs\n};\n\nasync function autoSaveIsEnabled(tab) {\n\tif (tab) {\n\t\tconst [allTabsData, rule] = await Promise.all([tabsData.get(), config.getRule(tab.url)]);\n\t\treturn Boolean(allTabsData.autoSaveAll ||\n\t\t\t(allTabsData.autoSaveUnpinned && !tab.pinned) ||\n\t\t\t(allTabsData[tab.id] && allTabsData[tab.id].autoSave)) &&\n\t\t\t(!rule || rule.autoSaveProfile != config.DISABLED_PROFILE_NAME);\n\t}\n}\n\nasync function refreshAutoSaveTabs() {\n\tconst tabs = (await browser.tabs.query({}));\n\treturn Promise.all(tabs.map(async tab => {\n\t\tconst [options, autoSaveEnabled] = await Promise.all([config.getOptions(tab.url, true), autoSaveIsEnabled(tab)]);\n\t\ttry {\n\t\t\tawait browser.tabs.sendMessage(tab.id, { method: \"content.init\", autoSaveEnabled, options });\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t}));\n}"
  },
  {
    "path": "src/core/bg/autosave.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, fetch */\n\nimport * as config from \"./config.js\";\nimport * as business from \"./business.js\";\nimport * as companion from \"./companion.js\";\nimport * as downloads from \"./downloads.js\";\nimport * as tabsData from \"./tabs-data.js\";\nimport * as ui from \"./../../ui/bg/index.js\";\nimport * as woleet from \"./../../lib/woleet/woleet.js\";\nimport { autoSaveIsEnabled } from \"./autosave-util.js\";\nimport * as offscreen from \"./offscreen.js\";\n\nconst pendingMessages = {};\nconst replacedTabIds = {};\n\nexport {\n\tonMessage,\n\tonMessageExternal,\n\tonInit,\n\tonTabUpdated,\n\tonTabRemoved,\n\tonTabDiscarded,\n\tonTabReplaced\n};\n\nasync function onMessage(message, sender) {\n\tif (message.method.endsWith(\".save\")) {\n\t\tif (message.autoSaveDiscard || message.autoSaveRemove) {\n\t\t\tif (sender.tab) {\n\t\t\t\tmessage.tab = sender.tab;\n\t\t\t\tpendingMessages[sender.tab.id] = message;\n\t\t\t} else if (pendingMessages[message.tabId] &&\n\t\t\t\t((pendingMessages[message.tabId].removed && message.autoSaveRemove) ||\n\t\t\t\t\t(pendingMessages[message.tabId].discarded && message.autoSaveDiscard))\n\t\t\t) {\n\t\t\t\tdelete pendingMessages[message.tabId];\n\t\t\t\tawait saveContent(message, { id: message.tabId, index: message.tabIndex, url: sender.url });\n\t\t\t}\n\t\t\tif (message.autoSaveUnload) {\n\t\t\t\tdelete pendingMessages[message.tabId];\n\t\t\t\tawait saveContent(message, sender.tab);\n\t\t\t}\n\t\t} else {\n\t\t\tdelete pendingMessages[message.tabId];\n\t\t\tawait saveContent(message, sender.tab);\n\t\t}\n\t\treturn {};\n\t}\n}\n\nfunction onTabUpdated(tabId) {\n\tdelete pendingMessages[tabId];\n}\n\nasync function onTabRemoved(tabId) {\n\tconst message = pendingMessages[tabId];\n\tif (message) {\n\t\tif (message.autoSaveRemove) {\n\t\t\tdelete pendingMessages[tabId];\n\t\t\tawait saveContent(message, message.tab);\n\t\t}\n\t} else {\n\t\tpendingMessages[tabId] = { removed: true };\n\t}\n}\n\nasync function onTabDiscarded(tabId) {\n\tconst message = pendingMessages[tabId];\n\tif (message) {\n\t\tdelete pendingMessages[tabId];\n\t\tawait saveContent(message, message.tab);\n\t} else {\n\t\tpendingMessages[tabId] = { discarded: true };\n\t}\n}\n\nasync function onTabReplaced(addedTabId, removedTabId) {\n\tif (pendingMessages[removedTabId] && !pendingMessages[addedTabId]) {\n\t\tpendingMessages[addedTabId] = pendingMessages[removedTabId];\n\t\tdelete pendingMessages[removedTabId];\n\t\treplacedTabIds[removedTabId] = addedTabId;\n\t}\n}\n\nasync function onMessageExternal(message, currentTab) {\n\tif (message.method == \"enableAutoSave\") {\n\t\tconst allTabsData = await tabsData.get(currentTab.id);\n\t\tallTabsData[currentTab.id].autoSave = message.enabled;\n\t\tawait tabsData.set(allTabsData);\n\t\tui.refreshTab(currentTab);\n\t}\n\tif (message.method == \"isAutoSaveEnabled\") {\n\t\treturn autoSaveIsEnabled(currentTab);\n\t}\n}\n\nasync function onInit(tab) {\n\tconst [options, autoSaveEnabled] = await Promise.all([config.getOptions(tab.url, true), autoSaveIsEnabled(tab)]);\n\tif (options && ((options.autoSaveLoad || options.autoSaveLoadOrUnload) && autoSaveEnabled)) {\n\t\tbusiness.saveTabs([tab], { autoSave: true });\n\t}\n}\n\nasync function saveContent(message, tab) {\n\tconst tabId = tab.id;\n\tconst options = await config.getOptions(tab.url, true);\n\tif (options) {\n\t\tui.onStart(tabId, 1, true);\n\t\toptions.content = message.content;\n\t\toptions.url = message.url;\n\t\toptions.frames = message.frames;\n\t\toptions.canvases = message.canvases;\n\t\toptions.fonts = message.fonts;\n\t\toptions.stylesheets = message.stylesheets;\n\t\toptions.images = message.images;\n\t\toptions.posters = message.posters;\n\t\toptions.videos = message.videos;\n\t\toptions.usedFonts = message.usedFonts;\n\t\toptions.shadowRoots = message.shadowRoots;\n\t\toptions.referrer = message.referrer;\n\t\toptions.updatedResources = message.updatedResources;\n\t\toptions.worklets = message.worklets;\n\t\toptions.adoptedStyleSheets = message.adoptedStyleSheets;\n\t\toptions.visitDate = new Date(message.visitDate);\n\t\toptions.backgroundTab = true;\n\t\toptions.autoSave = true;\n\t\toptions.incognito = tab.incognito;\n\t\toptions.tabId = tabId;\n\t\toptions.tabIndex = tab.index;\n\t\tlet pageData;\n\t\ttry {\n\t\t\tif (options.autoSaveExternalSave) {\n\t\t\t\tawait companion.externalSave(options);\n\t\t\t} else {\n\t\t\t\tpageData = await offscreen.processPage(options);\n\t\t\t\tlet skipped;\n\t\t\t\tif (!options.saveToGDrive && !options.saveWithWebDAV && !options.saveWithMCP && !options.saveToGitHub && !options.saveToDropbox && !options.saveWithCompanion && !options.saveToRestFormApi && !options.saveToS3) {\n\t\t\t\t\tconst testSkip = await downloads.testSkipSave(pageData.filename, options);\n\t\t\t\t\tskipped = testSkip.skipped;\n\t\t\t\t\toptions.filenameConflictAction = testSkip.filenameConflictAction;\n\t\t\t\t}\n\t\t\t\tif (!skipped) {\n\t\t\t\t\tif (options.saveToGDrive) {\n\t\t\t\t\t\tconst content = await (await fetch(pageData.url)).blob();\n\t\t\t\t\t\tawait downloads.saveToGDrive(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, options, {\n\t\t\t\t\t\t\tforceWebAuthFlow: options.forceWebAuthFlow\n\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\tfilenameConflictAction: options.filenameConflictAction\n\t\t\t\t\t\t});\n\t\t\t\t\t} if (options.saveToDropbox) {\n\t\t\t\t\t\tconst content = await (await fetch(pageData.url)).blob();\n\t\t\t\t\t\tawait downloads.saveToDropbox(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, {\n\t\t\t\t\t\t\tfilenameConflictAction: options.filenameConflictAction\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (options.saveWithWebDAV) {\n\t\t\t\t\t\tconst content = await (await fetch(pageData.url)).blob();\n\t\t\t\t\t\tawait downloads.saveWithWebDAV(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, options.webDAVURL, options.webDAVUser, options.webDAVPassword, {\n\t\t\t\t\t\t\tfilenameConflictAction: options.filenameConflictAction\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (options.saveWithMCP) {\n\t\t\t\t\t\tconst content = await (await fetch(pageData.url)).blob();\n\t\t\t\t\t\tawait downloads.saveWithMCP(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, options.mcpServerUrl, options.mcpAuthToken, {\n\t\t\t\t\t\t\tfilenameConflictAction: options.filenameConflictAction\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (options.saveToGitHub) {\n\t\t\t\t\t\tconst content = await (await fetch(pageData.url)).blob();\n\t\t\t\t\t\tawait (await downloads.saveToGitHub(message.taskId, downloads.encodeSharpCharacter(pageData.filename), content, options.githubToken, options.githubUser, options.githubRepository, options.githubBranch, {\n\t\t\t\t\t\t\tfilenameConflictAction: options.filenameConflictAction\n\t\t\t\t\t\t})).pushPromise;\n\t\t\t\t\t} else if (options.saveWithCompanion && !options.compressContent) {\n\t\t\t\t\t\tconst content = await (await fetch(pageData.url)).text();\n\t\t\t\t\t\tawait companion.save({\n\t\t\t\t\t\t\tfilename: pageData.filename,\n\t\t\t\t\t\t\tcontent: content,\n\t\t\t\t\t\t\ttitle: pageData.title,\n\t\t\t\t\t\t\turl: options.url,\n\t\t\t\t\t\t\tfilenameConflictAction: options.filenameConflictAction\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (options.saveToRestFormApi) {\n\t\t\t\t\t\tconst content = await (await fetch(pageData.url)).blob();\n\t\t\t\t\t\tawait downloads.saveToRestFormApi(\n\t\t\t\t\t\t\tmessage.taskId,\n\t\t\t\t\t\t\tpageData.filename,\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\toptions.url,\n\t\t\t\t\t\t\toptions.saveToRestFormApiToken,\n\t\t\t\t\t\t\toptions.saveToRestFormApiUrl,\n\t\t\t\t\t\t\toptions.saveToRestFormApiFileFieldName,\n\t\t\t\t\t\t\toptions.saveToRestFormApiUrlFieldName\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (options.saveToS3) {\n\t\t\t\t\t\tconst content = await (await fetch(pageData.url)).blob();\n\t\t\t\t\t\tawait downloads.saveToS3(\n\t\t\t\t\t\t\tmessage.taskId,\n\t\t\t\t\t\t\tpageData.filename,\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\toptions.S3Domain,\n\t\t\t\t\t\t\toptions.S3Region,\n\t\t\t\t\t\t\toptions.S3Bucket,\n\t\t\t\t\t\t\toptions.S3AccessKey,\n\t\t\t\t\t\t\toptions.S3SecretKey,\n\t\t\t\t\t\t\t{ filenameConflictAction: options.filenameConflictAction }\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait downloads.downloadPage(pageData, options);\n\t\t\t\t\t}\n\t\t\t\t\tif (options.openSavedPage) {\n\t\t\t\t\t\tconst createTabProperties = { active: true, url: \"/src/ui/pages/viewer.html?compressed=true&blobURI=\" + pageData.url, windowId: tab.windowId };\n\t\t\t\t\t\tconst index = tab.index;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait browser.tabs.get(tabId);\n\t\t\t\t\t\t\tcreateTabProperties.index = index + 1;\n\t\t\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tcreateTabProperties.index = index;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbrowser.tabs.create(createTabProperties);\n\t\t\t\t\t}\n\t\t\t\t\tif (pageData.hash) {\n\t\t\t\t\t\tawait woleet.anchor(pageData.hash, options.woleetKey);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (message.taskId) {\n\t\t\t\tbusiness.onSaveEnd(message.taskId);\n\t\t\t} else if (options.autoClose) {\n\t\t\t\tbrowser.tabs.remove(replacedTabIds[tabId] || tabId);\n\t\t\t\tdelete replacedTabIds[tabId];\n\t\t\t}\n\t\t\tif (pageData && pageData.url && !options.openSavedPage) {\n\t\t\t\toffscreen.revokeObjectURL(pageData.url);\n\t\t\t}\n\t\t\tui.onEnd(tabId, true);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/core/bg/bookmarks.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nimport * as config from \"./config.js\";\nimport * as business from \"./business.js\";\n\nconst pendingSaves = new Set();\n\nPromise.resolve().then(enable);\n\nexport {\n\tonMessage,\n\tenable as saveCreatedBookmarks,\n\tdisable,\n\tupdate\n};\n\nasync function onMessage(message) {\n\tif (message.method.endsWith(\".saveCreatedBookmarks\")) {\n\t\tenable();\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".disable\")) {\n\t\tdisable();\n\t\treturn {};\n\t}\n}\n\nasync function enable() {\n\ttry {\n\t\tbrowser.bookmarks.onCreated.removeListener(onCreated);\n\t\tbrowser.bookmarks.onMoved.removeListener(onMoved);\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n\tlet enabled;\n\tconst profiles = await config.getProfiles();\n\tObject.keys(profiles).forEach(profileName => {\n\t\tif (profiles[profileName].saveCreatedBookmarks) {\n\t\t\tenabled = true;\n\t\t}\n\t});\n\tif (enabled) {\n\t\tbrowser.bookmarks.onCreated.addListener(onCreated);\n\t\tbrowser.bookmarks.onMoved.addListener(onMoved);\n\t}\n}\n\nasync function disable() {\n\tlet disabled;\n\tconst profiles = await config.getProfiles();\n\tObject.keys(profiles).forEach(profileName => disabled = disabled || !profiles[profileName].saveCreatedBookmarks);\n\tif (disabled) {\n\t\tbrowser.bookmarks.onCreated.removeListener(onCreated);\n\t\tbrowser.bookmarks.onMoved.removeListener(onMoved);\n\t}\n}\n\nasync function update(id, changes) {\n\ttry {\n\t\tawait browser.bookmarks.update(id, changes);\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nasync function onCreated(bookmarkId, bookmarkInfo) {\n\tpendingSaves.add(bookmarkId);\n\tawait saveBookmark(bookmarkId, bookmarkInfo.url, bookmarkInfo);\n}\n\nasync function onMoved(bookmarkId, bookmarkInfo) {\n\tif (pendingSaves.has(bookmarkId)) {\n\t\tconst bookmarks = await browser.bookmarks.get(bookmarkId);\n\t\tif (bookmarks[0]) {\n\t\t\tawait saveBookmark(bookmarkId, bookmarks[0].url, bookmarkInfo);\n\t\t}\n\t}\n}\n\nasync function saveBookmark(bookmarkId, url, bookmarkInfo) {\n\tconst activeTabs = await browser.tabs.query({ lastFocusedWindow: true, active: true });\n\tconst options = await config.getOptions(url);\n\tif (options.saveCreatedBookmarks) {\n\t\tconst bookmarkFolders = await getParentFolders(bookmarkInfo.parentId);\n\t\tconst allowedBookmarkSet = options.allowedBookmarkFolders.toString();\n\t\tconst allowedBookmark = bookmarkFolders.find(folder => options.allowedBookmarkFolders.includes(folder));\n\t\tconst ignoredBookmarkSet = options.ignoredBookmarkFolders.toString();\n\t\tconst ignoredBookmark = bookmarkFolders.find(folder => options.ignoredBookmarkFolders.includes(folder));\n\t\tif (\n\t\t\t((allowedBookmarkSet && allowedBookmark) || !allowedBookmarkSet) &&\n\t\t\t((ignoredBookmarkSet && !ignoredBookmark) || !ignoredBookmarkSet)\n\t\t) {\n\t\t\tif (activeTabs.length && activeTabs[0].url == url) {\n\t\t\t\tpendingSaves.delete(bookmarkId);\n\t\t\t\tbusiness.saveTabs(activeTabs, { bookmarkId, bookmarkFolders });\n\t\t\t} else {\n\t\t\t\tconst tabs = await browser.tabs.query({});\n\t\t\t\tif (tabs.length) {\n\t\t\t\t\tconst tab = tabs.find(tab => tab.url == url);\n\t\t\t\t\tif (tab) {\n\t\t\t\t\t\tpendingSaves.delete(bookmarkId);\n\t\t\t\t\t\tbusiness.saveTabs([tab], { bookmarkId, bookmarkFolders });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (url) {\n\t\t\t\t\t\t\tif (url == \"about:blank\") {\n\t\t\t\t\t\t\t\tbrowser.bookmarks.onChanged.addListener(onChanged);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsaveUrl(url);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function getParentFolders(id, folderNames = []) {\n\t\tif (id) {\n\t\t\tconst bookmarkNode = (await browser.bookmarks.get(id))[0];\n\t\t\tif (bookmarkNode && bookmarkNode.title) {\n\t\t\t\tfolderNames.unshift(bookmarkNode.title);\n\t\t\t\tawait getParentFolders(bookmarkNode.parentId, folderNames);\n\t\t\t}\n\t\t}\n\t\treturn folderNames;\n\t}\n\n\tfunction onChanged(id, changeInfo) {\n\t\tif (id == bookmarkId && changeInfo.url) {\n\t\t\tbrowser.bookmarks.onChanged.removeListener(onChanged);\n\t\t\tsaveUrl(changeInfo.url);\n\t\t}\n\t}\n\n\tfunction saveUrl(url) {\n\t\tpendingSaves.delete(bookmarkId);\n\t\tbusiness.saveUrls([url], { bookmarkId });\n\t}\n}"
  },
  {
    "path": "src/core/bg/bootstrap.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\nimport * as config from \"./config.js\";\nimport { autoSaveIsEnabled } from \"./autosave-util.js\";\n\nexport {\n\tonMessage\n};\n\nasync function onMessage(message, sender) {\n\tif (message.method.endsWith(\".init\")) {\n\t\tconst [optionsAutoSave, options, autoSaveEnabled] = await Promise.all([config.getOptions(sender.tab.url, true), config.getOptions(sender.tab.url), autoSaveIsEnabled(sender.tab)]);\n\t\treturn { optionsAutoSave, options, autoSaveEnabled, tabId: sender.tab.id, tabIndex: sender.tab.index };\n\t}\n}"
  },
  {
    "path": "src/core/bg/business.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, window, document */\n\nimport * as config from \"./config.js\";\nimport { autoSaveIsEnabled } from \"./autosave-util.js\";\nimport * as editor from \"./editor.js\";\nimport * as ui from \"./../../ui/bg/index.js\";\n\nconst ERROR_CONNECTION_ERROR_CHROMIUM = \"Could not establish connection. Receiving end does not exist.\";\nconst ERROR_CONNECTION_LOST_CHROMIUM = \"The message port closed before a response was received.\";\nconst ERROR_CONNECTION_LOST_GECKO = \"Message manager disconnected\";\nconst ERROR_EDITOR_PAGE_CHROMIUM = \"Cannot access contents of url \";\nconst ERROR_CHANNEL_CLOSED_CHROMIUM = \"A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received\";\nconst INJECT_SCRIPTS_STEP = 1;\nconst EXECUTE_SCRIPTS_STEP = 2;\nconst TASK_PENDING_STATE = \"pending\";\nconst TASK_PROCESSING_STATE = \"processing\";\nconst CONTENT_SCRIPTS = [\n\t\"lib/single-file.js\",\n\t\"lib/single-file-extension.js\"\n];\nconst BOOTSTRAP_SCRIPTS_ALL_FRAMES = [\n\t\"lib/chrome-browser-polyfill.js\",\n\t\"lib/single-file-frames.js\",\n\t\"lib/single-file-extension-frames.js\"\n];\nconst BOOTSTRAP_SCRIPTS_ALL_FRAMES_MAIN_WORLD = [\n\t\"lib/single-file-hooks-frames.js\"\n];\nconst BOOTSTRAP_SCRIPTS = [\n\t\"lib/chrome-browser-polyfill.js\",\n\t\"lib/single-file-bootstrap.js\",\n\t\"lib/single-file-extension-bootstrap.js\",\n\t\"lib/single-file-infobar.js\"\n];\n\nconst tasks = [];\nlet currentTaskId = 0, maxParallelWorkers, processInForeground;\nui.init({ isSavingTab, saveTabs, saveUrls, cancelTab, openEditor, saveSelectedLinks, batchSaveUrls });\n\nexport {\n\tsaveTabs,\n\tsaveUrls,\n\tsaveSelectedLinks,\n\tcancelTask,\n\tcancelAllTasks,\n\tgetTasksInfo,\n\tgetTaskInfo,\n\tsetCancelCallback,\n\tonSaveEnd,\n\tonInit,\n\tonTabReplaced,\n\tcancelTab as cancel\n};\n\nasync function saveSelectedLinks(tab) {\n\tlet scriptsInjected;\n\ttry {\n\t\tscriptsInjected = await injectScript(tab.id);\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n\tif (scriptsInjected) {\n\t\tconst response = await browser.tabs.sendMessage(tab.id, { method: \"content.getSelectedLinks\" });\n\t\tif (response.urls && response.urls.length) {\n\t\t\tconst tab = await batchSaveUrls();\n\t\t\tconst onTabUpdated = (tabId, changeInfo) => {\n\t\t\t\tif (changeInfo.status == \"complete\" && tabId == tab.id) {\n\t\t\t\t\tbrowser.tabs.onUpdated.removeListener(onTabUpdated);\n\t\t\t\t\tbrowser.tabs.sendMessage(tab.id, { method: \"newUrls.addURLs\", urls: response.urls });\n\t\t\t\t}\n\t\t\t};\n\t\t\tbrowser.tabs.onUpdated.addListener(onTabUpdated);\n\t\t}\n\t} else {\n\t\tui.onForbiddenDomain(tab);\n\t}\n}\n\nasync function batchSaveUrls() {\n\treturn browser.tabs.create({ active: true, url: \"/src/ui/pages/batch-save-urls.html\" });\n}\n\nasync function saveUrls(urls, options = {}) {\n\tawait initMaxParallelWorkers();\n\tawait Promise.all(urls.map(async url => {\n\t\tconst tabOptions = await config.getOptions(url);\n\t\tif (tabOptions.profileName != config.DISABLED_PROFILE_NAME) {\n\t\t\tObject.keys(options).forEach(key => tabOptions[key] = options[key]);\n\t\t\ttabOptions.autoClose = true;\n\t\t\ttabOptions.originalUrl = url;\n\t\t\taddTask({\n\t\t\t\ttab: { url },\n\t\t\t\tstatus: TASK_PENDING_STATE,\n\t\t\t\toptions: tabOptions,\n\t\t\t\tmethod: \"content.save\"\n\t\t\t});\n\t\t}\n\t}));\n\trunTasks();\n}\n\nasync function saveTabs(tabs, options = {}) {\n\tawait initMaxParallelWorkers();\n\tawait Promise.all(tabs.map(async tab => {\n\t\tconst tabId = tab.id;\n\t\tconst tabOptions = await config.getOptions(tab.url);\n\t\tif (tabOptions.profileName != config.DISABLED_PROFILE_NAME) {\n\t\t\tObject.keys(options).forEach(key => tabOptions[key] = options[key]);\n\t\t\ttabOptions.tabId = tabId;\n\t\t\ttabOptions.tabIndex = tab.index;\n\t\t\tconst tabData = {\n\t\t\t\tid: tab.id,\n\t\t\t\tindex: tab.index,\n\t\t\t\turl: tab.url,\n\t\t\t\ttitle: tab.title\n\t\t\t};\n\t\t\tif (options.autoSave) {\n\t\t\t\tif (autoSaveIsEnabled(tab)) {\n\t\t\t\t\tconst taskInfo = addTask({\n\t\t\t\t\t\tstatus: TASK_PROCESSING_STATE,\n\t\t\t\t\t\ttab: tabData,\n\t\t\t\t\t\toptions: tabOptions,\n\t\t\t\t\t\tmethod: \"content.autosave\"\n\t\t\t\t\t});\n\t\t\t\t\trunTask(taskInfo);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tui.onStart(tabId, INJECT_SCRIPTS_STEP);\n\t\t\t\tlet scriptsInjected;\n\t\t\t\ttry {\n\t\t\t\t\tscriptsInjected = await injectScript(tabId, tabOptions);\n\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// ignored\n\t\t\t\t}\n\t\t\t\tif (scriptsInjected || editor.isEditor(tab)) {\n\t\t\t\t\tui.onStart(tabId, EXECUTE_SCRIPTS_STEP);\n\t\t\t\t\taddTask({\n\t\t\t\t\t\tstatus: TASK_PENDING_STATE,\n\t\t\t\t\t\ttab: tabData,\n\t\t\t\t\t\toptions: tabOptions,\n\t\t\t\t\t\tmethod: \"content.save\"\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tui.onForbiddenDomain(tab);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tui.onForbiddenDomain(tab);\n\t\t}\n\t}));\n\trunTasks();\n}\n\nfunction addTask(info) {\n\tconst taskInfo = {\n\t\tid: currentTaskId,\n\t\tstatus: info.status,\n\t\ttab: info.tab,\n\t\toptions: info.options,\n\t\tmethod: info.method,\n\t\tdone: function (runNextTasks = true) {\n\t\t\tconst index = tasks.findIndex(taskInfo => taskInfo.id == this.id);\n\t\t\tif (index > -1) {\n\t\t\t\ttasks.splice(index, 1);\n\t\t\t\tif (runNextTasks) {\n\t\t\t\t\trunTasks();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\ttasks.push(taskInfo);\n\tcurrentTaskId++;\n\treturn taskInfo;\n}\n\nfunction openEditor(tab) {\n\tbrowser.tabs.sendMessage(tab.id, { method: \"content.openEditor\" });\n}\n\nasync function initMaxParallelWorkers() {\n\tif (!maxParallelWorkers) {\n\t\tconst configData = await config.get();\n\t\tprocessInForeground = configData.processInForeground;\n\t\tmaxParallelWorkers = processInForeground ? 1 : configData.maxParallelWorkers;\n\t}\n}\n\nfunction runTasks() {\n\tconst processingCount = tasks.filter(taskInfo => taskInfo.status == TASK_PROCESSING_STATE).length;\n\tfor (let index = 0; index < Math.min(tasks.length - processingCount, (maxParallelWorkers - processingCount)); index++) {\n\t\tconst taskInfo = tasks.find(taskInfo => taskInfo.status == TASK_PENDING_STATE);\n\t\tif (taskInfo) {\n\t\t\trunTask(taskInfo);\n\t\t}\n\t}\n}\n\nasync function runTask(taskInfo) {\n\tconst taskId = taskInfo.id;\n\ttaskInfo.status = TASK_PROCESSING_STATE;\n\tif (!taskInfo.tab.id) {\n\t\tlet scriptsInjected;\n\t\ttry {\n\t\t\tconst tab = await createTabAndWaitUntilComplete({ url: taskInfo.tab.url, active: false });\n\t\t\ttaskInfo.tab.id = taskInfo.options.tabId = tab.id;\n\t\t\ttaskInfo.tab.index = taskInfo.options.tabIndex = tab.index;\n\t\t\tui.onStart(taskInfo.tab.id, INJECT_SCRIPTS_STEP);\n\t\t\ttry {\n\t\t\t\tscriptsInjected = await injectScript(taskInfo.tab.id, taskInfo.options);\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t} catch (error) {\n\t\t\t\t// ignored\n\t\t\t}\n\t\t} catch (tabId) {\n\t\t\ttaskInfo.tab.id = tabId;\n\t\t}\n\t\tif (scriptsInjected) {\n\t\t\tui.onStart(taskInfo.tab.id, EXECUTE_SCRIPTS_STEP);\n\t\t} else {\n\t\t\ttaskInfo.done();\n\t\t\treturn;\n\t\t}\n\t}\n\ttaskInfo.options.taskId = taskId;\n\ttry {\n\t\tif (processInForeground) {\n\t\t\tawait browser.tabs.update(taskInfo.tab.id, { active: true });\n\t\t}\n\t\tawait browser.tabs.sendMessage(taskInfo.tab.id, { method: taskInfo.method, options: taskInfo.options });\n\t} catch (error) {\n\t\tif (error && (!error.message || !isIgnoredError(error))) {\n\t\t\tconsole.log(error.message ? error.message : error); // eslint-disable-line no-console\n\t\t\tui.onError(taskInfo.tab.id, error.message, error.link);\n\t\t\ttaskInfo.done();\n\t\t}\n\t}\n}\n\nfunction isIgnoredError(error) {\n\treturn error.message == ERROR_CONNECTION_LOST_CHROMIUM ||\n\t\terror.message == ERROR_CONNECTION_ERROR_CHROMIUM ||\n\t\terror.message == ERROR_CONNECTION_LOST_GECKO ||\n\t\terror.message == ERROR_CHANNEL_CLOSED_CHROMIUM ||\n\t\terror.message.startsWith(ERROR_EDITOR_PAGE_CHROMIUM + JSON.stringify(editor.EDITOR_URL));\n}\n\nfunction isSavingTab(tab) {\n\treturn Boolean(tasks.find(taskInfo => taskInfo.tab.id == tab.id));\n}\n\nfunction onInit(tab) {\n\tcancelTab(tab.id, false);\n}\n\nfunction onTabReplaced(addedTabId, removedTabId) {\n\ttasks.forEach(taskInfo => {\n\t\tif (taskInfo.tab.id == removedTabId) {\n\t\t\ttaskInfo.tab.id = addedTabId;\n\t\t}\n\t});\n}\n\nfunction onSaveEnd(taskId) {\n\tconst taskInfo = tasks.find(taskInfo => taskInfo.id == taskId);\n\tif (taskInfo) {\n\t\tif (taskInfo.options.autoClose && !taskInfo.cancelled) {\n\t\t\tbrowser.tabs.remove(taskInfo.tab.id);\n\t\t}\n\t\ttaskInfo.done();\n\t}\n}\n\nasync function injectScript(tabId, options = {}, retry = true) {\n\tlet scriptsInjected;\n\tconst resultData = (await browser.scripting.executeScript({\n\t\ttarget: { tabId },\n\t\tfunc: () => Boolean(window.singlefile)\n\t}))[0];\n\tscriptsInjected = resultData && resultData.result;\n\tif (!scriptsInjected) {\n\t\ttry {\n\t\t\tawait browser.scripting.executeScript({\n\t\t\t\ttarget: { tabId, allFrames: true },\n\t\t\t\tfiles: BOOTSTRAP_SCRIPTS_ALL_FRAMES\n\t\t\t});\n\t\t\tawait browser.scripting.executeScript({\n\t\t\t\ttarget: { tabId },\n\t\t\t\tfiles: BOOTSTRAP_SCRIPTS\n\t\t\t});\n\t\t\tawait browser.scripting.executeScript({\n\t\t\t\ttarget: { tabId, allFrames: true },\n\t\t\t\tfiles: BOOTSTRAP_SCRIPTS_ALL_FRAMES_MAIN_WORLD,\n\t\t\t\tworld: \"MAIN\"\n\t\t\t});\n\t\t\tif (retry) {\n\t\t\t\treturn await injectScript(tabId, options, false);\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t} else {\n\t\ttry {\n\t\t\tawait browser.scripting.executeScript({\n\t\t\t\ttarget: { tabId },\n\t\t\t\tfiles: CONTENT_SCRIPTS\n\t\t\t});\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t}\n\tif (scriptsInjected && options.frameId) {\n\t\tawait browser.scripting.executeScript({\n\t\t\ttarget: {\n\t\t\t\ttabId,\n\t\t\t\tframeIds: [options.frameId]\n\t\t\t},\n\t\t\tfunc: () => document.documentElement.dataset.requestedFrameId = true\n\t\t});\n\t}\n\treturn scriptsInjected;\n}\n\nasync function createTabAndWaitUntilComplete(createProperties) {\n\tconst tab = await browser.tabs.create(createProperties);\n\treturn new Promise((resolve, reject) => {\n\t\tbrowser.tabs.onUpdated.addListener(onTabUpdated);\n\t\tbrowser.tabs.onRemoved.addListener(onTabRemoved);\n\t\tfunction onTabUpdated(tabId, changeInfo) {\n\t\t\tif (tabId == tab.id && changeInfo.status == \"complete\") {\n\t\t\t\tresolve(tab);\n\t\t\t\tbrowser.tabs.onUpdated.removeListener(onTabUpdated);\n\t\t\t\tbrowser.tabs.onRemoved.removeListener(onTabRemoved);\n\t\t\t}\n\t\t}\n\t\tfunction onTabRemoved(tabId) {\n\t\t\tif (tabId == tab.id) {\n\t\t\t\treject(tabId);\n\t\t\t\tbrowser.tabs.onRemoved.removeListener(onTabRemoved);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction setCancelCallback(taskId, cancelCallback) {\n\tconst taskInfo = tasks.find(taskInfo => taskInfo.id == taskId);\n\tif (taskInfo) {\n\t\ttaskInfo.cancel = cancelCallback;\n\t}\n}\n\nfunction cancelTab(tabId, stopProcessing = true) {\n\tArray.from(tasks).filter(taskInfo =>\n\t\ttaskInfo.tab.id == tabId &&\n\t\t!taskInfo.options.autoSave &&\n\t\t(stopProcessing || taskInfo.status != TASK_PROCESSING_STATE)\n\t).forEach(cancel);\n}\n\nfunction cancelTask(taskId) {\n\tconst taskInfo = tasks.find(taskInfo => taskInfo.id == taskId);\n\tif (taskInfo) {\n\t\tcancel(taskInfo);\n\t}\n}\n\nfunction cancelAllTasks() {\n\tArray.from(tasks).forEach(taskInfo => cancel(taskInfo, false));\n}\n\nfunction getTasksInfo() {\n\treturn tasks.map(mapTaskInfo);\n}\n\nfunction getTaskInfo(taskId) {\n\treturn tasks.find(taskInfo => taskInfo.id == taskId);\n}\n\nfunction cancel(taskInfo, runNextTasks) {\n\tconst tabId = taskInfo.tab.id;\n\ttaskInfo.cancelled = true;\n\tif (tabId) {\n\t\tbrowser.tabs.sendMessage(tabId, {\n\t\t\tmethod: \"content.cancelSave\",\n\t\t\toptions: {\n\t\t\t\tloadDeferredImages: taskInfo.options.loadDeferredImages,\n\t\t\t\tloadDeferredImagesKeepZoomLevel: taskInfo.options.loadDeferredImagesKeepZoomLevel\n\t\t\t}\n\t\t}).catch(() => {\n\t\t\t// ignored\n\t\t});\n\t\tif (taskInfo.method == \"content.autosave\") {\n\t\t\tui.onEnd(tabId, true);\n\t\t}\n\t\tui.onCancelled(taskInfo.tab);\n\t}\n\tif (taskInfo.cancel) {\n\t\ttaskInfo.cancel();\n\t}\n\ttaskInfo.done(runNextTasks);\n}\n\nfunction mapTaskInfo(taskInfo) {\n\treturn { id: taskInfo.id, tabId: taskInfo.tab.id, index: taskInfo.tab.index, url: taskInfo.tab.url, title: taskInfo.tab.title, cancelled: taskInfo.cancelled, status: taskInfo.status };\n}\n"
  },
  {
    "path": "src/core/bg/companion.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nlet enabled = true;\n\nexport {\n\tenabled,\n\tonMessage,\n\texternalSave,\n\tsave\n};\n\nasync function onMessage(message) {\n\tif (message.method.endsWith(\".state\")) {\n\t\treturn { enabled };\n\t}\n}\n\nasync function externalSave(pageData) {\n\tpageData.autoSaveExternalSave = false;\n\tlet response;\n\ttry {\n\t\tresponse = await browser.runtime.sendNativeMessage(\"singlefile_companion\", {\n\t\t\tmethod: \"externalSave\",\n\t\t\tpageData\n\t\t});\n\t} catch (error) {\n\t\tif (!error.message || !error.message.includes(\"Native host has exited\")) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\tif (response && response.error) {\n\t\tthrow new Error(response.error + \" (Companion)\");\n\t}\n}\n\nasync function save(pageData) {\n\tlet response;\n\ttry {\n\t\tresponse = await browser.runtime.sendNativeMessage(\"singlefile_companion\", {\n\t\t\tmethod: \"save\",\n\t\t\tpageData\n\t\t});\n\t} catch (error) {\n\t\tif (!error.message || !error.message.includes(\"Native host has exited\")) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\tif (response && response.error) {\n\t\tthrow new Error(response.error + \" (Companion)\");\n\t}\n}"
  },
  {
    "path": "src/core/bg/config.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, navigator, Blob, File, btoa */\n\nimport { download } from \"./download-util.js\";\nimport * as tabsData from \"./tabs-data.js\";\n\nconst CURRENT_PROFILE_NAME = \"-\";\nconst DEFAULT_PROFILE_NAME = \"__Default_Settings__\";\nconst DISABLED_PROFILE_NAME = \"__Disabled_Settings__\";\nconst REGEXP_RULE_PREFIX = \"regexp:\";\nconst PROFILE_NAME_PREFIX = \"profile_\";\n\nconst BACKGROUND_SAVE_SUPPORTED = !(/Mobile.*Firefox/.test(navigator.userAgent));\nconst SHARE_API_SUPPORTED = navigator.canShare && navigator.canShare({ files: [new File([new Blob([\"\"], { type: \"text/html\" })], \"test.html\")] });\nconst LEGACY_FILENAME_REPLACED_CHARACTERS = [\"~\", \"+\", \"\\\\\\\\\", \"?\", \"%\", \"*\", \":\", \"|\", \"\\\"\", \"<\", \">\", \"\\u0000-\\u001f\", \"\\u007f\"];\nconst DEFAULT_FILENAME_REPLACED_CHARACTERS = [\"~\", \"+\", \"?\", \"%\", \"*\", \":\", \"|\", \"\\\"\", \"<\", \">\", \"\\\\\\\\\", \"\\x00-\\x1f\", \"\\x7F\"];\nconst DEFAULT_FILENAME_REPLACEMENT_CHARACTERS = [\"～\", \"＋\", \"？\", \"％\", \"＊\", \"：\", \"｜\", \"＂\", \"＜\", \"＞\", \"＼\"];\n\nconst DEFAULT_CONFIG = {\n\tremoveHiddenElements: true,\n\tremovedElementsSelector: \"\",\n\tremoveUnusedStyles: true,\n\tremoveUnusedFonts: true,\n\tremoveFrames: false,\n\tcompressHTML: true,\n\tcompressCSS: false,\n\tloadDeferredImages: true,\n\tloadDeferredImagesMaxIdleTime: 1500,\n\tloadDeferredImagesBlockCookies: false,\n\tloadDeferredImagesBlockStorage: false,\n\tloadDeferredImagesKeepZoomLevel: false,\n\tloadDeferredImagesDispatchScrollEvent: false,\n\tloadDeferredImagesBeforeFrames: false,\n\tfilenameTemplate: \"%if-empty<{page-title}|No title> ({date-locale} {time-locale}).{filename-extension}\",\n\tinfobarTemplate: \"\",\n\tincludeInfobar: false,\n\topenInfobar: false,\n\tconfirmInfobarContent: false,\n\tautoClose: false,\n\tconfirmFilename: false,\n\tfilenameConflictAction: \"uniquify\",\n\tfilenameMaxLength: 192,\n\tfilenameMaxLengthUnit: \"bytes\",\n\tfilenameReplacedCharacters: DEFAULT_FILENAME_REPLACED_CHARACTERS,\n\tfilenameReplacementCharacter: \"_\",\n\tfilenameReplacementCharacters: DEFAULT_FILENAME_REPLACEMENT_CHARACTERS,\n\treplaceEmojisInFilename: false,\n\tsaveFilenameTemplateData: false,\n\tcontextMenuEnabled: true,\n\ttabMenuEnabled: true,\n\tbrowserActionMenuEnabled: true,\n\tshadowEnabled: true,\n\tlogsEnabled: true,\n\tprogressBarEnabled: true,\n\tmaxResourceSizeEnabled: false,\n\tmaxResourceSize: 10,\n\tdisplayInfobar: true,\n\tdisplayStats: false,\n\tbackgroundSave: BACKGROUND_SAVE_SUPPORTED,\n\tdefaultEditorMode: \"normal\",\n\tapplySystemTheme: true,\n\tcontentWidth: 70,\n\tautoSaveDelay: 1,\n\tautoSaveLoad: false,\n\tautoSaveUnload: false,\n\tautoSaveLoadOrUnload: true,\n\tautoSaveDiscard: false,\n\tautoSaveRemove: false,\n\tautoSaveRepeat: false,\n\tautoSaveRepeatDelay: 10,\n\tremoveAlternativeFonts: true,\n\tremoveAlternativeMedias: true,\n\tremoveAlternativeImages: true,\n\tgroupDuplicateImages: true,\n\tmaxSizeDuplicateImages: 512 * 1024,\n\tsaveRawPage: false,\n\tsaveToClipboard: false,\n\taddProof: false,\n\tsaveToGDrive: false,\n\tsaveToDropbox: false,\n\tsaveWithWebDAV: false,\n\twebDAVURL: \"\",\n\twebDAVUser: \"\",\n\twebDAVPassword: \"\",\n\tsaveWithMCP: false,\n\tmcpServerUrl: \"\",\n\tmcpAuthToken: \"\",\n\tsaveToGitHub: false,\n\tsaveToRestFormApi: false,\n\tsaveToS3: false,\n\tgithubToken: \"\",\n\tgithubUser: \"\",\n\tgithubRepository: \"SingleFile-Archives\",\n\tgithubBranch: \"main\",\n\tsaveWithCompanion: false,\n\tsharePage: false,\n\tforceWebAuthFlow: false,\n\tresolveFragmentIdentifierURLs: false,\n\tuserScriptEnabled: false,\n\topenEditor: false,\n\topenSavedPage: false,\n\tautoOpenEditor: false,\n\tsaveCreatedBookmarks: false,\n\tallowedBookmarkFolders: [],\n\tignoredBookmarkFolders: [],\n\treplaceBookmarkURL: true,\n\tsaveFavicon: true,\n\tincludeBOM: false,\n\twarnUnsavedPage: true,\n\tdisplayInfobarInEditor: false,\n\tcompressContent: false,\n\tcreateRootDirectory: false,\n\tselfExtractingArchive: false,\n\tdisableCompression: false,\n\textractDataFromPage: false,\n\tpreventAppendedData: false,\n\tinsertEmbeddedImage: false,\n\tinsertEmbeddedScreenshotImage: false,\n\tinsertTextBody: false,\n\tautoSaveExternalSave: false,\n\tinsertMetaNoIndex: false,\n\tinsertMetaCSP: true,\n\tpassReferrerOnError: false,\n\tpassword: \"\",\n\tinsertSingleFileComment: true,\n\tremoveSavedDate: false,\n\tblockMixedContent: false,\n\tsaveOriginalURLs: false,\n\tacceptHeaders: {\n\t\tfont: \"application/font-woff2;q=1.0,application/font-woff;q=0.9,*/*;q=0.8\",\n\t\timage: \"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8\",\n\t\tstylesheet: \"text/css,*/*;q=0.1\",\n\t\tscript: \"*/*\",\n\t\tdocument: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n\t\tvideo: \"video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5\",\n\t\taudio: \"audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5\"\n\t},\n\tmoveStylesInHead: false,\n\tnetworkTimeout: 0,\n\twoleetKey: \"\",\n\tblockImages: false,\n\tblockAlternativeImages: true,\n\tblockStylesheets: false,\n\tblockFonts: false,\n\tblockScripts: true,\n\tblockVideos: true,\n\tblockAudios: true,\n\tdelayBeforeProcessing: 0,\n\tdelayAfterProcessing: 0,\n\t_migratedTemplateFormat: true,\n\tsaveToRestFormApiUrl: \"\",\n\tsaveToRestFormApiFileFieldName: \"\",\n\tsaveToRestFormApiUrlFieldName: \"\",\n\tsaveToRestFormApiToken: \"\",\n\tS3Domain: \"s3.amazonaws.com\",\n\tS3Region: \"\",\n\tS3Bucket: \"\",\n\tS3AccessKey: \"\",\n\tS3SecretKey: \"\",\n\tresolveLinks: true,\n\tgroupDuplicateStylesheets: false,\n\tinfobarPositionAbsolute: false,\n\tinfobarPositionTop: \"16px\",\n\tinfobarPositionRight: \"16px\",\n\tinfobarPositionBottom: \"\",\n\tinfobarPositionLeft: \"\",\n\tremoveNoScriptTags: true,\n\tcustomShortcut: null,\n\timageReductionFactor: 1\n};\n\nconst DEFAULT_RULES = [{\n\t\"url\": \"file:\",\n\t\"profile\": \"__Default_Settings__\",\n\t\"autoSaveProfile\": \"__Disabled_Settings__\"\n}];\n\nconst MIGRATION_DEFAULT_VARIABLES_VALUES = {\n\t\"page-title\": \"No title\",\n\t\"page-heading\": \"No heading\",\n\t\"page-language\": \"No language\",\n\t\"page-description\": \"No description\",\n\t\"page-author\": \"No author\",\n\t\"page-creator\": \"No creator\",\n\t\"page-publisher\": \"No publisher\",\n\t\"url-hash\": \"No hash\",\n\t\"url-host\": \"No host\",\n\t\"url-hostname\": \"No hostname\",\n\t\"url-href\": \"No href\",\n\t\"url-href-digest-sha-1\": \"No hash\",\n\t\"url-href-flat\": \"No href\",\n\t\"url-referrer\": \"No referrer\",\n\t\"url-referrer-flat\": \"No referrer\",\n\t\"url-password\": \"No password\",\n\t\"url-pathname\": \"No pathname\",\n\t\"url-pathname-flat\": \"No pathname\",\n\t\"url-port\": \"No port\",\n\t\"url-protocol\": \"No protocol\",\n\t\"url-search\": \"No search\",\n\t\"url-username\": \"No username\",\n\t\"tab-id\": \"No tab id\",\n\t\"tab-index\": \"No tab index\",\n\t\"url-last-segment\": \"No last segment\"\n};\n\nlet configStorage;\nlet pendingUpgradePromise = upgrade();\nexport {\n\tDEFAULT_PROFILE_NAME,\n\tDISABLED_PROFILE_NAME,\n\tCURRENT_PROFILE_NAME,\n\tBACKGROUND_SAVE_SUPPORTED,\n\tSHARE_API_SUPPORTED,\n\tgetConfig as get,\n\tgetRule,\n\tgetOptions,\n\tgetProfiles,\n\tonMessage,\n\tupdateRule,\n\taddRule,\n\tgetAuthInfo,\n\tgetDropboxAuthInfo,\n\tsetAuthInfo,\n\tsetDropboxAuthInfo,\n\tremoveAuthInfo,\n\tremoveDropboxAuthInfo\n};\n\nasync function upgrade() {\n\tconst { sync } = await browser.storage.local.get();\n\tif (sync) {\n\t\tconfigStorage = browser.storage.sync;\n\t} else {\n\t\tconfigStorage = browser.storage.local;\n\t}\n\tconst config = await configStorage.get();\n\tif (!config[PROFILE_NAME_PREFIX + DEFAULT_PROFILE_NAME]) {\n\t\tif (config.profiles) {\n\t\t\tconst profileNames = Object.keys(config.profiles);\n\t\t\tfor (const profileName of profileNames) {\n\t\t\t\tawait setProfile(profileName, config.profiles[profileName]);\n\t\t\t}\n\t\t} else {\n\t\t\tawait setProfile(DEFAULT_PROFILE_NAME, DEFAULT_CONFIG);\n\t\t}\n\t} else if (config.profiles) {\n\t\tawait configStorage.remove([\"profiles\"]);\n\t}\n\tif (!config.rules) {\n\t\tawait configStorage.set({ rules: DEFAULT_RULES });\n\t}\n\tif (!config.maxParallelWorkers) {\n\t\tawait configStorage.set({ maxParallelWorkers: navigator.hardwareConcurrency || 4 });\n\t}\n\tif (!config.processInForeground) {\n\t\tawait configStorage.set({ processInForeground: false });\n\t}\n\tconst profileNames = await getProfileNames();\n\tprofileNames.map(async profileName => {\n\t\tconst profile = await getProfile(profileName);\n\t\tif (!profile._migratedTemplateFormat) {\n\t\t\tprofile.filenameTemplate = updateFilenameTemplate(profile.filenameTemplate);\n\t\t\tprofile._migratedTemplateFormat = true;\n\t\t}\n\t\tfor (const key of Object.keys(DEFAULT_CONFIG)) {\n\t\t\tif (profile[key] === undefined) {\n\t\t\t\tprofile[key] = DEFAULT_CONFIG[key];\n\t\t\t}\n\t\t}\n\t\tif (isSameArray(profile.filenameReplacedCharacters, LEGACY_FILENAME_REPLACED_CHARACTERS)\n\t\t\t&& isSameArray(profile.filenameReplacementCharacters, DEFAULT_FILENAME_REPLACEMENT_CHARACTERS)) {\n\t\t\tprofile.filenameReplacedCharacters = DEFAULT_FILENAME_REPLACED_CHARACTERS;\n\t\t}\n\t\tawait setProfile(profileName, profile);\n\t});\n}\n\nfunction updateFilenameTemplate(template) {\n\ttry {\n\t\tObject.keys(MIGRATION_DEFAULT_VARIABLES_VALUES).forEach(variable => {\n\t\t\tconst value = MIGRATION_DEFAULT_VARIABLES_VALUES[variable];\n\t\t\ttemplate = template.replaceAll(`{${variable}}`, `%if-empty<{${variable}}|${value}>`);\n\t\t});\n\t\treturn template;\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nasync function getRule(url, ignoreWildcard) {\n\tconst { rules } = await configStorage.get([\"rules\"]);\n\tconst regExpRules = rules.filter(rule => testRegExpRule(rule));\n\tlet rule = regExpRules.sort(sortRules).find(rule => url && url.match(new RegExp(rule.url.split(REGEXP_RULE_PREFIX)[1])));\n\tif (!rule) {\n\t\tconst normalRules = rules.filter(rule => !testRegExpRule(rule));\n\t\trule = normalRules.sort(sortRules).find(rule => (!ignoreWildcard && rule.url == \"*\") || (url && url.includes(rule.url)));\n\t}\n\treturn rule;\n}\n\nasync function getConfig() {\n\tawait pendingUpgradePromise;\n\tconst { maxParallelWorkers, processInForeground } = await configStorage.get([\"maxParallelWorkers\", \"processInForeground\"]);\n\tconst rules = await getRules();\n\tconst profiles = await getProfiles();\n\treturn { profiles, rules, maxParallelWorkers, processInForeground };\n}\n\nfunction sortRules(ruleLeft, ruleRight) {\n\treturn ruleRight.url.length - ruleLeft.url.length;\n}\n\nfunction testRegExpRule(rule) {\n\treturn rule.url.toLowerCase().startsWith(REGEXP_RULE_PREFIX);\n}\n\nasync function onMessage(message) {\n\tif (message.method.endsWith(\".get\")) {\n\t\treturn await getConfig();\n\t}\n\tif (message.method.endsWith(\".set\")) {\n\t\tconst { config } = message;\n\t\tconst profiles = config.profiles;\n\t\tconst rules = config.rules;\n\t\tconst maxParallelWorkers = config.maxParallelWorkers;\n\t\tconst processInForeground = config.processInForeground;\n\t\tconst profileKeyNames = await getProfileKeyNames();\n\t\tawait configStorage.remove([...profileKeyNames, \"rules\", \"maxParallelWorkers\", \"processInForeground\"]);\n\t\tawait configStorage.set({ rules, maxParallelWorkers, processInForeground });\n\t\tObject.keys(profiles).forEach(profileName => setProfile(profileName, profiles[profileName]));\n\t}\n\tif (message.method.endsWith(\".deleteRules\")) {\n\t\tawait deleteRules(message.profileName);\n\t}\n\tif (message.method.endsWith(\".deleteRule\")) {\n\t\tawait deleteRule(message.url);\n\t}\n\tif (message.method.endsWith(\".addRule\")) {\n\t\tawait addRule(message.url, message.profileName, message.autoSaveProfileName);\n\t}\n\tif (message.method.endsWith(\".createProfile\")) {\n\t\tawait createProfile(message.profileName, message.fromProfileName || DEFAULT_PROFILE_NAME);\n\t}\n\tif (message.method.endsWith(\".renameProfile\")) {\n\t\tawait renameProfile(message.profileName, message.newProfileName);\n\t}\n\tif (message.method.endsWith(\".deleteProfile\")) {\n\t\tawait deleteProfile(message.profileName);\n\t}\n\tif (message.method.endsWith(\".resetProfiles\")) {\n\t\tawait resetProfiles();\n\t}\n\tif (message.method.endsWith(\".resetProfile\")) {\n\t\tawait resetProfile(message.profileName);\n\t}\n\tif (message.method.endsWith(\".importConfig\")) {\n\t\tawait importConfig(message.config);\n\t}\n\tif (message.method.endsWith(\".updateProfile\")) {\n\t\tawait updateProfile(message.profileName, message.profile);\n\t}\n\tif (message.method.endsWith(\".updateRule\")) {\n\t\tawait updateRule(message.url, message.newUrl, message.profileName, message.autoSaveProfileName);\n\t}\n\tif (message.method.endsWith(\".getConstants\")) {\n\t\treturn {\n\t\t\tDISABLED_PROFILE_NAME,\n\t\t\tDEFAULT_PROFILE_NAME,\n\t\t\tCURRENT_PROFILE_NAME,\n\t\t\tBACKGROUND_SAVE_SUPPORTED,\n\t\t\tSHARE_API_SUPPORTED\n\t\t};\n\t}\n\tif (message.method.endsWith(\".getRules\")) {\n\t\treturn getRules();\n\t}\n\tif (message.method.endsWith(\".getProfiles\")) {\n\t\treturn getProfiles();\n\t}\n\tif (message.method.endsWith(\".exportConfig\")) {\n\t\treturn exportConfig();\n\t}\n\tif (message.method.endsWith(\".enableSync\")) {\n\t\tawait browser.storage.local.set({ sync: true });\n\t\tconst syncConfig = await browser.storage.sync.get();\n\t\tif (!syncConfig || !syncConfig.rules) {\n\t\t\tconst profileKeyNames = await getProfileKeyNames();\n\t\t\tconst localConfig = await browser.storage.local.get([\"rules\", \"maxParallelWorkers\", \"processInForeground\", ...profileKeyNames]);\n\t\t\tawait browser.storage.sync.set(localConfig);\n\t\t}\n\t\tconfigStorage = browser.storage.sync;\n\t\tawait upgrade();\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".disableSync\")) {\n\t\tawait browser.storage.local.set({ sync: false });\n\t\tconst syncConfig = await browser.storage.sync.get();\n\t\tconst localConfig = await browser.storage.local.get();\n\t\tif (syncConfig && syncConfig.rules && (!localConfig || !localConfig.rules)) {\n\t\t\tawait browser.storage.local.set({ rules: syncConfig.rules, maxParallelWorkers: syncConfig.maxParallelWorkers, processInForeground: syncConfig.processInForeground });\n\t\t\tconst profiles = {};\n\t\t\tawait browser.storage.local.set(profiles);\n\t\t}\n\t\tconfigStorage = browser.storage.local;\n\t\tawait upgrade();\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".isSync\")) {\n\t\treturn { sync: (await browser.storage.local.get()).sync };\n\t}\n\treturn {};\n}\n\nasync function createProfile(profileName, fromProfileName) {\n\tconst profileNames = await getProfileNames();\n\tif (profileNames.includes(profileName)) {\n\t\tthrow new Error(\"Duplicate profile name\");\n\t}\n\tconst profileFrom = await getProfile(fromProfileName);\n\tconst profile = JSON.parse(JSON.stringify(profileFrom));\n\tprofile.customShortcut = null;\n\tawait setProfile(profileName, profile);\n}\n\nasync function getProfiles() {\n\tawait pendingUpgradePromise;\n\tconst profileKeyNames = await getProfileKeyNames();\n\tconst profiles = await configStorage.get(profileKeyNames);\n\tconst result = {};\n\tObject.keys(profiles).forEach(profileName => result[profileName.substring(PROFILE_NAME_PREFIX.length)] = profiles[profileName]);\n\treturn result;\n}\n\nasync function getOptions(url, autoSave) {\n\tawait pendingUpgradePromise;\n\tconst [rule, allTabsData] = await Promise.all([getRule(url), tabsData.get()]);\n\tconst tabProfileName = allTabsData.profileName || DEFAULT_PROFILE_NAME;\n\tlet selectedProfileName;\n\tif (rule) {\n\t\tconst profileName = rule[autoSave ? \"autoSaveProfile\" : \"profile\"];\n\t\tselectedProfileName = profileName == CURRENT_PROFILE_NAME ? tabProfileName : profileName;\n\t} else {\n\t\tselectedProfileName = tabProfileName;\n\t}\n\tconst profile = await getProfile(selectedProfileName);\n\treturn Object.assign({ profileName: selectedProfileName }, profile);\n}\n\nasync function updateProfile(profileName, profile) {\n\tconst profileNames = await getProfileNames();\n\tif (!profileNames.includes(profileName)) {\n\t\tthrow new Error(\"Profile not found\");\n\t}\n\tconst previousProfile = await getProfile(profileName);\n\tObject.keys(previousProfile).forEach(key => {\n\t\tprofile[key] = profile[key] === undefined ? previousProfile[key] : profile[key];\n\t});\n\tawait setProfile(profileName, profile);\n}\n\nasync function renameProfile(oldProfileName, profileName) {\n\tconst profileNames = await getProfileNames();\n\tconst allTabsData = await tabsData.get();\n\tconst rules = await getRules();\n\tif (!profileNames.includes(oldProfileName)) {\n\t\tthrow new Error(\"Profile not found\");\n\t}\n\tif (profileNames.includes(profileName)) {\n\t\tthrow new Error(\"Duplicate profile name\");\n\t}\n\tif (oldProfileName == DEFAULT_PROFILE_NAME) {\n\t\tthrow new Error(\"Default settings cannot be renamed\");\n\t}\n\tif (allTabsData.profileName == oldProfileName) {\n\t\tallTabsData.profileName = profileName;\n\t\tawait tabsData.set(allTabsData);\n\t}\n\trules.forEach(rule => {\n\t\tif (rule.profile == oldProfileName) {\n\t\t\trule.profile = profileName;\n\t\t}\n\t\tif (rule.autoSaveProfile == oldProfileName) {\n\t\t\trule.autoSaveProfile = profileName;\n\t\t}\n\t});\n\tconst profile = await getProfile(oldProfileName);\n\tawait configStorage.remove([PROFILE_NAME_PREFIX + oldProfileName]);\n\tawait configStorage.set({ [PROFILE_NAME_PREFIX + profileName]: profile, rules });\n}\n\nasync function deleteProfile(profileName) {\n\tconst profileNames = await getProfileNames();\n\tconst allTabsData = await tabsData.get();\n\tconst rules = await getRules();\n\tif (!profileNames.includes(profileName)) {\n\t\tthrow new Error(\"Profile not found\");\n\t}\n\tif (profileName == DEFAULT_PROFILE_NAME) {\n\t\tthrow new Error(\"Default settings cannot be deleted\");\n\t}\n\tif (allTabsData.profileName == profileName) {\n\t\tdelete allTabsData.profileName;\n\t\tawait tabsData.set(allTabsData);\n\t}\n\trules.forEach(rule => {\n\t\tif (rule.profile == profileName) {\n\t\t\trule.profile = DEFAULT_PROFILE_NAME;\n\t\t}\n\t\tif (rule.autoSaveProfile == profileName) {\n\t\t\trule.autoSaveProfile = DEFAULT_PROFILE_NAME;\n\t\t}\n\t});\n\tconfigStorage.remove([PROFILE_NAME_PREFIX + profileName]);\n\tawait configStorage.set({ rules });\n}\n\nasync function getRules() {\n\treturn (await configStorage.get([\"rules\"])).rules;\n}\n\nasync function getProfileNames() {\n\treturn Object.keys(await configStorage.get()).filter(key => key.startsWith(PROFILE_NAME_PREFIX)).map(key => key.substring(PROFILE_NAME_PREFIX.length));\n}\n\nasync function getProfileKeyNames() {\n\treturn Object.keys(await configStorage.get()).filter(key => key.startsWith(PROFILE_NAME_PREFIX));\n}\n\nasync function getProfile(profileName) {\n\tconst profileKey = PROFILE_NAME_PREFIX + profileName;\n\tconst data = await configStorage.get([profileKey]);\n\treturn data[profileKey];\n}\n\nasync function setProfile(profileName, profileData) {\n\tconst profileKey = PROFILE_NAME_PREFIX + profileName;\n\tawait configStorage.set({ [profileKey]: profileData });\n}\n\nasync function addRule(url, profile, autoSaveProfile) {\n\tif (!url) {\n\t\tthrow new Error(\"URL is empty\");\n\t}\n\tconst rules = await getRules();\n\tif (rules.find(rule => rule.url == url)) {\n\t\tthrow new Error(\"URL already exists\");\n\t}\n\trules.push({\n\t\turl,\n\t\tprofile,\n\t\tautoSaveProfile\n\t});\n\tawait configStorage.set({ rules });\n}\n\nasync function deleteRule(url) {\n\tif (!url) {\n\t\tthrow new Error(\"URL is empty\");\n\t}\n\tconst rules = await getRules();\n\tawait configStorage.set({ rules: rules.filter(rule => rule.url != url) });\n}\n\nasync function deleteRules(profileName) {\n\tconst rules = await getRules();\n\tawait configStorage.set({ rules: profileName ? rules.filter(rule => rule.autoSaveProfile != profileName && rule.profile != profileName) : [] });\n}\n\nasync function updateRule(url, newURL, profile, autoSaveProfile) {\n\tif (!url || !newURL) {\n\t\tthrow new Error(\"URL is empty\");\n\t}\n\tconst rules = await getRules();\n\tconst urlConfig = rules.find(rule => rule.url == url);\n\tif (!urlConfig) {\n\t\tthrow new Error(\"URL not found\");\n\t}\n\tif (rules.find(rule => rule.url == newURL && rule.url != url)) {\n\t\tthrow new Error(\"New URL already exists\");\n\t}\n\turlConfig.url = newURL;\n\turlConfig.profile = profile;\n\turlConfig.autoSaveProfile = autoSaveProfile;\n\tawait configStorage.set({ rules });\n}\n\nasync function getAuthInfo() {\n\treturn (await configStorage.get()).authInfo;\n}\n\nasync function getDropboxAuthInfo() {\n\treturn (await configStorage.get()).dropboxAuthInfo;\n}\n\nasync function setAuthInfo(authInfo) {\n\tawait configStorage.set({ authInfo });\n}\n\nasync function setDropboxAuthInfo(authInfo) {\n\tawait configStorage.set({ dropboxAuthInfo: authInfo });\n}\n\nasync function removeAuthInfo() {\n\tlet authInfo = getAuthInfo();\n\tif (authInfo.revokableAccessToken) {\n\t\tsetAuthInfo({ revokableAccessToken: authInfo.revokableAccessToken });\n\t} else {\n\t\tawait configStorage.remove([\"authInfo\"]);\n\t}\n}\n\nasync function removeDropboxAuthInfo() {\n\tlet authInfo = getDropboxAuthInfo();\n\tif (authInfo.revokableAccessToken) {\n\t\tsetDropboxAuthInfo({ revokableAccessToken: authInfo.revokableAccessToken });\n\t} else {\n\t\tawait configStorage.remove([\"dropboxAuthInfo\"]);\n\t}\n}\n\nasync function resetProfiles() {\n\tawait pendingUpgradePromise;\n\tconst allTabsData = await tabsData.get();\n\tdelete allTabsData.profileName;\n\tawait tabsData.set(allTabsData);\n\tlet profileKeyNames = await getProfileKeyNames();\n\tawait configStorage.remove([...profileKeyNames, \"rules\", \"maxParallelWorkers\", \"processInForeground\"]);\n\tawait upgrade();\n}\n\nasync function resetProfile(profileName) {\n\tconst profileNames = await getProfileNames();\n\tif (!profileNames.includes(profileName)) {\n\t\tthrow new Error(\"Profile not found\");\n\t}\n\tawait setProfile(profileName, DEFAULT_CONFIG);\n}\n\nasync function exportConfig() {\n\tconst config = await getConfig();\n\tconst textContent = JSON.stringify({ profiles: config.profiles, rules: config.rules, maxParallelWorkers: config.maxParallelWorkers, processInForeground: config.processInForeground }, null, 2);\n\tconst filename = `singlefile-settings-${(new Date()).toISOString().replace(/:/g, \"_\")}.json`;\n\tconst url = \"data:text/json;base64,\" + btoa(unescape(encodeURIComponent(textContent)));\n\tconst downloadInfo = {\n\t\turl,\n\t\tfilename,\n\t\tsaveAs: true\n\t};\n\tawait download(downloadInfo, \"_\");\n}\n\nasync function importConfig(config) {\n\tconst profileNames = await getProfileNames();\n\tconst profileKeyNames = await getProfileKeyNames();\n\tconst allTabsData = await tabsData.get();\n\tif (profileNames.includes(allTabsData.profileName)) {\n\t\tdelete allTabsData.profileName;\n\t\tawait tabsData.set(allTabsData);\n\t}\n\tawait configStorage.remove([...profileKeyNames, \"rules\", \"maxParallelWorkers\", \"processInForeground\"]);\n\tconst newConfig = { rules: config.rules, maxParallelWorkers: config.maxParallelWorkers, processInForeground: config.processInForeground };\n\tObject.keys(config.profiles).forEach(profileName => newConfig[PROFILE_NAME_PREFIX + profileName] = config.profiles[profileName]);\n\tawait configStorage.set(newConfig);\n\tawait upgrade();\n}\n\nfunction isSameArray(arrayLeft, arrayRight) {\n\treturn arrayLeft.length == arrayRight.length && arrayLeft.every((value, index) => value == arrayRight[index]);\n}"
  },
  {
    "path": "src/core/bg/devtools.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nexport {\n\tonMessage\n};\n\nasync function onMessage(message) {\n\tif (message.method.endsWith(\".resourceCommitted\")) {\n\t\tif (message.tabId && message.url && (message.type == \"stylesheet\" || message.type == \"script\")) {\n\t\t\tawait browser.tabs.sendMessage(message.tabId, message);\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/core/bg/download-util.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nconst STATE_DOWNLOAD_COMPLETE = \"complete\";\nconst STATE_DOWNLOAD_INTERRUPTED = \"interrupted\";\nconst STATE_ERROR_CANCELED_CHROMIUM = \"USER_CANCELED\";\nconst ERROR_DOWNLOAD_CANCELED_GECKO = \"canceled\";\nconst ERROR_CONFLICT_ACTION_GECKO = \"conflictaction prompt not yet implemented\";\nconst ERROR_INCOGNITO_GECKO = \"'incognito'\";\nconst ERROR_INCOGNITO_GECKO_ALT = \"\\\"incognito\\\"\";\nconst ERROR_INVALID_FILENAME_GECKO = \"illegal characters\";\nconst ERROR_INVALID_FILENAME_CHROMIUM = \"invalid filename\";\n\nexport {\n\tdownload\n};\n\nasync function download(downloadInfo, replacementCharacter) {\n\tlet downloadId;\n\tconst result = new Promise((resolve, reject) => {\n\t\tbrowser.downloads.onChanged.addListener(onChanged);\n\n\t\tfunction onChanged(event) {\n\t\t\tif (event.id == downloadId && event.state) {\n\t\t\t\tif (event.state.current == STATE_DOWNLOAD_COMPLETE) {\n\t\t\t\t\tbrowser.downloads.search({ id: downloadId })\n\t\t\t\t\t\t.then(downloadItems => resolve({ filename: downloadItems[0] && downloadItems[0].filename }))\n\t\t\t\t\t\t.catch(() => resolve({}));\n\t\t\t\t\tbrowser.downloads.onChanged.removeListener(onChanged);\n\t\t\t\t}\n\t\t\t\tif (event.state.current == STATE_DOWNLOAD_INTERRUPTED) {\n\t\t\t\t\tif (event.error && event.error.current == STATE_ERROR_CANCELED_CHROMIUM) {\n\t\t\t\t\t\tresolve({ cancelled: true });\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject(new Error(event.state.current));\n\t\t\t\t\t}\n\t\t\t\t\tbrowser.downloads.onChanged.removeListener(onChanged);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\ttry {\n\t\tdownloadId = await browser.downloads.download(downloadInfo);\n\t} catch (error) {\n\t\tif (error.message) {\n\t\t\tconst errorMessage = error.message.toLowerCase();\n\t\t\tconst invalidFilename = errorMessage.includes(ERROR_INVALID_FILENAME_GECKO) || errorMessage.includes(ERROR_INVALID_FILENAME_CHROMIUM);\n\t\t\tif (invalidFilename && downloadInfo.filename.startsWith(\".\")) {\n\t\t\t\tdownloadInfo.filename = replacementCharacter + downloadInfo.filename;\n\t\t\t\treturn download(downloadInfo, replacementCharacter);\n\t\t\t} else if (invalidFilename && downloadInfo.filename.includes(\",\")) {\n\t\t\t\tdownloadInfo.filename = downloadInfo.filename.replace(/,/g, replacementCharacter);\n\t\t\t\treturn download(downloadInfo, replacementCharacter);\n\t\t\t} else if (invalidFilename && downloadInfo.filename.match(/\\u200C|\\u200D|\\u200E|\\u200F/)) {\n\t\t\t\tdownloadInfo.filename = downloadInfo.filename.replace(/\\u200C|\\u200D|\\u200E|\\u200F/g, replacementCharacter);\n\t\t\t\treturn download(downloadInfo, replacementCharacter);\n\t\t\t} else if (invalidFilename && !downloadInfo.filename.match(/^[\\x00-\\x7F]+$/)) { // eslint-disable-line  no-control-regex\n\t\t\t\tdownloadInfo.filename = downloadInfo.filename.replace(/[^\\x00-\\x7F]+/g, replacementCharacter); // eslint-disable-line  no-control-regex\n\t\t\t\treturn download(downloadInfo, replacementCharacter);\n\t\t\t} else if ((errorMessage.includes(ERROR_INCOGNITO_GECKO) || errorMessage.includes(ERROR_INCOGNITO_GECKO_ALT)) && downloadInfo.incognito) {\n\t\t\t\tdelete downloadInfo.incognito;\n\t\t\t\treturn download(downloadInfo, replacementCharacter);\n\t\t\t} else if (errorMessage == ERROR_CONFLICT_ACTION_GECKO && downloadInfo.conflictAction) {\n\t\t\t\tdelete downloadInfo.conflictAction;\n\t\t\t\treturn download(downloadInfo, replacementCharacter);\n\t\t\t} else if (errorMessage.includes(ERROR_DOWNLOAD_CANCELED_GECKO)) {\n\t\t\t\treturn { cancelled: true };\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t} else {\n\t\t\tthrow error;\n\t\t}\n\t}\n\treturn result;\n}"
  },
  {
    "path": "src/core/bg/downloads.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, fetch, Blob, TextEncoder */\n\nimport * as config from \"./config.js\";\nimport * as bookmarks from \"./bookmarks.js\";\nimport * as companion from \"./companion.js\";\nimport * as business from \"./business.js\";\nimport * as editor from \"./editor.js\";\nimport { launchWebAuthFlow, extractAuthCode } from \"./tabs-util.js\";\nimport * as ui from \"./../../ui/bg/index.js\";\nimport * as woleet from \"./../../lib/woleet/woleet.js\";\nimport { GDrive } from \"./../../lib/gdrive/gdrive.js\";\nimport { Dropbox } from \"./../../lib/dropbox/dropbox.js\";\nimport { WebDAV } from \"./../../lib/webdav/webdav.js\";\nimport { GitHub } from \"./../../lib/github/github.js\";\nimport { S3 } from \"./../../lib/s3/s3.js\";\nimport { MCP } from \"./../../lib/mcp/mcp.js\";\nimport { download } from \"./download-util.js\";\nimport * as yabson from \"./../../lib/yabson/yabson.js\";\nimport { RestFormApi } from \"../../lib/../lib/rest-form-api/index.js\";\nimport * as offscreen from \"./offscreen.js\";\n\nconst partialContents = new Map();\nconst tabData = new Map();\nconst SCOPES = [\"https://www.googleapis.com/auth/drive.file\"];\nconst CONFLICT_ACTION_SKIP = \"skip\";\nconst CONFLICT_ACTION_UNIQUIFY = \"uniquify\";\nconst REGEXP_ESCAPE = /([{}()^$&.*?/+|[\\\\\\\\]|\\]|-)/g;\nlet GDRIVE_CLIENT_ID = \"207618107333-h1220p1oasj3050kr5r416661adm091a.apps.googleusercontent.com\";\nlet GDRIVE_CLIENT_KEY = \"VQJ8Gq8Vxx72QyxPyeLtWvUt\";\nconst DROPBOX_CLIENT_ID = \"s50p6litdvuzrtb\";\nconst DROPBOX_CLIENT_KEY = \"i1vzwllesr14fzd\";\n\nconst gDriveOauth2 = browser.runtime.getManifest().oauth2;\nif (gDriveOauth2) {\n\tGDRIVE_CLIENT_ID = gDriveOauth2.client_id;\n\tGDRIVE_CLIENT_KEY = gDriveOauth2.client_secret;\n}\nconst gDrive = new GDrive(GDRIVE_CLIENT_ID, GDRIVE_CLIENT_KEY, SCOPES);\nconst dropbox = new Dropbox(DROPBOX_CLIENT_ID, DROPBOX_CLIENT_KEY);\n\nexport {\n\tonMessage,\n\tdownloadPage,\n\ttestSkipSave,\n\tsaveToGDrive,\n\tsaveToGitHub,\n\tsaveToDropbox,\n\tsaveWithWebDAV,\n\tsaveToRestFormApi,\n\tsaveToS3,\n\tsaveWithMCP,\n\tencodeSharpCharacter\n};\n\nasync function onMessage(message, sender) {\n\tif (message.method.endsWith(\".download\")) {\n\t\treturn downloadTabPage(message, sender.tab);\n\t}\n\tif (message.method.endsWith(\".disableGDrive\")) {\n\t\tconst authInfo = await config.getAuthInfo();\n\t\tconfig.removeAuthInfo();\n\t\tawait gDrive.revokeAuthToken(authInfo && (authInfo.accessToken || authInfo.revokableAccessToken));\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".disableDropbox\")) {\n\t\tconst authInfo = await config.getDropboxAuthInfo();\n\t\tconfig.removeDropboxAuthInfo();\n\t\tawait dropbox.revokeAuthToken(authInfo && (authInfo.accessToken || authInfo.revokableAccessToken));\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".end\")) {\n\t\tif (message.hash) {\n\t\t\ttry {\n\t\t\t\tawait woleet.anchor(message.hash, message.woleetKey);\n\t\t\t} catch (error) {\n\t\t\t\tui.onError(sender.tab.id, error.message, error.link);\n\t\t\t}\n\t\t}\n\t\tbusiness.onSaveEnd(message.taskId);\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".getInfo\")) {\n\t\treturn business.getTasksInfo();\n\t}\n\tif (message.method.endsWith(\".cancel\")) {\n\t\tif (message.taskId) {\n\t\t\tbusiness.cancelTask(message.taskId);\n\t\t} else {\n\t\t\tbusiness.cancel(sender.tab.id);\n\t\t}\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".cancelAll\")) {\n\t\tbusiness.cancelAllTasks();\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".saveUrls\")) {\n\t\tbusiness.saveUrls(message.urls);\n\t\treturn {};\n\t}\n}\n\nasync function downloadTabPage(message, tab) {\n\tconst tabId = tab.id;\n\tlet contents;\n\tif (message.blobURL) {\n\t\ttry {\n\t\t\tmessage.url = message.blobURL;\n\t\t\tif (message.compressContent) {\n\t\t\t\tmessage.pageData = await yabson.parse(new Uint8Array(await (await fetch(message.blobURL)).arrayBuffer()));\n\t\t\t\tawait downloadCompressedContent(message, tab);\n\t\t\t} else {\n\t\t\t\tmessage.content = await (await fetch(message.blobURL)).text();\n\t\t\t\tawait downloadContent(message, tab);\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\treturn { error: true };\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait offscreen.revokeObjectURL(message.blobURL);\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t} catch (error) {\n\t\t\t\t// ignored\n\t\t\t}\n\t\t}\n\t} else if (message.compressContent) {\n\t\tlet parser = tabData.get(tabId);\n\t\tif (!parser) {\n\t\t\tparser = yabson.getParser();\n\t\t\ttabData.set(tabId, parser);\n\t\t}\n\t\tif (message.data) {\n\t\t\tawait parser.next(new Uint8Array(message.data));\n\t\t} else {\n\t\t\ttabData.delete(tabId);\n\t\t\tconst result = await parser.next();\n\t\t\tconst message = result.value;\n\t\t\tawait downloadCompressedContent(message, tab);\n\t\t}\n\t} else {\n\t\tif (message.truncated) {\n\t\t\tcontents = partialContents.get(tabId);\n\t\t\tif (!contents) {\n\t\t\t\tcontents = [];\n\t\t\t\tpartialContents.set(tabId, contents);\n\t\t\t}\n\t\t\tcontents.push(message.content);\n\t\t\tif (message.finished) {\n\t\t\t\tpartialContents.delete(tabId);\n\t\t\t}\n\t\t} else if (message.content) {\n\t\t\tcontents = [message.content];\n\t\t}\n\t\tif (!message.truncated || message.finished) {\n\t\t\tmessage.content = contents.join(\"\");\n\t\t\ttry {\n\t\t\t\tmessage.url = await offscreen.getBlobURL(Array.from(new TextEncoder().encode(message.content)), message.mimeType);\n\t\t\t\tawait downloadContent(message, tab);\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tawait offscreen.revokeObjectURL(message.url);\n\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// ignored\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn {};\n}\n\nasync function downloadContent(message, tab) {\n\tconst tabId = tab.id;\n\ttry {\n\t\tlet skipped;\n\t\tif (message.backgroundSave && !message.saveToGDrive && !message.saveToDropbox && !message.saveWithWebDAV && !message.saveToGitHub && !message.saveToRestFormApi && !message.saveToS3) {\n\t\t\tconst testSkip = await testSkipSave(message.filename, message);\n\t\t\tmessage.filenameConflictAction = testSkip.filenameConflictAction;\n\t\t\tskipped = testSkip.skipped;\n\t\t}\n\t\tif (skipped) {\n\t\t\tui.onEnd(tabId);\n\t\t} else {\n\t\t\tconst prompt = filename => promptFilename(tabId, filename);\n\t\t\tlet response;\n\t\t\tif (message.openEditor) {\n\t\t\t\tui.onEdit(tabId);\n\t\t\t\tawait editor.open({ tabIndex: tab.index + 1, filename: message.filename, content: message.content, url: message.originalUrl });\n\t\t\t} else if (message.saveToClipboard) {\n\t\t\t\tawait offscreen.saveToClipboard(message.content, message.mimeType);\n\t\t\t} else if (message.saveWithWebDAV) {\n\t\t\t\tresponse = await saveWithWebDAV(message.taskId, encodeSharpCharacter(message.filename), message.content, message.webDAVURL, message.webDAVUser, message.webDAVPassword, { filenameConflictAction: message.filenameConflictAction, prompt });\n\t\t\t} else if (message.saveWithMCP) {\n\t\t\t\tresponse = await saveWithMCP(message.taskId, encodeSharpCharacter(message.filename), message.content, message.mcpServerUrl, message.mcpAuthToken, { filenameConflictAction: message.filenameConflictAction, prompt });\n\t\t\t} else if (message.saveToGDrive) {\n\t\t\t\tawait saveToGDrive(message.taskId, encodeSharpCharacter(message.filename), new Blob([message.content], { type: message.mimeType }), {\n\t\t\t\t\tforceWebAuthFlow: message.forceWebAuthFlow\n\t\t\t\t}, {\n\t\t\t\t\tonProgress: (offset, size) => ui.onUploadProgress(tabId, offset, size),\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tprompt\n\t\t\t\t});\n\t\t\t} else if (message.saveToDropbox) {\n\t\t\t\tawait saveToDropbox(message.taskId, encodeSharpCharacter(message.filename), new Blob([message.content], { type: message.mimeType }), {\n\t\t\t\t\tonProgress: (offset, size) => ui.onUploadProgress(tabId, offset, size),\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tprompt\n\t\t\t\t});\n\t\t\t} else if (message.saveToGitHub) {\n\t\t\t\tresponse = await saveToGitHub(message.taskId, encodeSharpCharacter(message.filename), message.content, message.githubToken, message.githubUser, message.githubRepository, message.githubBranch, {\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tprompt\n\t\t\t\t});\n\t\t\t\tawait response.pushPromise;\n\t\t\t} else if (message.saveWithCompanion) {\n\t\t\t\tawait companion.save({\n\t\t\t\t\tfilename: message.filename,\n\t\t\t\t\tcontent: message.content,\n\t\t\t\t\ttitle: message.title,\n\t\t\t\t\turl: message.originalUrl,\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction\n\t\t\t\t});\n\t\t\t} else if (message.saveToRestFormApi) {\n\t\t\t\tresponse = await saveToRestFormApi(\n\t\t\t\t\tmessage.taskId,\n\t\t\t\t\tmessage.filename,\n\t\t\t\t\tmessage.content,\n\t\t\t\t\ttab.url,\n\t\t\t\t\tmessage.saveToRestFormApiToken,\n\t\t\t\t\tmessage.saveToRestFormApiUrl,\n\t\t\t\t\tmessage.saveToRestFormApiFileFieldName,\n\t\t\t\t\tmessage.saveToRestFormApiUrlFieldName\n\t\t\t\t);\n\t\t\t} else if (message.saveToS3) {\n\t\t\t\tresponse = await saveToS3(message.taskId, encodeSharpCharacter(message.filename), new Blob([message.content], { type: message.mimeType }), message.S3Domain, message.S3Region, message.S3Bucket, message.S3AccessKey, message.S3SecretKey, {\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tprompt\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tresponse = await downloadPage(message, {\n\t\t\t\t\tconfirmFilename: message.confirmFilename,\n\t\t\t\t\tincognito: tab.incognito,\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tfilenameReplacementCharacter: message.filenameReplacementCharacter,\n\t\t\t\t\tbookmarkId: message.bookmarkId,\n\t\t\t\t\treplaceBookmarkURL: message.replaceBookmarkURL,\n\t\t\t\t\tincludeInfobar: message.includeInfobar,\n\t\t\t\t\topenInfobar: message.openInfobar,\n\t\t\t\t\tinfobarPositionAbsolute: message.infobarPositionAbsolute,\n\t\t\t\t\tinfobarPositionTop: message.infobarPositionTop,\n\t\t\t\t\tinfobarPositionBottom: message.infobarPositionBottom,\n\t\t\t\t\tinfobarPositionLeft: message.infobarPositionLeft,\n\t\t\t\t\tinfobarPositionRight: message.infobarPositionRight\n\t\t\t\t});\n\t\t\t\tif (!response) {\n\t\t\t\t\tthrow new Error(\"upload_cancelled\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (message.bookmarkId && message.replaceBookmarkURL && response && response.url) {\n\t\t\t\tawait bookmarks.update(message.bookmarkId, { url: response.url });\n\t\t\t}\n\t\t\tui.onEnd(tabId);\n\t\t\tif (message.openSavedPage && !message.openEditor) {\n\t\t\t\tconst createTabProperties = { active: true, url: \"/src/ui/pages/viewer.html?blobURI=\" + message.url };\n\t\t\t\tif (tab.index != null) {\n\t\t\t\t\tcreateTabProperties.index = tab.index + 1;\n\t\t\t\t}\n\t\t\t\tbrowser.tabs.create(createTabProperties);\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tif (!error.message || error.message != \"upload_cancelled\") {\n\t\t\tconsole.error(error); // eslint-disable-line no-console\n\t\t\tui.onError(tabId, error.message, error.link);\n\t\t}\n\t} finally {\n\t\tif (!message.openSavedPage && message.url) {\n\t\t\ttry {\n\t\t\t\tawait offscreen.revokeObjectURL(message.url);\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t} catch (error) {\n\t\t\t\t// ignored\n\t\t\t}\n\t\t}\n\t}\n}\n\nasync function downloadCompressedContent(message, tab) {\n\tconst tabId = tab.id;\n\tlet blobURI;\n\ttry {\n\t\tconst prompt = filename => promptFilename(tabId, filename);\n\t\tlet skipped, response;\n\t\tif (message.backgroundSave && !message.saveToGDrive && !message.saveToDropbox && !message.saveWithWebDAV && !message.saveWithMCP && !message.saveToGitHub && !message.saveToRestFormApi && !message.sharePage) {\n\t\t\tconst testSkip = await testSkipSave(message.filename, message);\n\t\t\tmessage.filenameConflictAction = testSkip.filenameConflictAction;\n\t\t\tskipped = testSkip.skipped;\n\t\t}\n\t\tif (skipped) {\n\t\t\tui.onEnd(tabId);\n\t\t} else {\n\t\t\tblobURI = await offscreen.compressPage(message.pageData, {\n\t\t\t\tinsertTextBody: message.insertTextBody,\n\t\t\t\turl: message.pageData.url || tab.url,\n\t\t\t\tcreateRootDirectory: message.createRootDirectory,\n\t\t\t\ttabId,\n\t\t\t\tselfExtractingArchive: message.selfExtractingArchive,\n\t\t\t\tdisableCompression: message.disableCompression,\n\t\t\t\textractDataFromPage: message.extractDataFromPage,\n\t\t\t\tpreventAppendedData: message.preventAppendedData,\n\t\t\t\tinsertCanonicalLink: message.insertCanonicalLink,\n\t\t\t\tinsertMetaNoIndex: message.insertMetaNoIndex,\n\t\t\t\tinsertMetaCSP: message.insertMetaCSP,\n\t\t\t\tpassword: message.password,\n\t\t\t\tembeddedImage: message.embeddedImage\n\t\t\t});\n\t\t\tif (message.openEditor) {\n\t\t\t\tui.onEdit(tabId);\n\t\t\t\tconst content = Array.from(new Uint8Array(await (await fetch(blobURI)).arrayBuffer()));\n\t\t\t\tawait editor.open({\n\t\t\t\t\ttabIndex: tab.index + 1,\n\t\t\t\t\tfilename: message.filename,\n\t\t\t\t\tcontent,\n\t\t\t\t\tcompressContent: message.compressContent,\n\t\t\t\t\tselfExtractingArchive: message.selfExtractingArchive,\n\t\t\t\t\tdisableCompression: message.disableCompression,\n\t\t\t\t\textractDataFromPage: message.extractDataFromPage,\n\t\t\t\t\tinsertTextBody: message.insertTextBody,\n\t\t\t\t\tinsertMetaCSP: message.insertMetaCSP,\n\t\t\t\t\tembeddedImage: message.embeddedImage,\n\t\t\t\t\turl: message.originalUrl\n\t\t\t\t});\n\t\t\t} else if (message.foregroundSave || message.sharePage) {\n\t\t\t\tconst blob = (await fetch(blobURI)).blob();\n\t\t\t\tawait downloadPageForeground(message.taskId, message.filename, blob, message.pageData.mimeType, tabId, {\n\t\t\t\t\tforegroundSave: message.foregroundSave,\n\t\t\t\t\tsharePage: message.sharePage\n\t\t\t\t});\n\t\t\t} else if (message.saveWithWebDAV) {\n\t\t\t\tconst blob = await (await fetch(blobURI)).blob();\n\t\t\t\tresponse = await saveWithWebDAV(message.taskId, encodeSharpCharacter(message.filename), blob, message.webDAVURL, message.webDAVUser, message.webDAVPassword, { filenameConflictAction: message.filenameConflictAction, prompt });\n\t\t\t} else if (message.saveWithMCP) {\n\t\t\t\tconst blob = await (await fetch(blobURI)).blob();\n\t\t\t\tresponse = await saveWithMCP(message.taskId, encodeSharpCharacter(message.filename), blob, message.mcpServerUrl, message.mcpAuthToken, { filenameConflictAction: message.filenameConflictAction, prompt });\n\t\t\t} else if (message.saveToGDrive) {\n\t\t\t\tconst blob = await (await fetch(blobURI)).blob();\n\t\t\t\tawait saveToGDrive(message.taskId, encodeSharpCharacter(message.filename), blob, {\n\t\t\t\t\tforceWebAuthFlow: message.forceWebAuthFlow\n\t\t\t\t}, {\n\t\t\t\t\tonProgress: (offset, size) => ui.onUploadProgress(tabId, offset, size),\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tprompt\n\t\t\t\t});\n\t\t\t} else if (message.saveToDropbox) {\n\t\t\t\tconst blob = await (await fetch(blobURI)).blob();\n\t\t\t\tawait saveToDropbox(message.taskId, encodeSharpCharacter(message.filename), blob, {\n\t\t\t\t\tonProgress: (offset, size) => ui.onUploadProgress(tabId, offset, size),\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tprompt\n\t\t\t\t});\n\t\t\t} else if (message.saveToGitHub) {\n\t\t\t\tconst blob = await (await fetch(blobURI)).blob();\n\t\t\t\tresponse = await saveToGitHub(message.taskId, encodeSharpCharacter(message.filename), blob, message.githubToken, message.githubUser, message.githubRepository, message.githubBranch, {\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tprompt\n\t\t\t\t});\n\t\t\t\tawait response.pushPromise;\n\t\t\t} else if (message.saveToRestFormApi) {\n\t\t\t\tconst blob = await (await fetch(blobURI)).blob();\n\t\t\t\tresponse = await saveToRestFormApi(\n\t\t\t\t\tmessage.taskId,\n\t\t\t\t\tmessage.filename,\n\t\t\t\t\tblob,\n\t\t\t\t\ttab.url,\n\t\t\t\t\tmessage.saveToRestFormApiToken,\n\t\t\t\t\tmessage.saveToRestFormApiUrl,\n\t\t\t\t\tmessage.saveToRestFormApiFileFieldName,\n\t\t\t\t\tmessage.saveToRestFormApiUrlFieldName\n\t\t\t\t);\n\t\t\t} else if (message.saveToS3) {\n\t\t\t\tconst blob = await (await fetch(blobURI)).blob();\n\t\t\t\tresponse = await saveToS3(message.taskId, encodeSharpCharacter(message.filename), blob, message.S3Domain, message.S3Region, message.S3Bucket, message.S3AccessKey, message.S3SecretKey, {\n\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\tprompt\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (message.backgroundSave) {\n\t\t\t\t\tmessage.url = blobURI;\n\t\t\t\t\tresponse = await downloadPage(message, {\n\t\t\t\t\t\tconfirmFilename: message.confirmFilename,\n\t\t\t\t\t\tincognito: tab.incognito,\n\t\t\t\t\t\tfilenameConflictAction: message.filenameConflictAction,\n\t\t\t\t\t\tfilenameReplacementCharacter: message.filenameReplacementCharacter,\n\t\t\t\t\t\tbookmarkId: message.bookmarkId,\n\t\t\t\t\t\treplaceBookmarkURL: message.replaceBookmarkURL,\n\t\t\t\t\t\tincludeInfobar: message.includeInfobar,\n\t\t\t\t\t\topenInfobar: message.openInfobar,\n\t\t\t\t\t\tinfobarPositionAbsolute: message.infobarPositionAbsolute,\n\t\t\t\t\t\tinfobarPositionTop: message.infobarPositionTop,\n\t\t\t\t\t\tinfobarPositionBottom: message.infobarPositionBottom,\n\t\t\t\t\t\tinfobarPositionLeft: message.infobarPositionLeft,\n\t\t\t\t\t\tinfobarPositionRight: message.infobarPositionRight\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst blob = await (await fetch(blobURI)).blob();\n\t\t\t\t\tawait downloadPageForeground(message.taskId, message.filename, blob, message.mimeType, tabId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (message.bookmarkId && message.replaceBookmarkURL && response && response.url) {\n\t\t\t\tawait bookmarks.update(message.bookmarkId, { url: response.url });\n\t\t\t}\n\t\t\tui.onEnd(tabId);\n\t\t\tif (message.openSavedPage && !message.openEditor) {\n\t\t\t\tconst createTabProperties = { active: true, url: \"/src/ui/pages/viewer.html?compressed&blobURI=\" + blobURI, windowId: tab.windowId };\n\t\t\t\tif (tab.index != null) {\n\t\t\t\t\tcreateTabProperties.index = tab.index + 1;\n\t\t\t\t}\n\t\t\t\tbrowser.tabs.create(createTabProperties);\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tif (!error.message || error.message != \"upload_cancelled\") {\n\t\t\tconsole.error(error); // eslint-disable-line no-console\n\t\t\tui.onError(tabId, error.message, error.link);\n\t\t}\n\t} finally {\n\t\tif (!message.openSavedPage && blobURI) {\n\t\t\ttry {\n\t\t\t\tawait offscreen.revokeObjectURL(blobURI);\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t} catch (error) {\n\t\t\t\t// ignored\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction encodeSharpCharacter(path) {\n\treturn path.replace(/#/g, \"%23\");\n}\n\nfunction getRegExp(string) {\n\treturn string.replace(REGEXP_ESCAPE, \"\\\\$1\");\n}\n\nasync function getAuthInfo(authOptions, force) {\n\tlet authInfo = await config.getAuthInfo();\n\tconst options = {\n\t\tinteractive: true,\n\t\tforceWebAuthFlow: authOptions.forceWebAuthFlow,\n\t\tlaunchWebAuthFlow: options => launchWebAuthFlow(options),\n\t\textractAuthCode: authURL => extractAuthCode(authURL)\n\t};\n\tgDrive.setAuthInfo(authInfo, options);\n\tif (!authInfo || !authInfo.accessToken || force) {\n\t\tauthInfo = await gDrive.auth(options);\n\t\tif (authInfo) {\n\t\t\tawait config.setAuthInfo(authInfo);\n\t\t} else {\n\t\t\tawait config.removeAuthInfo();\n\t\t}\n\t}\n\treturn authInfo;\n}\n\nasync function getDropboxAuthInfo(force) {\n\tlet authInfo = await config.getDropboxAuthInfo();\n\tconst options = {\n\t\tlaunchWebAuthFlow: options => launchWebAuthFlow(options),\n\t\textractAuthCode: authURL => extractAuthCode(authURL)\n\t};\n\tdropbox.setAuthInfo(authInfo);\n\tif (!authInfo || !authInfo.accessToken || force) {\n\t\tauthInfo = await dropbox.auth(options);\n\t\tif (authInfo) {\n\t\t\tawait config.setDropboxAuthInfo(authInfo);\n\t\t} else {\n\t\t\tawait config.removeDropboxAuthInfo();\n\t\t}\n\t}\n\treturn authInfo;\n}\n\nasync function saveToGitHub(taskId, filename, content, githubToken, githubUser, githubRepository, githubBranch, { filenameConflictAction, prompt }) {\n\ttry {\n\t\tconst taskInfo = business.getTaskInfo(taskId);\n\t\tif (!taskInfo || !taskInfo.cancelled) {\n\t\t\tconst client = new GitHub(githubToken, githubUser, githubRepository, githubBranch);\n\t\t\tbusiness.setCancelCallback(taskId, () => client.abort());\n\t\t\treturn await client.upload(filename, content, { filenameConflictAction, prompt });\n\t\t}\n\t} catch (error) {\n\t\tthrow new Error(error.message + \" (GitHub)\");\n\t}\n}\n\nasync function saveToS3(taskId, filename, blob, domain, region, bucket, accessKey, secretKey, { filenameConflictAction, prompt }) {\n\ttry {\n\t\tconst taskInfo = business.getTaskInfo(taskId);\n\t\tif (!taskInfo || !taskInfo.cancelled) {\n\t\t\tconst client = new S3(region, bucket, accessKey, secretKey, domain);\n\t\t\tbusiness.setCancelCallback(taskId, () => client.abort());\n\t\t\treturn await client.upload(filename, blob, { filenameConflictAction, prompt });\n\t\t}\n\t} catch (error) {\n\t\tthrow new Error(error.message + \" (S3)\");\n\t}\n}\n\nasync function saveWithWebDAV(taskId, filename, content, url, username, password, { filenameConflictAction, prompt }) {\n\ttry {\n\t\tconst taskInfo = business.getTaskInfo(taskId);\n\t\tif (!taskInfo || !taskInfo.cancelled) {\n\t\t\tconst client = new WebDAV(url, username, password);\n\t\t\tbusiness.setCancelCallback(taskId, () => client.abort());\n\t\t\treturn await client.upload(filename, content, { filenameConflictAction, prompt });\n\t\t}\n\t} catch (error) {\n\t\tthrow new Error(error.message + \" (WebDAV)\");\n\t}\n}\n\nasync function saveWithMCP(taskId, filename, content, serverUrl, authToken, { filenameConflictAction, prompt }) {\n\ttry {\n\t\tconst taskInfo = business.getTaskInfo(taskId);\n\t\tif (!taskInfo || !taskInfo.cancelled) {\n\t\t\tconst client = new MCP(serverUrl, authToken);\n\t\t\tbusiness.setCancelCallback(taskId, () => client.abort());\n\t\t\treturn await client.upload(filename, content, { filenameConflictAction, prompt });\n\t\t}\n\t} catch (error) {\n\t\tthrow new Error(error.message + \" (MCP)\");\n\t}\n}\n\nasync function saveToGDrive(taskId, filename, blob, authOptions, uploadOptions) {\n\ttry {\n\t\tawait getAuthInfo(authOptions);\n\t\tconst taskInfo = business.getTaskInfo(taskId);\n\t\tif (!taskInfo || !taskInfo.cancelled) {\n\t\t\treturn await gDrive.upload(filename, blob, uploadOptions, callback => business.setCancelCallback(taskId, callback));\n\t\t}\n\t}\n\tcatch (error) {\n\t\tif (error.message == \"invalid_token\") {\n\t\t\tlet authInfo;\n\t\t\ttry {\n\t\t\t\tauthInfo = await gDrive.refreshAuthToken();\n\t\t\t} catch (error) {\n\t\t\t\tif (error.message == \"unknown_token\") {\n\t\t\t\t\tauthInfo = await getAuthInfo(authOptions, true);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(error.message + \" (Google Drive)\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (authInfo) {\n\t\t\t\tawait config.setAuthInfo(authInfo);\n\t\t\t} else {\n\t\t\t\tawait config.removeAuthInfo();\n\t\t\t}\n\t\t\treturn await saveToGDrive(taskId, filename, blob, authOptions, uploadOptions);\n\t\t} else {\n\t\t\tthrow new Error(error.message + \" (Google Drive)\");\n\t\t}\n\t}\n}\n\nasync function saveToDropbox(taskId, filename, blob, uploadOptions) {\n\ttry {\n\t\tawait getDropboxAuthInfo();\n\t\tconst taskInfo = business.getTaskInfo(taskId);\n\t\tif (!taskInfo || !taskInfo.cancelled) {\n\t\t\treturn await dropbox.upload(filename, blob, uploadOptions, callback => business.setCancelCallback(taskId, callback));\n\t\t}\n\t}\n\tcatch (error) {\n\t\tif (error.message == \"invalid_token\") {\n\t\t\tlet authInfo;\n\t\t\ttry {\n\t\t\t\tauthInfo = await dropbox.refreshAuthToken();\n\t\t\t} catch (error) {\n\t\t\t\tif (error.message == \"unknown_token\") {\n\t\t\t\t\tauthInfo = await getDropboxAuthInfo(true);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(error.message + \" (Dropbox)\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (authInfo) {\n\t\t\t\tawait config.setDropboxAuthInfo(authInfo);\n\t\t\t} else {\n\t\t\t\tawait config.removeDropboxAuthInfo();\n\t\t\t}\n\t\t\treturn await saveToDropbox(taskId, filename, blob, uploadOptions);\n\t\t} else {\n\t\t\tthrow new Error(error.message + \" (Dropbox)\");\n\t\t}\n\t}\n}\n\nasync function testSkipSave(filename, options) {\n\tlet skipped, filenameConflictAction = options.filenameConflictAction;\n\tif (filenameConflictAction == CONFLICT_ACTION_SKIP) {\n\t\tconst downloadItems = await browser.downloads.search({\n\t\t\tfilenameRegex: \"(\\\\\\\\|/)\" + getRegExp(filename) + \"$\",\n\t\t\texists: true\n\t\t});\n\t\tif (downloadItems.length) {\n\t\t\tskipped = true;\n\t\t} else {\n\t\t\tfilenameConflictAction = CONFLICT_ACTION_UNIQUIFY;\n\t\t}\n\t}\n\treturn { skipped, filenameConflictAction };\n}\n\nfunction promptFilename(tabId, filename) {\n\treturn browser.tabs.sendMessage(tabId, { method: \"content.prompt\", message: \"Filename conflict, please enter a new filename\", value: filename });\n}\n\nasync function downloadPage(pageData, options) {\n\tconst downloadInfo = {\n\t\turl: pageData.url,\n\t\tsaveAs: options.confirmFilename,\n\t\tfilename: pageData.filename,\n\t\tconflictAction: options.filenameConflictAction\n\t};\n\tif (options.incognito) {\n\t\tdownloadInfo.incognito = true;\n\t}\n\tconst downloadData = await download(downloadInfo, options.filenameReplacementCharacter);\n\tif (downloadData.filename) {\n\t\tlet url = downloadData.filename;\n\t\tif (!url.startsWith(\"file:\")) {\n\t\t\tif (url.startsWith(\"/\")) {\n\t\t\t\turl = url.substring(1);\n\t\t\t}\n\t\t\turl = \"file:///\" + encodeSharpCharacter(url);\n\t\t}\n\t\treturn { url };\n\t}\n}\n\nasync function saveToRestFormApi(taskId, filename, content, url, token, restApiUrl, fileFieldName, urlFieldName) {\n\ttry {\n\t\tconst taskInfo = business.getTaskInfo(taskId);\n\t\tif (!taskInfo || !taskInfo.cancelled) {\n\t\t\tconst client = new RestFormApi(token, restApiUrl, fileFieldName, urlFieldName);\n\t\t\tbusiness.setCancelCallback(taskId, () => client.abort());\n\t\t\treturn await client.upload(filename, content, url);\n\t\t}\n\t} catch (error) {\n\t\tthrow new Error(error.message + \" (RestFormApi)\");\n\t}\n}\n\nasync function downloadPageForeground(taskId, filename, content, mimeType, tabId, { foregroundSave, sharePage } = {}) {\n\tconst serializer = yabson.getSerializer({\n\t\tfilename,\n\t\ttaskId,\n\t\tforegroundSave,\n\t\tsharePage,\n\t\tcontent: await content.arrayBuffer(),\n\t\tmimeType\n\t});\n\tfor await (const data of serializer) {\n\t\tawait browser.tabs.sendMessage(tabId, {\n\t\t\tmethod: \"content.download\",\n\t\t\tdata: Array.from(data)\n\t\t});\n\t}\n\treturn browser.tabs.sendMessage(tabId, { method: \"content.download\" });\n}"
  },
  {
    "path": "src/core/bg/editor.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nimport * as config from \"./config.js\";\n\nconst MAX_CONTENT_SIZE = 32 * (1024 * 1024);\nconst EDITOR_PAGE_URL = \"/src/ui/pages/editor.html\";\nconst tabsData = new Map();\nconst partialContents = new Map();\nconst EDITOR_URL = browser.runtime.getURL(EDITOR_PAGE_URL);\n\nexport {\n\tonMessage,\n\tonTabRemoved,\n\tisEditor,\n\topen,\n\tEDITOR_URL\n};\n\nasync function open({ tabIndex, content, filename, compressContent, selfExtractingArchive, disableCompression, extractDataFromPage, insertTextBody, insertMetaCSP, embeddedImage, url }) {\n\tconst createTabProperties = { active: true, url: EDITOR_PAGE_URL };\n\tif (tabIndex != null) {\n\t\tcreateTabProperties.index = tabIndex;\n\t}\n\tconst tab = await browser.tabs.create(createTabProperties);\n\ttabsData.set(tab.id, {\n\t\turl,\n\t\tcontent,\n\t\tfilename,\n\t\tcompressContent,\n\t\tselfExtractingArchive,\n\t\tdisableCompression,\n\t\textractDataFromPage,\n\t\tinsertTextBody,\n\t\tinsertMetaCSP,\n\t\tembeddedImage\n\t});\n}\n\nfunction onTabRemoved(tabId) {\n\ttabsData.delete(tabId);\n}\n\nfunction isEditor(tab) {\n\treturn tab.url == EDITOR_URL;\n}\n\nasync function onMessage(message, sender) {\n\tif (message.method.endsWith(\".getTabData\")) {\n\t\tconst tab = sender.tab;\n\t\tconst tabData = tabsData.get(tab.id);\n\t\tif (tabData) {\n\t\t\tconst options = await config.getOptions(tabData.url);\n\t\t\tconst content = JSON.stringify(tabData);\n\t\t\tfor (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < content.length; blockIndex++) {\n\t\t\t\tconst message = {\n\t\t\t\t\tmethod: \"editor.setTabData\",\n\t\t\t\t\tcompressContent: tabData.compressContent,\n\t\t\t\t\ttabId: tab.id,\n\t\t\t\t\turl: tabData.url\n\t\t\t\t};\n\t\t\t\tmessage.truncated = content.length > MAX_CONTENT_SIZE;\n\t\t\t\tif (message.truncated) {\n\t\t\t\t\tmessage.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > content.length;\n\t\t\t\t\tmessage.content = content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);\n\t\t\t\t\tif (message.finished) {\n\t\t\t\t\t\tmessage.options = options;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmessage.content = content;\n\t\t\t\t\toptions.embeddedImage = tabData.embeddedImage;\n\t\t\t\t\tmessage.options = options;\n\t\t\t\t}\n\t\t\t\tawait browser.tabs.sendMessage(tab.id, message);\n\t\t\t}\n\t\t} else {\n\t\t\tconst message = {\n\t\t\t\tmethod: \"editor.setTabData\",\n\t\t\t\ttabId: tab.id\n\t\t\t};\n\t\t\tawait browser.tabs.sendMessage(tab.id, message);\n\t\t}\n\t\treturn {};\n\t}\n\tif (message.method.endsWith(\".open\")) {\n\t\tlet contents;\n\t\tconst tab = sender.tab;\n\t\tif (message.truncated) {\n\t\t\tcontents = partialContents.get(tab.id);\n\t\t\tif (!contents) {\n\t\t\t\tcontents = [];\n\t\t\t\tpartialContents.set(tab.id, contents);\n\t\t\t}\n\t\t\tcontents.push(message.content);\n\t\t\tif (message.finished) {\n\t\t\t\tpartialContents.delete(tab.id);\n\t\t\t}\n\t\t} else if (message.content) {\n\t\t\tcontents = [message.content];\n\t\t}\n\t\tif (!message.truncated || message.finished) {\n\t\t\tconst updateTabProperties = { url: EDITOR_PAGE_URL };\n\t\t\tawait browser.tabs.update(tab.id, updateTabProperties);\n\t\t\tconst content = message.compressContent ? contents.flat() : contents.join(\"\");\n\t\t\ttabsData.set(tab.id, {\n\t\t\t\turl: tab.url,\n\t\t\t\tcontent,\n\t\t\t\tfilename: message.filename,\n\t\t\t\tcompressContent: message.compressContent,\n\t\t\t\tselfExtractingArchive: message.selfExtractingArchive,\n\t\t\t\tdisableCompression: message.disableCompression,\n\t\t\t\textractDataFromPageTags: message.extractDataFromPageTags,\n\t\t\t\tinsertTextBody: message.insertTextBody,\n\t\t\t\tinsertMetaCSP: message.insertMetaCSP,\n\t\t\t\tembeddedImage: message.embeddedImage\n\t\t\t});\n\t\t}\n\t\treturn {};\n\t}\n}"
  },
  {
    "path": "src/core/bg/external-messages.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n *\n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or\n *   modify it under the terms of the GNU Affero General Public License\n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n *\n *   The code in this file is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may\n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU\n *   AGPL normally required by section 4, provided you include this license\n *   notice and a URL through which recipients can access the Corresponding\n *   Source.\n */\n\n/* global browser */\n\nimport * as autosave from \"./autosave.js\";\nimport * as business from \"./business.js\";\nimport \"./../../lib/single-file/background.js\";\n\nconst ACTION_SAVE_PAGE = \"save-page\";\nconst ACTION_EDIT_AND_SAVE_PAGE = \"edit-and-save-page\";\nconst ACTION_SAVE_SELECTED_LINKS = \"save-selected-links\";\nconst ACTION_SAVE_SELECTED = \"save-selected-content\";\nconst ACTION_SAVE_SELECTED_TABS = \"save-selected-tabs\";\nconst ACTION_SAVE_UNPINNED_TABS = \"save-unpinned-tabs\";\nconst ACTION_SAVE_ALL_TABS = \"save-all-tabs\";\n\nexport { onMessage };\n\nasync function onMessage(message, sender) {\n\tif (message == ACTION_SAVE_PAGE) {\n\t\tconst tabs = await browser.tabs.query({ currentWindow: true, active: true });\n\t\ttabs.length = 1;\n\t\tawait business.saveTabs(tabs);\n\t} else if (message == ACTION_EDIT_AND_SAVE_PAGE) {\n\t\tconst tabs = await browser.tabs.query({ currentWindow: true, active: true });\n\t\ttabs.length = 1;\n\t\tawait business.saveTabs(tabs, { openEditor: true });\n\t} else if (message == ACTION_SAVE_SELECTED_LINKS) {\n\t\tconst tabs = await browser.tabs.query({ currentWindow: true, active: true });\n\t\tawait business.saveSelectedLinks(tabs[0]);\n\t} else if (message == ACTION_SAVE_SELECTED) {\n\t\tconst tabs = await browser.tabs.query({ currentWindow: true, active: true });\n\t\tawait business.saveTabs(tabs, { selected: true });\n\t} else if (message == ACTION_SAVE_SELECTED_TABS) {\n\t\tconst tabs = await queryTabs({ currentWindow: true, highlighted: true });\n\t\tawait business.saveTabs(tabs);\n\t} else if (message == ACTION_SAVE_UNPINNED_TABS) {\n\t\tconst tabs = await queryTabs({ currentWindow: true, pinned: false });\n\t\tawait business.saveTabs(tabs);\n\t} else if (message == ACTION_SAVE_ALL_TABS) {\n\t\tconst tabs = await queryTabs({ currentWindow: true });\n\t\tawait business.saveTabs(tabs);\n\t} else if (message.method) {\n\t\tconst tabs = await browser.tabs.query({ currentWindow: true, active: true });\n\t\tconst currentTab = tabs[0];\n\t\tif (currentTab) {\n\t\t\treturn autosave.onMessageExternal(message, currentTab, sender);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n}\n\nasync function queryTabs(options) {\n\tconst tabs = await browser.tabs.query(options);\n\treturn tabs.sort((tab1, tab2) => tab1.index - tab2.index);\n}\n"
  },
  {
    "path": "src/core/bg/index.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nimport \"./sw-reload-hack.js\";\nimport \"./../../../lib/chrome-browser-polyfill.js\";\nimport \"./../../lib/single-file/background.js\";\nimport * as config from \"./config.js\";\nimport * as bootstrap from \"./bootstrap.js\";\nimport * as autosave from \"./autosave.js\";\nimport * as bookmarks from \"./bookmarks.js\";\nimport * as companion from \"./companion.js\";\nimport * as devtools from \"./devtools.js\";\nimport * as downloads from \"./downloads.js\";\nimport * as editor from \"./editor.js\";\nimport * as tabsData from \"./tabs-data.js\";\nimport * as tabs from \"./tabs.js\";\nimport * as externalMesssages from \"./external-messages.js\";\nimport * as ui from \"./../../ui/bg/index.js\";\n\nbrowser.runtime.onMessage.addListener((message, sender) => {\n\tif (message.method.startsWith(\"tabs.\")) {\n\t\treturn tabs.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"downloads.\")) {\n\t\treturn downloads.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"autosave.\")) {\n\t\treturn autosave.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"ui.\")) {\n\t\treturn ui.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"config.\")) {\n\t\treturn config.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"tabsData.\")) {\n\t\treturn tabsData.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"devtools.\")) {\n\t\treturn devtools.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"editor.\")) {\n\t\treturn editor.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"bookmarks.\")) {\n\t\treturn bookmarks.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"companion.\")) {\n\t\treturn companion.onMessage(message, sender);\n\t}\n\tif (message.method.startsWith(\"bootstrap.\")) {\n\t\treturn bootstrap.onMessage(message, sender);\n\t}\n\tif (message.method == \"ping\") {\n\t\treturn Promise.resolve({});\n\t}\n});\n\nif (browser.runtime.onMessageExternal) {\n\tbrowser.runtime.onMessageExternal.addListener(externalMesssages.onMessage);\n}"
  },
  {
    "path": "src/core/bg/offscreen-document.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, Blob, URL, XMLHttpRequest, Image, document, TextDecoder */\n\nimport \"./../../../lib/chrome-browser-polyfill.js\";\nimport * as yabson from \"./../../lib/yabson/yabson.js\";\n\nconst singlefile = globalThis.singlefile;\nconst parsers = new Map(), pendingData = new Map();\n\nbrowser.runtime.onMessage.addListener(async ({ method, truncated, finished, requestId, url, data, mimeType, options, width, height, tabId }) => {\n\tif (method == \"processPage\") {\n\t\tconst result = await singlefile.getPageData(options, { fetch }, null, null);\n\t\tconst blob = new Blob([typeof result.content == \"string\" ? result.content : new Uint8Array(result.content)], { type: result.mimeType });\n\t\treturn {\n\t\t\turl: URL.createObjectURL(blob),\n\t\t\tarchiveTime: result.archiveTime,\n\t\t\tdoctype: result.doctype,\n\t\t\tfilename: result.filename,\n\t\t\ttitle: result.title\n\t\t};\n\t}\n\tif (method == \"compressPage\") {\n\t\tlet parser = parsers.get(tabId);\n\t\tif (!parser) {\n\t\t\tparser = yabson.getParser();\n\t\t\tparsers.set(tabId, parser);\n\t\t}\n\t\tif (data) {\n\t\t\tawait parser.next(new Uint8Array(data));\n\t\t\treturn {};\n\t\t} else {\n\t\t\tconst result = await parser.next();\n\t\t\tparsers.delete(tabId);\n\t\t\tconst pageData = result.value;\n\t\t\tconst blob = await singlefile.processors.compression.process(pageData, options);\n\t\t\treturn URL.createObjectURL(blob);\n\t\t}\n\t}\n\tif (method == \"getBlobURL\") {\n\t\tconst options = {};\n\t\tif (mimeType) {\n\t\t\toptions.type = mimeType;\n\t\t}\n\t\tconst dataArray = handleDataRequest({ requestId, truncated, finished, data });\n\t\tif (dataArray) {\n\t\t\treturn URL.createObjectURL(new Blob(dataArray, options));\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\tif (method == \"revokeObjectURL\") {\n\t\tURL.revokeObjectURL(url);\n\t\treturn {};\n\t}\n\tif (method == \"getImageData\") {\n\t\tconst image = new Image();\n\t\tawait new Promise((resolve, reject) => {\n\t\t\timage.onload = resolve;\n\t\t\timage.onerror = event => reject(new Error(event.detail));\n\t\t\timage.src = url;\n\t\t});\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\t\tconst context = canvas.getContext(\"2d\");\n\t\tcontext.drawImage(image, 0, 0, width, height);\n\t\tconst { data } = await context.getImageData(0, 0, width, height);\n\t\treturn {\n\t\t\turl: URL.createObjectURL(new Blob([data]))\n\t\t};\n\t}\n\tif (method == \"saveToClipboard\") {\n\t\tconst dataArray = handleDataRequest({ requestId, truncated, finished, data });\n\t\tif (dataArray) {\n\t\t\tconst data = new Uint8Array(dataArray.map(data => data.length).reduce((total, length) => total + length));\n\t\t\tfor (let i = 0, offset = 0; i < dataArray.length; i++) {\n\t\t\t\tdata.set(dataArray[i], offset);\n\t\t\t\toffset += dataArray[i].length;\n\t\t\t}\n\t\t\tsaveToClipboard({ content: new TextDecoder().decode(data), mimeType });\n\t\t}\n\t\treturn {};\n\t}\n});\n\nfunction saveToClipboard(pageData) {\n\tconst command = \"copy\";\n\tdocument.addEventListener(command, listener);\n\tdocument.execCommand(command);\n\tdocument.removeEventListener(command, listener);\n\n\tfunction listener(event) {\n\t\tevent.clipboardData.setData(pageData.mimeType, pageData.content);\n\t\tevent.clipboardData.setData(\"text/plain\", pageData.content);\n\t\tevent.preventDefault();\n\t}\n}\n\nfunction fetch(url, options = {}) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst xhrRequest = new XMLHttpRequest();\n\t\txhrRequest.withCredentials = true;\n\t\txhrRequest.responseType = \"arraybuffer\";\n\t\txhrRequest.onerror = event => reject(new Error(event.detail));\n\t\txhrRequest.onreadystatechange = () => {\n\t\t\tif (xhrRequest.readyState == XMLHttpRequest.DONE) {\n\t\t\t\tresolve({\n\t\t\t\t\tstatus: xhrRequest.status,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tget: name => xhrRequest.getResponseHeader(name)\n\t\t\t\t\t},\n\t\t\t\t\tarrayBuffer: async () => xhrRequest.response\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\txhrRequest.open(\"GET\", url, true);\n\t\tif (options.headers) {\n\t\t\tfor (const entry of Object.entries(options.headers)) {\n\t\t\t\txhrRequest.setRequestHeader(entry[0], entry[1]);\n\t\t\t}\n\t\t}\n\t\txhrRequest.send();\n\t});\n}\n\nfunction handleDataRequest({ requestId, truncated, finished, data }) {\n\tlet dataArray;\n\tif (truncated) {\n\t\tdataArray = pendingData.get(requestId);\n\t\tif (!dataArray) {\n\t\t\tdataArray = [];\n\t\t\tpendingData.set(requestId, dataArray);\n\t\t}\n\t\tdataArray.push(new Uint8Array(data));\n\t\tif (finished) {\n\t\t\tpendingData.delete(requestId);\n\t\t}\n\t} else if (data) {\n\t\tdataArray = [new Uint8Array(data)];\n\t}\n\tif (!truncated || finished) {\n\t\treturn dataArray;\n\t}\n}"
  },
  {
    "path": "src/core/bg/offscreen.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, TextEncoder */\n\nimport * as yabson from \"./../../lib/yabson/yabson.js\";\n\nconst OFFSCREEN_DOCUMENT_URL = \"/src/ui/pages/offscreen-document.html\";\nconst MAX_CONTENT_SIZE = 16 * (1024 * 1024);\n\nlet creating, requestId = 0;\n\nexport {\n\tcompressPage,\n\tprocessPage,\n\tgetBlobURL,\n\trevokeObjectURL,\n\tgetImageData,\n\tsaveToClipboard\n};\n\nasync function compressPage(pageData, options) {\n\tawait createOffscreenDocument();\n\tconst serializer = yabson.getSerializer(pageData);\n\tfor await (const chunk of serializer) {\n\t\tawait browser.runtime.sendMessage({\n\t\t\tmethod: \"compressPage\",\n\t\t\ttabId: options.tabId,\n\t\t\tdata: Array.from(chunk)\n\t\t});\n\t}\n\treturn browser.runtime.sendMessage({\n\t\tmethod: \"compressPage\",\n\t\ttabId: options.tabId,\n\t\toptions\n\t});\n}\n\nasync function processPage(options) {\n\tawait createOffscreenDocument();\n\treturn browser.runtime.sendMessage({ method: \"processPage\", options });\n}\n\nasync function revokeObjectURL(url) {\n\tawait createOffscreenDocument();\n\treturn browser.runtime.sendMessage({ method: \"revokeObjectURL\", url });\n}\n\nasync function getBlobURL(data, mimeType) {\n\tawait createOffscreenDocument();\n\treturn sendMessageData({ method: \"getBlobURL\", mimeType, requestId }, data);\n}\n\nasync function getImageData(url, width, height) {\n\tawait createOffscreenDocument();\n\treturn browser.runtime.sendMessage({ method: \"getImageData\", url, width, height });\n}\n\nasync function saveToClipboard(content, mimeType) {\n\tawait createOffscreenDocument();\n\treturn sendMessageData({ method: \"saveToClipboard\", mimeType, requestId }, Array.from(new TextEncoder().encode(content)));\n}\n\nasync function createOffscreenDocument() {\n\tconst offscreenUrl = browser.runtime.getURL(OFFSCREEN_DOCUMENT_URL);\n\tconst existingContexts = await browser.runtime.getContexts({\n\t\tcontextTypes: [\"OFFSCREEN_DOCUMENT\"],\n\t\tdocumentUrls: [offscreenUrl]\n\t});\n\tif (existingContexts.length > 0) {\n\t\treturn;\n\t}\n\n\tif (creating) {\n\t\tawait creating;\n\t} else {\n\t\tcreating = await browser.offscreen.createDocument({ url: OFFSCREEN_DOCUMENT_URL, justification: \"Auto-save/Compression features\", reasons: [\"DOM_PARSER\", \"WORKERS\", \"CLIPBOARD\", \"BLOBS\"] });\n\t\tcreating = null;\n\t}\n}\n\nasync function sendMessageData(message, data) {\n\tlet result;\n\trequestId++;\n\tfor (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < data.length; blockIndex++) {\n\t\tmessage.truncated = data.length > MAX_CONTENT_SIZE;\n\t\tif (message.truncated) {\n\t\t\tmessage.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > data.length;\n\t\t\tmessage.data = data.slice(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);\n\t\t} else {\n\t\t\tmessage.data = data;\n\t\t}\n\t\tresult = await browser.runtime.sendMessage(message);\n\t}\n\treturn result;\n}"
  },
  {
    "path": "src/core/bg/page-orphan-hack.js",
    "content": "/* global navigator, location */\n\n// see https://groups.google.com/a/chromium.org/g/chromium-extensions/c/ld3n-rTmj54\n\nnavigator.serviceWorker.oncontrollerchange = () => location.reload(); // might need setTimeout"
  },
  {
    "path": "src/core/bg/sw-reload-hack.js",
    "content": "/* global self, skipWaiting, clients */\n\n// See https://issues.chromium.org/issues/40805401\n\nself.oninstall = () => skipWaiting();\nself.onactivate = () => clients.claim();"
  },
  {
    "path": "src/core/bg/tabs-data.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, setTimeout */\n\nlet persistentData, temporaryData, cleanedUp;\nsetTimeout(() => getPersistent().then(tabsData => persistentData = tabsData), 0);\nexport {\n\tonMessage,\n\tgetTemporary,\n\tgetPersistent as get,\n\tsetPersistent as set,\n\tonTabReplaced,\n\tremove\n};\n\nfunction onMessage(message) {\n\tif (message.method.endsWith(\".get\")) {\n\t\treturn getPersistent();\n\t}\n\tif (message.method.endsWith(\".set\")) {\n\t\treturn setPersistent(message.tabsData);\n\t}\n}\n\nasync function onTabReplaced(addedTabId, removedTabId) {\n\tlet tabsData = await getPersistent();\n\tawait updateTabsData(tabsData, addedTabId, removedTabId);\n\tsetPersistent(tabsData);\n\tawait updateTabsData(temporaryData, addedTabId, removedTabId);\n}\n\nasync function updateTabsData(tabsData, addedTabId, removedTabId) {\n\tif (tabsData[removedTabId] && !tabsData[addedTabId]) {\n\t\ttabsData[addedTabId] = tabsData[removedTabId];\n\t\tdelete tabsData[removedTabId];\n\t}\n}\n\nasync function remove(tabId) {\n\tif (temporaryData) {\n\t\tdelete temporaryData[tabId];\n\t}\n\tconst tabsData = await getPersistent();\n\tif (tabsData[tabId]) {\n\t\tconst autoSave = tabsData[tabId].autoSave;\n\t\ttabsData[tabId] = { autoSave };\n\t\tawait setPersistent(tabsData);\n\t}\n}\n\nfunction getTemporary(desiredTabId) {\n\tif (!temporaryData) {\n\t\ttemporaryData = {};\n\t}\n\tif (desiredTabId !== undefined && !temporaryData[desiredTabId]) {\n\t\ttemporaryData[desiredTabId] = {};\n\t}\n\treturn temporaryData;\n}\n\nasync function getPersistent(desiredTabId) {\n\tif (!persistentData) {\n\t\tconst config = await browser.storage.local.get();\n\t\tpersistentData = config.tabsData || {};\n\t}\n\tcleanup();\n\tif (desiredTabId !== undefined && !persistentData[desiredTabId]) {\n\t\tpersistentData[desiredTabId] = {};\n\t}\n\treturn persistentData;\n}\n\nasync function setPersistent(tabsData) {\n\tpersistentData = tabsData;\n\tawait browser.storage.local.set({ tabsData });\n}\n\nasync function cleanup() {\n\tif (!cleanedUp) {\n\t\tcleanedUp = true;\n\t\tconst tabs = await browser.tabs.query({ currentWindow: true, highlighted: true });\n\t\tObject.keys(persistentData).filter(key => {\n\t\t\tif (key != \"autoSaveAll\" && key != \"autoSaveUnpinned\" && key != \"profileName\") {\n\t\t\t\treturn !tabs.find(tab => tab.id == key);\n\t\t\t}\n\t\t}).forEach(tabId => delete persistentData[tabId]);\n\t\tawait browser.storage.local.set({ tabsData: persistentData });\n\t}\n}"
  },
  {
    "path": "src/core/bg/tabs-util.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, URLSearchParams, URL */\n\nexport {\n\tqueryTabs,\n\textractAuthCode,\n\tlaunchWebAuthFlow\n};\n\nasync function queryTabs(options) {\n\tconst tabs = await browser.tabs.query(options);\n\treturn tabs.sort((tab1, tab2) => tab1.index - tab2.index);\n}\n\nfunction extractAuthCode(authURL) {\n\treturn new Promise((resolve, reject) => {\n\t\tbrowser.tabs.onUpdated.addListener(onTabUpdated);\n\n\t\tfunction onTabUpdated(tabId, changeInfo) {\n\t\t\tif (changeInfo && changeInfo.url && changeInfo.url.startsWith(authURL)) {\n\t\t\t\tbrowser.tabs.onUpdated.removeListener(onTabUpdated);\n\t\t\t\tconst code = new URLSearchParams(new URL(changeInfo.url).search).get(\"code\");\n\t\t\t\tif (code) {\n\t\t\t\t\tbrowser.tabs.remove(tabId);\n\t\t\t\t\tresolve(code);\n\t\t\t\t} else {\n\t\t\t\t\treject();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\nasync function launchWebAuthFlow(options) {\n\tconst tab = await browser.tabs.create({ url: options.url, active: true });\n\treturn new Promise((resolve, reject) => {\n\t\tbrowser.tabs.onRemoved.addListener(onTabRemoved);\n\t\tfunction onTabRemoved(tabId) {\n\t\t\tif (tabId == tab.id) {\n\t\t\t\tbrowser.tabs.onRemoved.removeListener(onTabRemoved);\n\t\t\t\treject(new Error(\"code_required\"));\n\t\t\t}\n\t\t}\n\t});\n}"
  },
  {
    "path": "src/core/bg/tabs.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, setTimeout, OffscreenCanvas, ImageData, fetch */\n\nimport * as config from \"./config.js\";\nimport * as autosave from \"./autosave.js\";\nimport * as business from \"./business.js\";\nimport * as editor from \"./editor.js\";\nimport * as tabsData from \"./tabs-data.js\";\nimport * as ui from \"./../../ui/bg/index.js\";\nimport * as offscreen from \"./offscreen.js\";\n\nconst DELAY_MAYBE_INIT = 1500;\n\nbrowser.tabs.onCreated.addListener(tab => onTabCreated(tab));\nbrowser.tabs.onActivated.addListener(activeInfo => onTabActivated(activeInfo));\nbrowser.tabs.onRemoved.addListener(tabId => onTabRemoved(tabId));\nbrowser.tabs.onUpdated.addListener((tabId, changeInfo) => onTabUpdated(tabId, changeInfo));\nbrowser.tabs.onReplaced.addListener((addedTabId, removedTabId) => onTabReplaced(addedTabId, removedTabId));\nexport {\n\tonMessage\n};\n\nasync function onMessage(message, sender) {\n\tif (message.method.endsWith(\".init\")) {\n\t\tawait onInit(sender.tab, message);\n\t\tui.onInit(sender.tab);\n\t\tbusiness.onInit(sender.tab);\n\t\tautosave.onInit(sender.tab);\n\t}\n\tif (message.method.endsWith(\".getOptions\")) {\n\t\treturn config.getOptions(message.url);\n\t}\n\tif (message.method.endsWith(\".activate\")) {\n\t\tawait browser.tabs.update(message.tabId, { active: true });\n\t}\n\tif (message.method.endsWith(\".getScreenshot\")) {\n\t\treturn captureTab(sender.tab.id, message);\n\t}\n}\n\nasync function onInit(tab, options) {\n\tawait tabsData.remove(tab.id);\n\tconst allTabsData = await tabsData.get(tab.id);\n\tallTabsData[tab.id].savedPageDetected = options.savedPageDetected;\n\tawait tabsData.set(allTabsData);\n}\n\nasync function onTabUpdated(tabId, changeInfo) {\n\tif (changeInfo.status == \"complete\") {\n\t\tsetTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tawait browser.tabs.sendMessage(tabId, { method: \"content.maybeInit\" });\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tcatch (error) {\n\t\t\t\t// ignored\n\t\t\t}\n\t\t}, DELAY_MAYBE_INIT);\n\t\tautosave.onTabUpdated(tabId);\n\t\tconst tab = await browser.tabs.get(tabId);\n\t\tif (editor.isEditor(tab)) {\n\t\t\tconst allTabsData = await tabsData.get(tab.id);\n\t\t\tallTabsData[tab.id].editorDetected = true;\n\t\t\tawait tabsData.set(allTabsData);\n\t\t\tui.onTabActivated(tab);\n\t\t}\n\t}\n\tif (changeInfo.discarded) {\n\t\tautosave.onTabDiscarded(tabId);\n\t}\n}\n\nfunction onTabReplaced(addedTabId, removedTabId) {\n\ttabsData.onTabReplaced(addedTabId, removedTabId);\n\tautosave.onTabReplaced(addedTabId, removedTabId);\n\tbusiness.onTabReplaced(addedTabId, removedTabId);\n}\n\nfunction onTabCreated(tab) {\n\tui.onTabCreated(tab);\n}\n\nasync function onTabActivated(activeInfo) {\n\tconst tab = await browser.tabs.get(activeInfo.tabId);\n\tui.onTabActivated(tab);\n}\n\nfunction onTabRemoved(tabId) {\n\tbusiness.cancel(tabId);\n\ttabsData.remove(tabId);\n\teditor.onTabRemoved(tabId);\n\tautosave.onTabRemoved(tabId);\n}\n\nasync function captureTab(tabId, options) {\n\tconst { width, height, scale = 1 } = options;\n\tconst canvasWidth = Math.floor(width * scale);\n\tconst canvasHeight = Math.floor(height * scale);\n\tlet y = 0, canvas, canvasY = 0, scrollYStep, activeTabId;\n\tif (browser.tabs.captureTab) {\n\t\tscrollYStep = 4 * 1024;\n\t} else {\n\t\tscrollYStep = options.innerHeight;\n\t\tactiveTabId = (await browser.tabs.query({ active: true, currentWindow: true }))[0].id;\n\t}\n\tconst canvasScrollStep = Math.floor(scrollYStep * scale);\n\tawait browser.tabs.sendMessage(tabId, { method: \"content.beginScrollTo\" });\n\ttry {\n\t\tcanvas = new OffscreenCanvas(canvasWidth, canvasHeight);\n\t\tconst context = canvas.getContext(\"2d\");\n\t\twhile (y < height) {\n\t\t\tlet imageSrc;\n\t\t\tif (browser.tabs.captureTab) {\n\t\t\t\timageSrc = await browser.tabs.captureTab(tabId, {\n\t\t\t\t\tformat: \"png\",\n\t\t\t\t\trect: { x: 0, y, width, height: Math.min(height - y, scrollYStep) }\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tawait browser.tabs.sendMessage(tabId, { method: \"content.scrollTo\", y });\n\t\t\t\tawait browser.tabs.update(tabId, { active: true });\n\t\t\t\timageSrc = await browser.tabs.captureVisibleTab(null, {\n\t\t\t\t\tformat: \"png\"\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst imageHeight = Math.min(canvasHeight - canvasY, canvasScrollStep);\n\t\t\tconst imageBlobURI = (await offscreen.getImageData(imageSrc, canvasWidth, imageHeight)).url;\n\t\t\tconst imageRawData = await fetch(imageBlobURI).then(response => response.arrayBuffer());\n\t\t\tawait offscreen.revokeObjectURL(imageBlobURI);\n\t\t\tconst imageData = new ImageData(new Uint8ClampedArray(imageRawData), width);\n\t\t\tcontext.putImageData(imageData, 0, y);\n\t\t\ty += scrollYStep;\n\t\t\tcanvasY += canvasScrollStep;\n\t\t}\n\t\tif (!browser.tabs.captureTab) {\n\t\t\tawait browser.tabs.update(activeTabId, { active: true });\n\t\t}\n\t} catch (error) {\n\t\tif (scale > .1) {\n\t\t\toptions.scale = scale * .75;\n\t\t\treturn captureTab(tabId, options);\n\t\t} else {\n\t\t\tthrow error;\n\t\t}\n\t} finally {\n\t\tawait browser.tabs.sendMessage(tabId, { method: \"content.endScrollTo\" });\n\t}\n\tif (canvas) {\n\t\tawait browser.tabs.sendMessage(tabId, { method: \"content.endScrollTo\" });\n\t\tconst blob = await canvas.convertToBlob({ type: \"image/png\" });\n\t\treturn await offscreen.getBlobURL(Array.from(new Uint8Array(await blob.arrayBuffer())));\n\t}\n}"
  },
  {
    "path": "src/core/common/download.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, document, URL, Blob, MouseEvent, setTimeout, open, navigator, File, setInterval, clearInterval */\n\nimport * as yabson from \"./../../lib/yabson/yabson.js\";\nimport * as ui from \"./../../ui/content/content-ui.js\";\nimport { getSharePageBar, setLabels } from \"./../../ui/common/common-content-ui.js\";\n\nconst MAX_CONTENT_SIZE = 16 * (1024 * 1024);\n\nlet EMBEDDED_IMAGE_BUTTON_MESSAGE, SHARE_PAGE_BUTTON_MESSAGE, SHARE_SELECTION_BUTTON_MESSAGE, ERROR_TITLE_MESSAGE;\n\ntry {\n\tEMBEDDED_IMAGE_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelEmbeddedImageButton\");\n\tSHARE_PAGE_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelSharePageButton\");\n\tSHARE_SELECTION_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelShareSelectionButton\");\n\tERROR_TITLE_MESSAGE = browser.i18n.getMessage(\"topPanelError\");\n\t// eslint-disable-next-line no-unused-vars\n} catch (error) {\n\t// ignored\n}\n\nlet sharePageBar;\nsetLabels({\n\tEMBEDDED_IMAGE_BUTTON_MESSAGE,\n\tSHARE_PAGE_BUTTON_MESSAGE,\n\tSHARE_SELECTION_BUTTON_MESSAGE,\n\tERROR_TITLE_MESSAGE\n});\n\nexport {\n\tdownloadPage,\n\tdownloadPageForeground\n};\n\nasync function downloadPage(pageData, options) {\n\tif (options.includeBOM) {\n\t\tpageData.content = \"\\ufeff\" + pageData.content;\n\t}\n\tconst embeddedImage = options.embeddedImage;\n\tconst message = {\n\t\tmethod: \"downloads.download\",\n\t\ttaskId: options.taskId,\n\t\tinsertTextBody: options.insertTextBody,\n\t\tconfirmFilename: options.confirmFilename,\n\t\tfilenameConflictAction: options.filenameConflictAction,\n\t\tfilename: pageData.filename,\n\t\tmimeType: pageData.mimeType,\n\t\tsaveToClipboard: options.saveToClipboard,\n\t\tsaveToGDrive: options.saveToGDrive,\n\t\tsaveToDropbox: options.saveToDropbox,\n\t\tsaveWithWebDAV: options.saveWithWebDAV,\n\t\twebDAVURL: options.webDAVURL,\n\t\twebDAVUser: options.webDAVUser,\n\t\twebDAVPassword: options.webDAVPassword,\n\t\tsaveWithMCP: options.saveWithMCP,\n\t\tmcpServerUrl: options.mcpServerUrl,\n\t\tmcpAuthToken: options.mcpAuthToken,\n\t\tsaveToGitHub: options.saveToGitHub,\n\t\tgithubToken: options.githubToken,\n\t\tgithubUser: options.githubUser,\n\t\tgithubRepository: options.githubRepository,\n\t\tgithubBranch: options.githubBranch,\n\t\tsaveWithCompanion: options.saveWithCompanion,\n\t\tforceWebAuthFlow: options.forceWebAuthFlow,\n\t\tfilenameReplacementCharacter: options.filenameReplacementCharacter,\n\t\topenEditor: options.openEditor,\n\t\topenSavedPage: options.openSavedPage,\n\t\tcompressHTML: options.compressHTML,\n\t\tbackgroundSave: options.backgroundSave,\n\t\tbookmarkId: options.bookmarkId,\n\t\treplaceBookmarkURL: options.replaceBookmarkURL,\n\t\tapplySystemTheme: options.applySystemTheme,\n\t\tcontentWidth: options.contentWidth,\n\t\tdefaultEditorMode: options.defaultEditorMode,\n\t\tincludeInfobar: options.includeInfobar,\n\t\topenInfobar: options.openInfobar,\n\t\twarnUnsavedPage: options.warnUnsavedPage,\n\t\tcreateRootDirectory: options.createRootDirectory,\n\t\tselfExtractingArchive: options.selfExtractingArchive,\n\t\tdisableCompression: options.disableCompression,\n\t\tembeddedImage: embeddedImage ? Array.from(embeddedImage) : null,\n\t\tpreventAppendedData: options.preventAppendedData,\n\t\textractDataFromPage: options.extractDataFromPage,\n\t\tinsertCanonicalLink: options.insertCanonicalLink,\n\t\tinsertMetaNoIndex: options.insertMetaNoIndex,\n\t\tinsertMetaCSP: options.insertMetaCSP,\n\t\tpassword: options.password,\n\t\tcompressContent: options.compressContent,\n\t\tforegroundSave: options.foregroundSave,\n\t\tsharePage: options.sharePage,\n\t\tsaveToRestFormApi: options.saveToRestFormApi,\n\t\tsaveToRestFormApiUrl: options.saveToRestFormApiUrl,\n\t\tsaveToRestFormApiFileFieldName: options.saveToRestFormApiFileFieldName,\n\t\tsaveToRestFormApiUrlFieldName: options.saveToRestFormApiUrlFieldName,\n\t\tsaveToRestFormApiToken: options.saveToRestFormApiToken,\n\t\tsaveToS3: options.saveToS3,\n\t\tS3Domain: options.S3Domain,\n\t\tS3Region: options.S3Region,\n\t\tS3Bucket: options.S3Bucket,\n\t\tS3AccessKey: options.S3AccessKey,\n\t\tS3SecretKey: options.S3SecretKey,\n\t\tinfobarPositionAbsolute: options.infobarPositionAbsolute,\n\t\tinfobarPositionTop: options.infobarPositionTop,\n\t\tinfobarPositionBottom: options.infobarPositionBottom,\n\t\tinfobarPositionLeft: options.infobarPositionLeft,\n\t\tinfobarPositionRight: options.infobarPositionRight,\n\t\toriginalUrl: options.url,\n\t\ttitle: pageData.title\n\t};\n\tconst pingInterval = setInterval(() => {\n\t\tbrowser.runtime.sendMessage({ method: \"ping\" }).then(() => { });\n\t}, 15000);\n\tif (options.compressContent) {\n\t\tif ((!options.backgroundSave || options.saveToGDrive || options.saveToGitHub || options.saveWithCompanion || options.saveWithWebDAV || options.saveWithMCP || options.saveToDropbox || options.saveToRestFormApi || options.saveToS3) && options.confirmFilename && !options.openEditor) {\n\t\t\tpageData.filename = ui.prompt(\"Save as\", pageData.filename);\n\t\t}\n\t\tif (pageData.filename) {\n\t\t\tconst blob = new Blob([await yabson.serialize(pageData)], { type: pageData.mimeType });\n\t\t\tconst blobURL = URL.createObjectURL(blob);\n\t\t\tmessage.filename = pageData.filename;\n\t\t\tmessage.blobURL = blobURL;\n\t\t\tconst result = await browser.runtime.sendMessage(message);\n\t\t\tif (!message.openSavedPage) {\n\t\t\t\tURL.revokeObjectURL(blobURL);\n\t\t\t}\n\t\t\tif (result.error) {\n\t\t\t\tmessage.embeddedImage = embeddedImage;\n\t\t\t\tmessage.blobURL = null;\n\t\t\t\tmessage.pageData = pageData;\n\t\t\t\tconst serializer = yabson.getSerializer(message);\n\t\t\t\tfor await (const chunk of serializer) {\n\t\t\t\t\tawait browser.runtime.sendMessage({\n\t\t\t\t\t\tmethod: \"downloads.download\",\n\t\t\t\t\t\tcompressContent: true,\n\t\t\t\t\t\tdata: Array.from(chunk)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tawait browser.runtime.sendMessage({\n\t\t\t\t\tmethod: \"downloads.download\",\n\t\t\t\t\tcompressContent: true,\n\t\t\t\t\tmimeType: pageData.mimeType\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (options.backgroundSave) {\n\t\t\t\tconst hash = options.openEditor ? null : pageData.hash;\n\t\t\t\tawait browser.runtime.sendMessage({ method: \"downloads.end\", taskId: options.taskId, hash, woleetKey: options.woleetKey });\n\t\t\t}\n\t\t} else {\n\t\t\tbrowser.runtime.sendMessage({ method: \"downloads.cancel\" });\n\t\t\tbrowser.runtime.sendMessage({ method: \"ui.processCancelled\" });\n\t\t}\n\t} else {\n\t\tif ((options.backgroundSave && !options.sharePage) || options.openEditor || options.saveToGDrive || options.saveToGitHub || options.saveWithCompanion || options.saveWithWebDAV || options.saveWithMCP || options.saveToDropbox || options.saveToRestFormApi || options.saveToS3) {\n\t\t\tlet filename = pageData.filename;\n\t\t\tif ((options.saveToGDrive || options.saveToGitHub || options.saveWithCompanion || options.saveWithWebDAV || options.saveWithMCP || options.saveToDropbox || options.saveToRestFormApi || options.saveToS3) && options.confirmFilename && !options.openEditor) {\n\t\t\t\tfilename = ui.prompt(\"Save as\", pageData.filename);\n\t\t\t}\n\t\t\tif (filename) {\n\t\t\t\tmessage.filename = pageData.filename = filename;\n\t\t\t\tconst blobURL = URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType }));\n\t\t\t\tmessage.blobURL = blobURL;\n\t\t\t\tconst result = await browser.runtime.sendMessage(message);\n\t\t\t\tif (!message.openSavedPage) {\n\t\t\t\t\tURL.revokeObjectURL(blobURL);\n\t\t\t\t}\n\t\t\t\tif (result.error) {\n\t\t\t\t\tmessage.blobURL = null;\n\t\t\t\t\tfor (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < pageData.content.length; blockIndex++) {\n\t\t\t\t\t\tmessage.truncated = pageData.content.length > MAX_CONTENT_SIZE;\n\t\t\t\t\t\tif (message.truncated) {\n\t\t\t\t\t\t\tmessage.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > pageData.content.length;\n\t\t\t\t\t\t\tmessage.content = pageData.content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmessage.content = pageData.content;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait browser.runtime.sendMessage(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbrowser.runtime.sendMessage({ method: \"downloads.cancel\" });\n\t\t\t\tbrowser.runtime.sendMessage({ method: \"ui.processCancelled\" });\n\t\t\t}\n\t\t} else {\n\t\t\tif (options.saveToClipboard) {\n\t\t\t\tsaveToClipboard(pageData);\n\t\t\t} else {\n\t\t\t\tawait downloadPageForeground(pageData, options);\n\t\t\t}\n\t\t\tif (options.openSavedPage) {\n\t\t\t\topen(URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType })));\n\t\t\t}\n\t\t\tbrowser.runtime.sendMessage({ method: \"ui.processEnd\" });\n\t\t}\n\t\tconst hash = options.openEditor ? null : pageData.hash;\n\t\tawait browser.runtime.sendMessage({ method: \"downloads.end\", taskId: options.taskId, hash, woleetKey: options.woleetKey });\n\t}\n\tclearInterval(pingInterval);\n}\n\nasync function downloadPageForeground(pageData, options) {\n\tif (Array.isArray(pageData.content)) {\n\t\tpageData.content = new Uint8Array(pageData.content);\n\t}\n\tif (options.sharePage && navigator.share) {\n\t\tawait sharePage(pageData, options);\n\t} else {\n\t\tlet filename = pageData.filename;\n\t\tif (options.confirmFilename) {\n\t\t\tfilename = ui.prompt(\"Save as\", pageData.filename);\n\t\t\tif (filename) {\n\t\t\t\tpageData.filename = filename;\n\t\t\t} else {\n\t\t\t\tbrowser.runtime.sendMessage({ method: \"downloads.cancel\" });\n\t\t\t\tbrowser.runtime.sendMessage({ method: \"ui.processCancelled\" });\n\t\t\t}\n\t\t}\n\t\tif (filename) {\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.download = pageData.filename;\n\t\t\tlink.href = URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType }));\n\t\t\tlink.dispatchEvent(new MouseEvent(\"click\"));\n\t\t\treturn new Promise(resolve => setTimeout(() => { URL.revokeObjectURL(link.href); resolve(); }, 1000));\n\t\t}\n\t}\n}\n\nasync function sharePage(pageData, options) {\n\tsharePageBar = getSharePageBar();\n\tconst cancelled = await sharePageBar.display(options.selected);\n\tif (!cancelled) {\n\t\tconst data = { files: [new File([pageData.content], pageData.filename, { type: pageData.mimeType })] };\n\t\ttry {\n\t\t\tawait navigator.share(data);\n\t\t\tsharePageBar.hide();\n\t\t} catch (error) {\n\t\t\tsharePageBar.hide();\n\t\t\tif (error.name === \"AbortError\") {\n\t\t\t\tawait sharePage(pageData, options);\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction saveToClipboard(pageData) {\n\tconst command = \"copy\";\n\tdocument.addEventListener(command, listener);\n\tdocument.execCommand(command);\n\tdocument.removeEventListener(command, listener);\n\n\tfunction listener(event) {\n\t\tevent.clipboardData.setData(pageData.mimeType, pageData.content);\n\t\tevent.clipboardData.setData(\"text/plain\", pageData.content);\n\t\tevent.preventDefault();\n\t}\n}"
  },
  {
    "path": "src/core/content/content-bootstrap.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, document, location, setTimeout, XMLHttpRequest, Node, DOMParser, Blob, URL, Image, OffscreenCanvas, CustomEvent */\n\nconst MAX_CONTENT_SIZE = 32 * (1024 * 1024);\nconst NESTING_TRACK_ID_ATTRIBUTE_NAME = \"data-sf-nesting-track-id\";\n\nconst singlefile = globalThis.singlefileBootstrap;\nconst pendingResponses = new Map();\n\nlet unloadListenerAdded, optionsAutoSave, tabId, tabIndex, autoSaveEnabled, autoSaveTimeout, autoSavingPage, pageAutoSaved, previousLocationHref, savedPageDetected, compressContent, extractDataFromPageTags, insertTextBody, insertMetaCSP;\nsinglefile.pageInfo = {\n\tupdatedResources: {},\n\tvisitDate: new Date()\n};\nbrowser.runtime.sendMessage({ method: \"bootstrap.init\" }).then(message => {\n\toptionsAutoSave = message.optionsAutoSave;\n\tconst options = message.options;\n\ttabId = message.tabId;\n\ttabIndex = message.tabIndex;\n\tautoSaveEnabled = message.autoSaveEnabled;\n\tif (options && options.autoOpenEditor && detectSavedPage(document)) {\n\t\tif (document.readyState == \"loading\") {\n\t\t\tdocument.addEventListener(\"DOMContentLoaded\", () => openEditor(document));\n\t\t} else {\n\t\t\topenEditor(document);\n\t\t}\n\t} else {\n\t\tif (document.readyState == \"loading\") {\n\t\t\tdocument.addEventListener(\"DOMContentLoaded\", refresh);\n\t\t} else {\n\t\t\trefresh();\n\t\t}\n\t}\n});\nbrowser.runtime.onMessage.addListener(message => {\n\tif ((autoSaveEnabled && message.method == \"content.autosave\") ||\n\t\tmessage.method == \"content.maybeInit\" ||\n\t\tmessage.method == \"content.init\" ||\n\t\tmessage.method == \"content.openEditor\" ||\n\t\tmessage.method == \"devtools.resourceCommitted\" ||\n\t\tmessage.method == \"singlefile.fetchResponse\") {\n\t\treturn onMessage(message);\n\t}\n});\ndocument.addEventListener(\"DOMContentLoaded\", init, false);\nif (globalThis.window == globalThis.top && location && location.href && (location.href.startsWith(\"file://\") || location.href.startsWith(\"content://\"))) {\n\tif (document.readyState == \"loading\") {\n\t\tdocument.addEventListener(\"DOMContentLoaded\", extractFile, false);\n\t} else {\n\t\textractFile();\n\t}\n}\n\nasync function extractFile() {\n\tif (document.documentElement.dataset && document.documentElement.dataset.sfz !== undefined) {\n\t\tconst data = await getContent();\n\t\tdocument.querySelectorAll(\"#sfz-error-message\").forEach(element => element.remove());\n\t\texecuteBootstrap(data);\n\t} else {\n\t\tif ((document.body && document.body.childNodes.length == 1 && document.body.childNodes[0].tagName == \"PRE\" && /<html[^>]* data-sfz[^>]*>/i.test(document.body.childNodes[0].textContent))) {\n\t\t\tconst doc = (new DOMParser()).parseFromString(document.body.childNodes[0].textContent, \"text/html\");\n\t\t\tdocument.replaceChild(doc.documentElement, document.documentElement);\n\t\t\tdocument.querySelectorAll(\"script\").forEach(element => {\n\t\t\t\tconst scriptElement = document.createElement(\"script\");\n\t\t\t\tscriptElement.textContent = element.textContent;\n\t\t\t\telement.parentElement.replaceChild(scriptElement, element);\n\t\t\t});\n\t\t\tawait extractFile();\n\t\t}\n\t}\n}\n\nfunction getContent() {\n\treturn new Promise((resolve, reject) => {\n\t\tconst xhr = new XMLHttpRequest();\n\t\txhr.open(\"GET\", location.href);\n\t\txhr.send();\n\t\txhr.responseType = \"arraybuffer\";\n\t\txhr.onload = () => resolve(new Uint8Array(xhr.response));\n\t\txhr.onerror = () => {\n\t\t\tconst errorMessageElement = document.getElementById(\"sfz-error-message\");\n\t\t\tif (errorMessageElement) {\n\t\t\t\terrorMessageElement.remove();\n\t\t\t}\n\t\t\tconst requestId = pendingResponses.size;\n\t\t\tpendingResponses.set(requestId, { resolve, reject });\n\t\t\tbrowser.runtime.sendMessage({ method: \"singlefile.fetch\", requestId, url: location.href });\n\t\t};\n\t});\n}\n\nfunction executeBootstrap(data) {\n\tdocument.dispatchEvent(new CustomEvent(\"single-file-bootstrap\", { detail: { data } }));\n}\n\nasync function onMessage(message) {\n\tif (autoSaveEnabled && message.method == \"content.autosave\") {\n\t\tinitAutoSavePage(message);\n\t\treturn {};\n\t}\n\tif (message.method == \"content.maybeInit\") {\n\t\tinit();\n\t\treturn {};\n\t}\n\tif (message.method == \"content.init\") {\n\t\toptionsAutoSave = message.options;\n\t\tautoSaveEnabled = message.autoSaveEnabled;\n\t\trefresh();\n\t\treturn {};\n\t}\n\tif (message.method == \"content.openEditor\") {\n\t\tif (detectSavedPage(document)) {\n\t\t\topenEditor(document);\n\t\t} else {\n\t\t\trefresh();\n\t\t}\n\t\treturn {};\n\t}\n\tif (message.method == \"devtools.resourceCommitted\") {\n\t\tsinglefile.pageInfo.updatedResources[message.url] = { content: message.content, type: message.type, encoding: message.encoding };\n\t\treturn {};\n\t}\n\tif (message.method == \"singlefile.fetchResponse\") {\n\t\treturn await onFetchResponse(message);\n\t}\n}\n\nasync function onFetchResponse(message) {\n\tconst pendingResponse = pendingResponses.get(message.requestId);\n\tif (pendingResponse) {\n\t\tif (message.error) {\n\t\t\tpendingResponse.reject(new Error(message.error));\n\t\t\tpendingResponses.delete(message.requestId);\n\t\t} else {\n\t\t\tif (message.truncated) {\n\t\t\t\tif (pendingResponse.array) {\n\t\t\t\t\tpendingResponse.array = pendingResponse.array.concat(message.array);\n\t\t\t\t} else {\n\t\t\t\t\tpendingResponse.array = message.array;\n\t\t\t\t\tpendingResponses.set(message.requestId, pendingResponse);\n\t\t\t\t}\n\t\t\t\tif (message.finished) {\n\t\t\t\t\tmessage.array = pendingResponse.array;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!message.truncated || message.finished) {\n\t\t\t\tpendingResponse.resolve(message.array);\n\t\t\t\tpendingResponses.delete(message.requestId);\n\t\t\t}\n\t\t}\n\t\treturn {};\n\t}\n}\n\nfunction init() {\n\tconst legacyInfobarElement = document.querySelector(\"singlefile-infobar\");\n\tif (legacyInfobarElement) {\n\t\tlegacyInfobarElement.remove();\n\t}\n\tif (previousLocationHref != location.href && !singlefile.pageInfo.processing) {\n\t\tpageAutoSaved = false;\n\t\tpreviousLocationHref = location.href;\n\t\tbrowser.runtime.sendMessage({ method: \"tabs.init\", savedPageDetected: detectSavedPage(document) }).catch(() => { });\n\t\tbrowser.runtime.sendMessage({ method: \"ui.processInit\" }).catch(() => { });\n\t}\n}\n\nasync function initAutoSavePage(message) {\n\toptionsAutoSave = message.options;\n\tif (document.readyState != \"complete\") {\n\t\tawait new Promise(resolve => globalThis.addEventListener(\"load\", resolve));\n\t}\n\tawait autoSavePage();\n\tif (optionsAutoSave.autoSaveRepeat) {\n\t\tsetTimeout(() => {\n\t\t\tif (autoSaveEnabled && !autoSavingPage) {\n\t\t\t\tpageAutoSaved = false;\n\t\t\t\toptionsAutoSave.autoSaveDelay = 0;\n\t\t\t\tonMessage(message);\n\t\t\t}\n\t\t}, optionsAutoSave.autoSaveRepeatDelay * 1000);\n\t}\n}\n\nasync function autoSavePage() {\n\tconst helper = singlefile.helper;\n\tif ((!autoSavingPage || autoSaveTimeout) && !pageAutoSaved) {\n\t\tautoSavingPage = true;\n\t\tif (optionsAutoSave.autoSaveDelay && !autoSaveTimeout) {\n\t\t\tawait new Promise(resolve => autoSaveTimeout = setTimeout(resolve, optionsAutoSave.autoSaveDelay * 1000));\n\t\t\tawait autoSavePage();\n\t\t} else {\n\t\t\tconst waitForUserScript = globalThis[helper.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];\n\t\t\tlet frames = [];\n\t\t\tlet framesSessionId;\n\t\t\tautoSaveTimeout = null;\n\t\t\tif (!optionsAutoSave.removeFrames && globalThis.frames && globalThis.frames.length) {\n\t\t\t\tframes = await singlefile.processors.frameTree.getAsync(optionsAutoSave);\n\t\t\t}\n\t\t\tframesSessionId = frames && frames.sessionId;\n\t\t\tif (optionsAutoSave.userScriptEnabled && waitForUserScript) {\n\t\t\t\tawait waitForUserScript(helper.ON_BEFORE_CAPTURE_EVENT_NAME);\n\t\t\t}\n\t\t\tconst docData = helper.preProcessDoc(document, globalThis, optionsAutoSave);\n\t\t\tsavePage(docData, frames);\n\t\t\tif (framesSessionId) {\n\t\t\t\tsinglefile.processors.frameTree.cleanup(framesSessionId);\n\t\t\t}\n\t\t\thelper.postProcessDoc(document, docData.markedElements, docData.invalidElements);\n\t\t\tif (optionsAutoSave.userScriptEnabled && waitForUserScript) {\n\t\t\t\tawait waitForUserScript(helper.ON_AFTER_CAPTURE_EVENT_NAME);\n\t\t\t}\n\t\t\tpageAutoSaved = true;\n\t\t\tautoSavingPage = false;\n\t\t}\n\t}\n}\n\nfunction refresh() {\n\tif (autoSaveEnabled && optionsAutoSave && (optionsAutoSave.autoSaveUnload || optionsAutoSave.autoSaveLoadOrUnload || optionsAutoSave.autoSaveDiscard || optionsAutoSave.autoSaveRemove)) {\n\t\tif (!unloadListenerAdded) {\n\t\t\tglobalThis.addEventListener(\"unload\", onUnload);\n\t\t\tdocument.addEventListener(\"visibilitychange\", onVisibilityChange);\n\t\t\tunloadListenerAdded = true;\n\t\t}\n\t} else {\n\t\tglobalThis.removeEventListener(\"unload\", onUnload);\n\t\tdocument.removeEventListener(\"visibilitychange\", onVisibilityChange);\n\t\tunloadListenerAdded = false;\n\t}\n}\n\nfunction onVisibilityChange() {\n\tif (document.visibilityState == \"hidden\" && optionsAutoSave.autoSaveDiscard) {\n\t\tautoSaveUnloadedPage({ autoSaveDiscard: optionsAutoSave.autoSaveDiscard });\n\t}\n}\n\nfunction onUnload() {\n\tif (!pageAutoSaved && (optionsAutoSave.autoSaveUnload || optionsAutoSave.autoSaveLoadOrUnload || optionsAutoSave.autoSaveRemove)) {\n\t\tautoSaveUnloadedPage({ autoSaveUnload: optionsAutoSave.autoSaveUnload, autoSaveRemove: optionsAutoSave.autoSaveRemove });\n\t}\n}\n\nfunction autoSaveUnloadedPage({ autoSaveUnload, autoSaveDiscard, autoSaveRemove }) {\n\tconst helper = singlefile.helper;\n\tconst waitForUserScript = globalThis[helper.WAIT_FOR_USERSCRIPT_PROPERTY_NAME];\n\tlet frames = [];\n\tif (!optionsAutoSave.removeFrames && globalThis.frames && globalThis.frames.length) {\n\t\tframes = singlefile.processors.frameTree.getSync(optionsAutoSave);\n\t}\n\tif (optionsAutoSave.userScriptEnabled && waitForUserScript) {\n\t\twaitForUserScript(helper.ON_BEFORE_CAPTURE_EVENT_NAME);\n\t}\n\tconst docData = helper.preProcessDoc(document, globalThis, optionsAutoSave);\n\tsavePage(docData, frames, { autoSaveUnload, autoSaveDiscard, autoSaveRemove });\n}\n\nfunction savePage(docData, frames, { autoSaveUnload, autoSaveDiscard, autoSaveRemove } = {}) {\n\tconst helper = singlefile.helper;\n\tconst updatedResources = singlefile.pageInfo.updatedResources;\n\tconst visitDate = singlefile.pageInfo.visitDate.getTime();\n\tObject.keys(updatedResources).forEach(url => updatedResources[url].retrieved = false);\n\tbrowser.runtime.sendMessage({\n\t\tmethod: \"autosave.save\",\n\t\ttabId,\n\t\ttabIndex,\n\t\ttaskId: optionsAutoSave.taskId,\n\t\tcontent: helper.serialize(document),\n\t\tcanvases: docData.canvases,\n\t\tfonts: docData.fonts,\n\t\tstylesheets: docData.stylesheets,\n\t\timages: docData.images,\n\t\tposters: docData.posters,\n\t\tusedFonts: docData.usedFonts,\n\t\tshadowRoots: docData.shadowRoots,\n\t\tvideos: docData.videos,\n\t\treferrer: docData.referrer,\n\t\tadoptedStyleSheets: docData.adoptedStyleSheets,\n\t\tworklets: docData.worklets,\n\t\tframes: frames,\n\t\turl: location.href,\n\t\tupdatedResources,\n\t\tvisitDate,\n\t\tautoSaveUnload,\n\t\tautoSaveDiscard,\n\t\tautoSaveRemove\n\t});\n}\n\nasync function openEditor(document) {\n\tlet content;\n\tif (compressContent) {\n\t\tcontent = await getContent();\n\t} else {\n\t\tserializeShadowRoots(document);\n\t\tmarkInvalidNesting(document);\n\t\tcontent = singlefile.helper.serialize(document);\n\t}\n\tfor (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < content.length; blockIndex++) {\n\t\tconst message = {\n\t\t\tmethod: \"editor.open\",\n\t\t\tfilename: decodeURIComponent(location.href.match(/^.*\\/(.*)$/)[1]),\n\t\t\tcompressContent,\n\t\t\textractDataFromPageTags,\n\t\t\tinsertTextBody,\n\t\t\tinsertMetaCSP,\n\t\t\tselfExtractingArchive: compressContent\n\t\t};\n\t\tmessage.truncated = content.length > MAX_CONTENT_SIZE;\n\t\tif (message.truncated) {\n\t\t\tmessage.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > content.length;\n\t\t\tif (content instanceof Uint8Array) {\n\t\t\t\tmessage.content = Array.from(content.subarray(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE));\n\t\t\t} else {\n\t\t\t\tmessage.content = content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);\n\t\t\t}\n\t\t} else {\n\t\t\tmessage.embeddedImage = await extractEmbeddedImage(content);\n\t\t\tmessage.content = content instanceof Uint8Array ? Array.from(content) : content;\n\t\t}\n\t\tawait browser.runtime.sendMessage(message);\n\t}\n}\n\nasync function extractEmbeddedImage(content) {\n\tif (content[0] == 0x89 && content[1] == 0x50 && content[2] == 0x4E && content[3] == 0x47) {\n\t\tlet blob = new Blob([new Uint8Array(content)], { type: \"image/png\" });\n\t\tconst blobURI = URL.createObjectURL(blob);\n\t\tconst image = new Image();\n\t\timage.src = blobURI;\n\t\tawait new Promise((resolve, reject) => {\n\t\t\timage.onload = resolve;\n\t\t\timage.onerror = reject;\n\t\t});\n\t\tconst canvas = new OffscreenCanvas(image.width, image.height);\n\t\tconst context = canvas.getContext(\"2d\");\n\t\tcontext.drawImage(image, 0, 0);\n\t\tblob = await canvas.convertToBlob({ type: \"image/png\" });\n\t\tconst arrayBuffer = await blob.arrayBuffer();\n\t\treturn Array.from(new Uint8Array(arrayBuffer));\n\t}\n}\n\nfunction detectSavedPage(document) {\n\tif (savedPageDetected === undefined) {\n\t\tconst helper = singlefile.helper;\n\t\tconst firstDocumentChild = document.documentElement.firstChild;\n\t\tcompressContent = document.documentElement.dataset && document.documentElement.dataset.sfz == \"\";\n\t\textractDataFromPageTags = Boolean(document.querySelector(\"sfz-extra-data\"));\n\t\tinsertTextBody = Boolean(document.querySelector(\"body > main[hidden]\"));\n\t\tinsertMetaCSP = Boolean(document.querySelector(\"meta[http-equiv=content-security-policy]\"));\n\t\tsavedPageDetected = compressContent || (\n\t\t\tfirstDocumentChild.nodeType == Node.COMMENT_NODE &&\n\t\t\t(firstDocumentChild.textContent.includes(helper.COMMENT_HEADER) || firstDocumentChild.textContent.includes(helper.COMMENT_HEADER_LEGACY)));\n\t}\n\treturn savedPageDetected;\n}\n\nfunction serializeShadowRoots(node) {\n\tconst SHADOWROOT_ATTRIBUTE_NAME = \"shadowrootmode\";\n\tnode.querySelectorAll(\"*\").forEach(element => {\n\t\tconst shadowRoot = singlefile.helper.getShadowRoot(element);\n\t\tif (shadowRoot) {\n\t\t\tserializeShadowRoots(shadowRoot);\n\t\t\tconst templateElement = document.createElement(\"template\");\n\t\t\ttemplateElement.setAttribute(SHADOWROOT_ATTRIBUTE_NAME, \"open\");\n\t\t\tArray.from(shadowRoot.childNodes).forEach(childNode => templateElement.appendChild(childNode));\n\t\t\telement.appendChild(templateElement);\n\t\t}\n\t});\n}\n\nfunction markInvalidNesting(doc) {\n\taddTrackIds(doc.body);\n\tconst verificationDoc = parseDocContent(serialize(doc));\n\tconst markedMap = buildTrackIdMap(doc.body);\n\tconst normalizedMap = buildTrackIdMap(verificationDoc.body);\n\tconst trackIds = new Set();\n\tObject.keys(markedMap).forEach(id => {\n\t\tif (id in normalizedMap) {\n\t\t\tconst markedParent = markedMap[id].parentElement?.getAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME) || null;\n\t\t\tconst normalizedParent = normalizedMap[id]?.parentElement?.getAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME) || null;\n\t\t\tif (markedParent !== normalizedParent) {\n\t\t\t\tlet current = markedMap[id];\n\t\t\t\twhile (current && current !== doc.body) {\n\t\t\t\t\tconst currentId = current.getAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME);\n\t\t\t\t\tif (currentId) {\n\t\t\t\t\t\ttrackIds.add(currentId);\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = current.parentElement;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tcleanupTrackIds(doc.body, trackIds);\n\n\tfunction addTrackIds(element, index = 0, parentTrackId = \"\") {\n\t\tconst trackId = parentTrackId ? `${parentTrackId}.${index + 1}` : `${index + 1}`;\n\t\telement.setAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME, trackId);\n\t\tArray.from(element.children).forEach((child, indexChild) => addTrackIds(child, indexChild, trackId));\n\t}\n\n\tfunction buildTrackIdMap(element) {\n\t\tconst trackIds = {};\n\t\ttraverse(element);\n\t\treturn trackIds;\n\n\t\tfunction traverse(element) {\n\t\t\tif (element.getAttribute) {\n\t\t\t\tconst id = element.getAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME);\n\t\t\t\tif (id) {\n\t\t\t\t\ttrackIds[id] = element;\n\t\t\t\t}\n\t\t\t\tArray.from(element.children).forEach(traverse);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction cleanupTrackIds(element, toKeep) {\n\t\tconst id = element.getAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME);\n\t\tif (id && !toKeep.has(id)) {\n\t\t\telement.removeAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME);\n\t\t}\n\t\tArray.from(element.children).forEach(child => cleanupTrackIds(child, toKeep));\n\t}\n}\n\nfunction parseDocContent(content, baseURI) {\n\tconst doc = (new DOMParser()).parseFromString(content, \"text/html\");\n\tif (!doc.head) {\n\t\tdoc.documentElement.insertBefore(doc.createElement(\"HEAD\"), doc.body);\n\t}\n\tlet baseElement = doc.querySelector(\"base\");\n\tif (!baseElement || !baseElement.getAttribute(\"href\")) {\n\t\tif (baseElement) {\n\t\t\tbaseElement.remove();\n\t\t}\n\t\tbaseElement = doc.createElement(\"base\");\n\t\tbaseElement.setAttribute(\"href\", baseURI);\n\t\tdoc.head.insertBefore(baseElement, doc.head.firstChild);\n\t}\n\treturn doc;\n}\n\nfunction serialize(doc) {\n\tconst docType = doc.doctype;\n\tlet docTypeString = \"\";\n\tif (docType) {\n\t\tdocTypeString = \"<!DOCTYPE \" + docType.nodeName;\n\t\tif (docType.publicId) {\n\t\t\tdocTypeString += \" PUBLIC \\\"\" + docType.publicId + \"\\\"\";\n\t\t\tif (docType.systemId) {\n\t\t\t\tdocTypeString += \" \\\"\" + docType.systemId + \"\\\"\";\n\t\t\t}\n\t\t} else if (docType.systemId) {\n\t\t\tdocTypeString += \" SYSTEM \\\"\" + docType.systemId + \"\\\"\";\n\t\t} if (docType.internalSubset) {\n\t\t\tdocTypeString += \" [\" + docType.internalSubset + \"]\";\n\t\t}\n\t\tdocTypeString += \"> \";\n\t}\n\treturn docTypeString + doc.documentElement.outerHTML;\n}"
  },
  {
    "path": "src/core/content/content-frames.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\nimport \"./../../lib/single-file/fetch/content/content-fetch.js\";"
  },
  {
    "path": "src/core/content/content.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, document, location, setTimeout, URL, setInterval, clearInterval */\n\nimport * as download from \"./../common/download.js\";\nimport { fetch, frameFetch } from \"./../../lib/single-file/fetch/content/content-fetch.js\";\nimport * as ui from \"./../../ui/content/content-ui.js\";\nimport { onError, getOpenFileBar, openFile, setLabels } from \"./../../ui/common/common-content-ui.js\";\nimport * as yabson from \"./../../lib/yabson/yabson.js\";\n\nconst singlefile = globalThis.singlefile;\nconst bootstrap = globalThis.singlefileBootstrap;\n\nconst MOZ_EXTENSION_PROTOCOL = \"moz-extension:\";\nconst EMBEDDED_IMAGE_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelEmbeddedImageButton\");\nconst SHARE_PAGE_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelSharePageButton\");\nconst SHARE_SELECTION_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelShareSelectionButton\");\nconst ERROR_TITLE_MESSAGE = browser.i18n.getMessage(\"topPanelError\");\n\nconst SINGLE_FILE_PREFIX = \"single-file-\";\nconst WAIT_FOR_USERSCRIPT_PROPERTY_NAME = \"_singleFile_waitForUserScript\";\nconst ON_INIT_CAPTURE_EVENT_NAME = SINGLE_FILE_PREFIX + \"on-init-capture\";\n\nlet processor, processing, downloadParser, openFileInfobar, scrollY, transform, overflow;\n\nsetLabels({\n\tEMBEDDED_IMAGE_BUTTON_MESSAGE,\n\tSHARE_PAGE_BUTTON_MESSAGE,\n\tSHARE_SELECTION_BUTTON_MESSAGE,\n\tERROR_TITLE_MESSAGE\n});\n\nif (!bootstrap || !bootstrap.initializedSingleFile) {\n\tsinglefile.init({ fetch, frameFetch });\n\tbrowser.runtime.onMessage.addListener(message => {\n\t\tif (message.method == \"content.save\" ||\n\t\t\tmessage.method == \"content.cancelSave\" ||\n\t\t\tmessage.method == \"content.download\" ||\n\t\t\tmessage.method == \"content.getSelectedLinks\" ||\n\t\t\tmessage.method == \"content.error\" ||\n\t\t\tmessage.method == \"content.prompt\" ||\n\t\t\tmessage.method == \"content.beginScrollTo\" ||\n\t\t\tmessage.method == \"content.scrollTo\" ||\n\t\t\tmessage.method == \"content.endScrollTo\") {\n\t\t\treturn onMessage(message);\n\t\t}\n\t});\n\tif (bootstrap) {\n\t\tbootstrap.initializedSingleFile = true;\n\t} else {\n\t\tglobalThis.singlefileBootstrap = { initializedSingleFile: true };\n\t}\n}\n\nasync function onMessage(message) {\n\tif (!location.href.startsWith(MOZ_EXTENSION_PROTOCOL)) {\n\t\tif (message.method == \"content.save\") {\n\t\t\tawait savePage(message);\n\t\t\treturn {};\n\t\t}\n\t\tif (message.method == \"content.cancelSave\") {\n\t\t\tif (processor) {\n\t\t\t\tprocessor.cancel();\n\t\t\t\tui.onEndPage();\n\t\t\t\tif (openFileInfobar) {\n\t\t\t\t\topenFileInfobar.cancel();\n\t\t\t\t\topenFileInfobar = null;\n\t\t\t\t}\n\t\t\t\tbrowser.runtime.sendMessage({ method: \"ui.processCancelled\" });\n\t\t\t}\n\t\t\tif (message.options.loadDeferredImages) {\n\t\t\t\tsinglefile.processors.lazy.resetZoomLevel(message.options);\n\t\t\t}\n\t\t\treturn {};\n\t\t}\n\t\tif (message.method == \"content.getSelectedLinks\") {\n\t\t\treturn {\n\t\t\t\turls: ui.getSelectedLinks()\n\t\t\t};\n\t\t}\n\t\tif (message.method == \"content.download\") {\n\t\t\tif (!downloadParser) {\n\t\t\t\tdownloadParser = yabson.getParser();\n\t\t\t}\n\t\t\tconst result = await downloadParser.next(message.data);\n\t\t\tif (result.done) {\n\t\t\t\tdownloadParser = null;\n\t\t\t\ttry {\n\t\t\t\t\tawait download.downloadPageForeground(result.value, {\n\t\t\t\t\t\tforegroundSave: result.value.foregroundSave,\n\t\t\t\t\t\tsharePage: result.value.sharePage,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: error && (error.message || error.toString())\n\t\t\t\t\t};\n\t\t\t\t} finally {\n\t\t\t\t\tawait browser.runtime.sendMessage({ method: \"downloads.end\", taskId: result.value.taskId });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {};\n\t\t}\n\t\tif (message.method == \"content.error\") {\n\t\t\tonError(message.error, message.link);\n\t\t\treturn {};\n\t\t}\n\t\tif (message.method == \"content.prompt\") {\n\t\t\treturn ui.prompt(message.message, message.value);\n\t\t}\n\t\tif (message.method == \"content.beginScrollTo\") {\n\t\t\tscrollY = globalThis.scrollY;\n\t\t\ttransform = document.documentElement.style.getPropertyValue(\"transform\");\n\t\t\toverflow = document.documentElement.style.getPropertyValue(\"overflow\");\n\t\t\tglobalThis.scrollTo(0, 0);\n\t\t\tdocument.documentElement.style.setProperty(\"transform\", \"translateY(0px)\");\n\t\t\tdocument.documentElement.style.setProperty(\"overflow\", \"hidden\");\n\t\t\treturn {};\n\t\t}\n\t\tif (message.method == \"content.scrollTo\") {\n\t\t\tdocument.documentElement.style.setProperty(\"transform\", \"translateY(-\" + message.y + \"px)\");\n\t\t\tawait new Promise(resolve => setTimeout(resolve, 500));\n\t\t\treturn {};\n\t\t}\n\t\tif (message.method == \"content.endScrollTo\") {\n\t\t\tglobalThis.scrollTo(0, scrollY);\n\t\t\tdocument.documentElement.style.setProperty(\"transform\", transform);\n\t\t\tdocument.documentElement.style.setProperty(\"overflow\", overflow);\n\t\t\treturn {};\n\t\t}\n\t}\n}\n\nasync function savePage(message) {\n\tconst pingInterval = setInterval(() => {\n\t\tbrowser.runtime.sendMessage({ method: \"ping\" }).then(() => { });\n\t}, 15000);\n\tconst options = message.options;\n\tlet selectionFound;\n\tif (options.selected || options.optionallySelected) {\n\t\tselectionFound = await ui.markSelection(options.optionallySelected);\n\t}\n\tif (!processing && (!bootstrap || !bootstrap.pageInfo.processing)) {\n\t\toptions.updatedResources = bootstrap ? bootstrap.pageInfo.updatedResources : {};\n\t\toptions.visitDate = bootstrap ? bootstrap.pageInfo.visitDate : new Date();\n\t\tObject.keys(options.updatedResources).forEach(url => options.updatedResources[url].retrieved = false);\n\t\tif (options.optionallySelected && selectionFound) {\n\t\t\toptions.selected = true;\n\t\t}\n\t\tif (!options.selected || selectionFound) {\n\t\t\tif (bootstrap) {\n\t\t\t\tbootstrap.pageInfo.processing = true;\n\t\t\t}\n\t\t\tprocessing = true;\n\t\t\ttry {\n\t\t\t\tconst pageData = await processPage(options);\n\t\t\t\tif (pageData) {\n\t\t\t\t\tawait download.downloadPage(pageData, options);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (!processor.cancelled) {\n\t\t\t\t\tconsole.error(error); // eslint-disable-line no-console\n\t\t\t\t\tconst errorMessage = error && (error.message || error.toString());\n\t\t\t\t\tbrowser.runtime.sendMessage({ method: \"ui.processError\", error: errorMessage });\n\t\t\t\t\tonError(errorMessage);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbrowser.runtime.sendMessage({ method: \"ui.processCancelled\" });\n\t\t}\n\t\tprocessing = false;\n\t\tif (bootstrap) {\n\t\t\tbootstrap.pageInfo.processing = false;\n\t\t}\n\t}\n\tclearInterval(pingInterval);\n}\n\nasync function processPage(options) {\n\tconst frames = singlefile.processors.frameTree;\n\tlet framesSessionId;\n\tsinglefile.helper.initDoc(document);\n\tui.onStartPage(options);\n\tprocessor = new singlefile.SingleFile(options);\n\tconst preInitializationPromises = [];\n\toptions.insertCanonicalLink = true;\n\tlet index = 0, maxIndex = 0, initializing;\n\toptions.onprogress = async event => {\n\t\tconst { options } = event.detail;\n\t\tif (!processor.cancelled) {\n\t\t\tif (event.type == event.RESOURCES_INITIALIZING) {\n\t\t\t\tif (!initializing && options.insertEmbeddedScreenshotImage && options.compressContent) {\n\t\t\t\t\tinitializing = true;\n\t\t\t\t\tui.setVisible(false);\n\t\t\t\t\tconst screenshotBlobURI = await browser.runtime.sendMessage({\n\t\t\t\t\t\tmethod: \"tabs.getScreenshot\",\n\t\t\t\t\t\twidth: document.documentElement.scrollWidth,\n\t\t\t\t\t\theight: document.documentElement.scrollHeight,\n\t\t\t\t\t\tinnerHeight: globalThis.innerHeight\n\t\t\t\t\t});\n\t\t\t\t\tui.setVisible(true);\n\t\t\t\t\tui.onInsertingEmbeddedImage(options);\n\t\t\t\t\toptions.embeddedImage = new Uint8Array(await (await fetch(screenshotBlobURI)).arrayBuffer());\n\t\t\t\t\tURL.revokeObjectURL(screenshotBlobURI);\n\t\t\t\t\tui.onInsertEmbeddedImage(options);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.type == event.RESOURCES_INITIALIZED) {\n\t\t\t\tmaxIndex = event.detail.max;\n\t\t\t\tif (options.loadDeferredImages) {\n\t\t\t\t\tsinglefile.processors.lazy.resetZoomLevel(options);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.type == event.RESOURCES_INITIALIZED || event.type == event.RESOURCE_LOADED) {\n\t\t\t\tif (event.type == event.RESOURCE_LOADED) {\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t\tawait browser.runtime.sendMessage({ method: \"ui.processProgress\", index, maxIndex });\n\t\t\t\tui.onLoadResource(index, maxIndex, options);\n\t\t\t} else if (!event.detail.frame) {\n\t\t\t\tif (event.type == event.PAGE_LOADING) {\n\t\t\t\t\tui.onPageLoading();\n\t\t\t\t} else if (event.type == event.PAGE_LOADED) {\n\t\t\t\t\tui.onLoadPage();\n\t\t\t\t} else if (event.type == event.STAGE_STARTED) {\n\t\t\t\t\tif (event.detail.step < 3) {\n\t\t\t\t\t\tui.onStartStage(event.detail.step, options);\n\t\t\t\t\t}\n\t\t\t\t} else if (event.type == event.STAGE_ENDED) {\n\t\t\t\t\tif (event.detail.step < 3) {\n\t\t\t\t\t\tui.onEndStage(event.detail.step, options);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tconst waitForUserScript = globalThis[WAIT_FOR_USERSCRIPT_PROPERTY_NAME];\n\tif (options.userScriptEnabled && waitForUserScript) {\n\t\tawait waitForUserScript(ON_INIT_CAPTURE_EVENT_NAME, options);\n\t}\n\tconst cancelProcessor = processor.cancel.bind(processor);\n\tif (options.insertEmbeddedImage && options.compressContent) {\n\t\tui.onInsertingEmbeddedImage(options);\n\t\topenFileInfobar = getOpenFileBar();\n\t\tconst cancelled = await openFileInfobar.display();\n\t\tif (!cancelled) {\n\t\t\toptions.embeddedImage = await openFile({ accept: \"image/*\" });\n\t\t\topenFileInfobar.hide();\n\t\t}\n\t\tui.onInsertEmbeddedImage(options);\n\t}\n\tif (!options.saveRawPage && !processor.cancelled) {\n\t\tlet lazyLoadPromise;\n\t\tif (options.loadDeferredImages) {\n\t\t\tlazyLoadPromise = singlefile.processors.lazy.process(options);\n\t\t\tui.onLoadingDeferResources(options);\n\t\t\tlazyLoadPromise.then(() => {\n\t\t\t\tif (!processor.cancelled) {\n\t\t\t\t\tui.onLoadDeferResources(options);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (options.loadDeferredImagesBeforeFrames) {\n\t\t\t\tawait lazyLoadPromise;\n\t\t\t}\n\t\t}\n\t\tif (!options.removeFrames && frames && globalThis.frames) {\n\t\t\tlet frameTreePromise;\n\t\t\tif (options.loadDeferredImages) {\n\t\t\t\tframeTreePromise = new Promise(resolve => globalThis.setTimeout(() => resolve(frames.getAsync(options)), options.loadDeferredImagesBeforeFrames || !options.loadDeferredImages ? 0 : options.loadDeferredImagesMaxIdleTime));\n\t\t\t} else {\n\t\t\t\tframeTreePromise = frames.getAsync(options);\n\t\t\t}\n\t\t\tui.onLoadingFrames(options);\n\t\t\tframeTreePromise.then(() => {\n\t\t\t\tif (!processor.cancelled) {\n\t\t\t\t\tui.onLoadFrames(options);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (options.loadDeferredImagesBeforeFrames) {\n\t\t\t\toptions.frames = await new Promise(resolve => {\n\t\t\t\t\tprocessor.cancel = function () {\n\t\t\t\t\t\tcancelProcessor();\n\t\t\t\t\t\tresolve([]);\n\t\t\t\t\t};\n\t\t\t\t\tframeTreePromise.then(resolve);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpreInitializationPromises.push(frameTreePromise);\n\t\t\t}\n\t\t}\n\t\tif (options.loadDeferredImages && !options.loadDeferredImagesBeforeFrames) {\n\t\t\tpreInitializationPromises.push(lazyLoadPromise);\n\t\t}\n\t}\n\tif (!options.loadDeferredImagesBeforeFrames && !processor.cancelled) {\n\t\t[options.frames] = await new Promise(resolve => {\n\t\t\tconst preInitializationAllPromises = Promise.all(preInitializationPromises);\n\t\t\tprocessor.cancel = function () {\n\t\t\t\tcancelProcessor();\n\t\t\t\tresolve([[]]);\n\t\t\t};\n\t\t\tpreInitializationAllPromises.then(() => resolve(preInitializationAllPromises));\n\t\t});\n\t}\n\tif (options.delayBeforeProcessing) {\n\t\tawait new Promise(resolve => setTimeout(resolve, options.delayBeforeProcessing * 1000));\n\t}\n\tframesSessionId = options.frames && options.frames.sessionId;\n\tconst selectedFrame = options.frames && options.frames.find(frameData => frameData.requestedFrame);\n\toptions.win = globalThis;\n\tif (selectedFrame) {\n\t\toptions.content = selectedFrame.content;\n\t\toptions.url = selectedFrame.baseURI;\n\t\toptions.canvases = selectedFrame.canvases;\n\t\toptions.fonts = selectedFrame.fonts;\n\t\toptions.stylesheets = selectedFrame.stylesheets;\n\t\toptions.images = selectedFrame.images;\n\t\toptions.posters = selectedFrame.posters;\n\t\toptions.videos = selectedFrame.videos;\n\t\toptions.usedFonts = selectedFrame.usedFonts;\n\t\toptions.shadowRoots = selectedFrame.shadowRoots;\n\t\toptions.adoptedStyleSheets = selectedFrame.adoptedStyleSheets;\n\t\toptions.worklets = selectedFrame.worklets;\n\t} else {\n\t\toptions.doc = document;\n\t}\n\tif (!processor.cancelled) {\n\t\tawait processor.run();\n\t}\n\tif (framesSessionId) {\n\t\tframes.cleanup(framesSessionId);\n\t}\n\tlet page;\n\tif (!processor.cancelled) {\n\t\tif (options.confirmInfobarContent) {\n\t\t\toptions.infobarContent = ui.prompt(\"Infobar content\", options.infobarContent) || \"\";\n\t\t}\n\t\tpage = await processor.getPageData();\n\t\tif (options.selected || options.optionallySelected) {\n\t\t\tui.unmarkSelection();\n\t\t}\n\t\tui.onEndPage();\n\t\tif (options.displayStats) {\n\t\t\tconsole.log(\"SingleFile stats\"); // eslint-disable-line no-console\n\t\t\tconsole.table(page.stats); // eslint-disable-line no-console\n\t\t}\n\t}\n\tif (options.delayAfterProcessing) {\n\t\tawait new Promise(resolve => setTimeout(resolve, options.delayAfterProcessing * 1000));\n\t}\n\treturn page;\n}"
  },
  {
    "path": "src/core/devtools/devtools.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n    <title>DevTools page</title>\r\n</head>\r\n\r\n<body>\r\n    <script src=\"/lib/chrome-browser-polyfill.js\"></script>\r\n    <script type=\"module\" src=\"devtools.js\"></script>\r\n</body>\r\n\r\n</html>"
  },
  {
    "path": "src/core/devtools/devtools.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nimport \"./../bg/page-orphan-hack.js\";\n\nif (browser.devtools.inspectedWindow && browser.devtools.inspectedWindow.onResourceContentCommitted) {\n\tbrowser.devtools.inspectedWindow.onResourceContentCommitted.addListener(resource => {\n\t\tresource.getContent((content, encoding) => {\n\t\t\tbrowser.runtime.sendMessage({\n\t\t\t\tmethod: \"devtools.resourceCommitted\",\n\t\t\t\ttabId: browser.devtools.inspectedWindow.tabId,\n\t\t\t\turl: resource.url,\n\t\t\t\tcontent,\n\t\t\t\tencoding,\n\t\t\t\ttype: resource.type\n\t\t\t});\n\t\t});\n\t});\n}\n"
  },
  {
    "path": "src/index.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\nimport { fetch, frameFetch } from \"./lib/single-file/fetch/content/content-fetch.js\";\n\nconst core = {\n\tgetPageData: globalThis.singlefile.getPageData\n};\n\nglobalThis.singlefile.getPageData = function (options, initOptions = { fetch, frameFetch }, doc, win) {\n\treturn core.getPageData(options, initOptions, doc, win);\n};"
  },
  {
    "path": "src/lib/dropbox/dropbox.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, fetch */\n\nconst TOKEN_URL = \"https://api.dropboxapi.com/oauth2/token\";\nconst AUTH_URL = \"https://www.dropbox.com/oauth2/authorize\";\nconst REVOKE_ACCESS_URL = \"https://api.dropboxapi.com/2/auth/token/revoke\";\nconst DROPBOX_SEARCH_URL = \"https://api.dropboxapi.com/2/files/search_v2\";\nconst DROPBOX_UPLOAD_URL = \"https://content.dropboxapi.com/2/files/upload_session/start\";\nconst DROPBOX_APPEND_URL = \"https://content.dropboxapi.com/2/files/upload_session/append_v2\";\nconst DROPBOX_FINISH_URL = \"https://content.dropboxapi.com/2/files/upload_session/finish\";\nconst CONFLICT_ACTION_UNIQUIFY = \"uniquify\";\nconst CONFLICT_ACTION_OVERWRITE = \"overwrite\";\nconst CONFLICT_ACTION_SKIP = \"skip\";\nconst CONFLICT_ACTION_PROMPT = \"prompt\";\nconst ENCODED_CHARS = /[\\u007f-\\uffff]/g;\n\nclass Dropbox {\n\tconstructor(clientId, clientKey) {\n\t\tthis.clientId = clientId;\n\t\tthis.clientKey = clientKey;\n\t}\n\tasync auth(options = { interactive: true }) {\n\t\tthis.authURL = AUTH_URL +\n\t\t\t\"?client_id=\" + this.clientId +\n\t\t\t\"&response_type=code\" +\n\t\t\t\"&token_access_type=offline\" +\n\t\t\t\"&redirect_uri=\" + browser.identity.getRedirectURL();\n\t\treturn options.code ? authFromCode(this, options) : initAuth(this, options);\n\t}\n\tsetAuthInfo(authInfo) {\n\t\tif (authInfo) {\n\t\t\tthis.accessToken = authInfo.accessToken;\n\t\t\tthis.refreshToken = authInfo.refreshToken;\n\t\t\tthis.expirationDate = authInfo.expirationDate;\n\t\t} else {\n\t\t\tdelete this.accessToken;\n\t\t\tdelete this.refreshToken;\n\t\t\tdelete this.expirationDate;\n\t\t}\n\t}\n\tasync refreshAuthToken() {\n\t\tif (this.refreshToken) {\n\t\t\tconst httpResponse = await fetch(TOKEN_URL, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\t\t\tbody: \"client_id=\" + this.clientId +\n\t\t\t\t\t\"&refresh_token=\" + this.refreshToken +\n\t\t\t\t\t\"&grant_type=refresh_token\" +\n\t\t\t\t\t\"&client_secret=\" + this.clientKey\n\t\t\t});\n\t\t\tif (httpResponse.status == 400) {\n\t\t\t\tthrow new Error(\"unknown_token\");\n\t\t\t}\n\t\t\tconst response = await getJSON(httpResponse);\n\t\t\tthis.accessToken = response.access_token;\n\t\t\tif (response.refresh_token) {\n\t\t\t\tthis.refreshToken = response.refresh_token;\n\t\t\t}\n\t\t\tif (response.expires_in) {\n\t\t\t\tthis.expirationDate = Date.now() + (response.expires_in * 1000);\n\t\t\t}\n\t\t\treturn { accessToken: this.accessToken, refreshToken: this.refreshToken, expirationDate: this.expirationDate };\n\t\t} else {\n\t\t\tdelete this.accessToken;\n\t\t}\n\t}\n\tasync revokeAuthToken(accessToken) {\n\t\tif (accessToken) {\n\t\t\tconst httpResponse = await fetch(REVOKE_ACCESS_URL, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Authorization\": \"Bearer \" + accessToken\n\t\t\t\t}\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait httpResponse.text();\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\tif (error.message != \"invalid_token\") {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tdelete this.accessToken;\n\t\t\t\tdelete this.refreshToken;\n\t\t\t\tdelete this.expirationDate;\n\t\t\t}\n\t\t}\n\t}\n\tasync upload(filename, blob, options, setCancelCallback) {\n\t\tconst uploader = new MediaUploader({\n\t\t\ttoken: this.accessToken,\n\t\t\tfile: blob,\n\t\t\tfilename,\n\t\t\tonProgress: options.onProgress,\n\t\t\tfilenameConflictAction: options.filenameConflictAction,\n\t\t\tprompt: options.prompt\n\t\t});\n\t\tif (setCancelCallback) {\n\t\t\tsetCancelCallback(() => uploader.cancelled = true);\n\t\t}\n\t\tawait uploader.upload();\n\t}\n}\n\nclass MediaUploader {\n\tconstructor(options) {\n\t\tthis.file = options.file;\n\t\tthis.onProgress = options.onProgress;\n\t\tthis.contentType = this.file.type || \"application/octet-stream\";\n\t\tthis.metadata = {\n\t\t\tname: options.filename,\n\t\t\tmimeType: this.contentType\n\t\t};\n\t\tthis.token = options.token;\n\t\tthis.offset = 0;\n\t\tthis.chunkSize = options.chunkSize || 8 * 1024 * 1024;\n\t\tthis.filenameConflictAction = options.filenameConflictAction;\n\t\tthis.prompt = options.prompt;\n\t}\n\tasync upload() {\n\t\tconst httpListResponse = getResponse(await fetch(DROPBOX_SEARCH_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": \"Bearer \" + this.token,\n\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t},\n\t\t\tbody: stringify({\n\t\t\t\tquery: this.metadata.name,\n\t\t\t\toptions: {\n\t\t\t\t\tfilename: true\n\t\t\t\t}\n\t\t\t})\n\t\t}));\n\t\tconst response = await getJSON(httpListResponse);\n\t\tif (response.matches.length) {\n\t\t\tif (this.filenameConflictAction == CONFLICT_ACTION_PROMPT) {\n\t\t\t\tif (this.prompt) {\n\t\t\t\t\tconst name = await this.prompt(this.metadata.name);\n\t\t\t\t\tif (name) {\n\t\t\t\t\t\tthis.metadata.name = name;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.filenameConflictAction = CONFLICT_ACTION_UNIQUIFY;\n\t\t\t\t}\n\t\t\t} else if (this.filenameConflictAction == CONFLICT_ACTION_SKIP) {\n\t\t\t\treturn response;\n\t\t\t}\n\t\t}\n\t\tconst httpResponse = getResponse(await fetch(DROPBOX_UPLOAD_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": \"Bearer \" + this.token,\n\t\t\t\t\"Dropbox-API-Arg\": stringify({\n\t\t\t\t\tclose: false\n\t\t\t\t}),\n\t\t\t\t\"Content-Type\": \"application/octet-stream\"\n\t\t\t}\n\t\t}));\n\t\tconst sessionId = (await getJSON(httpResponse)).session_id;\n\t\tthis.sessionId = sessionId;\n\t\tif (!this.cancelled) {\n\t\t\tif (this.onProgress) {\n\t\t\t\tthis.onProgress(0, this.file.size);\n\t\t\t}\n\t\t\treturn sendFile(this);\n\t\t}\n\t}\n}\n\nexport { Dropbox };\n\nasync function authFromCode(dropbox, options) {\n\tconst httpResponse = await fetch(TOKEN_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: \"client_id=\" + dropbox.clientId +\n\t\t\t\"&client_secret=\" + dropbox.clientKey +\n\t\t\t\"&grant_type=authorization_code\" +\n\t\t\t\"&code=\" + options.code +\n\t\t\t\"&redirect_uri=\" + browser.identity.getRedirectURL()\n\t});\n\tconst response = await getJSON(httpResponse);\n\tdropbox.accessToken = response.access_token;\n\tdropbox.refreshToken = response.refresh_token;\n\tdropbox.expirationDate = Date.now() + (response.expires_in * 1000);\n\treturn { accessToken: dropbox.accessToken, refreshToken: dropbox.refreshToken, expirationDate: dropbox.expirationDate };\n}\n\nasync function initAuth(dropbox, options) {\n\tlet code;\n\ttry {\n\t\toptions.extractAuthCode(browser.identity.getRedirectURL())\n\t\t\t.then(authCode => code = authCode)\n\t\t\t.catch(() => { /* ignored */ });\n\t\treturn await options.launchWebAuthFlow({ url: dropbox.authURL });\n\t}\n\tcatch (error) {\n\t\tif (error.message && (error.message == \"code_required\" || error.message.includes(\"access\"))) {\n\t\t\tif (code) {\n\t\t\t\toptions.code = code;\n\t\t\t\treturn await authFromCode(dropbox, options);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"code_required\");\n\t\t\t}\n\t\t} else {\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n\nasync function sendFile(mediaUploader) {\n\tlet content = mediaUploader.file, end = mediaUploader.file.size;\n\tif (mediaUploader.offset || mediaUploader.chunkSize) {\n\t\tif (mediaUploader.chunkSize) {\n\t\t\tend = Math.min(mediaUploader.offset + mediaUploader.chunkSize, mediaUploader.file.size);\n\t\t}\n\t\tcontent = content.slice(mediaUploader.offset, end);\n\t}\n\tconst httpAppendResponse = getResponse(await fetch(DROPBOX_APPEND_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Authorization\": \"Bearer \" + mediaUploader.token,\n\t\t\t\"Content-Type\": \"application/octet-stream\",\n\t\t\t\"Dropbox-API-Arg\": stringify({\n\t\t\t\tcursor: {\n\t\t\t\t\tsession_id: mediaUploader.sessionId,\n\t\t\t\t\toffset: mediaUploader.offset\n\t\t\t\t},\n\t\t\t\tclose: end == mediaUploader.file.size\n\t\t\t})\n\t\t},\n\t\tbody: content\n\t}));\n\tif (mediaUploader.onProgress && !mediaUploader.cancelled) {\n\t\tmediaUploader.onProgress(mediaUploader.offset + mediaUploader.chunkSize, mediaUploader.file.size);\n\t}\n\tif (httpAppendResponse.status == 200) {\n\t\tmediaUploader.offset = end;\n\t\tif (mediaUploader.offset < mediaUploader.file.size) {\n\t\t\treturn sendFile(mediaUploader);\n\t\t}\n\t}\n\tlet path = mediaUploader.metadata.name;\n\tif (!path.startsWith(\"/\")) {\n\t\tpath = \"/\" + path;\n\t}\n\tconst httpFinishResponse = await fetch(DROPBOX_FINISH_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Authorization\": \"Bearer \" + mediaUploader.token,\n\t\t\t\"Content-Type\": \"application/octet-stream\",\n\t\t\t\"Dropbox-API-Arg\": stringify({\n\t\t\t\tcursor: {\n\t\t\t\t\tsession_id: mediaUploader.sessionId,\n\t\t\t\t\toffset: mediaUploader.offset\n\t\t\t\t},\n\t\t\t\tcommit: {\n\t\t\t\t\tpath,\n\t\t\t\t\tmode: mediaUploader.filenameConflictAction == CONFLICT_ACTION_OVERWRITE ? \"overwrite\" : \"add\",\n\t\t\t\t\tautorename: mediaUploader.filenameConflictAction == CONFLICT_ACTION_UNIQUIFY\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t});\n\tif (httpFinishResponse.status == 200) {\n\t\treturn getJSON(httpFinishResponse);\n\t} else if (httpFinishResponse.status == 409 && mediaUploader.filenameConflictAction == CONFLICT_ACTION_PROMPT) {\n\t\tmediaUploader.offset = 0;\n\t\treturn mediaUploader.upload();\n\t} else {\n\t\tthrow new Error(\"unknown_error (\" + httpFinishResponse.status + \")\");\n\t}\n}\n\nasync function getJSON(httpResponse) {\n\thttpResponse = getResponse(httpResponse);\n\tconst response = await httpResponse.json();\n\tif (response.error) {\n\t\tthrow new Error(response.error);\n\t} else {\n\t\treturn response;\n\t}\n}\n\nfunction getResponse(httpResponse) {\n\tif (httpResponse.status == 200) {\n\t\treturn httpResponse;\n\t} else if (httpResponse.status == 401) {\n\t\tthrow new Error(\"invalid_token\");\n\t} else {\n\t\tthrow new Error(\"unknown_error (\" + httpResponse.status + \")\");\n\t}\n}\n\nfunction stringify(value) {\n\treturn JSON.stringify(value).replace(ENCODED_CHARS,\n\t\tfunction (c) {\n\t\t\treturn \"\\\\u\" + (\"000\" + c.charCodeAt(0).toString(16)).slice(-4);\n\t\t}\n\t);\n}"
  },
  {
    "path": "src/lib/gdrive/gdrive.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, fetch, setInterval, URLSearchParams, URL */\n\nconst TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nconst AUTH_URL = \"https://accounts.google.com/o/oauth2/v2/auth\";\nconst REVOKE_ACCESS_URL = \"https://accounts.google.com/o/oauth2/revoke\";\nconst GDRIVE_URL = \"https://www.googleapis.com/drive/v3/files\";\nconst GDRIVE_UPLOAD_URL = \"https://www.googleapis.com/upload/drive/v3/files\";\nconst CONFLICT_ACTION_UNIQUIFY = \"uniquify\";\nconst CONFLICT_ACTION_OVERWRITE = \"overwrite\";\nconst CONFLICT_ACTION_SKIP = \"skip\";\nconst CONFLICT_ACTION_PROMPT = \"prompt\";\n\nclass GDrive {\n\tconstructor(clientId, clientKey, scopes) {\n\t\tthis.clientId = clientId;\n\t\tthis.clientKey = clientKey;\n\t\tthis.scopes = scopes;\n\t\tthis.folderIds = new Map();\n\t\tsetInterval(() => this.folderIds.clear(), 60 * 1000);\n\t}\n\tasync auth(options = { interactive: true }) {\n\t\tif (nativeAuth(options)) {\n\t\t\tthis.accessToken = await browser.identity.getAuthToken({ interactive: options.interactive });\n\t\t\treturn { revokableAccessToken: this.accessToken };\n\t\t} else {\n\t\t\tthis.authURL = AUTH_URL +\n\t\t\t\t\"?client_id=\" + this.clientId +\n\t\t\t\t\"&response_type=code\" +\n\t\t\t\t\"&access_type=offline\" +\n\t\t\t\t\"&redirect_uri=\" + browser.identity.getRedirectURL() +\n\t\t\t\t\"&scope=\" + this.scopes.join(\" \");\n\t\t\treturn options.code ? authFromCode(this, options) : initAuth(this, options);\n\t\t}\n\t}\n\tsetAuthInfo(authInfo, options) {\n\t\tif (!nativeAuth(options)) {\n\t\t\tif (authInfo) {\n\t\t\t\tthis.accessToken = authInfo.accessToken;\n\t\t\t\tthis.refreshToken = authInfo.refreshToken;\n\t\t\t\tthis.expirationDate = authInfo.expirationDate;\n\t\t\t} else {\n\t\t\t\tdelete this.accessToken;\n\t\t\t\tdelete this.refreshToken;\n\t\t\t\tdelete this.expirationDate;\n\t\t\t}\n\t\t}\n\t}\n\tasync refreshAuthToken() {\n\t\tif (this.refreshToken) {\n\t\t\tconst httpResponse = await fetch(TOKEN_URL, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\t\t\tbody: \"client_id=\" + this.clientId +\n\t\t\t\t\t\"&refresh_token=\" + this.refreshToken +\n\t\t\t\t\t\"&grant_type=refresh_token\" +\n\t\t\t\t\t\"&client_secret=\" + this.clientKey\n\t\t\t});\n\t\t\tif (httpResponse.status == 400) {\n\t\t\t\tthrow new Error(\"unknown_token\");\n\t\t\t}\n\t\t\tconst response = await getJSON(httpResponse);\n\t\t\tthis.accessToken = response.access_token;\n\t\t\tif (response.refresh_token) {\n\t\t\t\tthis.refreshToken = response.refresh_token;\n\t\t\t}\n\t\t\tif (response.expires_in) {\n\t\t\t\tthis.expirationDate = Date.now() + (response.expires_in * 1000);\n\t\t\t}\n\t\t\treturn { accessToken: this.accessToken, refreshToken: this.refreshToken, expirationDate: this.expirationDate };\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tif (browser.identity && browser.identity.removeCachedAuthToken && this.accessToken) {\n\t\t\t\t\tawait browser.identity.removeCachedAuthToken({ token: this.accessToken });\n\t\t\t\t}\n\t\t\t\tthis.accessToken = await browser.identity.getAuthToken({ interactive: false });\n\t\t\t\treturn { revokableAccessToken: this.accessToken };\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t} catch (error) {\n\t\t\t\tdelete this.accessToken;\n\t\t\t}\n\t\t}\n\t}\n\tasync revokeAuthToken(accessToken) {\n\t\tif (accessToken) {\n\t\t\tif (browser.identity && browser.identity.removeCachedAuthToken) {\n\t\t\t\ttry {\n\t\t\t\t\tawait browser.identity.removeCachedAuthToken({ token: accessToken });\n\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// ignored\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst httpResponse = await fetch(REVOKE_ACCESS_URL, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\t\t\tbody: \"token=\" + accessToken\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait getJSON(httpResponse);\n\t\t\t}\n\t\t\tcatch (error) {\n\t\t\t\tif (error.message != \"invalid_token\") {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinally {\n\t\t\t\tdelete this.accessToken;\n\t\t\t\tdelete this.refreshToken;\n\t\t\t\tdelete this.expirationDate;\n\t\t\t}\n\t\t}\n\t}\n\tasync upload(fullFilename, blob, options, setCancelCallback, retry = true) {\n\t\tconst parentFolderId = await getParentFolderId(this, fullFilename);\n\t\tconst fileParts = fullFilename.split(\"/\");\n\t\tconst filename = fileParts.pop();\n\t\tconst uploader = new MediaUploader({\n\t\t\ttoken: this.accessToken,\n\t\t\tfile: blob,\n\t\t\tparents: [parentFolderId],\n\t\t\tfilename,\n\t\t\tonProgress: options.onProgress,\n\t\t\tfilenameConflictAction: options.filenameConflictAction,\n\t\t\tprompt: options.prompt\n\t\t});\n\t\ttry {\n\t\t\tif (setCancelCallback) {\n\t\t\t\tsetCancelCallback(() => uploader.cancelled = true);\n\t\t\t}\n\t\t\tawait uploader.upload();\n\t\t}\n\t\tcatch (error) {\n\t\t\tif (error.message == \"path_not_found\" && retry) {\n\t\t\t\tthis.folderIds.clear();\n\t\t\t\treturn this.upload(fullFilename, blob, options, setCancelCallback);\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass MediaUploader {\n\tconstructor(options) {\n\t\tthis.file = options.file;\n\t\tthis.onProgress = options.onProgress;\n\t\tthis.contentType = this.file.type || \"application/octet-stream\";\n\t\tthis.metadata = {\n\t\t\tname: options.filename,\n\t\t\tmimeType: this.contentType,\n\t\t\tparents: options.parents || [\"root\"]\n\t\t};\n\t\tthis.token = options.token;\n\t\tthis.offset = 0;\n\t\tthis.chunkSize = options.chunkSize || 512 * 1024;\n\t\tthis.filenameConflictAction = options.filenameConflictAction;\n\t\tthis.prompt = options.prompt;\n\t}\n\tasync upload(indexFilename = 1) {\n\t\tlet method = \"POST\";\n\t\tlet fileId;\n\t\tconst httpListResponse = getResponse(await fetch(GDRIVE_URL + `?q=name = '${this.metadata.name}' and trashed != true and '${this.metadata.parents[0]}' in parents`, {\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": \"Bearer \" + this.token,\n\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t}\n\t\t}));\n\t\tconst response = await httpListResponse.json();\n\t\tif (response.files.length) {\n\t\t\tif (this.filenameConflictAction == CONFLICT_ACTION_OVERWRITE) {\n\t\t\t\tmethod = \"PATCH\";\n\t\t\t\tfileId = response.files[0].id;\n\t\t\t\tthis.metadata.parents = null;\n\t\t\t} else if (this.filenameConflictAction == CONFLICT_ACTION_UNIQUIFY) {\n\t\t\t\tlet nameWithoutExtension = this.metadata.name;\n\t\t\t\tlet extension = \"\";\n\t\t\t\tconst dotIndex = this.metadata.name.lastIndexOf(\".\");\n\t\t\t\tif (dotIndex > -1) {\n\t\t\t\t\tnameWithoutExtension = this.metadata.name.substring(0, dotIndex);\n\t\t\t\t\textension = this.metadata.name.substring(dotIndex + 1);\n\t\t\t\t}\n\t\t\t\tconst name = nameWithoutExtension + \" (\" + indexFilename + \").\" + extension;\n\t\t\t\tconst httpResponse = getResponse(await fetch(GDRIVE_URL + `?q=name = '${name}' and trashed != true and '${this.metadata.parents[0]}' in parents`, {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"Authorization\": \"Bearer \" + this.token,\n\t\t\t\t\t\t\"Content-Type\": \"application/json\"\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t\tconst response = await httpResponse.json();\n\t\t\t\tif (response.files.length) {\n\t\t\t\t\treturn this.upload(indexFilename + 1);\n\t\t\t\t} else {\n\t\t\t\t\tthis.metadata.name = name;\n\t\t\t\t}\n\t\t\t} else if (this.filenameConflictAction == CONFLICT_ACTION_PROMPT) {\n\t\t\t\tif (this.prompt) {\n\t\t\t\t\tconst name = await this.prompt(this.metadata.name);\n\t\t\t\t\tif (name) {\n\t\t\t\t\t\tthis.metadata.name = name;\n\t\t\t\t\t\treturn this.upload(indexFilename);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn response;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.filenameConflictAction = CONFLICT_ACTION_UNIQUIFY;\n\t\t\t\t\treturn this.upload(indexFilename);\n\t\t\t\t}\n\t\t\t} else if (this.filenameConflictAction == CONFLICT_ACTION_SKIP) {\n\t\t\t\treturn response;\n\t\t\t}\n\t\t}\n\t\tconst httpResponse = getResponse(await fetch(GDRIVE_UPLOAD_URL + (fileId ? \"/\" + fileId : \"\") + \"?uploadType=resumable\", {\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\t\"Authorization\": \"Bearer \" + this.token,\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-Upload-Content-Length\": this.file.size,\n\t\t\t\t\"X-Upload-Content-Type\": this.contentType\n\t\t\t},\n\t\t\tbody: JSON.stringify(this.metadata)\n\t\t}));\n\t\tconst location = httpResponse.headers.get(\"Location\");\n\t\tthis.url = location;\n\t\tif (!this.cancelled) {\n\t\t\tif (this.onProgress) {\n\t\t\t\tthis.onProgress(0, this.file.size);\n\t\t\t}\n\t\t\treturn sendFile(this);\n\t\t}\n\t}\n}\n\nexport { GDrive };\n\nasync function authFromCode(gdrive, options) {\n\tconst httpResponse = await fetch(TOKEN_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n\t\tbody: \"client_id=\" + gdrive.clientId +\n\t\t\t\"&client_secret=\" + gdrive.clientKey +\n\t\t\t\"&grant_type=authorization_code\" +\n\t\t\t\"&code=\" + options.code +\n\t\t\t\"&redirect_uri=\" + browser.identity.getRedirectURL()\n\t});\n\tconst response = await getJSON(httpResponse);\n\tgdrive.accessToken = response.access_token;\n\tgdrive.refreshToken = response.refresh_token;\n\tgdrive.expirationDate = Date.now() + (response.expires_in * 1000);\n\treturn { accessToken: gdrive.accessToken, refreshToken: gdrive.refreshToken, expirationDate: gdrive.expirationDate };\n}\n\nasync function initAuth(gdrive, options) {\n\tlet code;\n\ttry {\n\t\tif (browser.identity && browser.identity.launchWebAuthFlow && !options.forceWebAuthFlow) {\n\t\t\tconst authURL = await browser.identity.launchWebAuthFlow({\n\t\t\t\tinteractive: options.interactive,\n\t\t\t\turl: gdrive.authURL\n\t\t\t});\n\t\t\toptions.code = new URLSearchParams(new URL(authURL).search).get(\"code\");\n\t\t\treturn await authFromCode(gdrive, options);\n\t\t} else if (options.launchWebAuthFlow) {\n\t\t\toptions.extractAuthCode(browser.identity.getRedirectURL())\n\t\t\t\t.then(authCode => code = authCode)\n\t\t\t\t.catch(() => { /* ignored */ });\n\t\t\treturn await options.launchWebAuthFlow({ url: gdrive.authURL });\n\t\t} else {\n\t\t\tthrow new Error(\"auth_not_supported\");\n\t\t}\n\t}\n\tcatch (error) {\n\t\tif (error.message && (error.message == \"code_required\" || error.message.includes(\"access\"))) {\n\t\t\tif (code) {\n\t\t\t\toptions.code = code;\n\t\t\t\treturn await authFromCode(gdrive, options);\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"code_required\");\n\t\t\t}\n\t\t} else {\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n\nfunction nativeAuth(options = {}) {\n\treturn Boolean(browser.identity && browser.identity.getAuthToken) && !options.forceWebAuthFlow;\n}\n\nasync function getParentFolderId(gdrive, filename, retry = true) {\n\tconst fileParts = filename.split(\"/\");\n\tfileParts.pop();\n\tconst folderId = gdrive.folderIds.get(fileParts.join(\"/\"));\n\tif (folderId) {\n\t\treturn folderId;\n\t}\n\tlet parentFolderId = \"root\";\n\tif (fileParts.length) {\n\t\tlet fullFolderName = \"\";\n\t\tfor (const folderName of fileParts) {\n\t\t\tif (fullFolderName) {\n\t\t\t\tfullFolderName += \"/\";\n\t\t\t}\n\t\t\tfullFolderName += folderName;\n\t\t\tconst folderId = gdrive.folderIds.get(fullFolderName);\n\t\t\tif (folderId) {\n\t\t\t\tparentFolderId = folderId;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tparentFolderId = await getOrCreateFolder(gdrive, folderName, parentFolderId);\n\t\t\t\t\tgdrive.folderIds.set(fullFolderName, parentFolderId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (error.message == \"path_not_found\" && retry) {\n\t\t\t\t\t\tgdrive.folderIds.clear();\n\t\t\t\t\t\treturn getParentFolderId(gdrive, filename, false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn parentFolderId;\n}\n\nasync function getOrCreateFolder(gdrive, folderName, parentFolderId) {\n\tconst response = await getFolder(gdrive, folderName, parentFolderId);\n\tif (response.files.length) {\n\t\treturn response.files[0].id;\n\t} else {\n\t\tconst response = await createFolder(gdrive, folderName, parentFolderId);\n\t\treturn response.id;\n\t}\n}\n\nasync function getFolder(gdrive, folderName, parentFolderId) {\n\tconst httpResponse = await fetch(GDRIVE_URL + \"?q=mimeType = 'application/vnd.google-apps.folder' and name = '\" + folderName + \"' and trashed != true and '\" + parentFolderId + \"' in parents\", {\n\t\theaders: {\n\t\t\t\"Authorization\": \"Bearer \" + gdrive.accessToken\n\t\t}\n\t});\n\treturn getJSON(httpResponse);\n}\n\nasync function createFolder(gdrive, folderName, parentFolderId) {\n\tconst httpResponse = await fetch(GDRIVE_URL, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Authorization\": \"Bearer \" + gdrive.accessToken,\n\t\t\t\"Content-Type\": \"application/json\"\n\t\t},\n\t\tbody: JSON.stringify({\n\t\t\tname: folderName,\n\t\t\tparents: [parentFolderId],\n\t\t\tmimeType: \"application/vnd.google-apps.folder\"\n\t\t})\n\t});\n\treturn getJSON(httpResponse);\n}\n\nasync function sendFile(mediaUploader) {\n\tlet content = mediaUploader.file, end = mediaUploader.file.size;\n\tif (mediaUploader.offset || mediaUploader.chunkSize) {\n\t\tif (mediaUploader.chunkSize) {\n\t\t\tend = Math.min(mediaUploader.offset + mediaUploader.chunkSize, mediaUploader.file.size);\n\t\t}\n\t\tcontent = content.slice(mediaUploader.offset, end);\n\t}\n\tconst httpResponse = await fetch(mediaUploader.url, {\n\t\tmethod: \"PUT\",\n\t\theaders: {\n\t\t\t\"Authorization\": \"Bearer \" + mediaUploader.token,\n\t\t\t\"Content-Type\": mediaUploader.contentType,\n\t\t\t\"Content-Range\": \"bytes \" + mediaUploader.offset + \"-\" + (end - 1) + \"/\" + mediaUploader.file.size,\n\t\t\t\"X-Upload-Content-Type\": mediaUploader.contentType\n\t\t},\n\t\tbody: content\n\t});\n\tif (mediaUploader.onProgress && !mediaUploader.cancelled) {\n\t\tmediaUploader.onProgress(mediaUploader.offset + mediaUploader.chunkSize, mediaUploader.file.size);\n\t}\n\tif (httpResponse.status == 200 || httpResponse.status == 201) {\n\t\treturn httpResponse.json();\n\t} else if (httpResponse.status == 308) {\n\t\tconst range = httpResponse.headers.get(\"Range\");\n\t\tif (range) {\n\t\t\tmediaUploader.offset = parseInt(range.match(/\\d+/g).pop(), 10) + 1;\n\t\t}\n\t\tif (mediaUploader.cancelled) {\n\t\t\tthrow new Error(\"upload_cancelled\");\n\t\t} else {\n\t\t\treturn sendFile(mediaUploader);\n\t\t}\n\t} else {\n\t\tgetResponse(httpResponse);\n\t}\n}\n\nasync function getJSON(httpResponse) {\n\thttpResponse = getResponse(httpResponse);\n\tconst response = await httpResponse.json();\n\tif (response.error) {\n\t\tthrow new Error(response.error);\n\t} else {\n\t\treturn response;\n\t}\n}\n\nfunction getResponse(httpResponse) {\n\tif (httpResponse.status == 200) {\n\t\treturn httpResponse;\n\t} else if (httpResponse.status == 404) {\n\t\tthrow new Error(\"path_not_found\");\n\t} else if (httpResponse.status == 401) {\n\t\tthrow new Error(\"invalid_token\");\n\t} else {\n\t\tthrow new Error(\"unknown_error (\" + httpResponse.status + \")\");\n\t}\n}"
  },
  {
    "path": "src/lib/github/github.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global fetch, btoa, Blob, FileReader, AbortController */\n\nconst EMPTY_STRING = \"\";\nconst CONFLICT_ACTION_SKIP = \"skip\";\nconst CONFLICT_ACTION_UNIQUIFY = \"uniquify\";\nconst CONFLICT_ACTION_OVERWRITE = \"overwrite\";\nconst CONFLICT_ACTION_PROMPT = \"prompt\";\nconst AUTHORIZATION_HEADER = \"Authorization\";\nconst BEARER_PREFIX_AUTHORIZATION = \"Bearer \";\nconst ACCEPT_HEADER = \"Accept\";\nconst GITHUB_API_CONTENT_TYPE = \"application/vnd.github+json\";\nconst GITHUB_API_VERSION_HEADER = \"X-GitHub-Api-Version\";\nconst GITHUB_API_VERSION = \"2022-11-28\";\nconst EXTENSION_SEPARATOR = \".\";\nconst INDEX_FILENAME_PREFIX = \" (\";\nconst INDEX_FILENAME_SUFFIX = \")\";\nconst INDEX_FILENAME_REGEXP = /\\s\\((\\d+)\\)$/;\nconst ABORT_ERROR_NAME = \"AbortError\";\nconst GET_METHOD = \"GET\";\nconst PUT_METHOD = \"PUT\";\nconst GITHUB_URL = \"https://github.com\";\nconst GITHUB_API_URL = \"https://api.github.com\";\nconst BLOB_PATH = \"blob\";\nconst REPOS_PATH = \"repos\";\nconst CONTENTS_PATH = \"contents\";\n\nexport { GitHub };\n\nlet pendingPush;\n\nclass GitHub {\n\tconstructor(token, userName, repositoryName, branch) {\n\t\tthis.headers = new Map([\n\t\t\t[AUTHORIZATION_HEADER, BEARER_PREFIX_AUTHORIZATION + token],\n\t\t\t[ACCEPT_HEADER, GITHUB_API_CONTENT_TYPE],\n\t\t\t[GITHUB_API_VERSION_HEADER, GITHUB_API_VERSION]\n\t\t]);\n\t\tthis.userName = userName;\n\t\tthis.repositoryName = repositoryName;\n\t\tthis.branch = branch;\n\t}\n\n\tasync upload(path, content, options) {\n\t\tthis.controller = new AbortController();\n\t\toptions.signal = this.controller.signal;\n\t\toptions.headers = this.headers;\n\t\tconst base64Content = content instanceof Blob ? await blobToBase64(content) : btoa(unescape(encodeURIComponent(content)));\n\t\treturn upload(this.userName, this.repositoryName, this.branch, path, base64Content, options);\n\t}\n\n\tabort() {\n\t\tif (this.controller) {\n\t\t\tthis.controller.abort();\n\t\t}\n\t}\n}\n\nasync function upload(userName, repositoryName, branch, path, content, options) {\n\tconst { filenameConflictAction, prompt, signal, headers } = options;\n\twhile (pendingPush) {\n\t\tawait pendingPush;\n\t}\n\ttry {\n\t\tpendingPush = await createContent({ path, content });\n\t} finally {\n\t\tpendingPush = null;\n\t}\n\treturn {\n\t\turl: `${GITHUB_URL}/${userName}/${repositoryName}/${BLOB_PATH}/${branch}/${path}`\n\t};\n\n\tasync function createContent({ path, content, message = EMPTY_STRING, sha }) {\n\t\ttry {\n\t\t\tconst response = await fetchContentData(PUT_METHOD, JSON.stringify({\n\t\t\t\tcontent,\n\t\t\t\tmessage,\n\t\t\t\tbranch,\n\t\t\t\tsha\n\t\t\t}));\n\t\t\tconst responseData = await response.json();\n\t\t\tif (response.status == 422) {\n\t\t\t\tif (filenameConflictAction == CONFLICT_ACTION_OVERWRITE) {\n\t\t\t\t\tconst response = await fetchContentData(GET_METHOD);\n\t\t\t\t\tconst responseData = await response.json();\n\t\t\t\t\tconst sha = responseData.sha;\n\t\t\t\t\treturn await createContent({ path, content, message, sha });\n\t\t\t\t} else if (filenameConflictAction == CONFLICT_ACTION_UNIQUIFY) {\n\t\t\t\t\tconst { filenameWithoutExtension, extension, indexFilename } = splitFilename(path);\n\t\t\t\t\toptions.indexFilename = indexFilename + 1;\n\t\t\t\t\tpath = getFilename(filenameWithoutExtension, extension);\n\t\t\t\t\treturn await createContent({ path, content, message });\n\t\t\t\t} else if (filenameConflictAction == CONFLICT_ACTION_SKIP) {\n\t\t\t\t\treturn responseData;\n\t\t\t\t} else if (filenameConflictAction == CONFLICT_ACTION_PROMPT) {\n\t\t\t\t\tif (prompt) {\n\t\t\t\t\t\tpath = await prompt(path);\n\t\t\t\t\t\tif (path) {\n\t\t\t\t\t\t\treturn await createContent({ path, content, message });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn responseData;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\toptions.filenameConflictAction = CONFLICT_ACTION_UNIQUIFY;\n\t\t\t\t\t\treturn await createContent({ path, content, message });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (response.status < 400) {\n\t\t\t\treturn responseData;\n\t\t\t} else {\n\t\t\t\tthrow new Error(responseData.message);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error.name != ABORT_ERROR_NAME) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tfunction fetchContentData(method, body) {\n\t\t\treturn fetch(`${GITHUB_API_URL}/${REPOS_PATH}/${userName}/${repositoryName}/${CONTENTS_PATH}/${path}`, {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t\tbody,\n\t\t\t\tsignal\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction splitFilename(filename) {\n\t\tlet filenameWithoutExtension = filename;\n\t\tlet extension = EMPTY_STRING;\n\t\tconst indexExtensionSeparator = filename.lastIndexOf(EXTENSION_SEPARATOR);\n\t\tif (indexExtensionSeparator > -1) {\n\t\t\tfilenameWithoutExtension = filename.substring(0, indexExtensionSeparator);\n\t\t\textension = filename.substring(indexExtensionSeparator + 1);\n\t\t}\n\t\tlet indexFilename;\n\t\t({ filenameWithoutExtension, indexFilename } = extractIndexFilename(filenameWithoutExtension));\n\t\treturn { filenameWithoutExtension, extension, indexFilename };\n\t}\n\n\tfunction extractIndexFilename(filenameWithoutExtension) {\n\t\tconst indexFilenameMatch = filenameWithoutExtension.match(INDEX_FILENAME_REGEXP);\n\t\tlet indexFilename = 0;\n\t\tif (indexFilenameMatch && indexFilenameMatch.length > 1) {\n\t\t\tconst parsedIndexFilename = Number(indexFilenameMatch[indexFilenameMatch.length - 1]);\n\t\t\tif (!Number.isNaN(parsedIndexFilename)) {\n\t\t\t\tindexFilename = parsedIndexFilename;\n\t\t\t\tfilenameWithoutExtension = filenameWithoutExtension.replace(INDEX_FILENAME_REGEXP, EMPTY_STRING);\n\t\t\t}\n\t\t}\n\t\treturn { filenameWithoutExtension, indexFilename };\n\t}\n\n\tfunction getFilename(filenameWithoutExtension, extension) {\n\t\treturn filenameWithoutExtension +\n\t\t\tINDEX_FILENAME_PREFIX + options.indexFilename + INDEX_FILENAME_SUFFIX +\n\t\t\t(extension ? EXTENSION_SEPARATOR + extension : EMPTY_STRING);\n\t}\n}\n\nfunction blobToBase64(blob) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onloadend = () => resolve(reader.result.match(/^data:[^,]+,(.*)$/)[1]);\n\t\treader.onerror = event => reject(event.detail);\n\t\treader.readAsDataURL(blob);\n\t});\n}"
  },
  {
    "path": "src/lib/mcp/mcp.js",
    "content": "/*\n * Copyright 2010-2025 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global fetch, Blob, AbortController */\n\nconst EMPTY_STRING = \"\";\nconst CONFLICT_ACTION_SKIP = \"skip\";\nconst CONFLICT_ACTION_UNIQUIFY = \"uniquify\";\nconst CONFLICT_ACTION_OVERWRITE = \"overwrite\";\nconst CONFLICT_ACTION_PROMPT = \"prompt\";\nconst EXTENSION_SEPARATOR = \".\";\nconst INDEX_FILENAME_PREFIX = \" (\";\nconst INDEX_FILENAME_SUFFIX = \")\";\nconst INDEX_FILENAME_REGEXP = /\\s\\((\\d+)\\)$/;\nconst ABORT_ERROR_NAME = \"AbortError\";\nconst CONTENT_TYPE_HEADER = \"Content-Type\";\nconst JSON_CONTENT_TYPE = \"application/json\";\nconst MCP_JSONRPC_VERSION = \"2.0\";\n\nexport { MCP };\n\nclass MCP {\n    constructor(serverUrl, authToken) {\n        this.serverUrl = serverUrl;\n        this.authToken = authToken;\n        this.requestId = 0;\n    }\n\n    async upload(path, content, options) {\n        this.controller = new AbortController();\n        options.signal = this.controller.signal;\n        options.serverUrl = this.serverUrl;\n        options.authToken = this.authToken;\n        options.getRequestId = () => ++this.requestId;\n        let textContent;\n        if (content instanceof Blob) {\n            textContent = await content.text();\n        } else {\n            textContent = content;\n        }\n\n        return upload(path, textContent, options);\n    }\n\n    abort() {\n        if (this.controller) {\n            this.controller.abort();\n        }\n    }\n}\n\nasync function upload(path, content, options) {\n    const { filenameConflictAction, prompt, signal, serverUrl, authToken, getRequestId } = options;\n\n    try {\n        const existsResponse = await checkFileExists(serverUrl, authToken, path, signal, getRequestId);\n\n        if (existsResponse.exists) {\n            if (filenameConflictAction == CONFLICT_ACTION_SKIP) {\n                return { url: path, skipped: true };\n            } else if (filenameConflictAction == CONFLICT_ACTION_OVERWRITE) {\n                // Continue to write\n            } else if (filenameConflictAction == CONFLICT_ACTION_UNIQUIFY) {\n                const { filenameWithoutExtension, extension, indexFilename } = splitFilename(path);\n                options.indexFilename = indexFilename + 1;\n                path = getFilename(filenameWithoutExtension, extension, options.indexFilename);\n                return await upload(path, content, options);\n            } else if (filenameConflictAction == CONFLICT_ACTION_PROMPT) {\n                if (prompt) {\n                    path = await prompt(path);\n                    if (path) {\n                        return await upload(path, content, options);\n                    } else {\n                        return { url: path, skipped: true };\n                    }\n                } else {\n                    options.filenameConflictAction = CONFLICT_ACTION_UNIQUIFY;\n                    return await upload(path, content, options);\n                }\n            }\n        }\n\n        const writeResponse = await writeFile(serverUrl, authToken, path, content, signal, getRequestId);\n\n        if (writeResponse.success) {\n            return { url: path };\n        } else {\n            throw new Error(writeResponse.error || \"Failed to write file via MCP\");\n        }\n    } catch (error) {\n        if (error.name != ABORT_ERROR_NAME) {\n            throw error;\n        }\n    }\n}\n\nasync function checkFileExists(serverUrl, authToken, path, signal, getRequestId) {\n    const requestBody = {\n        jsonrpc: MCP_JSONRPC_VERSION,\n        id: getRequestId(),\n        method: \"tools/call\",\n        params: {\n            name: \"get_file_info\",\n            arguments: {\n                path: path\n            }\n        }\n    };\n\n    const headers = {\n        [CONTENT_TYPE_HEADER]: JSON_CONTENT_TYPE,\n        \"Accept\": \"application/json, text/event-stream\"\n    };\n    if (authToken) {\n        headers.Authorization = `Bearer ${authToken}`;\n    }\n    const response = await fetch(serverUrl, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify(requestBody),\n        signal\n    });\n    if (!response.ok) {\n        throw new Error(`MCP server error: ${response.status} ${response.statusText}`);\n    }\n    const data = await response.json();\n    if (data.error) {\n        return { exists: false };\n    }\n    if (data.result && data.result.isError) {\n        return { exists: false };\n    }\n    if (data.result) {\n        return { exists: true };\n    }\n    return { exists: false };\n}\n\nasync function writeFile(serverUrl, authToken, path, content, signal, getRequestId) {\n    const requestBody = {\n        jsonrpc: MCP_JSONRPC_VERSION,\n        id: getRequestId(),\n        method: \"tools/call\",\n        params: {\n            name: \"write_file\",\n            arguments: {\n                path: path,\n                content: content\n            }\n        }\n    };\n    const headers = {\n        [CONTENT_TYPE_HEADER]: JSON_CONTENT_TYPE,\n        \"Accept\": \"application/json, text/event-stream\"\n    };\n    if (authToken) {\n        headers.Authorization = `Bearer ${authToken}`;\n    }\n    const response = await fetch(serverUrl, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify(requestBody),\n        signal\n    });\n    if (!response.ok) {\n        throw new Error(`MCP server error: ${response.status} ${response.statusText}`);\n    }\n    const data = await response.json();\n    if (data.error) {\n        throw new Error(data.error.message);\n    }\n    return { success: true };\n}\n\nfunction splitFilename(filename) {\n    let filenameWithoutExtension = filename;\n    let extension = EMPTY_STRING;\n    const indexExtensionSeparator = filename.lastIndexOf(EXTENSION_SEPARATOR);\n    if (indexExtensionSeparator > -1) {\n        filenameWithoutExtension = filename.substring(0, indexExtensionSeparator);\n        extension = filename.substring(indexExtensionSeparator + 1);\n    }\n    let indexFilename;\n    ({ filenameWithoutExtension, indexFilename } = extractIndexFilename(filenameWithoutExtension));\n    return { filenameWithoutExtension, extension, indexFilename };\n}\n\nfunction extractIndexFilename(filenameWithoutExtension) {\n    const indexFilenameMatch = filenameWithoutExtension.match(INDEX_FILENAME_REGEXP);\n    let indexFilename = 0;\n    if (indexFilenameMatch && indexFilenameMatch.length > 1) {\n        const parsedIndexFilename = Number(indexFilenameMatch[indexFilenameMatch.length - 1]);\n        if (!Number.isNaN(parsedIndexFilename)) {\n            indexFilename = parsedIndexFilename;\n            filenameWithoutExtension = filenameWithoutExtension.replace(INDEX_FILENAME_REGEXP, EMPTY_STRING);\n        }\n    }\n    return { filenameWithoutExtension, indexFilename };\n}\n\nfunction getFilename(filenameWithoutExtension, extension, indexFilename) {\n    return filenameWithoutExtension +\n        INDEX_FILENAME_PREFIX + indexFilename + INDEX_FILENAME_SUFFIX +\n        (extension ? EXTENSION_SEPARATOR + extension : EMPTY_STRING);\n}\n"
  },
  {
    "path": "src/lib/mhtml-to-html/convert.js",
    "content": "/* global URL */\n\nimport {\n    decodeMimeHeader,\n    parseDOM,\n    decodeBase64,\n    decodeBinary,\n    getCharset,\n    getResourceURI,\n    resolvePath,\n    isStylesheet,\n    EVENT_HANDLER_ATTRIBUTES\n} from \"./util.js\";\nimport * as cssTree from \"./vendor/csstree.esm.js\";\nimport * as srcsetParser from \"./srcset-parser.js\";\n\nconst BASE64_ENCODING = \"base64\";\nconst HREF_ATTRIBUTE = \"href\";\nconst SRC_ATTRIBUTE = \"src\";\nconst TITLE_ATTRIBUTE = \"title\";\nconst SRCSET_ATTRIBUTE = \"srcset\";\nconst SRCDOC_ATTRIBUTE = \"srcdoc\";\nconst CONTENT_ATTRIBUTE = \"content\";\nconst STYLE_ATTRIBUTE = \"style\";\nconst MEDIA_ATTRIBUTE = \"media\";\nconst BACKGROUND_ATTRIBUTE = \"background\";\nconst REL_ATTRIBUTE = \"rel\";\nconst DATA_ATTRIBUTE = \"data\";\nconst TYPE_ATTRIBUTE = \"type\";\nconst PING_ATTRIBUTE = \"ping\";\nconst HTTP_EQUIV_ATTRIBUTE = \"http-equiv\";\nconst INTEGRITY_ATTRIBUTE = \"integrity\";\nconst CHARSET_ATTRIBUTE = \"charset\";\nconst SHADOWMODE_ATTRIBUTE = \"shadowmode\";\nconst SHADOWROOTMODE_ATTRIBUTE = \"shadowrootmode\";\nconst SIZES_ATTRIBUTE = \"sizes\";\nconst STYLESHEET_CONTENT_TYPE = \"text/css\";\nconst CID_PROTOCOL = \"cid:\";\nconst DATA_PROTOCOL = \"data:\";\nconst HTTP_PROTOCOL = \"http:\";\nconst HTTPS_PROTOCOL = \"https:\";\nconst URN_PROTOCOL = \"urn:\";\nconst AT_RULE = \"Atrule\";\nconst IMPORT_RULE = \"import\";\nconst URL_FUNCTION = \"Url\";\nconst STYLESHEET_CONTEXT = \"stylesheet\";\nconst DECLARATION_LIST_CONTEXT = \"declarationList\";\nconst BASE_TAG = \"BASE\";\nconst LINK_TAG = \"LINK\";\nconst STYLE_TAG = \"STYLE\";\nconst IMG_TAG = \"IMG\";\nconst AUDIO_TAG = \"AUDIO\";\nconst VIDEO_TAG = \"VIDEO\";\nconst SOURCE_TAG = \"SOURCE\";\nconst SCRIPT_TAG = \"SCRIPT\";\nconst BODY_TAG = \"BODY\";\nconst TABLE_TAG = \"TABLE\";\nconst TD_TAG = \"TD\";\nconst TH_TAG = \"TH\";\nconst INPUT_TAG = \"INPUT\";\nconst IFRAME_TAG = \"IFRAME\";\nconst FRAME_TAG = \"FRAME\";\nconst EMBED_TAG = \"EMBED\";\nconst OBJECT_TAG = \"OBJECT\";\nconst A_TAG = \"A\";\nconst AREA_TAG = \"AREA\";\nconst META_TAG = \"META\";\nconst TEMPLATE_TAG = \"TEMPLATE\";\nconst HEAD_TAG = \"HEAD\";\nconst TITLE_TAG = \"TITLE\";\nconst ORIGINAL_URL_FUNCTION_NAME = \"--mhtml-to-html-url\";\nconst ORIGINAL_URL_ATTRIBUTE_PREFIX = \"data-original-\";\nconst CONTENT_TYPE_HEADER = \"Content-Type\";\nconst REL_ATTRIBUTE_STYLESHEET = \"stylesheet\";\nconst REL_ATTRIBUTE_ICON = \"icon\";\nconst REL_ATTRIBUTE_CANONICAL = \"canonical\";\nconst REL_ATTRIBUTE_ALTERNATE = \"alternate\";\nconst HTTP_EQUIV_ATTRIBUTE_REFRESH = \"refresh\";\nconst HTTP_EQUIV_ATTRIBUTE_CSP = \"content-security-policy\";\nconst TYPE_ATTRIBUTE_IMAGE = \"image\";\nconst REL_REMOVED_VALUES_REGEXP = /(preconnect|prerender|dns-prefetch|preload|prefetch|manifest|modulepreload)/gi;\nconst URN_ERROR_REGEXP = /^urn:[^:]+:(.+)$/;\nconst APPLICATION_OCTET_STREAM_CONTENT_TYPE = \"application/octet-stream\";\nconst JSON_LD_CONTENT_TYPE = \"application/ld+json\";\nconst TEXT_HTML_CONTENT_TYPE = \"text/html\";\nconst UTF8_CHARSET = \"utf-8\";\nconst INDEX_PAGE_NOT_FOUND_ERROR = \"Index page not found\";\nconst CID_REGEXP = /^<.+>$/;\nconst CONTENT_TYPE_SEPARATOR = \";\";\nconst DATA_URI_PAYLOAD_SEPARATOR = \",\";\nconst EMPTY_STRING = \"\";\nconst ORIGINAL_URL_FUNCTION_REGEXP = /url\\(--mhtml-to-html-url\\\\\\(\\\\\"(.*?)\\\\\"\\\\\\)\\\\ /g;\nconst ORIGINAL_URL_COMMENT = \"/* original URL: $1 */ url(\";\nconst DEFAULT_CSP = \"default-src 'none'; connect-src 'self' data:; font-src 'self' data:; img-src 'self' data:; style-src 'self' 'unsafe-inline' data:; frame-src 'self' data:; media-src 'self' data:; object-src 'self' data:; \";\nconst JS_ENABLED_CSP = \"script-src 'self' 'unsafe-inline' data:;\";\nconst JS_DISABLED_CSP = \"script-src 'none';\";\nconst CSS_FUNCTION_PARENTHESIS_START = \"(\";\nconst CSS_FUNCTION_PARENTHESIS_END = \") \";\nconst SUBJECT_HEADER = \"Subject\";\nconst DATE_HEADER = \"Date\";\nconst FROM_HEADER = \"From\";\nconst JSON_LD_PAGE_INFO = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": \"WebPage\",\n    \"additionalProperty\": {\n        \"@type\": \"PropertyValue\",\n        \"name\": \"savedBy\"\n    }\n};\n\nexport default fetchAndConvert;\n\nasync function fetchAndConvert(mhtml, config, failedResources = []) {\n    if (config.fetchMissingResources) {\n        let { fetch } = config;\n        let missingResources = [];\n        if (!fetch) {\n            fetch = globalThis.fetch;\n        }\n        missingResources = convert(mhtml, config);\n        missingResources = missingResources.filter(resource => !failedResources.includes(resource.id));\n        if (missingResources.length) {\n            await Promise.all(missingResources.map(async resource => {\n                const { id, transferEncoding } = resource;\n                let url = id;\n                const urnErrorMatch = url.match(URN_ERROR_REGEXP);\n                if (urnErrorMatch) {\n                    url = urnErrorMatch[1];\n                }\n                try {\n                    const response = await fetch(url);\n                    if (response.ok) {\n                        resource.contentType = response.headers.get(CONTENT_TYPE_HEADER) || APPLICATION_OCTET_STREAM_CONTENT_TYPE;\n                        if (transferEncoding === BASE64_ENCODING) {\n                            const bytes = await response.bytes();\n                            resource.data = decodeBinary(bytes);\n                        } else {\n                            resource.data = await response.text();\n                        }\n                        mhtml.resources[id] = resource;\n                    } else if (!failedResources.includes(id)) {\n                        failedResources.push(id);\n                    }\n                    // eslint-disable-next-line no-unused-vars\n                } catch (_) {\n                    if (!failedResources.includes(id)) {\n                        failedResources.push(id);\n                    }\n                }\n            }));\n            return fetchAndConvert(mhtml, config, failedResources);\n        } else {\n            return convert(mhtml, { ...config, fetchMissingResources: false });\n        }\n    } else {\n        return convert(mhtml, config);\n    }\n}\n\nfunction convert({ headers, frames, resources, unfoundResources = new Set(), index, id }, { DOMParser, enableScripts, fetchMissingResources } = { DOMParser: globalThis.DOMParser }) {\n    let resource = resources[index];\n    if (!resource) {\n        throw new Error(INDEX_PAGE_NOT_FOUND_ERROR);\n    }\n    let base = resource.id;\n    if (resource.transferEncoding === BASE64_ENCODING) {\n        resource.transferEncoding = undefined;\n        resource.data = decodeBase64(resource.data, getCharset(resource.contentType));\n    }\n    const contentType = resource.contentType.split(CONTENT_TYPE_SEPARATOR)[0];\n    const dom = parseDOM(resource.data, contentType, DOMParser);\n    const document = dom.document;\n    let nodes = [document];\n    const baseElement = document.getElementsByTagName(BASE_TAG)[0];\n    if (baseElement) {\n        const href = baseElement.getAttribute(HREF_ATTRIBUTE);\n        if (href) {\n            base = resolvePath(href, base);\n        }\n        baseElement.remove();\n    }\n    if (!fetchMissingResources) {\n        resource.used = true;\n    }\n    nodes = [document];\n    let canonicalLinkElement;\n    const stylesheets = {};\n    const missingResources = [];\n    const removedNodes = [];\n    const favicons = [];\n    let title;\n    while (nodes.length) {\n        const childNode = nodes.shift();\n        if (childNode.childNodes) {\n            for (const child of childNode.childNodes) {\n                let href, src;\n                if (child.getAttribute) {\n                    href = child.getAttribute(HREF_ATTRIBUTE);\n                    if (href) {\n                        href = resolvePath(href, base);\n                    }\n                    src = child.getAttribute(SRC_ATTRIBUTE);\n                    if (src) {\n                        src = resolvePath(src, base);\n                    }\n                    const style = child.getAttribute(STYLE_ATTRIBUTE);\n                    if (style) {\n                        const declarations = replaceStylesheetUrls(resources, base, { data: style }, { context: DECLARATION_LIST_CONTEXT }, stylesheets, fetchMissingResources && missingResources, unfoundResources);\n                        if (!fetchMissingResources) {\n                            child.setAttribute(STYLE_ATTRIBUTE, declarations);\n                        }\n                    }\n                    const integrity = child.getAttribute(INTEGRITY_ATTRIBUTE);\n                    if (integrity) {\n                        child.removeAttribute(INTEGRITY_ATTRIBUTE);\n                    }\n                }\n                if (!enableScripts && child.removeAttribute) {\n                    EVENT_HANDLER_ATTRIBUTES.forEach(attribute => child.removeAttribute(attribute));\n                }\n                if (child.tagName && child.tagName.toUpperCase() === LINK_TAG && href) {\n                    let rel = child.getAttribute(REL_ATTRIBUTE);\n                    if (rel) {\n                        rel = rel.toLowerCase();\n                        if (rel === REL_ATTRIBUTE_STYLESHEET) {\n                            resource = getResource(resources, href, child.getAttribute(HREF_ATTRIBUTE));\n                            if (resource) {\n                                let base = resource.id;\n                                if (base.startsWith(CID_PROTOCOL)) {\n                                    if (index.match(CID_REGEXP)) {\n                                        base = id;\n                                    } else {\n                                        base = index;\n                                    }\n                                }\n                                const stylesheet = replaceStylesheetUrls(resources, base, resource, { context: STYLESHEET_CONTEXT }, stylesheets, fetchMissingResources && missingResources, unfoundResources);\n                                if (!fetchMissingResources) {\n                                    const styleElement = document.createElement(STYLE_TAG);\n                                    styleElement.type = STYLESHEET_CONTENT_TYPE;\n                                    const media = child.getAttribute(MEDIA_ATTRIBUTE);\n                                    if (media) {\n                                        styleElement.setAttribute(MEDIA_ATTRIBUTE, media);\n                                    }\n                                    resource.used = true;\n                                    resource.data = stylesheet;\n                                    if (!href.startsWith(DATA_PROTOCOL)) {\n                                        styleElement.setAttribute(ORIGINAL_URL_ATTRIBUTE_PREFIX + HREF_ATTRIBUTE, href);\n                                    }\n                                    styleElement.appendChild(document.createTextNode(resource.data));\n                                    child.replaceWith(styleElement);\n                                }\n                            } else if (fetchMissingResources) {\n                                addMissingResource(missingResources, href);\n                            } else {\n                                unfoundResources.add(href);\n                                setAttribute(child, HREF_ATTRIBUTE, href);\n                            }\n                            if (!fetchMissingResources) {\n                                const title = child.getAttribute(TITLE_ATTRIBUTE);\n                                if (title && rel.includes(REL_ATTRIBUTE_ALTERNATE)) {\n                                    removedNodes.push(child);\n                                }\n                            }\n                        } else if (rel.includes(REL_ATTRIBUTE_ICON)) {\n                            resource = getResource(resources, href, child.getAttribute(HREF_ATTRIBUTE));\n                            const media = child.getAttribute(MEDIA_ATTRIBUTE);\n                            const type = child.getAttribute(TYPE_ATTRIBUTE);\n                            const sizes = child.getAttribute(SIZES_ATTRIBUTE);\n                            if (resource) {\n                                if (!fetchMissingResources) {\n                                    resource.used = true;\n                                    const resourceURI = getResourceURI(resource);\n                                    setAttribute(child, HREF_ATTRIBUTE, resourceURI);\n                                    favicons.push({ href: resourceURI, media, type, sizes, originalHref: href });\n                                }\n                            } else if (fetchMissingResources) {\n                                addMissingResource(missingResources, href, BASE64_ENCODING);\n                            } else {\n                                unfoundResources.add(href);\n                                setAttribute(child, HREF_ATTRIBUTE, href);\n                                favicons.push({ href, media, type, sizes });\n                            }\n                        } else if (rel == REL_ATTRIBUTE_CANONICAL && !fetchMissingResources) {\n                            canonicalLinkElement = child;\n                        }\n                        if (!fetchMissingResources) {\n                            const relValue = rel\n                                .replace(REL_REMOVED_VALUES_REGEXP, EMPTY_STRING)\n                                .trim();\n                            if (relValue.length) {\n                                child.setAttribute(REL_ATTRIBUTE, relValue);\n                            } else {\n                                removedNodes.push(child);\n                            }\n                        }\n                    }\n                } else if (child.tagName && child.tagName.toUpperCase() === STYLE_TAG) {\n                    const style = replaceStylesheetUrls(resources, base, { data: child.textContent }, { context: STYLESHEET_CONTEXT }, stylesheets, fetchMissingResources && missingResources, unfoundResources);\n                    if (!fetchMissingResources) {\n                        const styleElement = document.createElement(STYLE_TAG);\n                        styleElement.type = STYLESHEET_CONTENT_TYPE;\n                        const media = child.getAttribute(MEDIA_ATTRIBUTE);\n                        if (media) {\n                            styleElement.setAttribute(MEDIA_ATTRIBUTE, media);\n                        }\n                        styleElement.appendChild(document.createTextNode(style));\n                        child.replaceWith(styleElement);\n                    }\n                } else if (child.tagName && child.tagName.toUpperCase() === IMG_TAG || child.tagName && child.tagName.toUpperCase() === AUDIO_TAG || child.tagName && child.tagName.toUpperCase() === VIDEO_TAG || child.tagName && child.tagName.toUpperCase() === SOURCE_TAG || child.tagName && child.tagName.toUpperCase() === SCRIPT_TAG) {\n                    if (src) {\n                        resource = getResource(resources, src, child.getAttribute(SRC_ATTRIBUTE));\n                        if (resource) {\n                            if (!fetchMissingResources) {\n                                resource.used = true;\n                                setAttribute(child, SRC_ATTRIBUTE, getResourceURI(resource));\n                            }\n                        } else if (fetchMissingResources) {\n                            addMissingResource(missingResources, src, BASE64_ENCODING);\n                        } else {\n                            unfoundResources.add(src);\n                            setAttribute(child, SRC_ATTRIBUTE, src);\n                        }\n                    }\n                    if (child.tagName && child.tagName.toUpperCase() === IMG_TAG || child.tagName && child.tagName.toUpperCase() === SOURCE_TAG) {\n                        const srcset = child.getAttribute(SRCSET_ATTRIBUTE);\n                        if (srcset) {\n                            const srcsetData = srcsetParser.parse(srcset).map(data => {\n                                const src = resolvePath(data.url, base);\n                                const resource = getResource(resources, src, data.url);\n                                if (resource) {\n                                    if (!fetchMissingResources) {\n                                        resource.used = true;\n                                        data.url = getResourceURI(resource);\n                                    }\n                                } else if (fetchMissingResources) {\n                                    addMissingResource(missingResources, src, BASE64_ENCODING);\n                                } else {\n                                    unfoundResources.add(src);\n                                    data.url = src;\n                                }\n                                return data;\n                            });\n                            if (!fetchMissingResources) {\n                                setAttribute(child, SRCSET_ATTRIBUTE, srcsetParser.serialize(srcsetData));\n                            }\n                        }\n                    } else if (child.tagName && child.tagName.toUpperCase() === SCRIPT_TAG && !fetchMissingResources) {\n                        let type = child.getAttribute(TYPE_ATTRIBUTE);\n                        if (type) {\n                            type = type.toLowerCase();\n                        }\n                        if (!enableScripts && (!type || type !== JSON_LD_CONTENT_TYPE)) {\n                            removedNodes.push(child);\n                        }\n                    }\n                } else if (child.tagName && child.tagName.toUpperCase() === BODY_TAG || child.tagName && child.tagName.toUpperCase() === TABLE_TAG || child.tagName && child.tagName.toUpperCase() === TD_TAG || child.tagName && child.tagName.toUpperCase() === TH_TAG) {\n                    let background = child.getAttribute(BACKGROUND_ATTRIBUTE);\n                    if (background && !background.startsWith(DATA_PROTOCOL)) {\n                        background = resolvePath(background, base);\n                        resource = getResource(resources, background, child.getAttribute(BACKGROUND_ATTRIBUTE));\n                        if (resource) {\n                            if (!fetchMissingResources) {\n                                resource.used = true;\n                                setAttribute(child, BACKGROUND_ATTRIBUTE, getResourceURI(resource));\n                            }\n                        } else if (fetchMissingResources) {\n                            addMissingResource(missingResources, background, BASE64_ENCODING);\n                        } else {\n                            unfoundResources.add(background);\n                            setAttribute(child, BACKGROUND_ATTRIBUTE, background);\n                        }\n                    }\n                } else if (child.tagName && child.tagName.toUpperCase() === INPUT_TAG) {\n                    const type = child.getAttribute(TYPE_ATTRIBUTE);\n                    if (type && type.toLowerCase() === TYPE_ATTRIBUTE_IMAGE && src) {\n                        resource = getResource(resources, src, child.getAttribute(SRC_ATTRIBUTE));\n                        if (resource) {\n                            if (!fetchMissingResources) {\n                                resource.used = true;\n                                setAttribute(child, SRC_ATTRIBUTE, getResourceURI(resource));\n                            }\n                        } else if (fetchMissingResources) {\n                            addMissingResource(missingResources, src, BASE64_ENCODING);\n                        } else {\n                            unfoundResources.add(src);\n                            setAttribute(child, SRC_ATTRIBUTE, src);\n                        }\n                    }\n                } else if (child.tagName && child.tagName.toUpperCase() === IFRAME_TAG || child.tagName && child.tagName.toUpperCase() === FRAME_TAG || child.tagName && child.tagName.toUpperCase() === EMBED_TAG || child.tagName && child.tagName.toUpperCase() === OBJECT_TAG) {\n                    let id, attribute;\n                    if (child.tagName && child.tagName.toUpperCase() === OBJECT_TAG) {\n                        attribute = DATA_ATTRIBUTE;\n                        src = child.getAttribute(DATA_ATTRIBUTE);\n                        if (src) {\n                            src = resolvePath(src, base);\n                        }\n                    } else {\n                        attribute = SRC_ATTRIBUTE;\n                    }\n                    if (src) {\n                        if (src.startsWith(CID_PROTOCOL)) {\n                            id = `<${src.split(CID_PROTOCOL)[1]}>`;\n                            resource = frames[id];\n                        } else {\n                            id = src;\n                            resource = getResource(resources, src, child.getAttribute(attribute));\n                        }\n                        if (resource) {\n                            if (child.tagName && child.tagName.toUpperCase() === EMBED_TAG || child.tagName && child.tagName.toUpperCase() === OBJECT_TAG) {\n                                if (!fetchMissingResources) {\n                                    resource.used = true;\n                                    setAttribute(child, attribute, getResourceURI(resource));\n                                }\n                            } else {\n                                const result = convert({\n                                    resources: Object.assign({}, resources, { [id]: resource }),\n                                    unfoundResources,\n                                    frames: frames,\n                                    index: id,\n                                    id: resource.id\n                                }, { DOMParser, enableScripts, fetchMissingResources });\n                                if (fetchMissingResources) {\n                                    for (const missingResource of result) {\n                                        if (!missingResources.find(resource => resource.id === missingResource.id)) {\n                                            missingResources.push(missingResource);\n                                        }\n                                    }\n                                } else {\n                                    resource.used = true;\n                                    if (child.tagName && child.tagName.toUpperCase() === IFRAME_TAG) {\n                                        setAttribute(child, SRC_ATTRIBUTE);\n                                        child.removeAttribute(SRC_ATTRIBUTE);\n                                        child.setAttribute(SRCDOC_ATTRIBUTE, result.data);\n                                    } else {\n                                        setAttribute(child, attribute, DATA_PROTOCOL + TEXT_HTML_CONTENT_TYPE + DATA_URI_PAYLOAD_SEPARATOR + encodeURIComponent(result.data));\n                                    }\n                                }\n                            }\n                        } else if (fetchMissingResources) {\n                            addMissingResource(missingResources, src);\n                        } else {\n                            unfoundResources.add(src);\n                            setAttribute(child, attribute, src);\n                        }\n                    }\n                } else if ((child.tagName && child.tagName.toUpperCase() === A_TAG || child.tagName && child.tagName.toUpperCase() === AREA_TAG) && !fetchMissingResources) {\n                    if (href) {\n                        try {\n                            const url = new URL(child.getAttribute(HREF_ATTRIBUTE), base);\n                            const hash = url.hash;\n                            url.hash = EMPTY_STRING;\n                            if (url == base && hash) {\n                                child.setAttribute(HREF_ATTRIBUTE, hash);\n                            } else {\n                                child.setAttribute(HREF_ATTRIBUTE, href);\n                            }\n                            // eslint-disable-next-line no-unused-vars\n                        } catch (_) {\n                            child.setAttribute(HREF_ATTRIBUTE, href);\n                        }\n                    }\n                    child.removeAttribute(PING_ATTRIBUTE);\n                } else if (child.tagName && child.tagName.toUpperCase() === META_TAG && !fetchMissingResources) {\n                    let httpEquiv = child.getAttribute(HTTP_EQUIV_ATTRIBUTE);\n                    if (httpEquiv) {\n                        httpEquiv = httpEquiv.toLowerCase();\n                        if (httpEquiv === HTTP_EQUIV_ATTRIBUTE_REFRESH || httpEquiv === HTTP_EQUIV_ATTRIBUTE_CSP) {\n                            removedNodes.push(child);\n                        }\n                    }\n                } else if (child.tagName && child.tagName.toUpperCase() === TEMPLATE_TAG && !fetchMissingResources) {\n                    const shadowModeAttribute = child.getAttribute(SHADOWMODE_ATTRIBUTE);\n                    if (shadowModeAttribute) {\n                        child.removeAttribute(SHADOWMODE_ATTRIBUTE);\n                        child.setAttribute(SHADOWROOTMODE_ATTRIBUTE, shadowModeAttribute);\n                    }\n                    if (child.content) {\n                        child.content.childNodes.forEach(node => nodes.push(node));\n                    }\n                } else if (child.tagName && child.tagName.toUpperCase() === TITLE_TAG && !fetchMissingResources && childNode.tagName && childNode.tagName.toUpperCase() === HEAD_TAG && title === undefined && child.textContent) {\n                    title = child.textContent;\n                }\n                nodes.push(child);\n            }\n        }\n    }\n    if (fetchMissingResources) {\n        return missingResources;\n    } else {\n        removedNodes.forEach(node => node.remove());\n        if (!canonicalLinkElement) {\n            const linkElement = document.createElement(LINK_TAG);\n            linkElement.setAttribute(REL_ATTRIBUTE, REL_ATTRIBUTE_CANONICAL);\n            linkElement.setAttribute(HREF_ATTRIBUTE, index);\n            document.head.appendChild(linkElement);\n        }\n        let metaElement = document.createElement(META_TAG);\n        metaElement.setAttribute(HTTP_EQUIV_ATTRIBUTE, HTTP_EQUIV_ATTRIBUTE_CSP);\n        let csp = DEFAULT_CSP;\n        if (enableScripts) {\n            csp += JS_ENABLED_CSP;\n        } else {\n            csp += JS_DISABLED_CSP;\n        }\n        metaElement.setAttribute(CONTENT_ATTRIBUTE, csp);\n        if (document.head.firstChild) {\n            document.head.prepend(metaElement);\n        } else {\n            document.head.appendChild(metaElement);\n        }\n        metaElement.setAttribute(CONTENT_ATTRIBUTE, csp);\n        metaElement = document.createElement(META_TAG);\n        metaElement.setAttribute(CHARSET_ATTRIBUTE, UTF8_CHARSET);\n        document.head.prepend(metaElement);\n        if (headers) {\n            const pageInfoElement = document.createElement(SCRIPT_TAG);\n            pageInfoElement.setAttribute(TYPE_ATTRIBUTE, JSON_LD_CONTENT_TYPE);\n            pageInfoElement.appendChild(document.createTextNode(JSON.stringify(getPageInfo(headers, index), null, 2)));\n            if (document.head.firstChild) {\n                document.head.firstChild.after(pageInfoElement);\n            } else {\n                document.head.appendChild(pageInfoElement);\n            }\n        }\n        if (unfoundResources.size) {\n            unfoundResources.forEach(id => {\n                if (!id.startsWith(DATA_PROTOCOL)) {\n                    resources[id] = { id, notFound: true, used: true };\n                }\n            });\n        }\n        return {\n            title,\n            favicons,\n            data: dom.serialize()\n        };\n    }\n}\n\nfunction setAttribute(element, attribute, newValue) {\n    const value = element.getAttribute(attribute);\n    if (value && !value.startsWith(DATA_PROTOCOL) && value !== newValue) {\n        element.setAttribute(ORIGINAL_URL_ATTRIBUTE_PREFIX + attribute, value);\n    }\n    if (newValue !== undefined) {\n        element.setAttribute(attribute, newValue);\n    }\n}\n\nfunction replaceStylesheetUrls(resources, base, resource, options = {}, stylesheets, missingResources, unfoundResources) {\n    let ast;\n    if (resource.id !== undefined) {\n        if (stylesheets[resource.id]) {\n            return stylesheets[resource.id].data;\n        } else {\n            stylesheets[resource.id] = {};\n        }\n    }\n    try {\n        ast = cssTree.parse(resource.data, options);\n        // eslint-disable-next-line no-unused-vars\n    } catch (_) {\n        // ignored\n    }\n    if (ast) {\n        cssTree.walk(ast, node => {\n            if (node.type === URL_FUNCTION) {\n                const path = node.value;\n                if (!path.startsWith(DATA_PROTOCOL) && !path.startsWith(ORIGINAL_URL_FUNCTION_NAME)) {\n                    const id = resolvePath(path, base);\n                    const resource = getResource(resources, id, path);\n                    if (resource) {\n                        if (!missingResources) {\n                            resource.used = true;\n                            if (isStylesheet(resource.contentType)) {\n                                resource.data = replaceStylesheetUrls(resources, resource.id, resource, { context: STYLESHEET_CONTEXT }, stylesheets, missingResources, unfoundResources);\n                            }\n                            node.value = getOriginalUrlFunction(id, getResourceURI(resource));\n                        }\n                    } else if (missingResources) {\n                        addMissingResource(missingResources, id, BASE64_ENCODING);\n                    } else {\n                        unfoundResources.add(id);\n                        node.value = getOriginalUrlFunction(id);\n                    }\n                }\n            } else if (node.type === AT_RULE && node.name.toLowerCase() === IMPORT_RULE) {\n                const path = node.prelude.children.first.value;\n                if (!path.startsWith(DATA_PROTOCOL) && !path.startsWith(ORIGINAL_URL_FUNCTION_NAME)) {\n                    const id = resolvePath(path, base);\n                    const resource = getResource(resources, id, path);\n                    if (resource) {\n                        resource.data = replaceStylesheetUrls(resources, resource.id, resource, { context: STYLESHEET_CONTEXT }, stylesheets, missingResources, unfoundResources);\n                        if (!missingResources) {\n                            resource.used = true;\n                            node.prelude.children.first.value = getOriginalUrlFunction(id, getResourceURI(resource));\n                        }\n                    } else if (missingResources) {\n                        addMissingResource(missingResources, id);\n                    } else {\n                        unfoundResources.add(id);\n                        node.prelude.children.first.value = getOriginalUrlFunction(id);\n                    }\n                }\n            }\n        });\n        try {\n            const result = cssTree.generate(ast);\n            if (resource.id !== undefined) {\n                stylesheets[resource.id].data = result;\n            }\n            return result.replace(ORIGINAL_URL_FUNCTION_REGEXP, ORIGINAL_URL_COMMENT);\n            // eslint-disable-next-line no-unused-vars\n        } catch (_) {\n            return resource.data;\n        }\n    } else {\n        return resource.data;\n    }\n}\n\nfunction getResource(resources, id, rawId) {\n    let resource = resources[id];\n    if (!resource) {\n        resource = resources[rawId];\n    }\n    return resource;\n}\n\nfunction addMissingResource(missingResources, id, transferEncoding) {\n    if ((id.startsWith(HTTP_PROTOCOL) || id.startsWith(HTTPS_PROTOCOL) || id.startsWith(URN_PROTOCOL)) && !missingResources.find(resource => resource.id === id)) {\n        missingResources.push({ id, transferEncoding });\n    }\n}\n\nfunction getOriginalUrlFunction(id, resourceURI = id) {\n    return ORIGINAL_URL_FUNCTION_NAME + CSS_FUNCTION_PARENTHESIS_START + JSON.stringify(id) + CSS_FUNCTION_PARENTHESIS_END + resourceURI;\n}\n\nfunction getPageInfo(headers, index) {\n    return {\n        ...JSON_LD_PAGE_INFO,\n        url: index,\n        name: decodeMimeHeader(headers[SUBJECT_HEADER]),\n        dateCreated: headers[DATE_HEADER],\n        additionalProperty: {\n            ...JSON_LD_PAGE_INFO.additionalProperty,\n            value: decodeMimeHeader(headers[FROM_HEADER])\n        }\n    };\n}\n"
  },
  {
    "path": "src/lib/mhtml-to-html/mod.js",
    "content": "/// <reference types=\"./mod.d.ts\" />\n\n// derived from https://github.com/msindwan/mhtml2html\n\n/**\n * The MIT License(MIT)\n *\n * Copyright(c) 2016 Mayank Sindwani (https://github.com/msindwan/mhtml2html)\n * Copyright(c) 2025 Gildas Lormeau\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files(the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and / or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions :\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport modConvert from \"./convert.js\";\nimport modParse from \"./parse.js\";\n\nexport { convert, parse };\n\nfunction convert(mhtml, config = {}) {\n    if (config.DOMParser === undefined && globalThis.DOMParser) {\n        config.DOMParser = globalThis.DOMParser;\n    }\n    if ((typeof mhtml === \"string\") || mhtml instanceof Uint8Array) {\n        mhtml = parse(mhtml, config);\n    }\n    return modConvert(mhtml, config);\n}\n\nfunction parse(data, config = {}) {\n    if (config.DOMParser === undefined && globalThis.DOMParser) {\n        config.DOMParser = globalThis.DOMParser;\n    }\n    return modParse(data, config);\n}\n"
  },
  {
    "path": "src/lib/mhtml-to-html/parse.js",
    "content": "import {\n    decodeQuotedPrintable,\n    decodeBinary,\n    parseDOM,\n    decodeString,\n    encodeString,\n    getCharset,\n    replaceCharset,\n    isDocument,\n    isStylesheet,\n    isText,\n    isMultipartAlternative,\n    getBoundary,\n    indexOf,\n    startsWithBoundary,\n    isLineFeed,\n    endsWithCRLF,\n    endsWithLF\n} from \"./util.js\";\nimport * as cssTree from \"./vendor/csstree.esm.js\";\n\nconst MHTML_HEADERS = 0;\nconst MTHML_CONTENT = 1;\nconst MHTML_DATA = 2;\nconst MHTML_END = 3;\nconst STRING_TYPE = \"string\";\nconst HEADER_SEPARATOR = \":\";\nconst QUOTED_PRINTABLE_ENCODING = \"quoted-printable\";\nconst BINARY_ENCODING = \"binary\";\nconst CONTENT_TYPE_HEADER = \"content-type\";\nconst CONTENT_TRANSFER_ENCODING_HEADER = \"content-transfer-encoding\";\nconst CONTENT_ID_HEADER = \"content-id\";\nconst CONTENT_LOCATION_HEADER = \"content-location\";\nconst BASE64_ENCODING = \"base64\";\nconst UTF8_CHARSET = \"utf-8\";\nconst META_TAG = \"META\";\nconst CONTENT_ATTRIBUTE = \"content\";\nconst CHARSET_ATTRIBUTE = \"charset\";\nconst HTTP_EQUIV_ATTRIBUTE = \"http-equiv\";\nconst AT_RULE = \"Atrule\";\nconst CHARSET_IDENTIFIER = \"charset\";\nconst RANDOM_ID_PREFIX = \"_\";\n\nexport default parse;\n\nfunction parse(mhtml, { DOMParser } = { DOMParser: globalThis.DOMParser }, context = { resources: {}, frames: {} }) {\n    // deno-lint-ignore valid-typeof\n    if (typeof mhtml === STRING_TYPE) {\n        mhtml = encodeString(mhtml);\n    }\n    const headers = {};\n    const { resources, frames } = context;\n    let resource, transferEncoding, boundary, headerKey;\n    let content = {};\n    let state = MHTML_HEADERS;\n    let indexMhtml = 0;\n    let indexStartEmbeddedMhtml;\n    while (state !== MHTML_END && indexMhtml < mhtml.length - 1) {\n        let next;\n        if (state === MHTML_HEADERS) {\n            next = getLine();\n            if (!isLineFeed(next)) {\n                splitHeaders(next, headers);\n            } else {\n                if (headers[CONTENT_TYPE_HEADER]) {\n                    boundary = getBoundary(headers[CONTENT_TYPE_HEADER]);\n                }\n                if (boundary) {\n                    while (indexOf(next, boundary) === -1 && indexMhtml < mhtml.length - 1) {\n                        next = getLine();\n                    }\n                } else {\n                    const previousIndex = indexMhtml;\n                    next = getLine(transferEncoding);\n                    if (!boundary && startsWithBoundary(next)) {\n                        boundary = decodeString(next);\n                    } else {\n                        indexMhtml = previousIndex;\n                    }\n                }\n                content = {};\n                state = MTHML_CONTENT;\n            }\n        } else if (state === MTHML_CONTENT) {\n            if (boundary) {\n                if (indexStartEmbeddedMhtml === undefined) {\n                    indexStartEmbeddedMhtml = indexMhtml;\n                }\n                next = getLine();\n                if (!isLineFeed(next)) {\n                    splitHeaders(next, content);\n                } else {\n                    initResource(content);\n                    if (!resource.contentType || !isMultipartAlternative(resource.contentType)) {\n                        indexStartEmbeddedMhtml = undefined;\n                    }\n                    state = MHTML_DATA;\n                }\n            } else {\n                initResource(headers);\n                state = MHTML_DATA;\n            }\n        } else if (state === MHTML_DATA) {\n            const indexEndData = parseResourceData();\n            if (indexStartEmbeddedMhtml !== undefined && indexEndData !== undefined) {\n                resource.used = true;\n                context.index = convertEmbeddedMhtml(indexEndData);\n            } else {\n                processResource();\n            }\n            state = (indexMhtml >= mhtml.length - 1 ? MHTML_END : MTHML_CONTENT);\n        }\n    }\n    return { headers, frames, resources, index: context.index };\n\n    function getLine(transferEncoding) {\n        const indexStart = indexMhtml;\n        while (!isLineFeed([mhtml[indexMhtml]]) && indexMhtml++ < mhtml.length - 1);\n        indexMhtml++;\n        const line = mhtml.slice(indexStart, indexMhtml);\n        return transferEncoding === QUOTED_PRINTABLE_ENCODING ? decodeQuotedPrintable(line) : line;\n    }\n\n    function splitHeaders(line, obj) {\n        const lineString = decodeString(line);\n        const indexColumn = lineString.indexOf(HEADER_SEPARATOR);\n        if (indexColumn > -1) {\n            headerKey = lineString.substring(0, indexColumn).trim().toLowerCase();\n            obj[headerKey] = lineString.substring(indexColumn + 1, lineString.length).trim();\n        } else {\n            obj[headerKey] += lineString.trim();\n        }\n    }\n\n    function initResource(resourceData) {\n        transferEncoding = resourceData[CONTENT_TRANSFER_ENCODING_HEADER];\n        const contentType = resourceData[CONTENT_TYPE_HEADER];\n        const contentId = resourceData[CONTENT_ID_HEADER];\n        let id = resourceData[CONTENT_LOCATION_HEADER];\n        if (transferEncoding) {\n            transferEncoding = transferEncoding.toLowerCase();\n        }\n        resource = {\n            transferEncoding,\n            contentType,\n            data: [],\n            id\n        };\n        if (id === undefined) {\n            if (contentId !== undefined) {\n                id = contentId;\n            } else {\n                do {\n                    id = RANDOM_ID_PREFIX + Math.random().toString(36).substring(2);\n                } while (resources[id]);\n            }\n            resource.id = id;\n        }\n        if (context.index === undefined && isDocument(contentType)) {\n            context.index = id;\n        }\n        if (contentId !== undefined) {\n            frames[contentId] = resource;\n        }\n        if (!resources[id]) {\n            resources[id] = resource;\n        }\n        content = {};\n    }\n\n    function parseResourceData() {\n        let next = getLine(transferEncoding);\n        let indexEndData, boundaryFound;\n        while (!boundaryFound && indexMhtml < mhtml.length - 1) {\n            indexEndData = indexMhtml;\n            const indexBoundary = indexOf(next, boundary);\n            if (indexBoundary !== -1) {\n                indexEndData = indexEndData - next.length + indexBoundary - 2;\n                if (indexBoundary > 2) {\n                    next = next.slice(0, indexBoundary - 2);\n                } else {\n                    next = [];\n                }\n                boundaryFound = true;\n            }\n            if (resource.transferEncoding === QUOTED_PRINTABLE_ENCODING) {\n                if (resource.data.length > 2 && resource.data[resource.data.length - 3] === 0x3D && endsWithCRLF(next)) {\n                    resource.data.splice(resource.data.length - 3, 3);\n                } else if (resource.data.length > 1 && resource.data[resource.data.length - 2] === 0x3D && endsWithLF(next)) {\n                    resource.data.splice(resource.data.length - 2, 2);\n                }\n            } else if (resource.transferEncoding === BASE64_ENCODING) {\n                if (endsWithCRLF(next)) {\n                    next = next.slice(0, next.length - 2);\n                } else if (endsWithLF(next)) {\n                    next = next.slice(0, next.length - 1);\n                }\n            }\n            resource.data.splice(resource.data.length, 0, ...next);\n            if (!boundaryFound) {\n                next = getLine(transferEncoding);\n            }\n        }\n        if (!boundaryFound && boundary) {\n            indexEndData = indexMhtml;\n        }\n        return indexEndData;\n    }\n\n    function convertEmbeddedMhtml(indexEnd) {\n        const context = { resources, frames };\n        if (endsWithCRLF(mhtml)) {\n            indexEnd -= 2;\n        } else if (endsWithLF(mhtml)) {\n            indexEnd--;\n        }\n        parse(mhtml.slice(indexStartEmbeddedMhtml, indexEnd), { DOMParser }, context);\n        return context.index;\n    }\n\n    function processResource() {\n        resource.data = resource.rawData = new Uint8Array(resource.data);\n        const charset = resource.contentType ? getCharset(resource.contentType) : undefined;\n        if (resource.transferEncoding === BINARY_ENCODING && (!resource.contentType || !isText(resource.contentType))) {\n            resource.transferEncoding = BASE64_ENCODING;\n            resource.data = decodeBinary(resource.data);\n        } else {\n            resource.data = decodeString(resource.data, charset);\n        }\n        if (resource.contentType) {\n            resource.contentType = replaceCharset(resource.contentType, UTF8_CHARSET);\n            if (isStylesheet(resource.contentType)) {\n                processStylesheetCharset(charset);\n            } else if (isDocument(resource.contentType)) {\n                processDocumentCharset(charset);\n            }\n        }\n        delete resource.rawData;\n    }\n\n    function processStylesheetCharset(charset) {\n        try {\n            let ast = cssTree.parse(resource.data);\n            if (ast.children.first && ast.children.first.type === AT_RULE && ast.children.first.name.toLowerCase() === CHARSET_IDENTIFIER) {\n                const charsetNode = ast.children.first;\n                const cssCharset = charsetNode.prelude.children.first.value.toLowerCase();\n                if (cssCharset !== UTF8_CHARSET && cssCharset !== charset) {\n                    resource.data = decodeString(resource.rawData, cssCharset);\n                    ast = cssTree.parse(resource.data);\n                }\n                ast.children.remove(ast.children.head);\n                resource.data = cssTree.generate(ast);\n            }\n            // eslint-disable-next-line no-unused-vars\n        } catch (_) {\n            // ignored\n        }\n    }\n\n    function processDocumentCharset(charset) {\n        const contentType = resource.contentType.split(\";\")[0];\n        let dom = parseDOM(resource.data, contentType, DOMParser);\n        let charserMetaElement = getMetaCharsetElement(dom.document.documentElement);\n        if (charserMetaElement) {\n            let htmlCharset = charserMetaElement.getAttribute(CHARSET_ATTRIBUTE);\n            if (htmlCharset) {\n                htmlCharset = htmlCharset.toLowerCase();\n                if (htmlCharset !== UTF8_CHARSET && htmlCharset !== charset) {\n                    resource.data = decodeString(resource.rawData, charset);\n                    dom = parseDOM(resource.data, contentType, DOMParser);\n                    charserMetaElement = getMetaCharsetElement(dom.document.documentElement);\n                }\n            }\n            if (charserMetaElement) {\n                charserMetaElement.remove();\n            }\n            resource.data = dom.serialize();\n        }\n        let metaElement = getMetaContentTypeElement(dom.document);\n        if (metaElement) {\n            const contentType = metaElement.getAttribute(CONTENT_ATTRIBUTE);\n            const htmlCharset = getCharset(contentType);\n            if (htmlCharset && htmlCharset !== UTF8_CHARSET && htmlCharset !== charset) {\n                resource.data = decodeString(resource.rawData, htmlCharset);\n                dom = parseDOM(resource.data, contentType, DOMParser);\n                metaElement = getMetaContentTypeElement(dom.document.documentElement);\n            }\n            if (metaElement) {\n                metaElement.remove();\n            }\n            resource.data = dom.serialize();\n        }\n    }\n}\n\nfunction getMetaCharsetElement(document) {\n    const metaElements = document.getElementsByTagName(META_TAG);\n    return Array.from(metaElements).find(metaElement => metaElement.getAttribute(CHARSET_ATTRIBUTE));\n}\n\nfunction getMetaContentTypeElement(document) {\n    const metaElements = document.getElementsByTagName(META_TAG);\n    return Array.from(metaElements).find(metaElement => metaElement.getAttribute(HTTP_EQUIV_ATTRIBUTE)\n        && metaElement.getAttribute(HTTP_EQUIV_ATTRIBUTE).toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase());\n}\n"
  },
  {
    "path": "src/lib/mhtml-to-html/srcset-parser.js",
    "content": "// deno-lint-ignore-file no-control-regex\n\n// derived from https://github.com/albell/parse-srcset\n\n/*\n * The MIT License (MIT)\n * \n * Author: Gildas Lormeau\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Srcset Parser\n *\n * By Alex Bell |  MIT License\n *\n * JS Parser for the string value that appears in markup <img srcset=\"here\">\n *\n * @returns Array [{url: _, d: _, w: _, h:_}, ...]\n *\n * Based super duper closely on the reference algorithm at:\n * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute\n *\n * Most comments are copied in directly from the spec\n * (except for comments in parens).\n */\n\nexport { parse, serialize };\n\n// 1. Let input be the value passed to this algorithm.\nfunction parse(input) {\n\n\t// UTILITY FUNCTIONS\n\n\t// Manual is faster than RegEx\n\t// http://bjorn.tipling.com/state-and-regular-expressions-in-javascript\n\t// http://jsperf.com/whitespace-character/5\n\tfunction isSpace(c) {\n\t\treturn (c === \"\\u0020\" || // space\n\t\t\tc === \"\\u0009\" || // horizontal tab\n\t\t\tc === \"\\u000A\" || // new line\n\t\t\tc === \"\\u000C\" || // form feed\n\t\t\tc === \"\\u000D\");  // carriage return\n\t}\n\n\tfunction collectCharacters(regEx) {\n\t\tlet chars;\n\t\tconst match = regEx.exec(input.substring(pos));\n\t\tif (match) {\n\t\t\tchars = match[0];\n\t\t\tpos += chars.length;\n\t\t\treturn chars;\n\t\t}\n\t}\n\n\tconst inputLength = input.length;\n\n\t// (Don\"t use \\s, to avoid matching non-breaking space)\n\t/* eslint-disable no-control-regex */\n\tconst regexLeadingSpaces = /^[ \\t\\n\\r\\u000c]+/;\n\tconst regexLeadingCommasOrSpaces = /^[, \\t\\n\\r\\u000c]+/;\n\tconst regexLeadingNotSpaces = /^[^ \\t\\n\\r\\u000c]+/;\n\tconst regexTrailingCommas = /[,]+$/;\n\tconst regexNonNegativeInteger = /^\\d+$/;\n\t/* eslint-enable no-control-regex */\n\n\t// ( Positive or negative or unsigned integers or decimals, without or without exponents.\n\t// Must include at least one digit.\n\t// According to spec tests any decimal point must be followed by a digit.\n\t// No leading plus sign is allowed.)\n\t// https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number\n\tconst regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;\n\n\tlet url, descriptors, currentDescriptor, state, c,\n\t\t// 2. Let position be a pointer into input, initially pointing at the start\n\t\t//    of the string.\n\t\tpos = 0;\n\t// 3. Let candidates be an initially empty source set.\n\tconst candidates = [];\n\n\t// 4. Splitting loop: Collect a sequence of characters that are space\n\t//    characters or U+002C COMMA characters. If any U+002C COMMA characters\n\t//    were collected, that is a parse error.\t\t\n\twhile (true) {\n\t\tcollectCharacters(regexLeadingCommasOrSpaces);\n\n\t\t// 5. If position is past the end of input, return candidates and abort these steps.\n\t\tif (pos >= inputLength) {\n\t\t\treturn candidates; // (we\"re done, this is the sole return path)\n\t\t}\n\n\t\t// 6. Collect a sequence of characters that are not space characters,\n\t\t//    and let that be url.\n\t\turl = collectCharacters(regexLeadingNotSpaces);\n\n\t\t// 7. Let descriptors be a new empty list.\n\t\tdescriptors = [];\n\n\t\t// 8. If url ends with a U+002C COMMA character (,), follow these substeps:\n\t\t//\t\t(1). Remove all trailing U+002C COMMA characters from url. If this removed\n\t\t//         more than one character, that is a parse error.\n\t\tif (url.slice(-1) === \",\") {\n\t\t\turl = url.replace(regexTrailingCommas, \"\");\n\t\t\t// (Jump ahead to step 9 to skip tokenization and just push the candidate).\n\t\t\tparseDescriptors();\n\n\t\t\t//\tOtherwise, follow these substeps:\n\t\t} else {\n\t\t\ttokenize();\n\t\t} // (close else of step 8)\n\n\t\t// 16. Return to the step labeled splitting loop.\n\t} // (Close of big while loop.)\n\n\t/**\n\t * Tokenizes descriptor properties prior to parsing\n\t * Returns undefined.\n\t */\n\tfunction tokenize() {\n\n\t\t// 8.1. Descriptor tokeniser: Skip whitespace\n\t\tcollectCharacters(regexLeadingSpaces);\n\n\t\t// 8.2. Let current descriptor be the empty string.\n\t\tcurrentDescriptor = \"\";\n\n\t\t// 8.3. Let state be in descriptor.\n\t\tstate = \"in descriptor\";\n\n\t\twhile (true) {\n\n\t\t\t// 8.4. Let c be the character at position.\n\t\t\tc = input.charAt(pos);\n\n\t\t\t//  Do the following depending on the value of state.\n\t\t\t//  For the purpose of this step, \"EOF\" is a special character representing\n\t\t\t//  that position is past the end of input.\n\n\t\t\t// In descriptor\n\t\t\tif (state === \"in descriptor\") {\n\t\t\t\t// Do the following, depending on the value of c:\n\n\t\t\t\t// Space character\n\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t// descriptors and let current descriptor be the empty string.\n\t\t\t\t// Set state to after descriptor.\n\t\t\t\tif (isSpace(c)) {\n\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t\tcurrentDescriptor = \"\";\n\t\t\t\t\t\tstate = \"after descriptor\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// U+002C COMMA (,)\n\t\t\t\t\t// Advance position to the next character in input. If current descriptor\n\t\t\t\t\t// is not empty, append current descriptor to descriptors. Jump to the step\n\t\t\t\t\t// labeled descriptor parser.\n\t\t\t\t} else if (c === \",\") {\n\t\t\t\t\tpos += 1;\n\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t}\n\t\t\t\t\tparseDescriptors();\n\t\t\t\t\treturn;\n\n\t\t\t\t\t// U+0028 LEFT PARENTHESIS (()\n\t\t\t\t\t// Append c to current descriptor. Set state to in parens.\n\t\t\t\t} else if (c === \"\\u0028\") {\n\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\tstate = \"in parens\";\n\n\t\t\t\t\t// EOF\n\t\t\t\t\t// If current descriptor is not empty, append current descriptor to\n\t\t\t\t\t// descriptors. Jump to the step labeled descriptor parser.\n\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\tif (currentDescriptor) {\n\t\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\t}\n\t\t\t\t\tparseDescriptors();\n\t\t\t\t\treturn;\n\n\t\t\t\t\t// Anything else\n\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t} else {\n\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t}\n\t\t\t\t// (end \"in descriptor\"\n\n\t\t\t\t// In parens\n\t\t\t} else if (state === \"in parens\") {\n\n\t\t\t\t// U+0029 RIGHT PARENTHESIS ())\n\t\t\t\t// Append c to current descriptor. Set state to in descriptor.\n\t\t\t\tif (c === \")\") {\n\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t\tstate = \"in descriptor\";\n\n\t\t\t\t\t// EOF\n\t\t\t\t\t// Append current descriptor to descriptors. Jump to the step labeled\n\t\t\t\t\t// descriptor parser.\n\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\tdescriptors.push(currentDescriptor);\n\t\t\t\t\tparseDescriptors();\n\t\t\t\t\treturn;\n\n\t\t\t\t\t// Anything else\n\t\t\t\t\t// Append c to current descriptor.\n\t\t\t\t} else {\n\t\t\t\t\tcurrentDescriptor = currentDescriptor + c;\n\t\t\t\t}\n\n\t\t\t\t// After descriptor\n\t\t\t} else if (state === \"after descriptor\") {\n\n\t\t\t\t// Do the following, depending on the value of c:\n\t\t\t\t// Space character: Stay in this state.\n\t\t\t\tif (isSpace(c)) {\n\n\t\t\t\t\t// EOF: Jump to the step labeled descriptor parser.\n\t\t\t\t} else if (c === \"\") {\n\t\t\t\t\tparseDescriptors();\n\t\t\t\t\treturn;\n\n\t\t\t\t\t// Anything else\n\t\t\t\t\t// Set state to in descriptor. Set position to the previous character in input.\n\t\t\t\t} else {\n\t\t\t\t\tstate = \"in descriptor\";\n\t\t\t\t\tpos -= 1;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Advance position to the next character in input.\n\t\t\tpos += 1;\n\n\t\t\t// Repeat this step.\n\t\t} // (close while true loop)\n\t}\n\n\t/**\n\t * Adds descriptor properties to a candidate, pushes to the candidates array\n\t * @return undefined\n\t */\n\t// Declared outside of the while loop so that it\"s only created once.\n\tfunction parseDescriptors() {\n\n\t\t// 9. Descriptor parser: Let error be no.\n\t\tlet pError = false,\n\n\t\t\t// 10. Let width be absent.\n\t\t\t// 11. Let density be absent.\n\t\t\t// 12. Let future-compat-h be absent. (We\"re implementing it now as h)\n\t\t\tw, d, h, i,\n\t\t\tdesc, lastChar, value, intVal, floatVal;\n\t\tconst candidate = {};\n\n\t\t// 13. For each descriptor in descriptors, run the appropriate set of steps\n\t\t// from the following list:\n\t\tfor (i = 0; i < descriptors.length; i++) {\n\t\t\tdesc = descriptors[i];\n\n\t\t\tlastChar = desc[desc.length - 1];\n\t\t\tvalue = desc.substring(0, desc.length - 1);\n\t\t\tintVal = parseInt(value, 10);\n\t\t\tfloatVal = parseFloat(value);\n\n\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t// a U+0077 LATIN SMALL LETTER W character\n\t\t\tif (regexNonNegativeInteger.test(value) && (lastChar === \"w\")) {\n\n\t\t\t\t// If width and density are not both absent, then let error be yes.\n\t\t\t\tif (w || d) { pError = true; }\n\n\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t// If the result is zero, let error be yes.\n\t\t\t\t// Otherwise, let width be the result.\n\t\t\t\tif (intVal === 0) { pError = true; } else { w = intVal; }\n\n\t\t\t\t// If the descriptor consists of a valid floating-point number followed by\n\t\t\t\t// a U+0078 LATIN SMALL LETTER X character\n\t\t\t} else if (regexFloatingPoint.test(value) && (lastChar === \"x\")) {\n\n\t\t\t\t// If width, density and future-compat-h are not all absent, then let error\n\t\t\t\t// be yes.\n\t\t\t\tif (w || d || h) { pError = true; }\n\n\t\t\t\t// Apply the rules for parsing floating-point number values to the descriptor.\n\t\t\t\t// If the result is less than zero, let error be yes. Otherwise, let density\n\t\t\t\t// be the result.\n\t\t\t\tif (floatVal < 0) { pError = true; } else { d = floatVal; }\n\n\t\t\t\t// If the descriptor consists of a valid non-negative integer followed by\n\t\t\t\t// a U+0068 LATIN SMALL LETTER H character\n\t\t\t} else if (regexNonNegativeInteger.test(value) && (lastChar === \"h\")) {\n\n\t\t\t\t// If height and density are not both absent, then let error be yes.\n\t\t\t\tif (h || d) { pError = true; }\n\n\t\t\t\t// Apply the rules for parsing non-negative integers to the descriptor.\n\t\t\t\t// If the result is zero, let error be yes. Otherwise, let future-compat-h\n\t\t\t\t// be the result.\n\t\t\t\tif (intVal === 0) { pError = true; } else { h = intVal; }\n\n\t\t\t\t// Anything else, Let error be yes.\n\t\t\t} else { pError = true; }\n\t\t} // (close step 13 for loop)\n\n\t\t// 15. If error is still no, then append a new image source to candidates whose\n\t\t// URL is url, associated with a width width if not absent and a pixel\n\t\t// density density if not absent. Otherwise, there is a parse error.\n\t\tif (!pError) {\n\t\t\tcandidate.url = url;\n\t\t\tif (w) { candidate.w = w; }\n\t\t\tif (d) { candidate.d = d; }\n\t\t\tif (h) { candidate.h = h; }\n\t\t\tcandidates.push(candidate);\n\t\t} else if (console && console.log) {  // eslint-disable-line no-console\n\t\t\tconsole.log(\"Invalid srcset descriptor found in \\\"\" + input + \"\\\" at \\\"\" + desc + \"\\\".\"); // eslint-disable-line no-console\n\t\t}\n\t} // (close parseDescriptors fn)\n\n}\n\nfunction serialize(srcset) {\n\treturn srcset.map(function (candidate) {\n\t\tlet descriptor = \"\";\n\t\tif (candidate.w) {\n\t\t\tdescriptor += candidate.w + \"w\";\n\t\t}\n\t\tif (candidate.h) {\n\t\t\tdescriptor += candidate.h + \"h\";\n\t\t}\n\t\tif (candidate.d) {\n\t\t\tdescriptor += candidate.d + \"x\";\n\t\t}\n\t\treturn candidate.url + (descriptor ? \" \" + descriptor : \"\");\n\t}).join(\", \");\n}\n"
  },
  {
    "path": "src/lib/mhtml-to-html/util.js",
    "content": "/* global URL, TextDecoder, TextEncoder, btoa, atob */\n\nconst EVENT_HANDLER_ATTRIBUTES = [\n    \"onafterprint\",\n    \"onbeforeprint\",\n    \"onbeforeunload\",\n    \"onhashchange\",\n    \"onlanguagechange\",\n    \"onmessage\",\n    \"onmessageerror\",\n    \"onoffline\",\n    \"ononline\",\n    \"onpagehide\",\n    \"onpageshow\",\n    \"onpopstate\",\n    \"onrejectionhandled\",\n    \"onstorage\",\n    \"onunhandledrejection\",\n    \"onunload\",\n    \"ongamepadconnected\",\n    \"ongamepaddisconnected\",\n    \"onabort\",\n    \"onblur\",\n    \"onfocus\",\n    \"oncancel\",\n    \"onauxclick\",\n    \"onbeforeinput\",\n    \"onbeforetoggle\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontentvisibilityautostatechange\",\n    \"oncontextlost\",\n    \"oncontextmenu\",\n    \"oncontextrestored\",\n    \"oncopy\",\n    \"oncuechange\",\n    \"oncut\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onformdata\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmouseenter\",\n    \"onmouseleave\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onwheel\",\n    \"onpaste\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onresize\",\n    \"onscroll\",\n    \"onscrollend\",\n    \"onsecuritypolicyviolation\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onslotchange\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\",\n    \"onselectstart\",\n    \"onselectionchange\",\n    \"ontoggle\",\n    \"onpointercancel\",\n    \"onpointerdown\",\n    \"onpointerup\",\n    \"onpointermove\",\n    \"onpointerout\",\n    \"onpointerover\",\n    \"onpointerenter\",\n    \"onpointerleave\",\n    \"ongotpointercapture\",\n    \"onlostpointercapture\",\n    \"onanimationcancel\",\n    \"onanimationend\",\n    \"onanimationiteration\",\n    \"onanimationstart\",\n    \"ontransitioncancel\",\n    \"ontransitionend\",\n    \"ontransitionrun\",\n    \"ontransitionstart\",\n    \"onerror\",\n    \"onfullscreenchange\",\n    \"onfullscreenerror\"\n];\n\nexport {\n    EVENT_HANDLER_ATTRIBUTES,\n    decodeQuotedPrintable,\n    decodeBinary,\n    decodeMimeHeader,\n    parseDOM,\n    decodeBase64,\n    decodeString,\n    encodeString,\n    getCharset,\n    replaceCharset,\n    isDocument,\n    isStylesheet,\n    isText,\n    isMultipartAlternative,\n    getBoundary,\n    indexOf,\n    startsWithBoundary,\n    isLineFeed,\n    endsWithCRLF,\n    endsWithLF,\n    getResourceURI,\n    resolvePath\n};\n\nfunction decodeQuotedPrintable(array) {\n    const result = [];\n    for (let i = 0; i < array.length; i++) {\n        if (array[i] === 0x3D) {\n            if (isHex(array[i + 1]) && isHex(array[i + 2])) {\n                const hex = parseInt(String.fromCharCode(array[i + 1], array[i + 2]), 16);\n                result.push(hex);\n                i += 2;\n            } else {\n                result.push(array[i]);\n            }\n        } else {\n            result.push(array[i]);\n        }\n    }\n    return new Uint8Array(result);\n\n    function isHex(value) {\n        return value >= 0x30 && value <= 0x39 || value >= 0x41 && value <= 0x46;\n    }\n}\n\nfunction decodeBinary(array) {\n    let data = \"\";\n    for (let indexData = 0; indexData < array.length; indexData++) {\n        data += String.fromCharCode(array[indexData]);\n    }\n    return btoa(data);\n}\n\nfunction decodeBase64(value, charset) {\n    const decodedData = new Uint8Array(atob(value).split(\"\").map(char => char.charCodeAt(0)));\n    return new TextDecoder(charset).decode(decodedData);\n}\n\nfunction decodeMimeHeader(encodedSubject) {\n    if (encodedSubject && encodedSubject.startsWith(\"=?\") && encodedSubject.endsWith(\"?=\")) {\n        const encodedSubjectParts = [];\n        let index = 0;\n        while (index < encodedSubject.length) {\n            const start = encodedSubject.indexOf(\"=?\", index);\n            if (start === -1) {\n                break;\n            }\n            const endCharset = encodedSubject.indexOf(\"?\", start + 2);\n            if (endCharset === -1) {\n                break;\n            }\n            const charset = encodedSubject.substring(start + 2, endCharset);\n            const endEncoding = encodedSubject.indexOf(\"?\", endCharset + 1);\n            if (endEncoding === -1) {\n                break;\n            }\n            const encoding = encodedSubject.substring(endCharset + 1, endEncoding);\n            const endValue = encodedSubject.indexOf(\"?=\", endEncoding + 1);\n            if (endValue === -1) {\n                break;\n            }\n            const value = encodedSubject.substring(endEncoding + 1, endValue);\n            index = endValue + 2;\n            if (encoding === \"Q\") {\n                encodedSubjectParts.push(new TextDecoder(charset).decode(decodeQuotedPrintable(new TextEncoder().encode(value))));\n            } else if (encoding === \"B\") {\n                encodedSubjectParts.push(decodeBase64(value, charset));\n            }\n        }\n        encodedSubject = encodedSubjectParts.join(\"\");\n    }\n    return encodedSubject || \"\";\n}\n\nfunction parseDOM(asset, contentType = \"text/html\", DOMParser = globalThis.DOMParser) {\n    let document;\n    try {\n        document = new DOMParser().parseFromString(asset, contentType);\n        // eslint-disable-next-line no-unused-vars\n    } catch (_) {\n        document = new DOMParser().parseFromString(asset, \"text/html\");\n    }\n    return {\n        document,\n        serialize() {\n            let result = \"\";\n            if (this.document.doctype) {\n                result += serializeDocType(this.document.doctype) + \"\\n\";\n            }\n            result += this.document.documentElement.outerHTML;\n            return result;\n        }\n    };\n}\n\nfunction serializeDocType(doctype) {\n    return `<!DOCTYPE ${doctype.name}${(doctype.publicId ? ` PUBLIC \"${doctype.publicId}\"` : \"\")}${(doctype.systemId ? ` \"${doctype.systemId}\"` : \"\")}>`;\n}\n\nfunction decodeString(array, charset) {\n    return new TextDecoder(charset).decode(array);\n}\n\nfunction encodeString(string, charset) {\n    return new TextEncoder(charset).encode(string);\n}\n\nfunction getCharset(contentType) {\n    const charsetMatch = contentType.match(/charset=([^;]+)/);\n    if (charsetMatch) {\n        return removeQuotes(charsetMatch[1]).toLowerCase();\n    }\n}\n\nfunction removeQuotes(value) {\n    return value.replace(/^\"(.*)\"$/, \"$1\").replace(/^'(.*)'$/, \"$1\").trim();\n}\n\nfunction replaceCharset(contentType, charset) {\n    return contentType.replace(/charset=([^;]+)/, `charset=${charset}`);\n}\n\nfunction isDocument(contentType) {\n    return contentType.startsWith(\"text/html\") || contentType.startsWith(\"application/xhtml+xml\");\n}\n\nfunction isStylesheet(contentType) {\n    return contentType.startsWith(\"text/css\");\n}\n\nfunction isText(contentType) {\n    return contentType.startsWith(\"text/\");\n}\n\nfunction isMultipartAlternative(contentType) {\n    return contentType.startsWith(\"multipart/alternative\");\n}\n\nfunction getBoundary(contentType) {\n    const contentTypeParams = contentType.split(\";\");\n    contentTypeParams.shift();\n    const boundaryParam = contentTypeParams.find(param => param.startsWith(\"boundary=\"));\n    if (boundaryParam) {\n        return removeQuotes(boundaryParam.substring(9));\n    }\n}\n\nfunction indexOf(array, string) {\n    const stringBytes = new TextEncoder().encode(string);\n    for (let i = 0; i < array.length; i++) {\n        if (array[i] === stringBytes[0]) {\n            let match = true;\n            for (let j = 1; j < stringBytes.length; j++) {\n                if (array[i + j] !== stringBytes[j]) {\n                    match = false;\n                    break;\n                }\n            }\n            if (match) {\n                // return index\n                return i;\n            }\n        }\n    }\n    return -1;\n}\n\nfunction isLineFeed(array) {\n    return array.length == 2 ? array[0] == 0x0D && array[1] == 0x0A : array.length == 1 ? array[0] == 0x0A : false;\n}\n\nfunction endsWithCRLF(array) {\n    return array.length >= 2 ? array[array.length - 2] == 0x0D && array[array.length - 1] == 0x0A : array.length >= 1 ? array[array.length - 1] == 0x0D : false;\n}\n\nfunction endsWithLF(array) {\n    return array.length >= 1 ? array[array.length - 1] == 0x0A : false;\n}\n\nfunction startsWithBoundary(array) {\n    return array.length >= 2 ? array[0] == 0x2D && array[1] == 0x2D : false;\n}\n\nfunction getResourceURI({ contentType, transferEncoding, data }) {\n    return `data:${contentType};${\"base64\"},${transferEncoding === \"base64\" ? data : btoa(unescape(encodeURIComponent(data)))}`;\n}\n\nfunction resolvePath(path, base) {\n    if (base && !path.startsWith(\"data:\")) {\n        try {\n            return new URL(path, base).href;\n            // eslint-disable-next-line no-unused-vars\n        } catch (_) {\n            if (path.startsWith(\"//\")) {\n                const protocol = base.match(/^[^:]+/);\n                if (protocol) {\n                    return `${protocol[0]}:${path}`;\n                } else {\n                    return path;\n                }\n            } else {\n                return path;\n            }\n        }\n    } else {\n        return path;\n    }\n}\n"
  },
  {
    "path": "src/lib/mhtml-to-html/vendor/LICENSE.txt",
    "content": "Copyright (C) 2016-2024 by Roman Dvornov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "src/lib/mhtml-to-html/vendor/README.md",
    "content": "This folder contains the distributable file of https://github.com/csstree/csstree"
  },
  {
    "path": "src/lib/mhtml-to-html/vendor/csstree.esm.js",
    "content": "// dist/csstree.esm.js from https://github.com/csstree/csstree/tree/b3fe3e026ce131aa559427162451a60792589730\n\n/*\n * Copyright (C) 2016-2024 by Roman Dvornov\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nvar Ra=Object.create;var or=Object.defineProperty;var Fa=Object.getOwnPropertyDescriptor;var Ma=Object.getOwnPropertyNames;var Ba=Object.getPrototypeOf,_a=Object.prototype.hasOwnProperty;var Me=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),f=(e,t)=>{for(var r in t)or(e,r,{get:t[r],enumerable:!0})},Wa=(e,t,r,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of Ma(t))!_a.call(e,i)&&i!==r&&or(e,i,{get:()=>t[i],enumerable:!(n=Fa(t,i))||n.enumerable});return e};var qa=(e,t,r)=>(r=e!=null?Ra(Ba(e)):{},Wa(t||!e||!e.__esModule?or(r,\"default\",{value:e,enumerable:!0}):r,e));var So=Me(fr=>{var vo=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");fr.encode=function(e){if(0<=e&&e<vo.length)return vo[e];throw new TypeError(\"Must be between 0 and 63: \"+e)};fr.decode=function(e){var t=65,r=90,n=97,i=122,o=48,s=57,u=43,c=47,a=26,l=52;return t<=e&&e<=r?e-t:n<=e&&e<=i?e-n+a:o<=e&&e<=s?e-o+l:e==u?62:e==c?63:-1}});var Eo=Me(br=>{var Co=So(),gr=5,To=1<<gr,Ao=To-1,Lo=To;function Za(e){return e<0?(-e<<1)+1:(e<<1)+0}function Ja(e){var t=(e&1)===1,r=e>>1;return t?-r:r}br.encode=function(t){var r=\"\",n,i=Za(t);do n=i&Ao,i>>>=gr,i>0&&(n|=Lo),r+=Co.encode(n);while(i>0);return r};br.decode=function(t,r,n){var i=t.length,o=0,s=0,u,c;do{if(r>=i)throw new Error(\"Expected more digits in base 64 VLQ value.\");if(c=Co.decode(t.charCodeAt(r++)),c===-1)throw new Error(\"Invalid base64 digit: \"+t.charAt(r-1));u=!!(c&Lo),c&=Ao,o=o+(c<<s),s+=gr}while(u);n.value=Ja(o),n.rest=r}});var Rt=Me(W=>{function el(e,t,r){if(t in e)return e[t];if(arguments.length===3)return r;throw new Error('\"'+t+'\" is a required argument.')}W.getArg=el;var zo=/^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/,tl=/^data:.+\\,.+$/;function lt(e){var t=e.match(zo);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}W.urlParse=lt;function Ge(e){var t=\"\";return e.scheme&&(t+=e.scheme+\":\"),t+=\"//\",e.auth&&(t+=e.auth+\"@\"),e.host&&(t+=e.host),e.port&&(t+=\":\"+e.port),e.path&&(t+=e.path),t}W.urlGenerate=Ge;var rl=32;function nl(e){var t=[];return function(r){for(var n=0;n<t.length;n++)if(t[n].input===r){var i=t[0];return t[0]=t[n],t[n]=i,t[0].result}var o=e(r);return t.unshift({input:r,result:o}),t.length>rl&&t.pop(),o}}var xr=nl(function(t){var r=t,n=lt(t);if(n){if(!n.path)return t;r=n.path}for(var i=W.isAbsolute(r),o=[],s=0,u=0;;)if(s=u,u=r.indexOf(\"/\",s),u===-1){o.push(r.slice(s));break}else for(o.push(r.slice(s,u));u<r.length&&r[u]===\"/\";)u++;for(var c,a=0,u=o.length-1;u>=0;u--)c=o[u],c===\".\"?o.splice(u,1):c===\"..\"?a++:a>0&&(c===\"\"?(o.splice(u+1,a),a=0):(o.splice(u,2),a--));return r=o.join(\"/\"),r===\"\"&&(r=i?\"/\":\".\"),n?(n.path=r,Ge(n)):r});W.normalize=xr;function Po(e,t){e===\"\"&&(e=\".\"),t===\"\"&&(t=\".\");var r=lt(t),n=lt(e);if(n&&(e=n.path||\"/\"),r&&!r.scheme)return n&&(r.scheme=n.scheme),Ge(r);if(r||t.match(tl))return t;if(n&&!n.host&&!n.path)return n.host=t,Ge(n);var i=t.charAt(0)===\"/\"?t:xr(e.replace(/\\/+$/,\"\")+\"/\"+t);return n?(n.path=i,Ge(n)):i}W.join=Po;W.isAbsolute=function(e){return e.charAt(0)===\"/\"||zo.test(e)};function il(e,t){e===\"\"&&(e=\".\"),e=e.replace(/\\/$/,\"\");for(var r=0;t.indexOf(e+\"/\")!==0;){var n=e.lastIndexOf(\"/\");if(n<0||(e=e.slice(0,n),e.match(/^([^\\/]+:\\/)?\\/*$/)))return t;++r}return Array(r+1).join(\"../\")+t.substr(e.length+1)}W.relative=il;var Io=function(){var e=Object.create(null);return!(\"__proto__\"in e)}();function Do(e){return e}function ol(e){return No(e)?\"$\"+e:e}W.toSetString=Io?Do:ol;function sl(e){return No(e)?e.slice(1):e}W.fromSetString=Io?Do:sl;function No(e){if(!e)return!1;var t=e.length;if(t<9||e.charCodeAt(t-1)!==95||e.charCodeAt(t-2)!==95||e.charCodeAt(t-3)!==111||e.charCodeAt(t-4)!==116||e.charCodeAt(t-5)!==111||e.charCodeAt(t-6)!==114||e.charCodeAt(t-7)!==112||e.charCodeAt(t-8)!==95||e.charCodeAt(t-9)!==95)return!1;for(var r=t-10;r>=0;r--)if(e.charCodeAt(r)!==36)return!1;return!0}function al(e,t,r){var n=ke(e.source,t.source);return n!==0||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0||r)||(n=e.generatedColumn-t.generatedColumn,n!==0)||(n=e.generatedLine-t.generatedLine,n!==0)?n:ke(e.name,t.name)}W.compareByOriginalPositions=al;function ll(e,t,r){var n;return n=e.originalLine-t.originalLine,n!==0||(n=e.originalColumn-t.originalColumn,n!==0||r)||(n=e.generatedColumn-t.generatedColumn,n!==0)||(n=e.generatedLine-t.generatedLine,n!==0)?n:ke(e.name,t.name)}W.compareByOriginalPositionsNoSource=ll;function cl(e,t,r){var n=e.generatedLine-t.generatedLine;return n!==0||(n=e.generatedColumn-t.generatedColumn,n!==0||r)||(n=ke(e.source,t.source),n!==0)||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0)?n:ke(e.name,t.name)}W.compareByGeneratedPositionsDeflated=cl;function ul(e,t,r){var n=e.generatedColumn-t.generatedColumn;return n!==0||r||(n=ke(e.source,t.source),n!==0)||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0)?n:ke(e.name,t.name)}W.compareByGeneratedPositionsDeflatedNoLine=ul;function ke(e,t){return e===t?0:e===null?1:t===null?-1:e>t?1:-1}function pl(e,t){var r=e.generatedLine-t.generatedLine;return r!==0||(r=e.generatedColumn-t.generatedColumn,r!==0)||(r=ke(e.source,t.source),r!==0)||(r=e.originalLine-t.originalLine,r!==0)||(r=e.originalColumn-t.originalColumn,r!==0)?r:ke(e.name,t.name)}W.compareByGeneratedPositionsInflated=pl;function hl(e){return JSON.parse(e.replace(/^\\)]}'[^\\n]*\\n/,\"\"))}W.parseSourceMapInput=hl;function ml(e,t,r){if(t=t||\"\",e&&(e[e.length-1]!==\"/\"&&t[0]!==\"/\"&&(e+=\"/\"),t=e+t),r){var n=lt(r);if(!n)throw new Error(\"sourceMapURL could not be parsed\");if(n.path){var i=n.path.lastIndexOf(\"/\");i>=0&&(n.path=n.path.substring(0,i+1))}t=Po(Ge(n),t)}return xr(t)}W.computeSourceURL=ml});var Ro=Me(Oo=>{var yr=Rt(),kr=Object.prototype.hasOwnProperty,Ne=typeof Map<\"u\";function we(){this._array=[],this._set=Ne?new Map:Object.create(null)}we.fromArray=function(t,r){for(var n=new we,i=0,o=t.length;i<o;i++)n.add(t[i],r);return n};we.prototype.size=function(){return Ne?this._set.size:Object.getOwnPropertyNames(this._set).length};we.prototype.add=function(t,r){var n=Ne?t:yr.toSetString(t),i=Ne?this.has(t):kr.call(this._set,n),o=this._array.length;(!i||r)&&this._array.push(t),i||(Ne?this._set.set(t,o):this._set[n]=o)};we.prototype.has=function(t){if(Ne)return this._set.has(t);var r=yr.toSetString(t);return kr.call(this._set,r)};we.prototype.indexOf=function(t){if(Ne){var r=this._set.get(t);if(r>=0)return r}else{var n=yr.toSetString(t);if(kr.call(this._set,n))return this._set[n]}throw new Error('\"'+t+'\" is not in the set.')};we.prototype.at=function(t){if(t>=0&&t<this._array.length)return this._array[t];throw new Error(\"No element indexed by \"+t)};we.prototype.toArray=function(){return this._array.slice()};Oo.ArraySet=we});var Bo=Me(Mo=>{var Fo=Rt();function dl(e,t){var r=e.generatedLine,n=t.generatedLine,i=e.generatedColumn,o=t.generatedColumn;return n>r||n==r&&o>=i||Fo.compareByGeneratedPositionsInflated(e,t)<=0}function Ft(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}Ft.prototype.unsortedForEach=function(t,r){this._array.forEach(t,r)};Ft.prototype.add=function(t){dl(this._last,t)?(this._last=t,this._array.push(t)):(this._sorted=!1,this._array.push(t))};Ft.prototype.toArray=function(){return this._sorted||(this._array.sort(Fo.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};Mo.MappingList=Ft});var Wo=Me(_o=>{var ct=Eo(),F=Rt(),Mt=Ro().ArraySet,fl=Bo().MappingList;function ne(e){e||(e={}),this._file=F.getArg(e,\"file\",null),this._sourceRoot=F.getArg(e,\"sourceRoot\",null),this._skipValidation=F.getArg(e,\"skipValidation\",!1),this._sources=new Mt,this._names=new Mt,this._mappings=new fl,this._sourcesContents=null}ne.prototype._version=3;ne.fromSourceMap=function(t){var r=t.sourceRoot,n=new ne({file:t.file,sourceRoot:r});return t.eachMapping(function(i){var o={generated:{line:i.generatedLine,column:i.generatedColumn}};i.source!=null&&(o.source=i.source,r!=null&&(o.source=F.relative(r,o.source)),o.original={line:i.originalLine,column:i.originalColumn},i.name!=null&&(o.name=i.name)),n.addMapping(o)}),t.sources.forEach(function(i){var o=i;r!==null&&(o=F.relative(r,i)),n._sources.has(o)||n._sources.add(o);var s=t.sourceContentFor(i);s!=null&&n.setSourceContent(i,s)}),n};ne.prototype.addMapping=function(t){var r=F.getArg(t,\"generated\"),n=F.getArg(t,\"original\",null),i=F.getArg(t,\"source\",null),o=F.getArg(t,\"name\",null);this._skipValidation||this._validateMapping(r,n,i,o),i!=null&&(i=String(i),this._sources.has(i)||this._sources.add(i)),o!=null&&(o=String(o),this._names.has(o)||this._names.add(o)),this._mappings.add({generatedLine:r.line,generatedColumn:r.column,originalLine:n!=null&&n.line,originalColumn:n!=null&&n.column,source:i,name:o})};ne.prototype.setSourceContent=function(t,r){var n=t;this._sourceRoot!=null&&(n=F.relative(this._sourceRoot,n)),r!=null?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[F.toSetString(n)]=r):this._sourcesContents&&(delete this._sourcesContents[F.toSetString(n)],Object.keys(this._sourcesContents).length===0&&(this._sourcesContents=null))};ne.prototype.applySourceMap=function(t,r,n){var i=r;if(r==null){if(t.file==null)throw new Error(`SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map's \"file\" property. Both were omitted.`);i=t.file}var o=this._sourceRoot;o!=null&&(i=F.relative(o,i));var s=new Mt,u=new Mt;this._mappings.unsortedForEach(function(c){if(c.source===i&&c.originalLine!=null){var a=t.originalPositionFor({line:c.originalLine,column:c.originalColumn});a.source!=null&&(c.source=a.source,n!=null&&(c.source=F.join(n,c.source)),o!=null&&(c.source=F.relative(o,c.source)),c.originalLine=a.line,c.originalColumn=a.column,a.name!=null&&(c.name=a.name))}var l=c.source;l!=null&&!s.has(l)&&s.add(l);var p=c.name;p!=null&&!u.has(p)&&u.add(p)},this),this._sources=s,this._names=u,t.sources.forEach(function(c){var a=t.sourceContentFor(c);a!=null&&(n!=null&&(c=F.join(n,c)),o!=null&&(c=F.relative(o,c)),this.setSourceContent(c,a))},this)};ne.prototype._validateMapping=function(t,r,n,i){if(r&&typeof r.line!=\"number\"&&typeof r.column!=\"number\")throw new Error(\"original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.\");if(!(t&&\"line\"in t&&\"column\"in t&&t.line>0&&t.column>=0&&!r&&!n&&!i)){if(t&&\"line\"in t&&\"column\"in t&&r&&\"line\"in r&&\"column\"in r&&t.line>0&&t.column>=0&&r.line>0&&r.column>=0&&n)return;throw new Error(\"Invalid mapping: \"+JSON.stringify({generated:t,source:n,original:r,name:i}))}};ne.prototype._serializeMappings=function(){for(var t=0,r=1,n=0,i=0,o=0,s=0,u=\"\",c,a,l,p,h=this._mappings.toArray(),d=0,g=h.length;d<g;d++){if(a=h[d],c=\"\",a.generatedLine!==r)for(t=0;a.generatedLine!==r;)c+=\";\",r++;else if(d>0){if(!F.compareByGeneratedPositionsInflated(a,h[d-1]))continue;c+=\",\"}c+=ct.encode(a.generatedColumn-t),t=a.generatedColumn,a.source!=null&&(p=this._sources.indexOf(a.source),c+=ct.encode(p-s),s=p,c+=ct.encode(a.originalLine-1-i),i=a.originalLine-1,c+=ct.encode(a.originalColumn-n),n=a.originalColumn,a.name!=null&&(l=this._names.indexOf(a.name),c+=ct.encode(l-o),o=l)),u+=c}return u};ne.prototype._generateSourcesContent=function(t,r){return t.map(function(n){if(!this._sourcesContents)return null;r!=null&&(n=F.relative(r,n));var i=F.toSetString(n);return Object.prototype.hasOwnProperty.call(this._sourcesContents,i)?this._sourcesContents[i]:null},this)};ne.prototype.toJSON=function(){var t={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return this._file!=null&&(t.file=this._file),this._sourceRoot!=null&&(t.sourceRoot=this._sourceRoot),this._sourcesContents&&(t.sourcesContent=this._generateSourcesContent(t.sources,t.sourceRoot)),t};ne.prototype.toString=function(){return JSON.stringify(this.toJSON())};_o.SourceMapGenerator=ne});var sr={};f(sr,{AtKeyword:()=>D,BadString:()=>Be,BadUrl:()=>H,CDC:()=>G,CDO:()=>ze,Colon:()=>B,Comma:()=>Y,Comment:()=>N,Delim:()=>v,Dimension:()=>k,EOF:()=>be,Function:()=>y,Hash:()=>A,Ident:()=>m,LeftCurlyBracket:()=>R,LeftParenthesis:()=>S,LeftSquareBracket:()=>X,Number:()=>b,Percentage:()=>P,RightCurlyBracket:()=>$,RightParenthesis:()=>x,RightSquareBracket:()=>Z,Semicolon:()=>_,String:()=>te,Url:()=>M,WhiteSpace:()=>L});var be=0,m=1,y=2,D=3,A=4,te=5,Be=6,M=7,H=8,v=9,b=10,P=11,k=12,L=13,ze=14,G=15,B=16,_=17,Y=18,X=19,Z=20,S=21,x=22,R=23,$=24,N=25;function O(e){return e>=48&&e<=57}function J(e){return O(e)||e>=65&&e<=70||e>=97&&e<=102}function Lt(e){return e>=65&&e<=90}function ja(e){return e>=97&&e<=122}function Ua(e){return Lt(e)||ja(e)}function Ha(e){return e>=128}function At(e){return Ua(e)||Ha(e)||e===95}function _e(e){return At(e)||O(e)||e===45}function Ga(e){return e>=0&&e<=8||e===11||e>=14&&e<=31||e===127}function tt(e){return e===10||e===13||e===12}function me(e){return tt(e)||e===32||e===9}function K(e,t){return!(e!==92||tt(t)||t===0)}function We(e,t,r){return e===45?At(t)||t===45||K(t,r):At(e)?!0:e===92?K(e,t):!1}function Et(e,t,r){return e===43||e===45?O(t)?2:t===46&&O(r)?3:0:e===46?O(t)?2:0:O(e)?1:0}function zt(e){return e===65279||e===65534?1:0}var ar=new Array(128),Ya=128,rt=130,lr=131,Pt=132,cr=133;for(let e=0;e<ar.length;e++)ar[e]=me(e)&&rt||O(e)&&lr||At(e)&&Pt||Ga(e)&&cr||e||Ya;function It(e){return e<128?ar[e]:Pt}function qe(e,t){return t<e.length?e.charCodeAt(t):0}function Dt(e,t,r){return r===13&&qe(e,t+1)===10?2:1}function xe(e,t,r){let n=e.charCodeAt(t);return Lt(n)&&(n=n|32),n===r}function ye(e,t,r,n){if(r-t!==n.length||t<0||r>e.length)return!1;for(let i=t;i<r;i++){let o=n.charCodeAt(i-t),s=e.charCodeAt(i);if(Lt(s)&&(s=s|32),s!==o)return!1}return!0}function lo(e,t){for(;t>=0&&me(e.charCodeAt(t));t--);return t+1}function nt(e,t){for(;t<e.length&&me(e.charCodeAt(t));t++);return t}function ur(e,t){for(;t<e.length&&O(e.charCodeAt(t));t++);return t}function se(e,t){if(t+=2,J(qe(e,t-1))){for(let n=Math.min(e.length,t+5);t<n&&J(qe(e,t));t++);let r=qe(e,t);me(r)&&(t+=Dt(e,t,r))}return t}function it(e,t){for(;t<e.length;t++){let r=e.charCodeAt(t);if(!_e(r)){if(K(r,qe(e,t+1))){t=se(e,t)-1;continue}break}}return t}function Pe(e,t){let r=e.charCodeAt(t);if((r===43||r===45)&&(r=e.charCodeAt(t+=1)),O(r)&&(t=ur(e,t+1),r=e.charCodeAt(t)),r===46&&O(e.charCodeAt(t+1))&&(t+=2,t=ur(e,t)),xe(e,t,101)){let n=0;r=e.charCodeAt(t+1),(r===45||r===43)&&(n=1,r=e.charCodeAt(t+2)),O(r)&&(t=ur(e,t+1+n+1))}return t}function Nt(e,t){for(;t<e.length;t++){let r=e.charCodeAt(t);if(r===41){t++;break}K(r,qe(e,t+1))&&(t=se(e,t))}return t}function je(e){if(e.length===1&&!J(e.charCodeAt(0)))return e[0];let t=parseInt(e,16);return(t===0||t>=55296&&t<=57343||t>1114111)&&(t=65533),String.fromCodePoint(t)}var Ie=[\"EOF-token\",\"ident-token\",\"function-token\",\"at-keyword-token\",\"hash-token\",\"string-token\",\"bad-string-token\",\"url-token\",\"bad-url-token\",\"delim-token\",\"number-token\",\"percentage-token\",\"dimension-token\",\"whitespace-token\",\"CDO-token\",\"CDC-token\",\"colon-token\",\"semicolon-token\",\"comma-token\",\"[-token\",\"]-token\",\"(-token\",\")-token\",\"{-token\",\"}-token\",\"comment-token\"];function Ue(e=null,t){return e===null||e.length<t?new Uint32Array(Math.max(t+1024,16384)):e}var co=10,Ka=12,uo=13;function po(e){let t=e.source,r=t.length,n=t.length>0?zt(t.charCodeAt(0)):0,i=Ue(e.lines,r),o=Ue(e.columns,r),s=e.startLine,u=e.startColumn;for(let c=n;c<r;c++){let a=t.charCodeAt(c);i[c]=s,o[c]=u++,(a===co||a===uo||a===Ka)&&(a===uo&&c+1<r&&t.charCodeAt(c+1)===co&&(c++,i[c]=s,o[c]=u),s++,u=1)}i[r]=s,o[r]=u,e.lines=i,e.columns=o,e.computed=!0}var ot=class{constructor(t,r,n,i){this.setSource(t,r,n,i),this.lines=null,this.columns=null}setSource(t=\"\",r=0,n=1,i=1){this.source=t,this.startOffset=r,this.startLine=n,this.startColumn=i,this.computed=!1}getLocation(t,r){return this.computed||po(this),{source:r,offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}getLocationRange(t,r,n){return this.computed||po(this),{source:n,start:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]},end:{offset:this.startOffset+r,line:this.lines[r],column:this.columns[r]}}}};var ae=16777215,le=24,at=1,Ot=2,Se=new Uint8Array(32);Se[2]=22;Se[21]=22;Se[19]=20;Se[23]=24;var ce=new Uint8Array(32);ce[2]=at;ce[21]=at;ce[19]=at;ce[23]=at;ce[22]=Ot;ce[20]=Ot;ce[24]=Ot;function ho(e,t,r){return e<t?t:e>r?r:e}var st=class{constructor(t,r){this.setSource(t,r)}reset(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset}setSource(t=\"\",r=()=>{}){t=String(t||\"\");let n=t.length,i=Ue(this.offsetAndType,t.length+1),o=Ue(this.balance,t.length+1),s=0,u=-1,c=0,a=t.length;this.offsetAndType=null,this.balance=null,o.fill(0),r(t,(l,p,h)=>{let d=s++;if(i[d]=l<<le|h,u===-1&&(u=p),o[d]=a,l===c){let g=o[a];o[a]=d,a=g,c=Se[i[g]>>le]}else this.isBlockOpenerTokenType(l)&&(a=d,c=Se[l])}),i[s]=0<<le|n,o[s]=s;for(let l=0;l<s;l++){let p=o[l];if(p<=l){let h=o[p];h!==l&&(o[l]=h)}else p>s&&(o[l]=s)}this.source=t,this.firstCharOffset=u===-1?0:u,this.tokenCount=s,this.offsetAndType=i,this.balance=o,this.reset(),this.next()}lookupType(t){return t+=this.tokenIndex,t<this.tokenCount?this.offsetAndType[t]>>le:0}lookupTypeNonSC(t){for(let r=this.tokenIndex;r<this.tokenCount;r++){let n=this.offsetAndType[r]>>le;if(n!==13&&n!==25&&t--===0)return n}return 0}lookupOffset(t){return t+=this.tokenIndex,t<this.tokenCount?this.offsetAndType[t-1]&ae:this.source.length}lookupOffsetNonSC(t){for(let r=this.tokenIndex;r<this.tokenCount;r++){let n=this.offsetAndType[r]>>le;if(n!==13&&n!==25&&t--===0)return r-this.tokenIndex}return 0}lookupValue(t,r){return t+=this.tokenIndex,t<this.tokenCount?ye(this.source,this.offsetAndType[t-1]&ae,this.offsetAndType[t]&ae,r):!1}getTokenStart(t){return t===this.tokenIndex?this.tokenStart:t>0?t<this.tokenCount?this.offsetAndType[t-1]&ae:this.offsetAndType[this.tokenCount]&ae:this.firstCharOffset}getTokenEnd(t){return t===this.tokenIndex?this.tokenEnd:this.offsetAndType[ho(t,0,this.tokenCount)]&ae}getTokenType(t){return t===this.tokenIndex?this.tokenType:this.offsetAndType[ho(t,0,this.tokenCount)]>>le}substrToCursor(t){return this.source.substring(t,this.tokenStart)}isBlockOpenerTokenType(t){return ce[t]===at}isBlockCloserTokenType(t){return ce[t]===Ot}getBlockTokenPairIndex(t){let r=this.getTokenType(t);if(ce[r]===1){let n=this.balance[t],i=this.getTokenType(n);return Se[r]===i?n:-1}else if(ce[r]===2){let n=this.balance[t],i=this.getTokenType(n);return Se[i]===r?n:-1}return-1}isBalanceEdge(t){return this.balance[this.tokenIndex]<t}isDelim(t,r){return r?this.lookupType(r)===9&&this.source.charCodeAt(this.lookupOffset(r))===t:this.tokenType===9&&this.source.charCodeAt(this.tokenStart)===t}skip(t){let r=this.tokenIndex+t;r<this.tokenCount?(this.tokenIndex=r,this.tokenStart=this.offsetAndType[r-1]&ae,r=this.offsetAndType[r],this.tokenType=r>>le,this.tokenEnd=r&ae):(this.tokenIndex=this.tokenCount,this.next())}next(){let t=this.tokenIndex+1;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=this.tokenEnd,t=this.offsetAndType[t],this.tokenType=t>>le,this.tokenEnd=t&ae):(this.eof=!0,this.tokenIndex=this.tokenCount,this.tokenType=0,this.tokenStart=this.tokenEnd=this.source.length)}skipSC(){for(;this.tokenType===13||this.tokenType===25;)this.next()}skipUntilBalanced(t,r){let n=t,i=0,o=0;e:for(;n<this.tokenCount;n++){if(i=this.balance[n],i<t)break e;switch(o=n>0?this.offsetAndType[n-1]&ae:this.firstCharOffset,r(this.source.charCodeAt(o))){case 1:break e;case 2:n++;break e;default:this.isBlockOpenerTokenType(this.offsetAndType[n]>>le)&&(n=i)}}this.skip(n-this.tokenIndex)}forEachToken(t){for(let r=0,n=this.firstCharOffset;r<this.tokenCount;r++){let i=n,o=this.offsetAndType[r],s=o&ae,u=o>>le;n=s,t(u,i,s,r)}}dump(){let t=new Array(this.tokenCount);return this.forEachToken((r,n,i,o)=>{t[o]={idx:o,type:Ie[r],chunk:this.source.substring(n,i),balance:this.balance[o]}}),t}};function Ce(e,t){function r(p){return p<u?e.charCodeAt(p):0}function n(){if(a=Pe(e,a),We(r(a),r(a+1),r(a+2))){l=12,a=it(e,a);return}if(r(a)===37){l=11,a++;return}l=10}function i(){let p=a;if(a=it(e,a),ye(e,p,a,\"url\")&&r(a)===40){if(a=nt(e,a+1),r(a)===34||r(a)===39){l=2,a=p+4;return}s();return}if(r(a)===40){l=2,a++;return}l=1}function o(p){for(p||(p=r(a++)),l=5;a<e.length;a++){let h=e.charCodeAt(a);switch(It(h)){case p:a++;return;case rt:if(tt(h)){a+=Dt(e,a,h),l=6;return}break;case 92:if(a===e.length-1)break;let d=r(a+1);tt(d)?a+=Dt(e,a+1,d):K(h,d)&&(a=se(e,a)-1);break}}}function s(){for(l=7,a=nt(e,a);a<e.length;a++){let p=e.charCodeAt(a);switch(It(p)){case 41:a++;return;case rt:if(a=nt(e,a),r(a)===41||a>=e.length){a<e.length&&a++;return}a=Nt(e,a),l=8;return;case 34:case 39:case 40:case cr:a=Nt(e,a),l=8;return;case 92:if(K(p,r(a+1))){a=se(e,a)-1;break}a=Nt(e,a),l=8;return}}}e=String(e||\"\");let u=e.length,c=zt(r(0)),a=c,l;for(;a<u;){let p=e.charCodeAt(a);switch(It(p)){case rt:l=13,a=nt(e,a+1);break;case 34:o();break;case 35:_e(r(a+1))||K(r(a+1),r(a+2))?(l=4,a=it(e,a+1)):(l=9,a++);break;case 39:o();break;case 40:l=21,a++;break;case 41:l=22,a++;break;case 43:Et(p,r(a+1),r(a+2))?n():(l=9,a++);break;case 44:l=18,a++;break;case 45:Et(p,r(a+1),r(a+2))?n():r(a+1)===45&&r(a+2)===62?(l=15,a=a+3):We(p,r(a+1),r(a+2))?i():(l=9,a++);break;case 46:Et(p,r(a+1),r(a+2))?n():(l=9,a++);break;case 47:r(a+1)===42?(l=25,a=e.indexOf(\"*/\",a+2),a=a===-1?e.length:a+2):(l=9,a++);break;case 58:l=16,a++;break;case 59:l=17,a++;break;case 60:r(a+1)===33&&r(a+2)===45&&r(a+3)===45?(l=14,a=a+4):(l=9,a++);break;case 64:We(r(a+1),r(a+2),r(a+3))?(l=3,a=it(e,a+1)):(l=9,a++);break;case 91:l=19,a++;break;case 92:K(p,r(a+1))?i():(l=9,a++);break;case 93:l=20,a++;break;case 123:l=23,a++;break;case 125:l=24,a++;break;case lr:n();break;case Pt:i();break;default:l=9,a++}t(l,c,c=a)}}var He=null,V=class e{static createItem(t){return{prev:null,next:null,data:t}}constructor(){this.head=null,this.tail=null,this.cursor=null}createItem(t){return e.createItem(t)}allocateCursor(t,r){let n;return He!==null?(n=He,He=He.cursor,n.prev=t,n.next=r,n.cursor=this.cursor):n={prev:t,next:r,cursor:this.cursor},this.cursor=n,n}releaseCursor(){let{cursor:t}=this;this.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=He,He=t}updateCursors(t,r,n,i){let{cursor:o}=this;for(;o!==null;)o.prev===t&&(o.prev=r),o.next===n&&(o.next=i),o=o.cursor}*[Symbol.iterator](){for(let t=this.head;t!==null;t=t.next)yield t.data}get size(){let t=0;for(let r=this.head;r!==null;r=r.next)t++;return t}get isEmpty(){return this.head===null}get first(){return this.head&&this.head.data}get last(){return this.tail&&this.tail.data}fromArray(t){let r=null;this.head=null;for(let n of t){let i=e.createItem(n);r!==null?r.next=i:this.head=i,i.prev=r,r=i}return this.tail=r,this}toArray(){return[...this]}toJSON(){return[...this]}forEach(t,r=this){let n=this.allocateCursor(null,this.head);for(;n.next!==null;){let i=n.next;n.next=i.next,t.call(r,i.data,i,this)}this.releaseCursor()}forEachRight(t,r=this){let n=this.allocateCursor(this.tail,null);for(;n.prev!==null;){let i=n.prev;n.prev=i.prev,t.call(r,i.data,i,this)}this.releaseCursor()}reduce(t,r,n=this){let i=this.allocateCursor(null,this.head),o=r,s;for(;i.next!==null;)s=i.next,i.next=s.next,o=t.call(n,o,s.data,s,this);return this.releaseCursor(),o}reduceRight(t,r,n=this){let i=this.allocateCursor(this.tail,null),o=r,s;for(;i.prev!==null;)s=i.prev,i.prev=s.prev,o=t.call(n,o,s.data,s,this);return this.releaseCursor(),o}some(t,r=this){for(let n=this.head;n!==null;n=n.next)if(t.call(r,n.data,n,this))return!0;return!1}map(t,r=this){let n=new e;for(let i=this.head;i!==null;i=i.next)n.appendData(t.call(r,i.data,i,this));return n}filter(t,r=this){let n=new e;for(let i=this.head;i!==null;i=i.next)t.call(r,i.data,i,this)&&n.appendData(i.data);return n}nextUntil(t,r,n=this){if(t===null)return;let i=this.allocateCursor(null,t);for(;i.next!==null;){let o=i.next;if(i.next=o.next,r.call(n,o.data,o,this))break}this.releaseCursor()}prevUntil(t,r,n=this){if(t===null)return;let i=this.allocateCursor(t,null);for(;i.prev!==null;){let o=i.prev;if(i.prev=o.prev,r.call(n,o.data,o,this))break}this.releaseCursor()}clear(){this.head=null,this.tail=null}copy(){let t=new e;for(let r of this)t.appendData(r);return t}prepend(t){return this.updateCursors(null,t,this.head,t),this.head!==null?(this.head.prev=t,t.next=this.head):this.tail=t,this.head=t,this}prependData(t){return this.prepend(e.createItem(t))}append(t){return this.insert(t)}appendData(t){return this.insert(e.createItem(t))}insert(t,r=null){if(r!==null)if(this.updateCursors(r.prev,t,r,t),r.prev===null){if(this.head!==r)throw new Error(\"before doesn't belong to list\");this.head=t,r.prev=t,t.next=r,this.updateCursors(null,t)}else r.prev.next=t,t.prev=r.prev,r.prev=t,t.next=r;else this.updateCursors(this.tail,t,null,t),this.tail!==null?(this.tail.next=t,t.prev=this.tail):this.head=t,this.tail=t;return this}insertData(t,r){return this.insert(e.createItem(t),r)}remove(t){if(this.updateCursors(t,t.prev,t,t.next),t.prev!==null)t.prev.next=t.next;else{if(this.head!==t)throw new Error(\"item doesn't belong to list\");this.head=t.next}if(t.next!==null)t.next.prev=t.prev;else{if(this.tail!==t)throw new Error(\"item doesn't belong to list\");this.tail=t.prev}return t.prev=null,t.next=null,t}push(t){this.insert(e.createItem(t))}pop(){return this.tail!==null?this.remove(this.tail):null}unshift(t){this.prepend(e.createItem(t))}shift(){return this.head!==null?this.remove(this.head):null}prependList(t){return this.insertList(t,this.head)}appendList(t){return this.insertList(t)}insertList(t,r){return t.head===null?this:(r!=null?(this.updateCursors(r.prev,t.tail,r,t.head),r.prev!==null?(r.prev.next=t.head,t.head.prev=r.prev):this.head=t.head,r.prev=t.tail,t.tail.next=r):(this.updateCursors(this.tail,t.tail,null,t.head),this.tail!==null?(this.tail.next=t.head,t.head.prev=this.tail):this.head=t.head,this.tail=t.tail),t.head=null,t.tail=null,this)}replace(t,r){\"head\"in r?this.insertList(r,t):this.insert(r,t),this.remove(t)}};function De(e,t){let r=Object.create(SyntaxError.prototype),n=new Error;return Object.assign(r,{name:e,message:t,get stack(){return(n.stack||\"\").replace(/^(.+\\n){1,3}/,`${e}: ${t}\n`)}})}var pr=100,mo=60,fo=\"    \";function go({source:e,line:t,column:r,baseLine:n,baseColumn:i},o){function s(g,ee){return a.slice(g,ee).map((j,w)=>String(g+w+1).padStart(h)+\" |\"+j).join(`\n`)}let u=`\n`.repeat(Math.max(n-1,0)),c=\" \".repeat(Math.max(i-1,0)),a=(u+c+e).split(/\\r\\n?|\\n|\\f/),l=Math.max(1,t-o)-1,p=Math.min(t+o,a.length+1),h=Math.max(4,String(p).length)+1,d=0;r+=(fo.length-1)*(a[t-1].substr(0,r-1).match(/\\t/g)||[]).length,r>pr&&(d=r-mo+3,r=mo-2);for(let g=l;g<=p;g++)g>=0&&g<a.length&&(a[g]=a[g].replace(/\\t/g,fo),a[g]=(d>0&&a[g].length>d?\"\\u2026\":\"\")+a[g].substr(d,pr-2)+(a[g].length>d+pr-1?\"\\u2026\":\"\"));return[s(l,t),new Array(r+h+2).join(\"-\")+\"^\",s(t,p)].filter(Boolean).join(`\n`).replace(/^(\\s+\\d+\\s+\\|\\n)+/,\"\").replace(/\\n(\\s+\\d+\\s+\\|)+$/,\"\")}function hr(e,t,r,n,i,o=1,s=1){return Object.assign(De(\"SyntaxError\",e),{source:t,offset:r,line:n,column:i,sourceFragment(c){return go({source:t,line:n,column:i,baseLine:o,baseColumn:s},isNaN(c)?0:c)},get formattedMessage(){return`Parse error: ${e}\n`+go({source:t,line:n,column:i,baseLine:o,baseColumn:s},2)}})}function bo(e){let t=this.createList(),r=!1,n={recognizer:e};for(;!this.eof;){switch(this.tokenType){case 25:this.next();continue;case 13:r=!0,this.next();continue}let i=e.getNode.call(this,n);if(i===void 0)break;r&&(e.onWhiteSpace&&e.onWhiteSpace.call(this,i,t,n),r=!1),t.push(i)}return r&&e.onWhiteSpace&&e.onWhiteSpace.call(this,null,t,n),t}var xo=()=>{},Va=33,Qa=35,mr=59,yo=123,ko=0;function Xa(e){return function(){return this[e]()}}function dr(e){let t=Object.create(null);for(let r of Object.keys(e)){let n=e[r],i=n.parse||n;i&&(t[r]=i)}return t}function $a(e){let t={context:Object.create(null),features:Object.assign(Object.create(null),e.features),scope:Object.assign(Object.create(null),e.scope),atrule:dr(e.atrule),pseudo:dr(e.pseudo),node:dr(e.node)};for(let[r,n]of Object.entries(e.parseContext))switch(typeof n){case\"function\":t.context[r]=n;break;case\"string\":t.context[r]=Xa(n);break}return{config:t,...t,...t.node}}function wo(e){let t=\"\",r=\"<unknown>\",n=!1,i=xo,o=!1,s=new ot,u=Object.assign(new st,$a(e||{}),{parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:bo,consumeUntilBalanceEnd:()=>0,consumeUntilLeftCurlyBracket(l){return l===yo?1:0},consumeUntilLeftCurlyBracketOrSemicolon(l){return l===yo||l===mr?1:0},consumeUntilExclamationMarkOrSemicolon(l){return l===Va||l===mr?1:0},consumeUntilSemicolonIncluded(l){return l===mr?2:0},createList(){return new V},createSingleNodeList(l){return new V().appendData(l)},getFirstListNode(l){return l&&l.first},getLastListNode(l){return l&&l.last},parseWithFallback(l,p){let h=this.tokenIndex;try{return l.call(this)}catch(d){if(o)throw d;this.skip(h-this.tokenIndex);let g=p.call(this);return o=!0,i(d,g),o=!1,g}},lookupNonWSType(l){let p;do if(p=this.lookupType(l++),p!==13&&p!==25)return p;while(p!==ko);return ko},charCodeAt(l){return l>=0&&l<t.length?t.charCodeAt(l):0},substring(l,p){return t.substring(l,p)},substrToCursor(l){return this.source.substring(l,this.tokenStart)},cmpChar(l,p){return xe(t,l,p)},cmpStr(l,p,h){return ye(t,l,p,h)},consume(l){let p=this.tokenStart;return this.eat(l),this.substrToCursor(p)},consumeFunctionName(){let l=t.substring(this.tokenStart,this.tokenEnd-1);return this.eat(2),l},consumeNumber(l){let p=t.substring(this.tokenStart,Pe(t,this.tokenStart));return this.eat(l),p},eat(l){if(this.tokenType!==l){let p=Ie[l].slice(0,-6).replace(/-/g,\" \").replace(/^./,g=>g.toUpperCase()),h=`${/[[\\](){}]/.test(p)?`\"${p}\"`:p} is expected`,d=this.tokenStart;switch(l){case 1:this.tokenType===2||this.tokenType===7?(d=this.tokenEnd-1,h=\"Identifier is expected but function found\"):h=\"Identifier is expected\";break;case 4:this.isDelim(Qa)&&(this.next(),d++,h=\"Name is expected\");break;case 11:this.tokenType===10&&(d=this.tokenEnd,h=\"Percent sign is expected\");break}this.error(h,d)}this.next()},eatIdent(l){(this.tokenType!==1||this.lookupValue(0,l)===!1)&&this.error(`Identifier \"${l}\" is expected`),this.next()},eatDelim(l){this.isDelim(l)||this.error(`Delim \"${String.fromCharCode(l)}\" is expected`),this.next()},getLocation(l,p){return n?s.getLocationRange(l,p,r):null},getLocationFromList(l){if(n){let p=this.getFirstListNode(l),h=this.getLastListNode(l);return s.getLocationRange(p!==null?p.loc.start.offset-s.startOffset:this.tokenStart,h!==null?h.loc.end.offset-s.startOffset:this.tokenStart,r)}return null},error(l,p){let h=typeof p<\"u\"&&p<t.length?s.getLocation(p):this.eof?s.getLocation(lo(t,t.length-1)):s.getLocation(this.tokenStart);throw new hr(l||\"Unexpected input\",t,h.offset,h.line,h.column,s.startLine,s.startColumn)}}),c=()=>({filename:r,source:t,tokenCount:u.tokenCount,getTokenType:l=>u.getTokenType(l),getTokenTypeName:l=>Ie[u.getTokenType(l)],getTokenStart:l=>u.getTokenStart(l),getTokenEnd:l=>u.getTokenEnd(l),getTokenValue:l=>u.source.substring(u.getTokenStart(l),u.getTokenEnd(l)),substring:(l,p)=>u.source.substring(l,p),balance:u.balance.subarray(0,u.tokenCount+1),isBlockOpenerTokenType:u.isBlockOpenerTokenType,isBlockCloserTokenType:u.isBlockCloserTokenType,getBlockTokenPairIndex:l=>u.getBlockTokenPairIndex(l),getLocation:l=>s.getLocation(l,r),getRangeLocation:(l,p)=>s.getLocationRange(l,p,r)});return Object.assign(function(l,p){t=l,p=p||{},u.setSource(t,Ce),s.setSource(t,p.offset,p.line,p.column),r=p.filename||\"<unknown>\",n=!!p.positions,i=typeof p.onParseError==\"function\"?p.onParseError:xo,o=!1,u.parseAtrulePrelude=\"parseAtrulePrelude\"in p?!!p.parseAtrulePrelude:!0,u.parseRulePrelude=\"parseRulePrelude\"in p?!!p.parseRulePrelude:!0,u.parseValue=\"parseValue\"in p?!!p.parseValue:!0,u.parseCustomProperty=\"parseCustomProperty\"in p?!!p.parseCustomProperty:!1;let{context:h=\"default\",onComment:d,onToken:g}=p;if(!(h in u.context))throw new Error(\"Unknown context `\"+h+\"`\");Array.isArray(g)?u.forEachToken((j,w,T)=>{g.push({type:j,start:w,end:T})}):typeof g==\"function\"&&u.forEachToken(g.bind(c())),typeof d==\"function\"&&u.forEachToken((j,w,T)=>{if(j===25){let he=u.getLocation(w,T),z=ye(t,T-2,T,\"*/\")?t.slice(w+2,T-2):t.slice(w+2,T);d(z,he)}});let ee=u.context[h].call(u,p);return u.eof||u.error(),ee},{SyntaxError:hr,config:u.config})}var jo=qa(Wo(),1),qo=new Set([\"Atrule\",\"Selector\",\"Declaration\"]);function Uo(e){let t=new jo.SourceMapGenerator,r={line:1,column:0},n={line:0,column:0},i={line:1,column:0},o={generated:i},s=1,u=0,c=!1,a=e.node;e.node=function(h){if(h.loc&&h.loc.start&&qo.has(h.type)){let d=h.loc.start.line,g=h.loc.start.column-1;(n.line!==d||n.column!==g)&&(n.line=d,n.column=g,r.line=s,r.column=u,c&&(c=!1,(r.line!==i.line||r.column!==i.column)&&t.addMapping(o)),c=!0,t.addMapping({source:h.loc.source,original:n,generated:r}))}a.call(this,h),c&&qo.has(h.type)&&(i.line=s,i.column=u)};let l=e.emit;e.emit=function(h,d,g){for(let ee=0;ee<h.length;ee++)h.charCodeAt(ee)===10?(s++,u=0):u++;l(h,d,g)};let p=e.result;return e.result=function(){return c&&t.addMapping(o),{css:p(),map:t}},e}var Bt={};f(Bt,{safe:()=>vr,spec:()=>yl});var gl=43,bl=45,wr=(e,t)=>{if(e===9&&(e=t),typeof e==\"string\"){let r=e.charCodeAt(0);return r>127?32768:r<<8}return e},Ho=[[1,1],[1,2],[1,7],[1,8],[1,\"-\"],[1,10],[1,11],[1,12],[1,15],[1,21],[3,1],[3,2],[3,7],[3,8],[3,\"-\"],[3,10],[3,11],[3,12],[3,15],[4,1],[4,2],[4,7],[4,8],[4,\"-\"],[4,10],[4,11],[4,12],[4,15],[12,1],[12,2],[12,7],[12,8],[12,\"-\"],[12,10],[12,11],[12,12],[12,15],[\"#\",1],[\"#\",2],[\"#\",7],[\"#\",8],[\"#\",\"-\"],[\"#\",10],[\"#\",11],[\"#\",12],[\"#\",15],[\"-\",1],[\"-\",2],[\"-\",7],[\"-\",8],[\"-\",\"-\"],[\"-\",10],[\"-\",11],[\"-\",12],[\"-\",15],[10,1],[10,2],[10,7],[10,8],[10,10],[10,11],[10,12],[10,\"%\"],[10,15],[\"@\",1],[\"@\",2],[\"@\",7],[\"@\",8],[\"@\",\"-\"],[\"@\",15],[\".\",10],[\".\",11],[\".\",12],[\"+\",10],[\"+\",11],[\"+\",12],[\"/\",\"*\"]],xl=Ho.concat([[1,4],[12,4],[4,4],[3,21],[3,5],[3,16],[11,11],[11,12],[11,2],[11,\"-\"],[22,1],[22,2],[22,11],[22,12],[22,4],[22,\"-\"]]);function Go(e){let t=new Set(e.map(([r,n])=>wr(r)<<16|wr(n)));return function(r,n,i){let o=wr(n,i),s=i.charCodeAt(0);return(s===bl&&n!==1&&n!==2&&n!==15||s===gl?t.has(r<<16|s<<8):t.has(r<<16|o))&&this.emit(\" \",13,!0),o}}var yl=Go(Ho),vr=Go(xl);var kl=92;function wl(e,t){if(typeof t==\"function\"){let r=null;e.children.forEach(n=>{r!==null&&t.call(this,r),this.node(n),r=n});return}e.children.forEach(this.node,this)}function vl(e){Ce(e,(t,r,n)=>{this.token(t,e.slice(r,n))})}function Yo(e){let t=new Map;for(let[r,n]of Object.entries(e.node))typeof(n.generate||n)==\"function\"&&t.set(r,n.generate||n);return function(r,n){let i=\"\",o=0,s={node(c){if(t.has(c.type))t.get(c.type).call(u,c);else throw new Error(\"Unknown node type: \"+c.type)},tokenBefore:vr,token(c,a){o=this.tokenBefore(o,c,a),this.emit(a,c,!1),c===9&&a.charCodeAt(0)===kl&&this.emit(`\n`,13,!0)},emit(c){i+=c},result(){return i}};n&&(typeof n.decorator==\"function\"&&(s=n.decorator(s)),n.sourceMap&&(s=Uo(s)),n.mode in Bt&&(s.tokenBefore=Bt[n.mode]));let u={node:c=>s.node(c),children:wl,token:(c,a)=>s.token(c,a),tokenize:vl};return s.node(r),s.result()}}function Ko(e){return{fromPlainObject(t){return e(t,{enter(r){r.children&&!(r.children instanceof V)&&(r.children=new V().fromArray(r.children))}}),t},toPlainObject(t){return e(t,{leave(r){r.children&&r.children instanceof V&&(r.children=r.children.toArray())}}),t}}}var{hasOwnProperty:Sr}=Object.prototype,ut=function(){};function Vo(e){return typeof e==\"function\"?e:ut}function Qo(e,t){return function(r,n,i){r.type===t&&e.call(this,r,n,i)}}function Sl(e,t){let r=t.structure,n=[];for(let i in r){if(Sr.call(r,i)===!1)continue;let o=r[i],s={name:i,type:!1,nullable:!1};Array.isArray(o)||(o=[o]);for(let u of o)u===null?s.nullable=!0:typeof u==\"string\"?s.type=\"node\":Array.isArray(u)&&(s.type=\"list\");s.type&&n.push(s)}return n.length?{context:t.walkContext,fields:n}:null}function Cl(e){let t={};for(let r in e.node)if(Sr.call(e.node,r)){let n=e.node[r];if(!n.structure)throw new Error(\"Missed `structure` field in `\"+r+\"` node type definition\");t[r]=Sl(r,n)}return t}function Xo(e,t){let r=e.fields.slice(),n=e.context,i=typeof n==\"string\";return t&&r.reverse(),function(o,s,u,c){let a;i&&(a=s[n],s[n]=o);for(let l of r){let p=o[l.name];if(!l.nullable||p){if(l.type===\"list\"){if(t?p.reduceRight(c,!1):p.reduce(c,!1))return!0}else if(u(p))return!0}}i&&(s[n]=a)}}function $o({StyleSheet:e,Atrule:t,Rule:r,Block:n,DeclarationList:i}){return{Atrule:{StyleSheet:e,Atrule:t,Rule:r,Block:n},Rule:{StyleSheet:e,Atrule:t,Rule:r,Block:n},Declaration:{StyleSheet:e,Atrule:t,Rule:r,Block:n,DeclarationList:i}}}function Zo(e){let t=Cl(e),r={},n={},i=Symbol(\"break-walk\"),o=Symbol(\"skip-node\");for(let a in t)Sr.call(t,a)&&t[a]!==null&&(r[a]=Xo(t[a],!1),n[a]=Xo(t[a],!0));let s=$o(r),u=$o(n),c=function(a,l){function p(w,T,he){let z=h.call(j,w,T,he);return z===i?!0:z===o?!1:!!(g.hasOwnProperty(w.type)&&g[w.type](w,j,p,ee)||d.call(j,w,T,he)===i)}let h=ut,d=ut,g=r,ee=(w,T,he,z)=>w||p(T,he,z),j={break:i,skip:o,root:a,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if(typeof l==\"function\")h=l;else if(l&&(h=Vo(l.enter),d=Vo(l.leave),l.reverse&&(g=n),l.visit)){if(s.hasOwnProperty(l.visit))g=l.reverse?u[l.visit]:s[l.visit];else if(!t.hasOwnProperty(l.visit))throw new Error(\"Bad value `\"+l.visit+\"` for `visit` option (should be: \"+Object.keys(t).sort().join(\", \")+\")\");h=Qo(h,l.visit),d=Qo(d,l.visit)}if(h===ut&&d===ut)throw new Error(\"Neither `enter` nor `leave` walker handler is set or both aren't a function\");p(a)};return c.break=i,c.skip=o,c.find=function(a,l){let p=null;return c(a,function(h,d,g){if(l.call(this,h,d,g))return p=h,i}),p},c.findLast=function(a,l){let p=null;return c(a,{reverse:!0,enter(h,d,g){if(l.call(this,h,d,g))return p=h,i}}),p},c.findAll=function(a,l){let p=[];return c(a,function(h,d,g){l.call(this,h,d,g)&&p.push(h)}),p},c}function Tl(e){return e}function Al(e){let{min:t,max:r,comma:n}=e;return t===0&&r===0?n?\"#?\":\"*\":t===0&&r===1?\"?\":t===1&&r===0?n?\"#\":\"+\":t===1&&r===1?\"\":(n?\"#\":\"\")+(t===r?\"{\"+t+\"}\":\"{\"+t+\",\"+(r!==0?r:\"\")+\"}\")}function Ll(e){switch(e.type){case\"Range\":return\" [\"+(e.min===null?\"-\\u221E\":e.min)+\",\"+(e.max===null?\"\\u221E\":e.max)+\"]\";default:throw new Error(\"Unknown node type `\"+e.type+\"`\")}}function El(e,t,r,n){let i=e.combinator===\" \"||n?e.combinator:\" \"+e.combinator+\" \",o=e.terms.map(s=>_t(s,t,r,n)).join(i);return e.explicit||r?(n||o[0]===\",\"?\"[\":\"[ \")+o+(n?\"]\":\" ]\"):o}function _t(e,t,r,n){let i;switch(e.type){case\"Group\":i=El(e,t,r,n)+(e.disallowEmpty?\"!\":\"\");break;case\"Multiplier\":return _t(e.term,t,r,n)+t(Al(e),e);case\"Boolean\":i=\"<boolean-expr[\"+_t(e.term,t,r,n)+\"]>\";break;case\"Type\":i=\"<\"+e.name+(e.opts?t(Ll(e.opts),e.opts):\"\")+\">\";break;case\"Property\":i=\"<'\"+e.name+\"'>\";break;case\"Keyword\":i=e.name;break;case\"AtKeyword\":i=\"@\"+e.name;break;case\"Function\":i=e.name+\"(\";break;case\"String\":case\"Token\":i=e.value;break;case\"Comma\":i=\",\";break;default:throw new Error(\"Unknown node type `\"+e.type+\"`\")}return t(i,e)}function Oe(e,t){let r=Tl,n=!1,i=!1;return typeof t==\"function\"?r=t:t&&(n=!!t.forceBraces,i=!!t.compact,typeof t.decorate==\"function\"&&(r=t.decorate)),_t(e,r,n,i)}var Jo={offset:0,line:1,column:1};function zl(e,t){let r=e.tokens,n=e.longestMatch,i=n<r.length&&r[n].node||null,o=i!==t?i:null,s=0,u=0,c=0,a=\"\",l,p;for(let h=0;h<r.length;h++){let d=r[h].value;h===n&&(u=d.length,s=a.length),o!==null&&r[h].node===o&&(h<=n?c++:c=0),a+=d}return n===r.length||c>1?(l=Wt(o||t,\"end\")||pt(Jo,a),p=pt(l)):(l=Wt(o,\"start\")||pt(Wt(t,\"start\")||Jo,a.slice(0,s)),p=Wt(o,\"end\")||pt(l,a.substr(s,u))),{css:a,mismatchOffset:s,mismatchLength:u,start:l,end:p}}function Wt(e,t){let r=e&&e.loc&&e.loc[t];return r?\"line\"in r?pt(r):r:null}function pt({offset:e,line:t,column:r},n){let i={offset:e,line:t,column:r};if(n){let o=n.split(/\\n|\\r\\n?|\\f/);i.offset+=n.length,i.line+=o.length-1,i.column=o.length===1?i.column+n.length:o.pop().length+1}return i}var Ye=function(e,t){let r=De(\"SyntaxReferenceError\",e+(t?\" `\"+t+\"`\":\"\"));return r.reference=t,r},es=function(e,t,r,n){let i=De(\"SyntaxMatchError\",e),{css:o,mismatchOffset:s,mismatchLength:u,start:c,end:a}=zl(n,r);return i.rawMessage=e,i.syntax=t?Oe(t):\"<generic>\",i.css=o,i.mismatchOffset=s,i.mismatchLength=u,i.message=e+`\n  syntax: `+i.syntax+`\n   value: `+(o||\"<empty string>\")+`\n  --------`+new Array(i.mismatchOffset+1).join(\"-\")+\"^\",Object.assign(i,c),i.loc={source:r&&r.loc&&r.loc.source||\"<unknown>\",start:c,end:a},i};var qt=new Map,Ke=new Map,jt=45,Ut=Pl,Cr=Il,Xd=Tr;function Ht(e,t){return t=t||0,e.length-t>=2&&e.charCodeAt(t)===jt&&e.charCodeAt(t+1)===jt}function Tr(e,t){if(t=t||0,e.length-t>=3&&e.charCodeAt(t)===jt&&e.charCodeAt(t+1)!==jt){let r=e.indexOf(\"-\",t+2);if(r!==-1)return e.substring(t,r+1)}return\"\"}function Pl(e){if(qt.has(e))return qt.get(e);let t=e.toLowerCase(),r=qt.get(t);if(r===void 0){let n=Ht(t,0),i=n?\"\":Tr(t,0);r=Object.freeze({basename:t.substr(i.length),name:t,prefix:i,vendor:i,custom:n})}return qt.set(e,r),r}function Il(e){if(Ke.has(e))return Ke.get(e);let t=e,r=e[0];r===\"/\"?r=e[1]===\"/\"?\"//\":\"/\":r!==\"_\"&&r!==\"*\"&&r!==\"$\"&&r!==\"#\"&&r!==\"+\"&&r!==\"&\"&&(r=\"\");let n=Ht(t,r.length);if(!n&&(t=t.toLowerCase(),Ke.has(t))){let u=Ke.get(t);return Ke.set(e,u),u}let i=n?\"\":Tr(t,r.length),o=t.substr(0,r.length+i.length),s=Object.freeze({basename:t.substr(o.length),name:t.substr(r.length),hack:r,vendor:i,prefix:o,custom:n});return Ke.set(e,s),s}var Ve=[\"initial\",\"inherit\",\"unset\",\"revert\",\"revert-layer\"];var mt=43,de=45,Ar=110,Qe=!0,Nl=!1;function Er(e,t){return e!==null&&e.type===9&&e.value.charCodeAt(0)===t}function ht(e,t,r){for(;e!==null&&(e.type===13||e.type===25);)e=r(++t);return t}function Te(e,t,r,n){if(!e)return 0;let i=e.value.charCodeAt(t);if(i===mt||i===de){if(r)return 0;t++}for(;t<e.value.length;t++)if(!O(e.value.charCodeAt(t)))return 0;return n+1}function Lr(e,t,r){let n=!1,i=ht(e,t,r);if(e=r(i),e===null)return t;if(e.type!==10)if(Er(e,mt)||Er(e,de)){if(n=!0,i=ht(r(++i),i,r),e=r(i),e===null||e.type!==10)return 0}else return t;if(!n){let o=e.value.charCodeAt(0);if(o!==mt&&o!==de)return 0}return Te(e,n?0:1,n,i)}function zr(e,t){let r=0;if(!e)return 0;if(e.type===10)return Te(e,0,Nl,r);if(e.type===1&&e.value.charCodeAt(0)===de){if(!xe(e.value,1,Ar))return 0;switch(e.value.length){case 2:return Lr(t(++r),r,t);case 3:return e.value.charCodeAt(2)!==de?0:(r=ht(t(++r),r,t),e=t(r),Te(e,0,Qe,r));default:return e.value.charCodeAt(2)!==de?0:Te(e,3,Qe,r)}}else if(e.type===1||Er(e,mt)&&t(r+1).type===1){if(e.type!==1&&(e=t(++r)),e===null||!xe(e.value,0,Ar))return 0;switch(e.value.length){case 1:return Lr(t(++r),r,t);case 2:return e.value.charCodeAt(1)!==de?0:(r=ht(t(++r),r,t),e=t(r),Te(e,0,Qe,r));default:return e.value.charCodeAt(1)!==de?0:Te(e,2,Qe,r)}}else if(e.type===12){let n=e.value.charCodeAt(0),i=n===mt||n===de?1:0,o=i;for(;o<e.value.length&&O(e.value.charCodeAt(o));o++);return o===i||!xe(e.value,o,Ar)?0:o+1===e.value.length?Lr(t(++r),r,t):e.value.charCodeAt(o+1)!==de?0:o+2===e.value.length?(r=ht(t(++r),r,t),e=t(r),Te(e,0,Qe,r)):Te(e,o+2,Qe,r)}return 0}var Ol=43,ts=45,rs=63,Rl=117;function Pr(e,t){return e!==null&&e.type===9&&e.value.charCodeAt(0)===t}function Fl(e,t){return e.value.charCodeAt(0)===t}function dt(e,t,r){let n=0;for(let i=t;i<e.value.length;i++){let o=e.value.charCodeAt(i);if(o===ts&&r&&n!==0)return dt(e,t+n+1,!1),6;if(!J(o)||++n>6)return 0}return n}function Gt(e,t,r){if(!e)return 0;for(;Pr(r(t),rs);){if(++e>6)return 0;t++}return t}function Ir(e,t){let r=0;if(e===null||e.type!==1||!xe(e.value,0,Rl)||(e=t(++r),e===null))return 0;if(Pr(e,Ol))return e=t(++r),e===null?0:e.type===1?Gt(dt(e,0,!0),++r,t):Pr(e,rs)?Gt(1,++r,t):0;if(e.type===10){let n=dt(e,1,!0);return n===0?0:(e=t(++r),e===null?r:e.type===12||e.type===10?!Fl(e,ts)||!dt(e,1,!1)?0:r+1:Gt(n,r,t))}return e.type===12?Gt(dt(e,1,!0),++r,t):0}var Ml=[\"calc(\",\"-moz-calc(\",\"-webkit-calc(\"],Dr=new Map([[2,22],[21,22],[19,20],[23,24]]);function ue(e,t){return t<e.length?e.charCodeAt(t):0}function ns(e,t){return ye(e,0,e.length,t)}function is(e,t){for(let r=0;r<t.length;r++)if(ns(e,t[r]))return!0;return!1}function os(e,t){return t!==e.length-2?!1:ue(e,t)===92&&O(ue(e,t+1))}function Yt(e,t,r){if(e&&e.type===\"Range\"){let n=Number(r!==void 0&&r!==t.length?t.substr(0,r):t);if(isNaN(n)||e.min!==null&&n<e.min&&typeof e.min!=\"string\"||e.max!==null&&n>e.max&&typeof e.max!=\"string\")return!0}return!1}function Bl(e,t){let r=0,n=[],i=0;e:do{switch(e.type){case 24:case 22:case 20:if(e.type!==r)break e;if(r=n.pop(),n.length===0){i++;break e}break;case 2:case 21:case 19:case 23:n.push(r),r=Dr.get(e.type);break}i++}while(e=t(i));return i}function ie(e){return function(t,r,n){return t===null?0:t.type===2&&is(t.value,Ml)?Bl(t,r):e(t,r,n)}}function I(e){return function(t){return t===null||t.type!==e?0:1}}function _l(e){if(e===null||e.type!==1)return 0;let t=e.value.toLowerCase();return is(t,Ve)||ns(t,\"default\")?0:1}function ss(e){return e===null||e.type!==1||ue(e.value,0)!==45||ue(e.value,1)!==45?0:1}function Wl(e){return!ss(e)||e.value===\"--\"?0:1}function ql(e){if(e===null||e.type!==4)return 0;let t=e.value.length;if(t!==4&&t!==5&&t!==7&&t!==9)return 0;for(let r=1;r<t;r++)if(!J(ue(e.value,r)))return 0;return 1}function jl(e){return e===null||e.type!==4||!We(ue(e.value,1),ue(e.value,2),ue(e.value,3))?0:1}function Ul(e,t){if(!e)return 0;let r=0,n=[],i=0;e:do{switch(e.type){case 6:case 8:break e;case 24:case 22:case 20:if(e.type!==r)break e;r=n.pop();break;case 17:if(r===0)break e;break;case 9:if(r===0&&e.value===\"!\")break e;break;case 2:case 21:case 19:case 23:n.push(r),r=Dr.get(e.type);break}i++}while(e=t(i));return i}function Hl(e,t){if(!e)return 0;let r=0,n=[],i=0;e:do{switch(e.type){case 6:case 8:break e;case 24:case 22:case 20:if(e.type!==r)break e;r=n.pop();break;case 2:case 21:case 19:case 23:n.push(r),r=Dr.get(e.type);break}i++}while(e=t(i));return i}function ve(e){return e&&(e=new Set(e)),function(t,r,n){if(t===null||t.type!==12)return 0;let i=Pe(t.value,0);if(e!==null){let o=t.value.indexOf(\"\\\\\",i),s=o===-1||!os(t.value,o)?t.value.substr(i):t.value.substring(i,o);if(e.has(s.toLowerCase())===!1)return 0}return Yt(n,t.value,i)?0:1}}function Gl(e,t,r){return e===null||e.type!==11||Yt(r,e.value,e.value.length-1)?0:1}function as(e){return typeof e!=\"function\"&&(e=function(){return 0}),function(t,r,n){return t!==null&&t.type===10&&Number(t.value)===0?1:e(t,r,n)}}function Yl(e,t,r){if(e===null)return 0;let n=Pe(e.value,0);return!(n===e.value.length)&&!os(e.value,n)||Yt(r,e.value,n)?0:1}function Kl(e,t,r){if(e===null||e.type!==10)return 0;let n=ue(e.value,0)===43||ue(e.value,0)===45?1:0;for(;n<e.value.length;n++)if(!O(ue(e.value,n)))return 0;return Yt(r,e.value,n)?0:1}var Vl={\"ident-token\":I(1),\"function-token\":I(2),\"at-keyword-token\":I(3),\"hash-token\":I(4),\"string-token\":I(5),\"bad-string-token\":I(6),\"url-token\":I(7),\"bad-url-token\":I(8),\"delim-token\":I(9),\"number-token\":I(10),\"percentage-token\":I(11),\"dimension-token\":I(12),\"whitespace-token\":I(13),\"CDO-token\":I(14),\"CDC-token\":I(15),\"colon-token\":I(16),\"semicolon-token\":I(17),\"comma-token\":I(18),\"[-token\":I(19),\"]-token\":I(20),\"(-token\":I(21),\")-token\":I(22),\"{-token\":I(23),\"}-token\":I(24)},Ql={string:I(5),ident:I(1),percentage:ie(Gl),zero:as(),number:ie(Yl),integer:ie(Kl),\"custom-ident\":_l,\"dashed-ident\":ss,\"custom-property-name\":Wl,\"hex-color\":ql,\"id-selector\":jl,\"an-plus-b\":zr,urange:Ir,\"declaration-value\":Ul,\"any-value\":Hl};function Xl(e){let{angle:t,decibel:r,frequency:n,flex:i,length:o,resolution:s,semitones:u,time:c}=e||{};return{dimension:ie(ve(null)),angle:ie(ve(t)),decibel:ie(ve(r)),frequency:ie(ve(n)),flex:ie(ve(i)),length:ie(as(ve(o))),resolution:ie(ve(s)),semitones:ie(ve(u)),time:ie(ve(c))}}function ls(e){return{...Vl,...Ql,...Xl(e)}}var Kt={};f(Kt,{angle:()=>Zl,decibel:()=>nc,flex:()=>rc,frequency:()=>ec,length:()=>$l,resolution:()=>tc,semitones:()=>ic,time:()=>Jl});var $l=[\"cm\",\"mm\",\"q\",\"in\",\"pt\",\"pc\",\"px\",\"em\",\"rem\",\"ex\",\"rex\",\"cap\",\"rcap\",\"ch\",\"rch\",\"ic\",\"ric\",\"lh\",\"rlh\",\"vw\",\"svw\",\"lvw\",\"dvw\",\"vh\",\"svh\",\"lvh\",\"dvh\",\"vi\",\"svi\",\"lvi\",\"dvi\",\"vb\",\"svb\",\"lvb\",\"dvb\",\"vmin\",\"svmin\",\"lvmin\",\"dvmin\",\"vmax\",\"svmax\",\"lvmax\",\"dvmax\",\"cqw\",\"cqh\",\"cqi\",\"cqb\",\"cqmin\",\"cqmax\"],Zl=[\"deg\",\"grad\",\"rad\",\"turn\"],Jl=[\"s\",\"ms\"],ec=[\"hz\",\"khz\"],tc=[\"dpi\",\"dpcm\",\"dppx\",\"x\"],rc=[\"fr\"],nc=[\"db\"],ic=[\"st\"];var ws={};f(ws,{SyntaxError:()=>Vt,generate:()=>Oe,parse:()=>Xe,walk:()=>Zt});function Vt(e,t,r){return Object.assign(De(\"SyntaxError\",e),{input:t,offset:r,rawMessage:e,message:e+`\n  `+t+`\n--`+new Array((r||t.length)+1).join(\"-\")+\"^\"})}var oc=9,sc=10,ac=12,lc=13,cc=32,cs=new Uint8Array(128).map((e,t)=>/[a-zA-Z0-9\\-]/.test(String.fromCharCode(t))?1:0),Qt=class{constructor(t){this.str=t,this.pos=0}charCodeAt(t){return t<this.str.length?this.str.charCodeAt(t):0}charCode(){return this.charCodeAt(this.pos)}isNameCharCode(t=this.charCode()){return t<128&&cs[t]===1}nextCharCode(){return this.charCodeAt(this.pos+1)}nextNonWsCode(t){return this.charCodeAt(this.findWsEnd(t))}skipWs(){this.pos=this.findWsEnd(this.pos)}findWsEnd(t){for(;t<this.str.length;t++){let r=this.str.charCodeAt(t);if(r!==lc&&r!==sc&&r!==ac&&r!==cc&&r!==oc)break}return t}substringToPos(t){return this.str.substring(this.pos,this.pos=t)}eat(t){this.charCode()!==t&&this.error(\"Expect `\"+String.fromCharCode(t)+\"`\"),this.pos++}peek(){return this.pos<this.str.length?this.str.charAt(this.pos++):\"\"}error(t){throw new Vt(t,this.str,this.pos)}scanSpaces(){return this.substringToPos(this.findWsEnd(this.pos))}scanWord(){let t=this.pos;for(;t<this.str.length;t++){let r=this.str.charCodeAt(t);if(r>=128||cs[r]===0)break}return this.pos===t&&this.error(\"Expect a keyword\"),this.substringToPos(t)}scanNumber(){let t=this.pos;for(;t<this.str.length;t++){let r=this.str.charCodeAt(t);if(r<48||r>57)break}return this.pos===t&&this.error(\"Expect a number\"),this.substringToPos(t)}scanString(){let t=this.str.indexOf(\"'\",this.pos+1);return t===-1&&(this.pos=this.str.length,this.error(\"Expect an apostrophe\")),this.substringToPos(t+1)}};var uc=9,pc=10,hc=12,mc=13,dc=32,bs=33,Fr=35,us=38,Xt=39,xs=40,fc=41,ys=42,Mr=43,Br=44,ps=45,_r=60,Or=62,Rr=63,gc=64,ft=91,gt=93,$t=123,hs=124,ms=125,ds=8734,fs={\" \":1,\"&&\":2,\"||\":3,\"|\":4};function gs(e){let t=null,r=null;return e.eat($t),e.skipWs(),t=e.scanNumber(e),e.skipWs(),e.charCode()===Br?(e.pos++,e.skipWs(),e.charCode()!==ms&&(r=e.scanNumber(e),e.skipWs())):r=t,e.eat(ms),{min:Number(t),max:r?Number(r):0}}function bc(e){let t=null,r=!1;switch(e.charCode()){case ys:e.pos++,t={min:0,max:0};break;case Mr:e.pos++,t={min:1,max:0};break;case Rr:e.pos++,t={min:0,max:1};break;case Fr:e.pos++,r=!0,e.charCode()===$t?t=gs(e):e.charCode()===Rr?(e.pos++,t={min:0,max:0}):t={min:1,max:0};break;case $t:t=gs(e);break;default:return null}return{type:\"Multiplier\",comma:r,min:t.min,max:t.max,term:null}}function Ae(e,t){let r=bc(e);return r!==null?(r.term=t,e.charCode()===Fr&&e.charCodeAt(e.pos-1)===Mr?Ae(e,r):r):t}function Nr(e){let t=e.peek();return t===\"\"?null:Ae(e,{type:\"Token\",value:t})}function xc(e){let t;return e.eat(_r),e.eat(Xt),t=e.scanWord(),e.eat(Xt),e.eat(Or),Ae(e,{type:\"Property\",name:t})}function yc(e){let t=null,r=null,n=1;return e.eat(ft),e.charCode()===ps&&(e.peek(),n=-1),n==-1&&e.charCode()===ds?e.peek():(t=n*Number(e.scanNumber(e)),e.isNameCharCode()&&(t+=e.scanWord())),e.skipWs(),e.eat(Br),e.skipWs(),e.charCode()===ds?e.peek():(n=1,e.charCode()===ps&&(e.peek(),n=-1),r=n*Number(e.scanNumber(e)),e.isNameCharCode()&&(r+=e.scanWord())),e.eat(gt),{type:\"Range\",min:t,max:r}}function kc(e){let t,r=null;if(e.eat(_r),t=e.scanWord(),t===\"boolean-expr\"){e.eat(ft);let n=Wr(e,gt);return e.eat(gt),e.eat(Or),Ae(e,{type:\"Boolean\",term:n.terms.length===1?n.terms[0]:n})}return e.charCode()===xs&&e.nextCharCode()===fc&&(e.pos+=2,t+=\"()\"),e.charCodeAt(e.findWsEnd(e.pos))===ft&&(e.skipWs(),r=yc(e)),e.eat(Or),Ae(e,{type:\"Type\",name:t,opts:r})}function wc(e){let t=e.scanWord();return e.charCode()===xs?(e.pos++,{type:\"Function\",name:t}):Ae(e,{type:\"Keyword\",name:t})}function vc(e,t){function r(i,o){return{type:\"Group\",terms:i,combinator:o,disallowEmpty:!1,explicit:!1}}let n;for(t=Object.keys(t).sort((i,o)=>fs[i]-fs[o]);t.length>0;){n=t.shift();let i=0,o=0;for(;i<e.length;i++){let s=e[i];s.type===\"Combinator\"&&(s.value===n?(o===-1&&(o=i-1),e.splice(i,1),i--):(o!==-1&&i-o>1&&(e.splice(o,i-o,r(e.slice(o,i),n)),i=o+1),o=-1))}o!==-1&&t.length&&e.splice(o,i-o,r(e.slice(o,i),n))}return n}function Wr(e,t){let r=Object.create(null),n=[],i,o=null,s=e.pos;for(;e.charCode()!==t&&(i=Cc(e,t));)i.type!==\"Spaces\"&&(i.type===\"Combinator\"?((o===null||o.type===\"Combinator\")&&(e.pos=s,e.error(\"Unexpected combinator\")),r[i.value]=!0):o!==null&&o.type!==\"Combinator\"&&(r[\" \"]=!0,n.push({type:\"Combinator\",value:\" \"})),n.push(i),o=i,s=e.pos);return o!==null&&o.type===\"Combinator\"&&(e.pos-=s,e.error(\"Unexpected combinator\")),{type:\"Group\",terms:n,combinator:vc(n,r)||\" \",disallowEmpty:!1,explicit:!1}}function Sc(e,t){let r;return e.eat(ft),r=Wr(e,t),e.eat(gt),r.explicit=!0,e.charCode()===bs&&(e.pos++,r.disallowEmpty=!0),r}function Cc(e,t){let r=e.charCode();switch(r){case gt:break;case ft:return Ae(e,Sc(e,t));case _r:return e.nextCharCode()===Xt?xc(e):kc(e);case hs:return{type:\"Combinator\",value:e.substringToPos(e.pos+(e.nextCharCode()===hs?2:1))};case us:return e.pos++,e.eat(us),{type:\"Combinator\",value:\"&&\"};case Br:return e.pos++,{type:\"Comma\"};case Xt:return Ae(e,{type:\"String\",value:e.scanString()});case dc:case uc:case pc:case mc:case hc:return{type:\"Spaces\",value:e.scanSpaces()};case gc:return r=e.nextCharCode(),e.isNameCharCode(r)?(e.pos++,{type:\"AtKeyword\",name:e.scanWord()}):Nr(e);case ys:case Mr:case Rr:case Fr:case bs:break;case $t:if(r=e.nextCharCode(),r<48||r>57)return Nr(e);break;default:return e.isNameCharCode(r)?wc(e):Nr(e)}}function Xe(e){let t=new Qt(e),r=Wr(t);return t.pos!==e.length&&t.error(\"Unexpected input\"),r.terms.length===1&&r.terms[0].type===\"Group\"?r.terms[0]:r}var bt=function(){};function ks(e){return typeof e==\"function\"?e:bt}function Zt(e,t,r){function n(s){switch(i.call(r,s),s.type){case\"Group\":s.terms.forEach(n);break;case\"Multiplier\":case\"Boolean\":n(s.term);break;case\"Type\":case\"Property\":case\"Keyword\":case\"AtKeyword\":case\"Function\":case\"String\":case\"Token\":case\"Comma\":break;default:throw new Error(\"Unknown type: \"+s.type)}o.call(r,s)}let i=bt,o=bt;if(typeof t==\"function\"?i=t:t&&(i=ks(t.enter),o=ks(t.leave)),i===bt&&o===bt)throw new Error(\"Neither `enter` nor `leave` walker handler is set or both aren't a function\");n(e,r)}var Tc={decorator(e){let t=[],r=null;return{...e,node(n){let i=r;r=n,e.node.call(this,n),r=i},emit(n,i,o){t.push({type:i,value:n,node:o?null:r})},result(){return t}}}};function Ac(e){let t=[];return Ce(e,(r,n,i)=>t.push({type:r,value:e.slice(n,i),node:null})),t}function vs(e,t){return typeof e==\"string\"?Ac(e):t.generate(e,Tc)}var C={type:\"Match\"},E={type:\"Mismatch\"},Jt={type:\"DisallowEmpty\"},Lc=40,Ec=41;function Q(e,t,r){return t===C&&r===E||e===C&&t===C&&r===C?e:(e.type===\"If\"&&e.else===E&&t===C&&(t=e.then,e=e.match),{type:\"If\",match:e,then:t,else:r})}function Cs(e){return e.length>2&&e.charCodeAt(e.length-2)===Lc&&e.charCodeAt(e.length-1)===Ec}function Ss(e){return e.type===\"Keyword\"||e.type===\"AtKeyword\"||e.type===\"Function\"||e.type===\"Type\"&&Cs(e.name)}function Le(e,t=\" \",r=!1){return{type:\"Group\",terms:e,combinator:t,disallowEmpty:!1,explicit:r}}function xt(e,t,r=new Set){if(!r.has(e))switch(r.add(e),e.type){case\"If\":e.match=xt(e.match,t,r),e.then=xt(e.then,t,r),e.else=xt(e.else,t,r);break;case\"Type\":return t[e.name]||e}return e}function qr(e,t,r){switch(e){case\" \":{let n=C;for(let i=t.length-1;i>=0;i--){let o=t[i];n=Q(o,n,E)}return n}case\"|\":{let n=E,i=null;for(let o=t.length-1;o>=0;o--){let s=t[o];if(Ss(s)&&(i===null&&o>0&&Ss(t[o-1])&&(i=Object.create(null),n=Q({type:\"Enum\",map:i},C,n)),i!==null)){let u=(Cs(s.name)?s.name.slice(0,-1):s.name).toLowerCase();if(!(u in i)){i[u]=s;continue}}i=null,n=Q(s,C,n)}return n}case\"&&\":{if(t.length>5)return{type:\"MatchOnce\",terms:t,all:!0};let n=E;for(let i=t.length-1;i>=0;i--){let o=t[i],s;t.length>1?s=qr(e,t.filter(function(u){return u!==o}),!1):s=C,n=Q(o,s,n)}return n}case\"||\":{if(t.length>5)return{type:\"MatchOnce\",terms:t,all:!1};let n=r?C:E;for(let i=t.length-1;i>=0;i--){let o=t[i],s;t.length>1?s=qr(e,t.filter(function(u){return u!==o}),!0):s=C,n=Q(o,s,n)}return n}}}function zc(e){let t=C,r=$e(e.term);if(e.max===0)r=Q(r,Jt,E),t=Q(r,null,E),t.then=Q(C,C,t),e.comma&&(t.then.else=Q({type:\"Comma\",syntax:e},t,E));else for(let n=e.min||1;n<=e.max;n++)e.comma&&t!==C&&(t=Q({type:\"Comma\",syntax:e},t,E)),t=Q(r,Q(C,C,t),E);if(e.min===0)t=Q(C,C,t);else for(let n=0;n<e.min-1;n++)e.comma&&t!==C&&(t=Q({type:\"Comma\",syntax:e},t,E)),t=Q(r,t,E);return t}function $e(e){if(typeof e==\"function\")return{type:\"Generic\",fn:e};switch(e.type){case\"Group\":{let t=qr(e.combinator,e.terms.map($e),!1);return e.disallowEmpty&&(t=Q(t,Jt,E)),t}case\"Multiplier\":return zc(e);case\"Boolean\":{let t=$e(e.term),r=$e(Le([Le([{type:\"Keyword\",name:\"not\"},{type:\"Type\",name:\"!boolean-group\"}]),Le([{type:\"Type\",name:\"!boolean-group\"},Le([{type:\"Multiplier\",comma:!1,min:0,max:0,term:Le([{type:\"Keyword\",name:\"and\"},{type:\"Type\",name:\"!boolean-group\"}])},{type:\"Multiplier\",comma:!1,min:0,max:0,term:Le([{type:\"Keyword\",name:\"or\"},{type:\"Type\",name:\"!boolean-group\"}])}],\"|\")])],\"|\")),n=$e(Le([{type:\"Type\",name:\"!term\"},Le([{type:\"Token\",value:\"(\"},{type:\"Type\",name:\"!self\"},{type:\"Token\",value:\")\"}]),{type:\"Type\",name:\"general-enclosed\"}],\"|\"));return xt(n,{\"!term\":t,\"!self\":r}),xt(r,{\"!boolean-group\":n}),r}case\"Type\":case\"Property\":return{type:e.type,name:e.name,syntax:e};case\"Keyword\":return{type:e.type,name:e.name.toLowerCase(),syntax:e};case\"AtKeyword\":return{type:e.type,name:\"@\"+e.name.toLowerCase(),syntax:e};case\"Function\":return{type:e.type,name:e.name.toLowerCase()+\"(\",syntax:e};case\"String\":return e.value.length===3?{type:\"Token\",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\\\'/g,\"'\"),syntax:e};case\"Token\":return{type:e.type,value:e.value,syntax:e};case\"Comma\":return{type:e.type,syntax:e};default:throw new Error(\"Unknown node type:\",e.type)}}function yt(e,t){return typeof e==\"string\"&&(e=Xe(e)),{type:\"MatchGraph\",match:$e(e),syntax:t||null,source:e}}var{hasOwnProperty:Ts}=Object.prototype,Pc=0,Ic=1,Ur=2,Ps=3,As=\"Match\",Dc=\"Mismatch\",Nc=\"Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)\",Ls=15e3,Oc=0;function Rc(e){let t=null,r=null,n=e;for(;n!==null;)r=n.prev,n.prev=t,t=n,n=r;return t}function jr(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++){let n=t.charCodeAt(r),i=e.charCodeAt(r);if(i>=65&&i<=90&&(i=i|32),i!==n)return!1}return!0}function Fc(e){return e.type!==9?!1:e.value!==\"?\"}function Es(e){return e===null?!0:e.type===18||e.type===2||e.type===21||e.type===19||e.type===23||Fc(e)}function zs(e){return e===null?!0:e.type===22||e.type===20||e.type===24||e.type===9&&e.value===\"/\"}function Mc(e,t,r){function n(){do T++,w=T<e.length?e[T]:null;while(w!==null&&(w.type===13||w.type===25))}function i(oe){let ge=T+oe;return ge<e.length?e[ge]:null}function o(oe,ge){return{nextState:oe,matchStack:z,syntaxStack:p,thenStack:h,tokenIndex:T,prev:ge}}function s(oe){h={nextState:oe,matchStack:z,syntaxStack:p,prev:h}}function u(oe){d=o(oe,d)}function c(){z={type:Ic,syntax:t.syntax,token:w,prev:z},n(),g=null,T>he&&(he=T)}function a(){p={syntax:t.syntax,opts:t.syntax.opts||p!==null&&p.opts||null,prev:p},z={type:Ur,syntax:t.syntax,token:z.token,prev:z}}function l(){z.type===Ur?z=z.prev:z={type:Ps,syntax:p.syntax,token:z.token,prev:z},p=p.prev}let p=null,h=null,d=null,g=null,ee=0,j=null,w=null,T=-1,he=0,z={type:Pc,syntax:null,token:null,prev:null};for(n();j===null&&++ee<Ls;)switch(t.type){case\"Match\":if(h===null){if(w!==null&&(T!==e.length-1||w.value!==\"\\\\0\"&&w.value!==\"\\\\9\")){t=E;break}j=As;break}if(t=h.nextState,t===Jt)if(h.matchStack===z){t=E;break}else t=C;for(;h.syntaxStack!==p;)l();h=h.prev;break;case\"Mismatch\":if(g!==null&&g!==!1)(d===null||T>d.tokenIndex)&&(d=g,g=!1);else if(d===null){j=Dc;break}t=d.nextState,h=d.thenStack,p=d.syntaxStack,z=d.matchStack,T=d.tokenIndex,w=T<e.length?e[T]:null,d=d.prev;break;case\"MatchGraph\":t=t.match;break;case\"If\":t.else!==E&&u(t.else),t.then!==C&&s(t.then),t=t.match;break;case\"MatchOnce\":t={type:\"MatchOnceBuffer\",syntax:t,index:0,mask:0};break;case\"MatchOnceBuffer\":{let q=t.syntax.terms;if(t.index===q.length){if(t.mask===0||t.syntax.all){t=E;break}t=C;break}if(t.mask===(1<<q.length)-1){t=C;break}for(;t.index<q.length;t.index++){let U=1<<t.index;if(!(t.mask&U)){u(t),s({type:\"AddMatchOnce\",syntax:t.syntax,mask:t.mask|U}),t=q[t.index++];break}}break}case\"AddMatchOnce\":t={type:\"MatchOnceBuffer\",syntax:t.syntax,index:0,mask:t.mask};break;case\"Enum\":if(w!==null){let q=w.value.toLowerCase();if(q.indexOf(\"\\\\\")!==-1&&(q=q.replace(/\\\\[09].*$/,\"\")),Ts.call(t.map,q)){t=t.map[q];break}}t=E;break;case\"Generic\":{let q=p!==null?p.opts:null,U=T+Math.floor(t.fn(w,i,q));if(!isNaN(U)&&U>T){for(;T<U;)c();t=C}else t=E;break}case\"Type\":case\"Property\":{let q=t.type===\"Type\"?\"types\":\"properties\",U=Ts.call(r,q)?r[q][t.name]:null;if(!U||!U.match)throw new Error(\"Bad syntax reference: \"+(t.type===\"Type\"?\"<\"+t.name+\">\":\"<'\"+t.name+\"'>\"));if(g!==!1&&w!==null&&t.type===\"Type\"&&(t.name===\"custom-ident\"&&w.type===1||t.name===\"length\"&&w.value===\"0\")){g===null&&(g=o(t,d)),t=E;break}a(),t=U.matchRef||U.match;break}case\"Keyword\":{let q=t.name;if(w!==null){let U=w.value;if(U.indexOf(\"\\\\\")!==-1&&(U=U.replace(/\\\\[09].*$/,\"\")),jr(U,q)){c(),t=C;break}}t=E;break}case\"AtKeyword\":case\"Function\":if(w!==null&&jr(w.value,t.name)){c(),t=C;break}t=E;break;case\"Token\":if(w!==null&&w.value===t.value){c(),t=C;break}t=E;break;case\"Comma\":w!==null&&w.type===18?Es(z.token)?t=E:(c(),t=zs(w)?E:C):t=Es(z.token)||zs(w)?C:E;break;case\"String\":let oe=\"\",ge=T;for(;ge<e.length&&oe.length<t.value.length;ge++)oe+=e[ge].value;if(jr(oe,t.value)){for(;T<ge;)c();t=C}else t=E;break;default:throw new Error(\"Unknown node type: \"+t.type)}switch(Oc+=ee,j){case null:console.warn(\"[csstree-match] BREAK after \"+Ls+\" iterations\"),j=Nc,z=null;break;case As:for(;p!==null;)l();break;default:z=null}return{tokens:e,reason:j,iterations:ee,match:z,longestMatch:he}}function Hr(e,t,r){let n=Mc(e,t,r||{});if(n.match===null)return n;let i=n.match,o=n.match={syntax:t.syntax||null,match:[]},s=[o];for(i=Rc(i).prev;i!==null;){switch(i.type){case Ur:o.match.push(o={syntax:i.syntax,match:[]}),s.push(o);break;case Ps:s.pop(),o=s[s.length-1];break;default:o.match.push({syntax:i.syntax||null,token:i.token.value,node:i.token.node})}i=i.prev}return n}var Yr={};f(Yr,{getTrace:()=>Is,isKeyword:()=>Wc,isProperty:()=>_c,isType:()=>Bc});function Is(e){function t(i){return i===null?!1:i.type===\"Type\"||i.type===\"Property\"||i.type===\"Keyword\"}function r(i){if(Array.isArray(i.match)){for(let o=0;o<i.match.length;o++)if(r(i.match[o]))return t(i.syntax)&&n.unshift(i.syntax),!0}else if(i.node===e)return n=t(i.syntax)?[i.syntax]:[],!0;return!1}let n=null;return this.matched!==null&&r(this.matched),n}function Bc(e,t){return Gr(this,e,r=>r.type===\"Type\"&&r.name===t)}function _c(e,t){return Gr(this,e,r=>r.type===\"Property\"&&r.name===t)}function Wc(e){return Gr(this,e,t=>t.type===\"Keyword\")}function Gr(e,t,r){let n=Is.call(e,t);return n===null?!1:n.some(r)}function Ds(e){return\"node\"in e?e.node:Ds(e.match[0])}function Ns(e){return\"node\"in e?e.node:Ns(e.match[e.match.length-1])}function Kr(e,t,r,n,i){function o(u){if(u.syntax!==null&&u.syntax.type===n&&u.syntax.name===i){let c=Ds(u),a=Ns(u);e.syntax.walk(t,function(l,p,h){if(l===c){let d=new V;do{if(d.appendData(p.data),p.data===a)break;p=p.next}while(p!==null);s.push({parent:h,nodes:d})}})}Array.isArray(u.match)&&u.match.forEach(o)}let s=[];return r.matched!==null&&o(r.matched),s}var{hasOwnProperty:kt}=Object.prototype;function Vr(e){return typeof e==\"number\"&&isFinite(e)&&Math.floor(e)===e&&e>=0}function Os(e){return!!e&&Vr(e.offset)&&Vr(e.line)&&Vr(e.column)}function qc(e,t){return function(n,i){if(!n||n.constructor!==Object)return i(n,\"Type of node should be an Object\");for(let o in n){let s=!0;if(kt.call(n,o)!==!1){if(o===\"type\")n.type!==e&&i(n,\"Wrong node type `\"+n.type+\"`, expected `\"+e+\"`\");else if(o===\"loc\"){if(n.loc===null)continue;if(n.loc&&n.loc.constructor===Object)if(typeof n.loc.source!=\"string\")o+=\".source\";else if(!Os(n.loc.start))o+=\".start\";else if(!Os(n.loc.end))o+=\".end\";else continue;s=!1}else if(t.hasOwnProperty(o)){s=!1;for(let u=0;!s&&u<t[o].length;u++){let c=t[o][u];switch(c){case String:s=typeof n[o]==\"string\";break;case Boolean:s=typeof n[o]==\"boolean\";break;case null:s=n[o]===null;break;default:typeof c==\"string\"?s=n[o]&&n[o].type===c:Array.isArray(c)&&(s=n[o]instanceof V)}}}else i(n,\"Unknown field `\"+o+\"` for \"+e+\" node type\");s||i(n,\"Bad value for `\"+e+\".\"+o+\"`\")}}for(let o in t)kt.call(t,o)&&kt.call(n,o)===!1&&i(n,\"Field `\"+e+\".\"+o+\"` is missed\")}}function Rs(e,t){let r=[];for(let n=0;n<e.length;n++){let i=e[n];if(i===String||i===Boolean)r.push(i.name.toLowerCase());else if(i===null)r.push(\"null\");else if(typeof i==\"string\")r.push(i);else if(Array.isArray(i))r.push(\"List<\"+(Rs(i,t)||\"any\")+\">\");else throw new Error(\"Wrong value `\"+i+\"` in `\"+t+\"` structure definition\")}return r.join(\" | \")}function jc(e,t){let r=t.structure,n={type:String,loc:!0},i={type:'\"'+e+'\"'};for(let o in r){if(kt.call(r,o)===!1)continue;let s=n[o]=Array.isArray(r[o])?r[o].slice():[r[o]];i[o]=Rs(s,e+\".\"+o)}return{docs:i,check:qc(e,n)}}function Fs(e){let t={};if(e.node){for(let r in e.node)if(kt.call(e.node,r)){let n=e.node[r];if(n.structure)t[r]=jc(r,n);else throw new Error(\"Missed `structure` field in `\"+r+\"` node type definition\")}}return t}function Qr(e,t,r){let n={};for(let i in e)e[i].syntax&&(n[i]=r?e[i].syntax:Oe(e[i].syntax,{compact:t}));return n}function Uc(e,t,r){let n={};for(let[i,o]of Object.entries(e))n[i]={prelude:o.prelude&&(r?o.prelude.syntax:Oe(o.prelude.syntax,{compact:t})),descriptors:o.descriptors&&Qr(o.descriptors,t,r)};return n}function Hc(e){for(let t=0;t<e.length;t++)if(e[t].value.toLowerCase()===\"var(\")return!0;return!1}function Gc(e){let t=e.terms[0];return e.explicit===!1&&e.terms.length===1&&t.type===\"Multiplier\"&&t.comma===!0}function pe(e,t,r){return{matched:e,iterations:r,error:t,...Yr}}function Ze(e,t,r,n){let i=vs(r,e.syntax),o;return Hc(i)?pe(null,new Error(\"Matching for a tree with var() is not supported\")):(n&&(o=Hr(i,e.cssWideKeywordsSyntax,e)),(!n||!o.match)&&(o=Hr(i,t.match,e),!o.match)?pe(null,new es(o.reason,t.syntax,r,o),o.iterations):pe(o.match,null,o.iterations))}var Je=class{constructor(t,r,n){if(this.cssWideKeywords=Ve,this.syntax=r,this.generic=!1,this.units={...Kt},this.atrules=Object.create(null),this.properties=Object.create(null),this.types=Object.create(null),this.structure=n||Fs(t),t){if(t.cssWideKeywords&&(this.cssWideKeywords=t.cssWideKeywords),t.units)for(let i of Object.keys(Kt))Array.isArray(t.units[i])&&(this.units[i]=t.units[i]);if(t.types)for(let[i,o]of Object.entries(t.types))this.addType_(i,o);if(t.generic){this.generic=!0;for(let[i,o]of Object.entries(ls(this.units)))this.addType_(i,o)}if(t.atrules)for(let[i,o]of Object.entries(t.atrules))this.addAtrule_(i,o);if(t.properties)for(let[i,o]of Object.entries(t.properties))this.addProperty_(i,o)}this.cssWideKeywordsSyntax=yt(this.cssWideKeywords.join(\" |  \"))}checkStructure(t){function r(o,s){i.push({node:o,message:s})}let n=this.structure,i=[];return this.syntax.walk(t,function(o){n.hasOwnProperty(o.type)?n[o.type].check(o,r):r(o,\"Unknown node type `\"+o.type+\"`\")}),i.length?i:!1}createDescriptor(t,r,n,i=null){let o={type:r,name:n},s={type:r,name:n,parent:i,serializable:typeof t==\"string\"||t&&typeof t.type==\"string\",syntax:null,match:null,matchRef:null};return typeof t==\"function\"?s.match=yt(t,o):(typeof t==\"string\"?Object.defineProperty(s,\"syntax\",{get(){return Object.defineProperty(s,\"syntax\",{value:Xe(t)}),s.syntax}}):s.syntax=t,Object.defineProperty(s,\"match\",{get(){return Object.defineProperty(s,\"match\",{value:yt(s.syntax,o)}),s.match}}),r===\"Property\"&&Object.defineProperty(s,\"matchRef\",{get(){let u=s.syntax,c=Gc(u)?yt({...u,terms:[u.terms[0].term]},o):null;return Object.defineProperty(s,\"matchRef\",{value:c}),c}})),s}addAtrule_(t,r){r&&(this.atrules[t]={type:\"Atrule\",name:t,prelude:r.prelude?this.createDescriptor(r.prelude,\"AtrulePrelude\",t):null,descriptors:r.descriptors?Object.keys(r.descriptors).reduce((n,i)=>(n[i]=this.createDescriptor(r.descriptors[i],\"AtruleDescriptor\",i,t),n),Object.create(null)):null})}addProperty_(t,r){r&&(this.properties[t]=this.createDescriptor(r,\"Property\",t))}addType_(t,r){r&&(this.types[t]=this.createDescriptor(r,\"Type\",t))}checkAtruleName(t){if(!this.getAtrule(t))return new Ye(\"Unknown at-rule\",\"@\"+t)}checkAtrulePrelude(t,r){let n=this.checkAtruleName(t);if(n)return n;let i=this.getAtrule(t);if(!i.prelude&&r)return new SyntaxError(\"At-rule `@\"+t+\"` should not contain a prelude\");if(i.prelude&&!r&&!Ze(this,i.prelude,\"\",!1).matched)return new SyntaxError(\"At-rule `@\"+t+\"` should contain a prelude\")}checkAtruleDescriptorName(t,r){let n=this.checkAtruleName(t);if(n)return n;let i=this.getAtrule(t),o=Ut(r);if(!i.descriptors)return new SyntaxError(\"At-rule `@\"+t+\"` has no known descriptors\");if(!i.descriptors[o.name]&&!i.descriptors[o.basename])return new Ye(\"Unknown at-rule descriptor\",r)}checkPropertyName(t){if(!this.getProperty(t))return new Ye(\"Unknown property\",t)}matchAtrulePrelude(t,r){let n=this.checkAtrulePrelude(t,r);if(n)return pe(null,n);let i=this.getAtrule(t);return i.prelude?Ze(this,i.prelude,r||\"\",!1):pe(null,null)}matchAtruleDescriptor(t,r,n){let i=this.checkAtruleDescriptorName(t,r);if(i)return pe(null,i);let o=this.getAtrule(t),s=Ut(r);return Ze(this,o.descriptors[s.name]||o.descriptors[s.basename],n,!1)}matchDeclaration(t){return t.type!==\"Declaration\"?pe(null,new Error(\"Not a Declaration node\")):this.matchProperty(t.property,t.value)}matchProperty(t,r){if(Cr(t).custom)return pe(null,new Error(\"Lexer matching doesn't applicable for custom properties\"));let n=this.checkPropertyName(t);return n?pe(null,n):Ze(this,this.getProperty(t),r,!0)}matchType(t,r){let n=this.getType(t);return n?Ze(this,n,r,!1):pe(null,new Ye(\"Unknown type\",t))}match(t,r){return typeof t!=\"string\"&&(!t||!t.type)?pe(null,new Ye(\"Bad syntax\")):((typeof t==\"string\"||!t.match)&&(t=this.createDescriptor(t,\"Type\",\"anonymous\")),Ze(this,t,r,!1))}findValueFragments(t,r,n,i){return Kr(this,r,this.matchProperty(t,r),n,i)}findDeclarationValueFragments(t,r,n){return Kr(this,t.value,this.matchDeclaration(t),r,n)}findAllFragments(t,r,n){let i=[];return this.syntax.walk(t,{visit:\"Declaration\",enter:o=>{i.push.apply(i,this.findDeclarationValueFragments(o,r,n))}}),i}getAtrule(t,r=!0){let n=Ut(t);return(n.vendor&&r?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null}getAtrulePrelude(t,r=!0){let n=this.getAtrule(t,r);return n&&n.prelude||null}getAtruleDescriptor(t,r){return this.atrules.hasOwnProperty(t)&&this.atrules.declarators&&this.atrules[t].declarators[r]||null}getProperty(t,r=!0){let n=Cr(t);return(n.vendor&&r?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null}getType(t){return hasOwnProperty.call(this.types,t)?this.types[t]:null}validate(){function t(c,a){return a?`<${c}>`:`<'${c}'>`}function r(c,a,l,p){if(l.has(a))return l.get(a);l.set(a,!1),p.syntax!==null&&Zt(p.syntax,function(h){if(h.type!==\"Type\"&&h.type!==\"Property\")return;let d=h.type===\"Type\"?c.types:c.properties,g=h.type===\"Type\"?i:o;hasOwnProperty.call(d,h.name)?r(c,h.name,g,d[h.name])&&(n.push(`${t(a,l===i)} used broken syntax definition ${t(h.name,h.type===\"Type\")}`),l.set(a,!0)):(n.push(`${t(a,l===i)} used missed syntax definition ${t(h.name,h.type===\"Type\")}`),l.set(a,!0))},this)}let n=[],i=new Map,o=new Map;for(let c in this.types)r(this,c,i,this.types[c]);for(let c in this.properties)r(this,c,o,this.properties[c]);let s=[...i.keys()].filter(c=>i.get(c)),u=[...o.keys()].filter(c=>o.get(c));return s.length||u.length?{errors:n,types:s,properties:u}:null}dump(t,r){return{generic:this.generic,cssWideKeywords:this.cssWideKeywords,units:this.units,types:Qr(this.types,!r,t),properties:Qr(this.properties,!r,t),atrules:Uc(this.atrules,!r,t)}}toString(){return JSON.stringify(this.dump())}};function Xr(e,t){return typeof t==\"string\"&&/^\\s*\\|/.test(t)?typeof e==\"string\"?e+t:t.replace(/^\\s*\\|\\s*/,\"\"):t||null}function Yc(e,t){let r=Object.create(null);for(let n of Object.keys(e))t.includes(n)&&(r[n]=e[n]);return r}function $r(e,t,r){let n={...e};for(let[i,o]of Object.entries(t))n[i]={...n[i],...r?Yc(o,r):o};return n}function wt(e,t){let r={...e};for(let[n,i]of Object.entries(t))switch(n){case\"generic\":r[n]=!!i;break;case\"cssWideKeywords\":r[n]=e[n]?[...e[n],...i]:i||[];break;case\"units\":r[n]={...e[n]};for(let[o,s]of Object.entries(i))r[n][o]=Array.isArray(s)?s:[];break;case\"atrules\":r[n]={...e[n]};for(let[o,s]of Object.entries(i)){let u=r[n][o]||{},c=r[n][o]={prelude:u.prelude||null,descriptors:{...u.descriptors}};if(s){c.prelude=s.prelude?Xr(c.prelude,s.prelude):c.prelude||null;for(let[a,l]of Object.entries(s.descriptors||{}))c.descriptors[a]=l?Xr(c.descriptors[a],l):null;Object.keys(c.descriptors).length||(c.descriptors=null)}}break;case\"types\":case\"properties\":r[n]={...e[n]};for(let[o,s]of Object.entries(i))r[n][o]=Xr(r[n][o],s);break;case\"parseContext\":r[n]={...e[n],...i};break;case\"scope\":case\"features\":r[n]=$r(e[n],i);break;case\"atrule\":case\"pseudo\":r[n]=$r(e[n],i,[\"parse\"]);break;case\"node\":r[n]=$r(e[n],i,[\"name\",\"structure\",\"parse\",\"generate\",\"walkContext\"]);break}return r}function Ms(e){let t=wo(e),r=Zo(e),n=Yo(e),{fromPlainObject:i,toPlainObject:o}=Ko(r),s={lexer:null,createLexer:u=>new Je(u,s,s.lexer.structure),tokenize:Ce,parse:t,generate:n,walk:r,find:r.find,findLast:r.findLast,findAll:r.findAll,fromPlainObject:i,toPlainObject:o,fork(u){let c=wt({},e);return Ms(typeof u==\"function\"?u(c):wt(c,u))}};return s.lexer=new Je({generic:e.generic,cssWideKeywords:e.cssWideKeywords,units:e.units,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},s),s}var Zr=e=>Ms(wt({},e));var Bs={generic:!0,cssWideKeywords:[\"initial\",\"inherit\",\"unset\",\"revert\",\"revert-layer\"],units:{angle:[\"deg\",\"grad\",\"rad\",\"turn\"],decibel:[\"db\"],flex:[\"fr\"],frequency:[\"hz\",\"khz\"],length:[\"cm\",\"mm\",\"q\",\"in\",\"pt\",\"pc\",\"px\",\"em\",\"rem\",\"ex\",\"rex\",\"cap\",\"rcap\",\"ch\",\"rch\",\"ic\",\"ric\",\"lh\",\"rlh\",\"vw\",\"svw\",\"lvw\",\"dvw\",\"vh\",\"svh\",\"lvh\",\"dvh\",\"vi\",\"svi\",\"lvi\",\"dvi\",\"vb\",\"svb\",\"lvb\",\"dvb\",\"vmin\",\"svmin\",\"lvmin\",\"dvmin\",\"vmax\",\"svmax\",\"lvmax\",\"dvmax\",\"cqw\",\"cqh\",\"cqi\",\"cqb\",\"cqmin\",\"cqmax\"],resolution:[\"dpi\",\"dpcm\",\"dppx\",\"x\"],semitones:[\"st\"],time:[\"s\",\"ms\"]},types:{\"abs()\":\"abs( <calc-sum> )\",\"absolute-size\":\"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large\",\"acos()\":\"acos( <calc-sum> )\",\"alpha-value\":\"<number>|<percentage>\",\"an+b\":\"odd|even|<integer>|<n-dimension>|'+'? \\u2020 n|-n|<ndashdigit-dimension>|'+'? \\u2020 <ndashdigit-ident>|<dashndashdigit-ident>|<n-dimension> <signed-integer>|'+'? \\u2020 n <signed-integer>|-n <signed-integer>|<ndash-dimension> <signless-integer>|'+'? \\u2020 n- <signless-integer>|-n- <signless-integer>|<n-dimension> ['+'|'-'] <signless-integer>|'+'? \\u2020 n ['+'|'-'] <signless-integer>|-n ['+'|'-'] <signless-integer>\",\"anchor()\":\"anchor( <anchor-name>?&&<anchor-side> , <length-percentage>? )\",\"anchor-name\":\"<dashed-ident>\",\"anchor-side\":\"inside|outside|top|left|right|bottom|start|end|self-start|self-end|<percentage>|center\",\"anchor-size\":\"width|height|block|inline|self-block|self-inline\",\"anchor-size()\":\"anchor-size( [<anchor-name>||<anchor-size>]? , <length-percentage>? )\",\"angle-percentage\":\"<angle>|<percentage>\",\"angular-color-hint\":\"<angle-percentage>|<zero>\",\"angular-color-stop\":\"<color> <color-stop-angle>?\",\"angular-color-stop-list\":\"<angular-color-stop> , [<angular-color-hint>? , <angular-color-stop>]#?\",\"animateable-feature\":\"scroll-position|contents|<custom-ident>\",\"asin()\":\"asin( <calc-sum> )\",\"atan()\":\"atan( <calc-sum> )\",\"atan2()\":\"atan2( <calc-sum> , <calc-sum> )\",attachment:\"scroll|fixed|local\",\"attr()\":\"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )\",\"attr-matcher\":\"['~'|'|'|'^'|'$'|'*']? '='\",\"attr-modifier\":\"i|s\",\"attribute-selector\":\"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'\",\"auto-repeat\":\"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )\",\"auto-track-list\":\"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?\",axis:\"block|inline|x|y\",\"baseline-position\":\"[first|last]? baseline\",\"basic-shape\":\"<inset()>|<xywh()>|<rect()>|<circle()>|<ellipse()>|<polygon()>|<path()>\",\"basic-shape-rect\":\"<inset()>|<rect()>|<xywh()>\",\"bg-clip\":\"<visual-box>|border-area|text\",\"bg-image\":\"none|<image>\",\"bg-layer\":\"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<visual-box>||<visual-box>\",\"bg-position\":\"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]\",\"bg-size\":\"[<length-percentage>|auto]{1,2}|cover|contain\",\"blend-mode\":\"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity\",\"blur()\":\"blur( <length>? )\",\"brightness()\":\"brightness( [<number>|<percentage>]? )\",\"calc()\":\"calc( <calc-sum> )\",\"calc-constant\":\"e|pi|infinity|-infinity|NaN\",\"calc-product\":\"<calc-value> ['*' <calc-value>|'/' <number>]*\",\"calc-size()\":\"calc-size( <calc-size-basis> , <calc-sum> )\",\"calc-size-basis\":\"<intrinsic-size-keyword>|<calc-size()>|any|<calc-sum>\",\"calc-sum\":\"<calc-product> [['+'|'-'] <calc-product>]*\",\"calc-value\":\"<number>|<dimension>|<percentage>|<calc-constant>|( <calc-sum> )\",\"cf-final-image\":\"<image>|<color>\",\"cf-mixing-image\":\"<percentage>?&&<image>\",\"circle()\":\"circle( <radial-size>? [at <position>]? )\",\"clamp()\":\"clamp( <calc-sum>#{3} )\",\"class-selector\":\"'.' <ident-token>\",\"clip-source\":\"<url>\",color:\"<color-base>|currentColor|<system-color>|<device-cmyk()>|<light-dark()>|<-non-standard-color>\",\"color()\":\"color( <colorspace-params> [/ [<alpha-value>|none]]? )\",\"color-base\":\"<hex-color>|<color-function>|<named-color>|<color-mix()>|transparent\",\"color-function\":\"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hwb()>|<lab()>|<lch()>|<oklab()>|<oklch()>|<color()>\",\"color-interpolation-method\":\"in [<rectangular-color-space>|<polar-color-space> <hue-interpolation-method>?|<custom-color-space>]\",\"color-mix()\":\"color-mix( <color-interpolation-method> , [<color>&&<percentage [0,100]>?]#{2} )\",\"color-stop\":\"<color-stop-length>|<color-stop-angle>\",\"color-stop-angle\":\"[<angle-percentage>|<zero>]{1,2}\",\"color-stop-length\":\"<length-percentage>{1,2}\",\"color-stop-list\":\"<linear-color-stop> , [<linear-color-hint>? , <linear-color-stop>]#?\",\"colorspace-params\":\"[<predefined-rgb-params>|<xyz-params>]\",combinator:\"'>'|'+'|'~'|['|' '|']\",\"common-lig-values\":\"[common-ligatures|no-common-ligatures]\",\"compat-auto\":\"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button\",\"complex-selector\":\"<complex-selector-unit> [<combinator>? <complex-selector-unit>]*\",\"complex-selector-list\":\"<complex-selector>#\",\"composite-style\":\"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor\",\"compositing-operator\":\"add|subtract|intersect|exclude\",\"compound-selector\":\"[<type-selector>? <subclass-selector>*]!\",\"compound-selector-list\":\"<compound-selector>#\",\"conic-gradient()\":\"conic-gradient( [<conic-gradient-syntax>] )\",\"conic-gradient-syntax\":\"[[[from [<angle>|<zero>]]? [at <position>]?]||<color-interpolation-method>]? , <angular-color-stop-list>\",\"container-condition\":\"not <query-in-parens>|<query-in-parens> [[and <query-in-parens>]*|[or <query-in-parens>]*]\",\"container-name\":\"<custom-ident>\",\"container-query\":\"not <query-in-parens>|<query-in-parens> [[and <query-in-parens>]*|[or <query-in-parens>]*]\",\"content-distribution\":\"space-between|space-around|space-evenly|stretch\",\"content-list\":\"[<string>|contents|<image>|<counter>|<quote>|<target>|<leader()>|<attr()>]+\",\"content-position\":\"center|start|end|flex-start|flex-end\",\"content-replacement\":\"<image>\",\"contextual-alt-values\":\"[contextual|no-contextual]\",\"contrast()\":\"contrast( [<number>|<percentage>]? )\",\"coord-box\":\"content-box|padding-box|border-box|fill-box|stroke-box|view-box\",\"cos()\":\"cos( <calc-sum> )\",counter:\"<counter()>|<counters()>\",\"counter()\":\"counter( <counter-name> , <counter-style>? )\",\"counter-name\":\"<custom-ident>\",\"counter-style\":\"<counter-style-name>|symbols( )\",\"counter-style-name\":\"<custom-ident>\",\"counters()\":\"counters( <counter-name> , <string> , <counter-style>? )\",\"cross-fade()\":\"cross-fade( <cf-mixing-image> , <cf-final-image>? )\",\"cubic-bezier()\":\"cubic-bezier( [<number [0,1]> , <number>]#{2} )\",\"cubic-bezier-timing-function\":\"ease|ease-in|ease-out|ease-in-out|<cubic-bezier()>\",\"custom-color-space\":\"<dashed-ident>\",\"custom-params\":\"<dashed-ident> [<number>|<percentage>|none]+\",dasharray:\"[[<length-percentage>|<number>]+]#\",\"dashndashdigit-ident\":\"<ident-token>\",\"deprecated-system-color\":\"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonHighlight|ButtonShadow|CaptionText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText\",\"discretionary-lig-values\":\"[discretionary-ligatures|no-discretionary-ligatures]\",\"display-box\":\"contents|none\",\"display-inside\":\"flow|flow-root|table|flex|grid|ruby\",\"display-internal\":\"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container\",\"display-legacy\":\"inline-block|inline-list-item|inline-table|inline-flex|inline-grid\",\"display-listitem\":\"<display-outside>?&&[flow|flow-root]?&&list-item\",\"display-outside\":\"block|inline|run-in\",\"drop-shadow()\":\"drop-shadow( [<color>?&&<length>{2,3}] )\",\"easing-function\":\"<linear-easing-function>|<cubic-bezier-easing-function>|<step-easing-function>\",\"east-asian-variant-values\":\"[jis78|jis83|jis90|jis04|simplified|traditional]\",\"east-asian-width-values\":\"[full-width|proportional-width]\",\"element()\":\"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )\",\"ellipse()\":\"ellipse( <radial-size>? [at <position>]? )\",\"env()\":\"env( <custom-ident> , <declaration-value>? )\",\"exp()\":\"exp( <calc-sum> )\",\"explicit-track-list\":\"[<line-names>? <track-size>]+ <line-names>?\",\"family-name\":\"<string>|<custom-ident>+\",\"feature-tag-value\":\"<string> [<integer>|on|off]?\",\"feature-type\":\"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation\",\"feature-value-block\":\"<feature-type> '{' <feature-value-declaration-list> '}'\",\"feature-value-block-list\":\"<feature-value-block>+\",\"feature-value-declaration\":\"<custom-ident> : <integer>+ ;\",\"feature-value-declaration-list\":\"<feature-value-declaration>\",\"feature-value-name\":\"<custom-ident>\",\"filter-function\":\"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>\",\"filter-value-list\":\"[<filter-function>|<url>]+\",\"final-bg-layer\":\"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<visual-box>||<visual-box>\",\"fit-content()\":\"fit-content( <length-percentage [0,\\u221E]> )\",\"fixed-breadth\":\"<length-percentage>\",\"fixed-repeat\":\"repeat( [<integer [1,\\u221E]>] , [<line-names>? <fixed-size>]+ <line-names>? )\",\"fixed-size\":\"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )\",\"font-stretch-absolute\":\"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>\",\"font-variant-css21\":\"[normal|small-caps]\",\"font-weight-absolute\":\"normal|bold|<number [1,1000]>\",\"form-control-identifier\":\"select\",\"frequency-percentage\":\"<frequency>|<percentage>\",\"generic-complete\":\"serif|sans-serif|system-ui|cursive|fantasy|math|monospace\",\"general-enclosed\":\"[<function-token> <any-value>? )]|[( <any-value>? )]\",\"generic-family\":\"<generic-script-specific>|<generic-complete>|<generic-incomplete>|<-non-standard-generic-family>\",\"generic-incomplete\":\"ui-serif|ui-sans-serif|ui-monospace|ui-rounded\",\"geometry-box\":\"<shape-box>|fill-box|stroke-box|view-box\",gradient:\"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<repeating-conic-gradient()>|<-legacy-gradient>\",\"grayscale()\":\"grayscale( [<number>|<percentage>]? )\",\"grid-line\":\"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]\",\"historical-lig-values\":\"[historical-ligatures|no-historical-ligatures]\",\"hsl()\":\"hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )|hsl( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"hsla()\":\"hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )|hsla( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",hue:\"<number>|<angle>\",\"hue-interpolation-method\":\"[shorter|longer|increasing|decreasing] hue\",\"hue-rotate()\":\"hue-rotate( [<angle>|<zero>]? )\",\"hwb()\":\"hwb( [<hue>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"hypot()\":\"hypot( <calc-sum># )\",image:\"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>\",\"image()\":\"image( <image-tags>? [<image-src>? , <color>?]! )\",\"image-set()\":\"image-set( <image-set-option># )\",\"image-set-option\":\"[<image>|<string>] [<resolution>||type( <string> )]\",\"image-src\":\"<url>|<string>\",\"image-tags\":\"ltr|rtl\",\"inflexible-breadth\":\"<length-percentage>|min-content|max-content|auto\",\"inset()\":\"inset( <length-percentage>{1,4} [round <'border-radius'>]? )\",\"invert()\":\"invert( [<number>|<percentage>]? )\",\"keyframe-block\":\"<keyframe-selector># { <declaration-list> }\",\"keyframe-selector\":\"from|to|<percentage [0,100]>|<timeline-range-name> <percentage>\",\"keyframes-name\":\"<custom-ident>|<string>\",\"lab()\":\"lab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"layer()\":\"layer( <layer-name> )\",\"layer-name\":\"<ident> ['.' <ident>]*\",\"lch()\":\"lch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )\",\"leader()\":\"leader( <leader-type> )\",\"leader-type\":\"dotted|solid|space|<string>\",\"length-percentage\":\"<length>|<percentage>\",\"light-dark()\":\"light-dark( <color> , <color> )\",\"line-name-list\":\"[<line-names>|<name-repeat>]+\",\"line-names\":\"'[' <custom-ident>* ']'\",\"line-style\":\"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset\",\"line-width\":\"<length>|thin|medium|thick\",\"linear()\":\"linear( [<number>&&<percentage>{0,2}]# )\",\"linear-color-hint\":\"<length-percentage>\",\"linear-color-stop\":\"<color> <color-stop-length>?\",\"linear-easing-function\":\"linear|<linear()>\",\"linear-gradient()\":\"linear-gradient( [<linear-gradient-syntax>] )\",\"linear-gradient-syntax\":\"[[<angle>|<zero>|to <side-or-corner>]||<color-interpolation-method>]? , <color-stop-list>\",\"log()\":\"log( <calc-sum> , <calc-sum>? )\",\"mask-layer\":\"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>\",\"mask-position\":\"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?\",\"mask-reference\":\"none|<image>|<mask-source>\",\"mask-source\":\"<url>\",\"masking-mode\":\"alpha|luminance|match-source\",\"matrix()\":\"matrix( <number>#{6} )\",\"matrix3d()\":\"matrix3d( <number>#{16} )\",\"max()\":\"max( <calc-sum># )\",\"media-and\":\"<media-in-parens> [and <media-in-parens>]+\",\"media-condition\":\"<media-not>|<media-and>|<media-or>|<media-in-parens>\",\"media-condition-without-or\":\"<media-not>|<media-and>|<media-in-parens>\",\"media-feature\":\"( [<mf-plain>|<mf-boolean>|<mf-range>] )\",\"media-in-parens\":\"( <media-condition> )|<media-feature>|<general-enclosed>\",\"media-not\":\"not <media-in-parens>\",\"media-or\":\"<media-in-parens> [or <media-in-parens>]+\",\"media-query\":\"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?\",\"media-query-list\":\"<media-query>#\",\"media-type\":\"<ident>\",\"mf-boolean\":\"<mf-name>\",\"mf-name\":\"<ident>\",\"mf-plain\":\"<mf-name> : <mf-value>\",\"mf-range\":\"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>\",\"mf-value\":\"<number>|<dimension>|<ident>|<ratio>\",\"min()\":\"min( <calc-sum># )\",\"minmax()\":\"minmax( [<length-percentage>|min-content|max-content|auto] , [<length-percentage>|<flex>|min-content|max-content|auto] )\",\"mod()\":\"mod( <calc-sum> , <calc-sum> )\",\"n-dimension\":\"<dimension-token>\",\"name-repeat\":\"repeat( [<integer [1,\\u221E]>|auto-fill] , <line-names>+ )\",\"named-color\":\"aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen\",\"namespace-prefix\":\"<ident>\",\"ndash-dimension\":\"<dimension-token>\",\"ndashdigit-dimension\":\"<dimension-token>\",\"ndashdigit-ident\":\"<ident-token>\",\"ns-prefix\":\"[<ident-token>|'*']? '|'\",\"number-percentage\":\"<number>|<percentage>\",\"numeric-figure-values\":\"[lining-nums|oldstyle-nums]\",\"numeric-fraction-values\":\"[diagonal-fractions|stacked-fractions]\",\"numeric-spacing-values\":\"[proportional-nums|tabular-nums]\",\"offset-path\":\"<ray()>|<url>|<basic-shape>\",\"oklab()\":\"oklab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )\",\"oklch()\":\"oklch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )\",\"opacity()\":\"opacity( [<number>|<percentage>]? )\",\"opacity-value\":\"<number>|<percentage>\",\"outline-line-style\":\"none|dotted|dashed|solid|double|groove|ridge|inset|outset\",\"outline-radius\":\"<length>|<percentage>\",\"overflow-position\":\"unsafe|safe\",\"page-body\":\"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>\",\"page-margin-box\":\"<page-margin-box-type> '{' <declaration-list> '}'\",\"page-margin-box-type\":\"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom\",\"page-selector\":\"<pseudo-page>+|<ident> <pseudo-page>*\",\"page-selector-list\":\"[<page-selector>#]?\",\"page-size\":\"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger\",paint:\"none|<color>|<url> [none|<color>]?|context-fill|context-stroke\",\"paint()\":\"paint( <ident> , <declaration-value>? )\",\"paint-box\":\"<visual-box>|fill-box|stroke-box\",\"palette-identifier\":\"<dashed-ident>\",\"palette-mix()\":\"palette-mix( <color-interpolation-method> , [[normal|light|dark|<palette-identifier>|<palette-mix()>]&&<percentage [0,100]>?]#{2} )\",\"path()\":\"path( <'fill-rule'>? , <string> )\",\"perspective()\":\"perspective( [<length [0,\\u221E]>|none] )\",\"polar-color-space\":\"hsl|hwb|lch|oklch\",\"polygon()\":\"polygon( <'fill-rule'>? , [<length-percentage> <length-percentage>]# )\",position:\"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]\",\"position-area\":\"[[left|center|right|span-left|span-right|x-start|x-end|span-x-start|span-x-end|x-self-start|x-self-end|span-x-self-start|span-x-self-end|span-all]||[top|center|bottom|span-top|span-bottom|y-start|y-end|span-y-start|span-y-end|y-self-start|y-self-end|span-y-self-start|span-y-self-end|span-all]|[block-start|center|block-end|span-block-start|span-block-end|span-all]||[inline-start|center|inline-end|span-inline-start|span-inline-end|span-all]|[self-block-start|center|self-block-end|span-self-block-start|span-self-block-end|span-all]||[self-inline-start|center|self-inline-end|span-self-inline-start|span-self-inline-end|span-all]|[start|center|end|span-start|span-end|span-all]{1,2}|[self-start|center|self-end|span-self-start|span-self-end|span-all]{1,2}]\",\"pow()\":\"pow( <calc-sum> , <calc-sum> )\",\"predefined-rgb\":\"srgb|srgb-linear|display-p3|a98-rgb|prophoto-rgb|rec2020\",\"predefined-rgb-params\":\"<predefined-rgb> [<number>|<percentage>|none]{3}\",\"pseudo-class-selector\":\"':' <ident-token>|':' <function-token> <any-value> ')'\",\"pseudo-element-selector\":\"':' <pseudo-class-selector>|<legacy-pseudo-element-selector>\",\"pseudo-page\":\": [left|right|first|blank]\",\"query-in-parens\":\"( <container-condition> )|( <size-feature> )|style( <style-query> )|<general-enclosed>\",quote:\"open-quote|close-quote|no-open-quote|no-close-quote\",\"radial-extent\":\"closest-corner|closest-side|farthest-corner|farthest-side\",\"radial-gradient()\":\"radial-gradient( [<radial-gradient-syntax>] )\",\"radial-gradient-syntax\":\"[[[<radial-shape>||<radial-size>]? [at <position>]?]||<color-interpolation-method>]? , <color-stop-list>\",\"radial-shape\":\"circle|ellipse\",\"radial-size\":\"<radial-extent>|<length [0,\\u221E]>|<length-percentage [0,\\u221E]>{2}\",ratio:\"<number [0,\\u221E]> [/ <number [0,\\u221E]>]?\",\"ray()\":\"ray( <angle>&&<ray-size>?&&contain?&&[at <position>]? )\",\"ray-size\":\"closest-side|closest-corner|farthest-side|farthest-corner|sides\",\"rect()\":\"rect( [<length-percentage>|auto]{4} [round <'border-radius'>]? )\",\"rectangular-color-space\":\"srgb|srgb-linear|display-p3|a98-rgb|prophoto-rgb|rec2020|lab|oklab|xyz|xyz-d50|xyz-d65\",\"relative-selector\":\"<combinator>? <complex-selector>\",\"relative-selector-list\":\"<relative-selector>#\",\"relative-size\":\"larger|smaller\",\"rem()\":\"rem( <calc-sum> , <calc-sum> )\",\"repeat-style\":\"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}\",\"repeating-conic-gradient()\":\"repeating-conic-gradient( [<conic-gradient-syntax>] )\",\"repeating-linear-gradient()\":\"repeating-linear-gradient( [<linear-gradient-syntax>] )\",\"repeating-radial-gradient()\":\"repeating-radial-gradient( [<radial-gradient-syntax>] )\",\"reversed-counter-name\":\"reversed( <counter-name> )\",\"rgb()\":\"rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )|rgb( [<number>|<percentage>|none]{3} [/ [<alpha-value>|none]]? )\",\"rgba()\":\"rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )|rgba( [<number>|<percentage>|none]{3} [/ [<alpha-value>|none]]? )\",\"rotate()\":\"rotate( [<angle>|<zero>] )\",\"rotate3d()\":\"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )\",\"rotateX()\":\"rotateX( [<angle>|<zero>] )\",\"rotateY()\":\"rotateY( [<angle>|<zero>] )\",\"rotateZ()\":\"rotateZ( [<angle>|<zero>] )\",\"round()\":\"round( <rounding-strategy>? , <calc-sum> , <calc-sum> )\",\"rounding-strategy\":\"nearest|up|down|to-zero\",\"saturate()\":\"saturate( [<number>|<percentage>]? )\",\"scale()\":\"scale( [<number>|<percentage>]#{1,2} )\",\"scale3d()\":\"scale3d( [<number>|<percentage>]#{3} )\",\"scaleX()\":\"scaleX( [<number>|<percentage>] )\",\"scaleY()\":\"scaleY( [<number>|<percentage>] )\",\"scaleZ()\":\"scaleZ( [<number>|<percentage>] )\",\"scope-end\":\"<forgiving-selector-list>\",\"scope-start\":\"<forgiving-selector-list>\",\"scroll()\":\"scroll( [<scroller>||<axis>]? )\",scroller:\"root|nearest|self\",\"scroll-state-feature\":\"<media-query-list>\",\"scroll-state-in-parens\":\"( <scroll-state-query> )|( <scroll-state-feature> )|<general-enclosed>\",\"scroll-state-query\":\"not <scroll-state-in-parens>|<scroll-state-in-parens> [[and <scroll-state-in-parens>]*|[or <scroll-state-in-parens>]*]|<scroll-state-feature>\",\"selector-list\":\"<complex-selector-list>\",\"self-position\":\"center|start|end|self-start|self-end|flex-start|flex-end\",\"sepia()\":\"sepia( [<number>|<percentage>]? )\",shadow:\"inset?&&<length>{2,4}&&<color>?\",\"shadow-t\":\"[<length>{2,3}&&<color>?]\",shape:\"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )\",\"shape-box\":\"<visual-box>|margin-box\",\"side-or-corner\":\"[left|right]||[top|bottom]\",\"sign()\":\"sign( <calc-sum> )\",\"signed-integer\":\"<number-token>\",\"signless-integer\":\"<number-token>\",\"sin()\":\"sin( <calc-sum> )\",\"single-animation\":\"<'animation-duration'>||<easing-function>||<'animation-delay'>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]||<single-animation-timeline>\",\"single-animation-composition\":\"replace|add|accumulate\",\"single-animation-direction\":\"normal|reverse|alternate|alternate-reverse\",\"single-animation-fill-mode\":\"none|forwards|backwards|both\",\"single-animation-iteration-count\":\"infinite|<number>\",\"single-animation-play-state\":\"running|paused\",\"single-animation-timeline\":\"auto|none|<dashed-ident>|<scroll()>|<view()>\",\"single-transition\":\"[none|<single-transition-property>]||<time>||<easing-function>||<time>||<transition-behavior-value>\",\"single-transition-property\":\"all|<custom-ident>\",size:\"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}\",\"size-feature\":\"<mf-plain>|<mf-boolean>|<mf-range>\",\"skew()\":\"skew( [<angle>|<zero>] , [<angle>|<zero>]? )\",\"skewX()\":\"skewX( [<angle>|<zero>] )\",\"skewY()\":\"skewY( [<angle>|<zero>] )\",\"sqrt()\":\"sqrt( <calc-sum> )\",\"step-position\":\"jump-start|jump-end|jump-none|jump-both|start|end\",\"step-easing-function\":\"step-start|step-end|<steps()>\",\"steps()\":\"steps( <integer> , <step-position>? )\",\"style-feature\":\"<declaration>\",\"style-in-parens\":\"( <style-condition> )|( <style-feature> )|<general-enclosed>\",\"style-query\":\"<style-condition>|<style-feature>\",\"subclass-selector\":\"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>\",\"supports-condition\":\"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*\",\"supports-decl\":\"( <declaration> )\",\"supports-feature\":\"<supports-decl>|<supports-selector-fn>\",\"supports-in-parens\":\"( <supports-condition> )|<supports-feature>|<general-enclosed>\",\"supports-selector-fn\":\"selector( <complex-selector> )\",symbol:\"<string>|<image>|<custom-ident>\",\"symbols()\":\"symbols( <symbols-type>? [<string>|<image>]+ )\",\"symbols-type\":\"cyclic|numeric|alphabetic|symbolic|fixed\",\"system-color\":\"AccentColor|AccentColorText|ActiveText|ButtonBorder|ButtonFace|ButtonText|Canvas|CanvasText|Field|FieldText|GrayText|Highlight|HighlightText|LinkText|Mark|MarkText|SelectedItem|SelectedItemText|VisitedText\",\"tan()\":\"tan( <calc-sum> )\",target:\"<target-counter()>|<target-counters()>|<target-text()>\",\"target-counter()\":\"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )\",\"target-counters()\":\"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )\",\"target-text()\":\"target-text( [<string>|<url>] , [content|before|after|first-letter]? )\",\"text-edge\":\"[text|cap|ex|ideographic|ideographic-ink] [text|alphabetic|ideographic|ideographic-ink]?\",\"time-percentage\":\"<time>|<percentage>\",\"timeline-range-name\":\"cover|contain|entry|exit|entry-crossing|exit-crossing\",\"track-breadth\":\"<length-percentage>|<flex>|min-content|max-content|auto\",\"track-list\":\"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?\",\"track-repeat\":\"repeat( [<integer [1,\\u221E]>] , [<line-names>? <track-size>]+ <line-names>? )\",\"track-size\":\"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( <length-percentage> )\",\"transform-function\":\"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>\",\"transform-list\":\"<transform-function>+\",\"transition-behavior-value\":\"normal|allow-discrete\",\"translate()\":\"translate( <length-percentage> , <length-percentage>? )\",\"translate3d()\":\"translate3d( <length-percentage> , <length-percentage> , <length> )\",\"translateX()\":\"translateX( <length-percentage> )\",\"translateY()\":\"translateY( <length-percentage> )\",\"translateZ()\":\"translateZ( <length> )\",\"try-size\":\"most-width|most-height|most-block-size|most-inline-size\",\"try-tactic\":\"flip-block||flip-inline||flip-start\",\"type-or-unit\":\"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%\",\"type-selector\":\"<wq-name>|<ns-prefix>? '*'\",\"var()\":\"var( <custom-property-name> , <declaration-value>? )\",\"view()\":\"view( [<axis>||<'view-timeline-inset'>]? )\",\"viewport-length\":\"auto|<length-percentage>\",\"visual-box\":\"content-box|padding-box|border-box\",\"wq-name\":\"<ns-prefix>? <ident-token>\",\"xywh()\":\"xywh( <length-percentage>{2} <length-percentage [0,\\u221E]>{2} [round <'border-radius'>]? )\",xyz:\"xyz|xyz-d50|xyz-d65\",\"xyz-params\":\"<xyz-space> [<number>|<percentage>|none]{3}\",\"-legacy-gradient\":\"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>\",\"-legacy-linear-gradient\":\"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )\",\"-legacy-repeating-linear-gradient\":\"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )\",\"-legacy-linear-gradient-arguments\":\"[<angle>|<side-or-corner>]? , <color-stop-list>\",\"-legacy-radial-gradient\":\"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )\",\"-legacy-repeating-radial-gradient\":\"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )\",\"-legacy-radial-gradient-arguments\":\"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>\",\"-legacy-radial-gradient-size\":\"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover\",\"-legacy-radial-gradient-shape\":\"circle|ellipse\",\"-non-standard-font\":\"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body\",\"-non-standard-color\":\"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text\",\"-non-standard-image-rendering\":\"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast\",\"-non-standard-overflow\":\"overlay|-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable\",\"-non-standard-size\":\"intrinsic|min-intrinsic|-webkit-fill-available|-webkit-fit-content|-webkit-min-content|-webkit-max-content|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content\",\"-webkit-gradient()\":\"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )\",\"-webkit-gradient-color-stop\":\"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )\",\"-webkit-gradient-point\":\"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]\",\"-webkit-gradient-radius\":\"<length>|<percentage>\",\"-webkit-gradient-type\":\"linear|radial\",\"-webkit-mask-box-repeat\":\"repeat|stretch|round\",\"-ms-filter-function-list\":\"<-ms-filter-function>+\",\"-ms-filter-function\":\"<-ms-filter-function-progid>|<-ms-filter-function-legacy>\",\"-ms-filter-function-progid\":\"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]\",\"-ms-filter-function-legacy\":\"<ident-token>|<function-token> <any-value>? )\",age:\"child|young|old\",\"attr-name\":\"<wq-name>\",\"attr-fallback\":\"<any-value>\",bottom:\"<length>|auto\",\"cubic-bezier-easing-function\":\"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )\",\"generic-voice\":\"[<age>? <gender> <integer>?]\",gender:\"male|female|neutral\",\"generic-script-specific\":\"generic( kai )|generic( fangsong )|generic( nastaliq )\",\"-non-standard-generic-family\":\"-apple-system|BlinkMacSystemFont\",\"intrinsic-size-keyword\":\"min-content|max-content|fit-content\",left:\"<length>|auto\",\"device-cmyk()\":\"<legacy-device-cmyk-syntax>|<modern-device-cmyk-syntax>\",\"legacy-device-cmyk-syntax\":\"device-cmyk( <number>#{4} )\",\"modern-device-cmyk-syntax\":\"device-cmyk( <cmyk-component>{4} [/ [<alpha-value>|none]]? )\",\"cmyk-component\":\"<number>|<percentage>|none\",\"color-space\":\"<rectangular-color-space>|<polar-color-space>|<custom-color-space>\",right:\"<length>|auto\",\"forgiving-selector-list\":\"<complex-real-selector-list>\",\"forgiving-relative-selector-list\":\"<relative-real-selector-list>\",\"complex-real-selector-list\":\"<complex-real-selector>#\",\"simple-selector-list\":\"<simple-selector>#\",\"relative-real-selector-list\":\"<relative-real-selector>#\",\"complex-selector-unit\":\"[<compound-selector>? <pseudo-compound-selector>*]!\",\"complex-real-selector\":\"<compound-selector> [<combinator>? <compound-selector>]*\",\"relative-real-selector\":\"<combinator>? <complex-real-selector>\",\"pseudo-compound-selector\":\"<pseudo-element-selector> <pseudo-class-selector>*\",\"simple-selector\":\"<type-selector>|<subclass-selector>\",\"legacy-pseudo-element-selector\":\"':' [before|after|first-line|first-letter]\",\"svg-length\":\"<percentage>|<length>|<number>\",\"svg-writing-mode\":\"lr-tb|rl-tb|tb-rl|lr|rl|tb\",top:\"<length>|auto\",x:\"<number>\",y:\"<number>\",declaration:\"<ident-token> : <declaration-value>? ['!' important]?\",\"declaration-list\":\"[<declaration>? ';']* <declaration>?\",url:\"url( <string> <url-modifier>* )|<url-token>\",\"url-modifier\":\"<ident>|<function-token> <any-value> )\",\"number-zero-one\":\"<number [0,1]>\",\"number-one-or-greater\":\"<number [1,\\u221E]>\",\"xyz-space\":\"xyz|xyz-d50|xyz-d65\",\"style-condition\":\"not <style-in-parens>|<style-in-parens> [[and <style-in-parens>]*|[or <style-in-parens>]*]\",\"-non-standard-display\":\"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box\",\"inset-area\":\"[[left|center|right|span-left|span-right|x-start|x-end|span-x-start|span-x-end|x-self-start|x-self-end|span-x-self-start|span-x-self-end|span-all]||[top|center|bottom|span-top|span-bottom|y-start|y-end|span-y-start|span-y-end|y-self-start|y-self-end|span-y-self-start|span-y-self-end|span-all]|[block-start|center|block-end|span-block-start|span-block-end|span-all]||[inline-start|center|inline-end|span-inline-start|span-inline-end|span-all]|[self-block-start|self-block-end|span-self-block-start|span-self-block-end|span-all]||[self-inline-start|self-inline-end|span-self-inline-start|span-self-inline-end|span-all]|[start|center|end|span-start|span-end|span-all]{1,2}|[self-start|center|self-end|span-self-start|span-self-end|span-all]{1,2}]\",\"font-variant-css2\":\"normal|small-caps\",\"font-width-css3\":\"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded\",\"system-family-name\":\"caption|icon|menu|message-box|small-caption|status-bar\"},properties:{\"--*\":\"<declaration-value>\",\"-ms-accelerator\":\"false|true\",\"-ms-block-progression\":\"tb|rl|bt|lr\",\"-ms-content-zoom-chaining\":\"none|chained\",\"-ms-content-zoom-limit\":\"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>\",\"-ms-content-zoom-limit-max\":\"<percentage>\",\"-ms-content-zoom-limit-min\":\"<percentage>\",\"-ms-content-zoom-snap\":\"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>\",\"-ms-content-zoom-snap-points\":\"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )\",\"-ms-content-zoom-snap-type\":\"none|proximity|mandatory\",\"-ms-content-zooming\":\"none|zoom\",\"-ms-filter\":\"<string>\",\"-ms-flow-from\":\"[none|<custom-ident>]#\",\"-ms-flow-into\":\"[none|<custom-ident>]#\",\"-ms-grid-columns\":\"none|<track-list>|<auto-track-list>\",\"-ms-grid-rows\":\"none|<track-list>|<auto-track-list>\",\"-ms-high-contrast-adjust\":\"auto|none\",\"-ms-hyphenate-limit-chars\":\"auto|<integer>{1,3}\",\"-ms-hyphenate-limit-lines\":\"no-limit|<integer>\",\"-ms-hyphenate-limit-zone\":\"<percentage>|<length>\",\"-ms-ime-align\":\"auto|after\",\"-ms-overflow-style\":\"auto|none|scrollbar|-ms-autohiding-scrollbar\",\"-ms-scroll-chaining\":\"chained|none\",\"-ms-scroll-limit\":\"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>\",\"-ms-scroll-limit-x-max\":\"auto|<length>\",\"-ms-scroll-limit-x-min\":\"<length>\",\"-ms-scroll-limit-y-max\":\"auto|<length>\",\"-ms-scroll-limit-y-min\":\"<length>\",\"-ms-scroll-rails\":\"none|railed\",\"-ms-scroll-snap-points-x\":\"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )\",\"-ms-scroll-snap-points-y\":\"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )\",\"-ms-scroll-snap-type\":\"none|proximity|mandatory\",\"-ms-scroll-snap-x\":\"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>\",\"-ms-scroll-snap-y\":\"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>\",\"-ms-scroll-translation\":\"none|vertical-to-horizontal\",\"-ms-scrollbar-3dlight-color\":\"<color>\",\"-ms-scrollbar-arrow-color\":\"<color>\",\"-ms-scrollbar-base-color\":\"<color>\",\"-ms-scrollbar-darkshadow-color\":\"<color>\",\"-ms-scrollbar-face-color\":\"<color>\",\"-ms-scrollbar-highlight-color\":\"<color>\",\"-ms-scrollbar-shadow-color\":\"<color>\",\"-ms-scrollbar-track-color\":\"<color>\",\"-ms-text-autospace\":\"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space\",\"-ms-touch-select\":\"grippers|none\",\"-ms-user-select\":\"none|element|text\",\"-ms-wrap-flow\":\"auto|both|start|end|maximum|clear\",\"-ms-wrap-margin\":\"<length>\",\"-ms-wrap-through\":\"wrap|none\",\"-moz-appearance\":\"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized\",\"-moz-binding\":\"<url>|none\",\"-moz-border-bottom-colors\":\"<color>+|none\",\"-moz-border-left-colors\":\"<color>+|none\",\"-moz-border-right-colors\":\"<color>+|none\",\"-moz-border-top-colors\":\"<color>+|none\",\"-moz-context-properties\":\"none|[fill|fill-opacity|stroke|stroke-opacity]#\",\"-moz-float-edge\":\"border-box|content-box|margin-box|padding-box\",\"-moz-force-broken-image-icon\":\"0|1\",\"-moz-image-region\":\"<shape>|auto\",\"-moz-orient\":\"inline|block|horizontal|vertical\",\"-moz-outline-radius\":\"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?\",\"-moz-outline-radius-bottomleft\":\"<outline-radius>\",\"-moz-outline-radius-bottomright\":\"<outline-radius>\",\"-moz-outline-radius-topleft\":\"<outline-radius>\",\"-moz-outline-radius-topright\":\"<outline-radius>\",\"-moz-stack-sizing\":\"ignore|stretch-to-fit\",\"-moz-text-blink\":\"none|blink\",\"-moz-user-focus\":\"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none\",\"-moz-user-input\":\"auto|none|enabled|disabled\",\"-moz-user-modify\":\"read-only|read-write|write-only\",\"-moz-window-dragging\":\"drag|no-drag\",\"-moz-window-shadow\":\"default|menu|tooltip|sheet|none\",\"-webkit-appearance\":\"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button\",\"-webkit-border-before\":\"<'border-width'>||<'border-style'>||<color>\",\"-webkit-border-before-color\":\"<color>\",\"-webkit-border-before-style\":\"<'border-style'>\",\"-webkit-border-before-width\":\"<'border-width'>\",\"-webkit-box-reflect\":\"[above|below|right|left]? <length>? <image>?\",\"-webkit-line-clamp\":\"none|<integer>\",\"-webkit-mask\":\"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<visual-box>|border|padding|content|text]||[<visual-box>|border|padding|content]]#\",\"-webkit-mask-attachment\":\"<attachment>#\",\"-webkit-mask-clip\":\"[<coord-box>|no-clip|border|padding|content|text]#\",\"-webkit-mask-composite\":\"<composite-style>#\",\"-webkit-mask-image\":\"<mask-reference>#\",\"-webkit-mask-origin\":\"[<coord-box>|border|padding|content]#\",\"-webkit-mask-position\":\"<position>#\",\"-webkit-mask-position-x\":\"[<length-percentage>|left|center|right]#\",\"-webkit-mask-position-y\":\"[<length-percentage>|top|center|bottom]#\",\"-webkit-mask-repeat\":\"<repeat-style>#\",\"-webkit-mask-repeat-x\":\"repeat|no-repeat|space|round\",\"-webkit-mask-repeat-y\":\"repeat|no-repeat|space|round\",\"-webkit-mask-size\":\"<bg-size>#\",\"-webkit-overflow-scrolling\":\"auto|touch\",\"-webkit-tap-highlight-color\":\"<color>\",\"-webkit-text-fill-color\":\"<color>\",\"-webkit-text-stroke\":\"<length>||<color>\",\"-webkit-text-stroke-color\":\"<color>\",\"-webkit-text-stroke-width\":\"<length>\",\"-webkit-touch-callout\":\"default|none\",\"-webkit-user-modify\":\"read-only|read-write|read-write-plaintext-only\",\"-webkit-user-select\":\"auto|none|text|all\",\"accent-color\":\"auto|<color>\",\"align-content\":\"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>\",\"align-items\":\"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]\",\"align-self\":\"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>\",\"align-tracks\":\"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#\",\"alignment-baseline\":\"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical\",all:\"initial|inherit|unset|revert|revert-layer\",\"anchor-name\":\"none|<dashed-ident>#\",\"anchor-scope\":\"none|all|<dashed-ident>#\",animation:\"<single-animation>#\",\"animation-composition\":\"<single-animation-composition>#\",\"animation-delay\":\"<time>#\",\"animation-direction\":\"<single-animation-direction>#\",\"animation-duration\":\"<time>#\",\"animation-fill-mode\":\"<single-animation-fill-mode>#\",\"animation-iteration-count\":\"<single-animation-iteration-count>#\",\"animation-name\":\"[none|<keyframes-name>]#\",\"animation-play-state\":\"<single-animation-play-state>#\",\"animation-range\":\"[<'animation-range-start'> <'animation-range-end'>?]#\",\"animation-range-end\":\"[normal|<length-percentage>|<timeline-range-name> <length-percentage>?]#\",\"animation-range-start\":\"[normal|<length-percentage>|<timeline-range-name> <length-percentage>?]#\",\"animation-timeline\":\"<single-animation-timeline>#\",\"animation-timing-function\":\"<easing-function>#\",appearance:\"none|auto|textfield|menulist-button|<compat-auto>\",\"aspect-ratio\":\"auto||<ratio>\",\"backdrop-filter\":\"none|<filter-value-list>\",\"backface-visibility\":\"visible|hidden\",background:\"[<bg-layer> ,]* <final-bg-layer>\",\"background-attachment\":\"<attachment>#\",\"background-blend-mode\":\"<blend-mode>#\",\"background-clip\":\"<bg-clip>#\",\"background-color\":\"<color>\",\"background-image\":\"<bg-image>#\",\"background-origin\":\"<visual-box>#\",\"background-position\":\"<bg-position>#\",\"background-position-x\":\"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#\",\"background-position-y\":\"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#\",\"background-repeat\":\"<repeat-style>#\",\"background-size\":\"<bg-size>#\",\"baseline-shift\":\"baseline|sub|super|<svg-length>\",\"block-size\":\"<'width'>\",border:\"<line-width>||<line-style>||<color>\",\"border-block\":\"<'border-block-start'>\",\"border-block-color\":\"<'border-top-color'>{1,2}\",\"border-block-end\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-block-end-color\":\"<'border-top-color'>\",\"border-block-end-style\":\"<'border-top-style'>\",\"border-block-end-width\":\"<'border-top-width'>\",\"border-block-start\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-block-start-color\":\"<'border-top-color'>\",\"border-block-start-style\":\"<'border-top-style'>\",\"border-block-start-width\":\"<'border-top-width'>\",\"border-block-style\":\"<'border-top-style'>{1,2}\",\"border-block-width\":\"<'border-top-width'>{1,2}\",\"border-bottom\":\"<line-width>||<line-style>||<color>\",\"border-bottom-color\":\"<'border-top-color'>\",\"border-bottom-left-radius\":\"<length-percentage>{1,2}\",\"border-bottom-right-radius\":\"<length-percentage>{1,2}\",\"border-bottom-style\":\"<line-style>\",\"border-bottom-width\":\"<line-width>\",\"border-collapse\":\"collapse|separate\",\"border-color\":\"<color>{1,4}\",\"border-end-end-radius\":\"<'border-top-left-radius'>\",\"border-end-start-radius\":\"<'border-top-left-radius'>\",\"border-image\":\"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>\",\"border-image-outset\":\"[<length>|<number>]{1,4}\",\"border-image-repeat\":\"[stretch|repeat|round|space]{1,2}\",\"border-image-slice\":\"<number-percentage>{1,4}&&fill?\",\"border-image-source\":\"none|<image>\",\"border-image-width\":\"[<length-percentage>|<number>|auto]{1,4}\",\"border-inline\":\"<'border-block-start'>\",\"border-inline-color\":\"<'border-top-color'>{1,2}\",\"border-inline-end\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-inline-end-color\":\"<'border-top-color'>\",\"border-inline-end-style\":\"<'border-top-style'>\",\"border-inline-end-width\":\"<'border-top-width'>\",\"border-inline-start\":\"<'border-top-width'>||<'border-top-style'>||<color>\",\"border-inline-start-color\":\"<'border-top-color'>\",\"border-inline-start-style\":\"<'border-top-style'>\",\"border-inline-start-width\":\"<'border-top-width'>\",\"border-inline-style\":\"<'border-top-style'>{1,2}\",\"border-inline-width\":\"<'border-top-width'>{1,2}\",\"border-left\":\"<line-width>||<line-style>||<color>\",\"border-left-color\":\"<color>\",\"border-left-style\":\"<line-style>\",\"border-left-width\":\"<line-width>\",\"border-radius\":\"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?\",\"border-right\":\"<line-width>||<line-style>||<color>\",\"border-right-color\":\"<color>\",\"border-right-style\":\"<line-style>\",\"border-right-width\":\"<line-width>\",\"border-spacing\":\"<length> <length>?\",\"border-start-end-radius\":\"<'border-top-left-radius'>\",\"border-start-start-radius\":\"<'border-top-left-radius'>\",\"border-style\":\"<line-style>{1,4}\",\"border-top\":\"<line-width>||<line-style>||<color>\",\"border-top-color\":\"<color>\",\"border-top-left-radius\":\"<length-percentage>{1,2}\",\"border-top-right-radius\":\"<length-percentage>{1,2}\",\"border-top-style\":\"<line-style>\",\"border-top-width\":\"<line-width>\",\"border-width\":\"<line-width>{1,4}\",bottom:\"<length>|<percentage>|auto\",\"box-align\":\"start|center|end|baseline|stretch\",\"box-decoration-break\":\"slice|clone\",\"box-direction\":\"normal|reverse|inherit\",\"box-flex\":\"<number>\",\"box-flex-group\":\"<integer>\",\"box-lines\":\"single|multiple\",\"box-ordinal-group\":\"<integer>\",\"box-orient\":\"horizontal|vertical|inline-axis|block-axis|inherit\",\"box-pack\":\"start|center|end|justify\",\"box-shadow\":\"none|<shadow>#\",\"box-sizing\":\"content-box|border-box\",\"break-after\":\"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region\",\"break-before\":\"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region\",\"break-inside\":\"auto|avoid|avoid-page|avoid-column|avoid-region\",\"caption-side\":\"top|bottom\",caret:\"<'caret-color'>||<'caret-shape'>\",\"caret-color\":\"auto|<color>\",\"caret-shape\":\"auto|bar|block|underscore\",clear:\"none|left|right|both|inline-start|inline-end\",clip:\"<shape>|auto\",\"clip-path\":\"<clip-source>|[<basic-shape>||<geometry-box>]|none\",\"clip-rule\":\"nonzero|evenodd\",color:\"<color>\",\"color-interpolation-filters\":\"auto|sRGB|linearRGB\",\"color-scheme\":\"normal|[light|dark|<custom-ident>]+&&only?\",\"column-count\":\"<integer>|auto\",\"column-fill\":\"auto|balance\",\"column-gap\":\"normal|<length-percentage>\",\"column-rule\":\"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>\",\"column-rule-color\":\"<color>\",\"column-rule-style\":\"<'border-style'>\",\"column-rule-width\":\"<'border-width'>\",\"column-span\":\"none|all\",\"column-width\":\"<length>|auto\",columns:\"<'column-width'>||<'column-count'>\",contain:\"none|strict|content|[[size||inline-size]||layout||style||paint]\",\"contain-intrinsic-block-size\":\"auto? [none|<length>]\",\"contain-intrinsic-height\":\"auto? [none|<length>]\",\"contain-intrinsic-inline-size\":\"auto? [none|<length>]\",\"contain-intrinsic-size\":\"[auto? [none|<length>]]{1,2}\",\"contain-intrinsic-width\":\"auto? [none|<length>]\",container:\"<'container-name'> [/ <'container-type'>]?\",\"container-name\":\"none|<custom-ident>+\",\"container-type\":\"normal|[[size|inline-size]||scroll-state]\",content:\"normal|none|[<content-replacement>|<content-list>] [/ [<string>|<counter>]+]?\",\"content-visibility\":\"visible|auto|hidden\",\"counter-increment\":\"[<counter-name> <integer>?]+|none\",\"counter-reset\":\"[<counter-name> <integer>?|<reversed-counter-name> <integer>?]+|none\",\"counter-set\":\"[<counter-name> <integer>?]+|none\",cursor:\"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]\",cx:\"<length>|<percentage>\",cy:\"<length>|<percentage>\",d:\"none|path( <string> )\",direction:\"ltr|rtl\",display:\"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>\",\"dominant-baseline\":\"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge\",\"empty-cells\":\"show|hide\",\"field-sizing\":\"content|fixed\",fill:\"<paint>\",\"fill-opacity\":\"<number-zero-one>\",\"fill-rule\":\"nonzero|evenodd\",filter:\"none|<filter-value-list>|<-ms-filter-function-list>\",flex:\"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]\",\"flex-basis\":\"content|<'width'>\",\"flex-direction\":\"row|row-reverse|column|column-reverse\",\"flex-flow\":\"<'flex-direction'>||<'flex-wrap'>\",\"flex-grow\":\"<number>\",\"flex-shrink\":\"<number>\",\"flex-wrap\":\"nowrap|wrap|wrap-reverse\",float:\"left|right|none|inline-start|inline-end\",\"flood-color\":\"<color>\",\"flood-opacity\":\"<'opacity'>\",font:\"[[<'font-style'>||<font-variant-css2>||<'font-weight'>||<font-width-css3>]? <'font-size'> [/ <'line-height'>]? <'font-family'>#]|<system-family-name>|<-non-standard-font>\",\"font-family\":\"[<family-name>|<generic-family>]#\",\"font-feature-settings\":\"normal|<feature-tag-value>#\",\"font-kerning\":\"auto|normal|none\",\"font-language-override\":\"normal|<string>\",\"font-optical-sizing\":\"auto|none\",\"font-palette\":\"normal|light|dark|<palette-identifier>|<palette-mix()>\",\"font-size\":\"<absolute-size>|<relative-size>|<length-percentage [0,\\u221E]>|math\",\"font-size-adjust\":\"none|[ex-height|cap-height|ch-width|ic-width|ic-height]? [from-font|<number>]\",\"font-smooth\":\"auto|never|always|<absolute-size>|<length>\",\"font-stretch\":\"<font-stretch-absolute>\",\"font-style\":\"normal|italic|oblique <angle>?\",\"font-synthesis\":\"none|[weight||style||small-caps||position]\",\"font-synthesis-position\":\"auto|none\",\"font-synthesis-small-caps\":\"auto|none\",\"font-synthesis-style\":\"auto|none\",\"font-synthesis-weight\":\"auto|none\",\"font-variant\":\"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]\",\"font-variant-alternates\":\"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]\",\"font-variant-caps\":\"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps\",\"font-variant-east-asian\":\"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]\",\"font-variant-emoji\":\"normal|text|emoji|unicode\",\"font-variant-ligatures\":\"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]\",\"font-variant-numeric\":\"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]\",\"font-variant-position\":\"normal|sub|super\",\"font-variation-settings\":\"normal|[<string> <number>]#\",\"font-weight\":\"<font-weight-absolute>|bolder|lighter\",\"forced-color-adjust\":\"auto|none|preserve-parent-color\",gap:\"<'row-gap'> <'column-gap'>?\",grid:\"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>\",\"grid-area\":\"<grid-line> [/ <grid-line>]{0,3}\",\"grid-auto-columns\":\"<track-size>+\",\"grid-auto-flow\":\"[row|column]||dense\",\"grid-auto-rows\":\"<track-size>+\",\"grid-column\":\"<grid-line> [/ <grid-line>]?\",\"grid-column-end\":\"<grid-line>\",\"grid-column-gap\":\"<length-percentage>\",\"grid-column-start\":\"<grid-line>\",\"grid-gap\":\"<'grid-row-gap'> <'grid-column-gap'>?\",\"grid-row\":\"<grid-line> [/ <grid-line>]?\",\"grid-row-end\":\"<grid-line>\",\"grid-row-gap\":\"<length-percentage>\",\"grid-row-start\":\"<grid-line>\",\"grid-template\":\"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?\",\"grid-template-areas\":\"none|<string>+\",\"grid-template-columns\":\"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?\",\"grid-template-rows\":\"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?\",\"hanging-punctuation\":\"none|[first||[force-end|allow-end]||last]\",height:\"auto|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"hyphenate-character\":\"auto|<string>\",\"hyphenate-limit-chars\":\"[auto|<integer>]{1,3}\",hyphens:\"none|manual|auto\",\"image-orientation\":\"from-image|<angle>|[<angle>? flip]\",\"image-rendering\":\"auto|crisp-edges|pixelated|smooth|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>\",\"image-resolution\":\"[from-image||<resolution>]&&snap?\",\"ime-mode\":\"auto|normal|active|inactive|disabled\",\"initial-letter\":\"normal|[<number> <integer>?]\",\"initial-letter-align\":\"[auto|alphabetic|hanging|ideographic]\",\"inline-size\":\"<'width'>\",inset:\"<'top'>{1,4}\",\"inset-block\":\"<'top'>{1,2}\",\"inset-block-end\":\"<'top'>\",\"inset-block-start\":\"<'top'>\",\"inset-inline\":\"<'top'>{1,2}\",\"inset-inline-end\":\"<'top'>\",\"inset-inline-start\":\"<'top'>\",\"interpolate-size\":\"numeric-only|allow-keywords\",isolation:\"auto|isolate\",\"justify-content\":\"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]\",\"justify-items\":\"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]\",\"justify-self\":\"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]\",\"justify-tracks\":\"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#\",left:\"<length>|<percentage>|auto\",\"letter-spacing\":\"normal|<length-percentage>\",\"lighting-color\":\"<color>\",\"line-break\":\"auto|loose|normal|strict|anywhere\",\"line-clamp\":\"none|<integer>\",\"line-height\":\"normal|<number>|<length>|<percentage>\",\"line-height-step\":\"<length>\",\"list-style\":\"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>\",\"list-style-image\":\"<image>|none\",\"list-style-position\":\"inside|outside\",\"list-style-type\":\"<counter-style>|<string>|none\",margin:\"<'margin-top'>{1,4}\",\"margin-block\":\"<'margin-top'>{1,2}\",\"margin-block-end\":\"<'margin-top'>\",\"margin-block-start\":\"<'margin-top'>\",\"margin-bottom\":\"<length-percentage>|auto\",\"margin-inline\":\"<'margin-top'>{1,2}\",\"margin-inline-end\":\"<'margin-top'>\",\"margin-inline-start\":\"<'margin-top'>\",\"margin-left\":\"<length-percentage>|auto\",\"margin-right\":\"<length-percentage>|auto\",\"margin-top\":\"<length-percentage>|auto\",\"margin-trim\":\"none|in-flow|all\",marker:\"none|<url>\",\"marker-end\":\"none|<url>\",\"marker-mid\":\"none|<url>\",\"marker-start\":\"none|<url>\",mask:\"<mask-layer>#\",\"mask-border\":\"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>\",\"mask-border-mode\":\"luminance|alpha\",\"mask-border-outset\":\"[<length>|<number>]{1,4}\",\"mask-border-repeat\":\"[stretch|repeat|round|space]{1,2}\",\"mask-border-slice\":\"<number-percentage>{1,4} fill?\",\"mask-border-source\":\"none|<image>\",\"mask-border-width\":\"[<length-percentage>|<number>|auto]{1,4}\",\"mask-clip\":\"[<coord-box>|no-clip]#\",\"mask-composite\":\"<compositing-operator>#\",\"mask-image\":\"<mask-reference>#\",\"mask-mode\":\"<masking-mode>#\",\"mask-origin\":\"<coord-box>#\",\"mask-position\":\"<position>#\",\"mask-repeat\":\"<repeat-style>#\",\"mask-size\":\"<bg-size>#\",\"mask-type\":\"luminance|alpha\",\"masonry-auto-flow\":\"[pack|next]||[definite-first|ordered]\",\"math-depth\":\"auto-add|add( <integer> )|<integer>\",\"math-shift\":\"normal|compact\",\"math-style\":\"normal|compact\",\"max-block-size\":\"<'max-width'>\",\"max-height\":\"none|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"max-inline-size\":\"<'max-width'>\",\"max-lines\":\"none|<integer>\",\"max-width\":\"none|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"min-block-size\":\"<'min-width'>\",\"min-height\":\"auto|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"min-inline-size\":\"<'min-width'>\",\"min-width\":\"auto|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"mix-blend-mode\":\"<blend-mode>|plus-lighter\",\"object-fit\":\"fill|contain|cover|none|scale-down\",\"object-position\":\"<position>\",\"object-view-box\":\"none|<basic-shape-rect>\",offset:\"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?\",\"offset-anchor\":\"auto|<position>\",\"offset-distance\":\"<length-percentage>\",\"offset-path\":\"none|<offset-path>||<coord-box>\",\"offset-position\":\"normal|auto|<position>\",\"offset-rotate\":\"[auto|reverse]||<angle>\",opacity:\"<opacity-value>\",order:\"<integer>\",orphans:\"<integer>\",outline:\"<'outline-width'>||<'outline-style'>||<'outline-color'>\",\"outline-color\":\"auto|<color>\",\"outline-offset\":\"<length>\",\"outline-style\":\"auto|<outline-line-style>\",\"outline-width\":\"<line-width>\",overflow:\"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>\",\"overflow-anchor\":\"auto|none\",\"overflow-block\":\"visible|hidden|clip|scroll|auto\",\"overflow-clip-box\":\"padding-box|content-box\",\"overflow-clip-margin\":\"<visual-box>||<length [0,\\u221E]>\",\"overflow-inline\":\"visible|hidden|clip|scroll|auto\",\"overflow-wrap\":\"normal|break-word|anywhere\",\"overflow-x\":\"visible|hidden|clip|scroll|auto|<-non-standard-overflow>\",\"overflow-y\":\"visible|hidden|clip|scroll|auto|<-non-standard-overflow>\",overlay:\"none|auto\",\"overscroll-behavior\":\"[contain|none|auto]{1,2}\",\"overscroll-behavior-block\":\"contain|none|auto\",\"overscroll-behavior-inline\":\"contain|none|auto\",\"overscroll-behavior-x\":\"contain|none|auto\",\"overscroll-behavior-y\":\"contain|none|auto\",padding:\"<'padding-top'>{1,4}\",\"padding-block\":\"<'padding-top'>{1,2}\",\"padding-block-end\":\"<'padding-top'>\",\"padding-block-start\":\"<'padding-top'>\",\"padding-bottom\":\"<length-percentage [0,\\u221E]>\",\"padding-inline\":\"<'padding-top'>{1,2}\",\"padding-inline-end\":\"<'padding-top'>\",\"padding-inline-start\":\"<'padding-top'>\",\"padding-left\":\"<length-percentage [0,\\u221E]>\",\"padding-right\":\"<length-percentage [0,\\u221E]>\",\"padding-top\":\"<length-percentage [0,\\u221E]>\",page:\"auto|<custom-ident>\",\"page-break-after\":\"auto|always|avoid|left|right|recto|verso\",\"page-break-before\":\"auto|always|avoid|left|right|recto|verso\",\"page-break-inside\":\"auto|avoid\",\"paint-order\":\"normal|[fill||stroke||markers]\",perspective:\"none|<length>\",\"perspective-origin\":\"<position>\",\"place-content\":\"<'align-content'> <'justify-content'>?\",\"place-items\":\"<'align-items'> <'justify-items'>?\",\"place-self\":\"<'align-self'> <'justify-self'>?\",\"pointer-events\":\"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit\",position:\"static|relative|absolute|sticky|fixed|-webkit-sticky\",\"position-anchor\":\"auto|<anchor-name>\",\"position-area\":\"none|<position-area>\",\"position-try\":\"<'position-try-order'>? <'position-try-fallbacks'>\",\"position-try-fallbacks\":\"none|[[<dashed-ident>||<try-tactic>]|<'position-area'>]#\",\"position-try-order\":\"normal|<try-size>\",\"position-visibility\":\"always|[anchors-valid||anchors-visible||no-overflow]\",\"print-color-adjust\":\"economy|exact\",quotes:\"none|auto|[<string> <string>]+\",r:\"<length>|<percentage>\",resize:\"none|both|horizontal|vertical|block|inline\",right:\"<length>|<percentage>|auto\",rotate:\"none|<angle>|[x|y|z|<number>{3}]&&<angle>\",\"row-gap\":\"normal|<length-percentage>\",\"ruby-align\":\"start|center|space-between|space-around\",\"ruby-merge\":\"separate|collapse|auto\",\"ruby-position\":\"[alternate||[over|under]]|inter-character\",rx:\"<length>|<percentage>\",ry:\"<length>|<percentage>\",scale:\"none|[<number>|<percentage>]{1,3}\",\"scroll-behavior\":\"auto|smooth\",\"scroll-initial-target\":\"none|nearest\",\"scroll-margin\":\"<length>{1,4}\",\"scroll-margin-block\":\"<length>{1,2}\",\"scroll-margin-block-end\":\"<length>\",\"scroll-margin-block-start\":\"<length>\",\"scroll-margin-bottom\":\"<length>\",\"scroll-margin-inline\":\"<length>{1,2}\",\"scroll-margin-inline-end\":\"<length>\",\"scroll-margin-inline-start\":\"<length>\",\"scroll-margin-left\":\"<length>\",\"scroll-margin-right\":\"<length>\",\"scroll-margin-top\":\"<length>\",\"scroll-padding\":\"[auto|<length-percentage>]{1,4}\",\"scroll-padding-block\":\"[auto|<length-percentage>]{1,2}\",\"scroll-padding-block-end\":\"auto|<length-percentage>\",\"scroll-padding-block-start\":\"auto|<length-percentage>\",\"scroll-padding-bottom\":\"auto|<length-percentage>\",\"scroll-padding-inline\":\"[auto|<length-percentage>]{1,2}\",\"scroll-padding-inline-end\":\"auto|<length-percentage>\",\"scroll-padding-inline-start\":\"auto|<length-percentage>\",\"scroll-padding-left\":\"auto|<length-percentage>\",\"scroll-padding-right\":\"auto|<length-percentage>\",\"scroll-padding-top\":\"auto|<length-percentage>\",\"scroll-snap-align\":\"[none|start|end|center]{1,2}\",\"scroll-snap-coordinate\":\"none|<position>#\",\"scroll-snap-destination\":\"<position>\",\"scroll-snap-points-x\":\"none|repeat( <length-percentage> )\",\"scroll-snap-points-y\":\"none|repeat( <length-percentage> )\",\"scroll-snap-stop\":\"normal|always\",\"scroll-snap-type\":\"none|[x|y|block|inline|both] [mandatory|proximity]?\",\"scroll-snap-type-x\":\"none|mandatory|proximity\",\"scroll-snap-type-y\":\"none|mandatory|proximity\",\"scroll-timeline\":\"[<'scroll-timeline-name'> <'scroll-timeline-axis'>?]#\",\"scroll-timeline-axis\":\"[block|inline|x|y]#\",\"scroll-timeline-name\":\"[none|<dashed-ident>]#\",\"scrollbar-color\":\"auto|<color>{2}\",\"scrollbar-gutter\":\"auto|stable&&both-edges?\",\"scrollbar-width\":\"auto|thin|none\",\"shape-image-threshold\":\"<opacity-value>\",\"shape-margin\":\"<length-percentage>\",\"shape-outside\":\"none|[<shape-box>||<basic-shape>]|<image>\",\"shape-rendering\":\"auto|optimizeSpeed|crispEdges|geometricPrecision\",\"speak-as\":\"normal|spell-out||digits||[literal-punctuation|no-punctuation]\",\"stop-color\":\"<'color'>\",\"stop-opacity\":\"<'opacity'>\",stroke:\"<paint>\",\"stroke-dasharray\":\"none|[<svg-length>+]#\",\"stroke-dashoffset\":\"<svg-length>\",\"stroke-linecap\":\"butt|round|square\",\"stroke-linejoin\":\"miter|round|bevel\",\"stroke-miterlimit\":\"<number-one-or-greater>\",\"stroke-opacity\":\"<'opacity'>\",\"stroke-width\":\"<svg-length>\",\"tab-size\":\"<integer>|<length>\",\"table-layout\":\"auto|fixed\",\"text-align\":\"start|end|left|right|center|justify|match-parent\",\"text-align-last\":\"auto|start|end|left|right|center|justify\",\"text-anchor\":\"start|middle|end\",\"text-box\":\"normal|<'text-box-trim'>||<'text-box-edge'>\",\"text-box-edge\":\"auto|<text-edge>\",\"text-box-trim\":\"none|trim-start|trim-end|trim-both\",\"text-combine-upright\":\"none|all|[digits <integer>?]\",\"text-decoration\":\"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>\",\"text-decoration-color\":\"<color>\",\"text-decoration-line\":\"none|[underline||overline||line-through||blink]|spelling-error|grammar-error\",\"text-decoration-skip\":\"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]\",\"text-decoration-skip-ink\":\"auto|all|none\",\"text-decoration-style\":\"solid|double|dotted|dashed|wavy\",\"text-decoration-thickness\":\"auto|from-font|<length>|<percentage>\",\"text-emphasis\":\"<'text-emphasis-style'>||<'text-emphasis-color'>\",\"text-emphasis-color\":\"<color>\",\"text-emphasis-position\":\"auto|[over|under]&&[right|left]?\",\"text-emphasis-style\":\"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>\",\"text-indent\":\"<length-percentage>&&hanging?&&each-line?\",\"text-justify\":\"auto|inter-character|inter-word|none\",\"text-orientation\":\"mixed|upright|sideways\",\"text-overflow\":\"[clip|ellipsis|<string>]{1,2}\",\"text-rendering\":\"auto|optimizeSpeed|optimizeLegibility|geometricPrecision\",\"text-shadow\":\"none|<shadow-t>#\",\"text-size-adjust\":\"none|auto|<percentage>\",\"text-spacing-trim\":\"space-all|normal|space-first|trim-start\",\"text-transform\":\"none|[capitalize|uppercase|lowercase]||full-width||full-size-kana|math-auto\",\"text-underline-offset\":\"auto|<length>|<percentage>\",\"text-underline-position\":\"auto|from-font|[under||[left|right]]\",\"text-wrap\":\"<'text-wrap-mode'>||<'text-wrap-style'>\",\"text-wrap-mode\":\"wrap|nowrap\",\"text-wrap-style\":\"auto|balance|stable|pretty\",\"timeline-scope\":\"none|<dashed-ident>#\",top:\"<length>|<percentage>|auto\",\"touch-action\":\"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation\",transform:\"none|<transform-list>\",\"transform-box\":\"content-box|border-box|fill-box|stroke-box|view-box\",\"transform-origin\":\"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?\",\"transform-style\":\"flat|preserve-3d\",transition:\"<single-transition>#\",\"transition-behavior\":\"<transition-behavior-value>#\",\"transition-delay\":\"<time>#\",\"transition-duration\":\"<time>#\",\"transition-property\":\"none|<single-transition-property>#\",\"transition-timing-function\":\"<easing-function>#\",translate:\"none|<length-percentage> [<length-percentage> <length>?]?\",\"unicode-bidi\":\"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext\",\"user-select\":\"auto|text|none|all\",\"vector-effect\":\"none|non-scaling-stroke|non-scaling-size|non-rotation|fixed-position\",\"vertical-align\":\"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>\",\"view-timeline\":\"[<'view-timeline-name'> [<'view-timeline-axis'>||<'view-timeline-inset'>]?]#\",\"view-timeline-axis\":\"[block|inline|x|y]#\",\"view-timeline-inset\":\"[[auto|<length-percentage>]{1,2}]#\",\"view-timeline-name\":\"[none|<dashed-ident>]#\",\"view-transition-class\":\"none|<custom-ident>+\",\"view-transition-name\":\"none|<custom-ident>\",visibility:\"visible|hidden|collapse\",\"white-space\":\"normal|pre|pre-wrap|pre-line|<'white-space-collapse'>||<'text-wrap-mode'>\",\"white-space-collapse\":\"collapse|preserve|preserve-breaks|preserve-spaces|break-spaces\",widows:\"<integer>\",width:\"auto|<length-percentage [0,\\u221E]>|min-content|max-content|fit-content|fit-content( <length-percentage [0,\\u221E]> )|<calc-size()>|<anchor-size()>|stretch|<-non-standard-size>\",\"will-change\":\"auto|<animateable-feature>#\",\"word-break\":\"normal|break-all|keep-all|break-word|auto-phrase\",\"word-spacing\":\"normal|<length>\",\"word-wrap\":\"normal|break-word\",\"writing-mode\":\"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>\",x:\"<length>|<percentage>\",y:\"<length>|<percentage>\",\"z-index\":\"auto|<integer>\",zoom:\"normal|reset|<number [0,\\u221E]>||<percentage [0,\\u221E]>\",\"-moz-background-clip\":\"padding|border\",\"-moz-border-radius-bottomleft\":\"<'border-bottom-left-radius'>\",\"-moz-border-radius-bottomright\":\"<'border-bottom-right-radius'>\",\"-moz-border-radius-topleft\":\"<'border-top-left-radius'>\",\"-moz-border-radius-topright\":\"<'border-bottom-right-radius'>\",\"-moz-control-character-visibility\":\"visible|hidden\",\"-moz-osx-font-smoothing\":\"auto|grayscale\",\"-moz-user-select\":\"none|text|all|-moz-none\",\"-ms-flex-align\":\"start|end|center|baseline|stretch\",\"-ms-flex-item-align\":\"auto|start|end|center|baseline|stretch\",\"-ms-flex-line-pack\":\"start|end|center|justify|distribute|stretch\",\"-ms-flex-negative\":\"<'flex-shrink'>\",\"-ms-flex-pack\":\"start|end|center|justify|distribute\",\"-ms-flex-order\":\"<integer>\",\"-ms-flex-positive\":\"<'flex-grow'>\",\"-ms-flex-preferred-size\":\"<'flex-basis'>\",\"-ms-interpolation-mode\":\"nearest-neighbor|bicubic\",\"-ms-grid-column-align\":\"start|end|center|stretch\",\"-ms-grid-row-align\":\"start|end|center|stretch\",\"-ms-hyphenate-limit-last\":\"none|always|column|page|spread\",\"-webkit-background-clip\":\"[<visual-box>|border|padding|content|text]#\",\"-webkit-column-break-after\":\"always|auto|avoid\",\"-webkit-column-break-before\":\"always|auto|avoid\",\"-webkit-column-break-inside\":\"always|auto|avoid\",\"-webkit-font-smoothing\":\"auto|none|antialiased|subpixel-antialiased\",\"-webkit-mask-box-image\":\"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?\",\"-webkit-print-color-adjust\":\"economy|exact\",\"-webkit-text-security\":\"none|circle|disc|square\",\"-webkit-user-drag\":\"none|element|auto\",behavior:\"<url>+\",cue:\"<'cue-before'> <'cue-after'>?\",\"cue-after\":\"<url> <decibel>?|none\",\"cue-before\":\"<url> <decibel>?|none\",\"glyph-orientation-horizontal\":\"<angle>\",\"glyph-orientation-vertical\":\"<angle>\",kerning:\"auto|<svg-length>\",pause:\"<'pause-before'> <'pause-after'>?\",\"pause-after\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"pause-before\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"position-try-options\":\"<'position-try-fallbacks'>\",rest:\"<'rest-before'> <'rest-after'>?\",\"rest-after\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",\"rest-before\":\"<time>|none|x-weak|weak|medium|strong|x-strong\",speak:\"auto|never|always\",\"voice-balance\":\"<number>|left|center|right|leftwards|rightwards\",\"voice-duration\":\"auto|<time>\",\"voice-family\":\"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve\",\"voice-pitch\":\"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]\",\"voice-range\":\"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]\",\"voice-rate\":\"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>\",\"voice-stress\":\"normal|strong|moderate|none|reduced\",\"voice-volume\":\"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]\",\"white-space-trim\":\"none|discard-before||discard-after||discard-inner\"},atrules:{charset:{prelude:\"<string>\",descriptors:null},\"counter-style\":{prelude:\"<counter-style-name>\",descriptors:{\"additive-symbols\":\"[<integer>&&<symbol>]#\",fallback:\"<counter-style-name>\",negative:\"<symbol> <symbol>?\",pad:\"<integer>&&<symbol>\",prefix:\"<symbol>\",range:\"[[<integer>|infinite]{2}]#|auto\",\"speak-as\":\"auto|bullets|numbers|words|spell-out|<counter-style-name>\",suffix:\"<symbol>\",symbols:\"<symbol>+\",system:\"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]\"}},container:{prelude:\"[<container-name>]? <container-condition>\",descriptors:null},document:{prelude:\"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#\",descriptors:null},\"font-face\":{prelude:null,descriptors:{\"ascent-override\":\"normal|<percentage>\",\"descent-override\":\"normal|<percentage>\",\"font-display\":\"auto|block|swap|fallback|optional\",\"font-family\":\"<family-name>\",\"font-feature-settings\":\"normal|<feature-tag-value>#\",\"font-stretch\":\"<font-stretch-absolute>{1,2}\",\"font-style\":\"normal|italic|oblique <angle>{0,2}\",\"font-variation-settings\":\"normal|[<string> <number>]#\",\"font-weight\":\"<font-weight-absolute>{1,2}\",\"line-gap-override\":\"normal|<percentage>\",\"size-adjust\":\"<percentage>\",src:\"[<url> [format( <string># )]?|local( <family-name> )]#\",\"unicode-range\":\"<unicode-range-token>#\"}},\"font-feature-values\":{prelude:\"<family-name>#\",descriptors:null},\"font-palette-values\":{prelude:\"<dashed-ident>\",descriptors:{\"base-palette\":\"light|dark|<integer [0,\\u221E]>\",\"font-family\":\"<family-name>#\",\"override-colors\":\"[<integer [0,\\u221E]> <color>]#\"}},import:{prelude:\"[<string>|<url>] [layer|layer( <layer-name> )]? [supports( [<supports-condition>|<declaration>] )]? <media-query-list>?\",descriptors:null},keyframes:{prelude:\"<keyframes-name>\",descriptors:null},layer:{prelude:\"[<layer-name>#|<layer-name>?]\",descriptors:null},media:{prelude:\"<media-query-list>\",descriptors:null},namespace:{prelude:\"<namespace-prefix>? [<string>|<url>]\",descriptors:null},page:{prelude:\"<page-selector-list>\",descriptors:{bleed:\"auto|<length>\",marks:\"none|[crop||cross]\",\"page-orientation\":\"upright|rotate-left|rotate-right\",size:\"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]\"}},\"position-try\":{prelude:\"<dashed-ident>\",descriptors:{top:\"<'top'>\",left:\"<'left'>\",bottom:\"<'bottom'>\",right:\"<'right'>\",\"inset-block-start\":\"<'inset-block-start'>\",\"inset-block-end\":\"<'inset-block-end'>\",\"inset-inline-start\":\"<'inset-inline-start'>\",\"inset-inline-end\":\"<'inset-inline-end'>\",\"inset-block\":\"<'inset-block'>\",\"inset-inline\":\"<'inset-inline'>\",inset:\"<'inset'>\",\"margin-top\":\"<'margin-top'>\",\"margin-left\":\"<'margin-left'>\",\"margin-bottom\":\"<'margin-bottom'>\",\"margin-right\":\"<'margin-right'>\",\"margin-block-start\":\"<'margin-block-start'>\",\"margin-block-end\":\"<'margin-block-end'>\",\"margin-inline-start\":\"<'margin-inline-start'>\",\"margin-inline-end\":\"<'margin-inline-end'>\",margin:\"<'margin'>\",\"margin-block\":\"<'margin-block'>\",\"margin-inline\":\"<'margin-inline'>\",width:\"<'width'>\",height:\"<'height'>\",\"min-width\":\"<'min-width'>\",\"min-height\":\"<'min-height'>\",\"max-width\":\"<'max-width'>\",\"max-height\":\"<'max-height'>\",\"block-size\":\"<'block-size'>\",\"inline-size\":\"<'inline-size'>\",\"min-block-size\":\"<'min-block-size'>\",\"min-inline-size\":\"<'min-inline-size'>\",\"max-block-size\":\"<'max-block-size'>\",\"max-inline-size\":\"<'max-inline-size'>\",\"align-self\":\"<'align-self'>|anchor-center\",\"justify-self\":\"<'justify-self'>|anchor-center\"}},property:{prelude:\"<custom-property-name>\",descriptors:{inherits:\"true|false\",\"initial-value\":\"<declaration-value>?\",syntax:\"<string>\"}},scope:{prelude:\"[( <scope-start> )]? [to ( <scope-end> )]?\",descriptors:null},\"starting-style\":{prelude:null,descriptors:null},supports:{prelude:\"<supports-condition>\",descriptors:null},\"view-transition\":{prelude:null,descriptors:{navigation:\"auto|none\",types:\"none|<custom-ident>+\"}},nest:{prelude:\"<complex-selector-list>\",descriptors:null}}};var Ct={};f(Ct,{AnPlusB:()=>tn,Atrule:()=>nn,AtrulePrelude:()=>sn,AttributeSelector:()=>cn,Block:()=>pn,Brackets:()=>mn,CDC:()=>fn,CDO:()=>bn,ClassSelector:()=>yn,Combinator:()=>wn,Comment:()=>Sn,Condition:()=>Tn,Declaration:()=>Ln,DeclarationList:()=>Pn,Dimension:()=>Dn,Feature:()=>On,FeatureFunction:()=>Fn,FeatureRange:()=>_n,Function:()=>qn,GeneralEnclosed:()=>Un,Hash:()=>Gn,IdSelector:()=>Qn,Identifier:()=>Kn,Layer:()=>$n,LayerList:()=>Jn,MediaQuery:()=>ti,MediaQueryList:()=>ni,NestingSelector:()=>oi,Nth:()=>ai,Number:()=>ci,Operator:()=>pi,Parentheses:()=>mi,Percentage:()=>fi,PseudoClassSelector:()=>bi,PseudoElementSelector:()=>yi,Ratio:()=>wi,Raw:()=>Si,Rule:()=>Ti,Scope:()=>Li,Selector:()=>zi,SelectorList:()=>Ii,String:()=>Fi,StyleSheet:()=>Bi,SupportsDeclaration:()=>Wi,TypeSelector:()=>Ui,UnicodeRange:()=>Yi,Url:()=>Zi,Value:()=>eo,WhiteSpace:()=>ro});var tn={};f(tn,{generate:()=>Xc,name:()=>Vc,parse:()=>en,structure:()=>Qc});var fe=43,re=45,er=110,Re=!0,Kc=!1;function tr(e,t){let r=this.tokenStart+e,n=this.charCodeAt(r);for((n===fe||n===re)&&(t&&this.error(\"Number sign is not allowed\"),r++);r<this.tokenEnd;r++)O(this.charCodeAt(r))||this.error(\"Integer is expected\",r)}function et(e){return tr.call(this,0,e)}function Ee(e,t){if(!this.cmpChar(this.tokenStart+e,t)){let r=\"\";switch(t){case er:r=\"N is expected\";break;case re:r=\"HyphenMinus is expected\";break}this.error(r,this.tokenStart+e)}}function Jr(){let e=0,t=0,r=this.tokenType;for(;r===13||r===25;)r=this.lookupType(++e);if(r!==10)if(this.isDelim(fe,e)||this.isDelim(re,e)){t=this.isDelim(fe,e)?fe:re;do r=this.lookupType(++e);while(r===13||r===25);r!==10&&(this.skip(e),et.call(this,Re))}else return null;return e>0&&this.skip(e),t===0&&(r=this.charCodeAt(this.tokenStart),r!==fe&&r!==re&&this.error(\"Number sign is expected\")),et.call(this,t!==0),t===re?\"-\"+this.consume(10):this.consume(10)}var Vc=\"AnPlusB\",Qc={a:[String,null],b:[String,null]};function en(){let e=this.tokenStart,t=null,r=null;if(this.tokenType===10)et.call(this,Kc),r=this.consume(10);else if(this.tokenType===1&&this.cmpChar(this.tokenStart,re))switch(t=\"-1\",Ee.call(this,1,er),this.tokenEnd-this.tokenStart){case 2:this.next(),r=Jr.call(this);break;case 3:Ee.call(this,2,re),this.next(),this.skipSC(),et.call(this,Re),r=\"-\"+this.consume(10);break;default:Ee.call(this,2,re),tr.call(this,3,Re),this.next(),r=this.substrToCursor(e+2)}else if(this.tokenType===1||this.isDelim(fe)&&this.lookupType(1)===1){let n=0;switch(t=\"1\",this.isDelim(fe)&&(n=1,this.next()),Ee.call(this,0,er),this.tokenEnd-this.tokenStart){case 1:this.next(),r=Jr.call(this);break;case 2:Ee.call(this,1,re),this.next(),this.skipSC(),et.call(this,Re),r=\"-\"+this.consume(10);break;default:Ee.call(this,1,re),tr.call(this,2,Re),this.next(),r=this.substrToCursor(e+n+1)}}else if(this.tokenType===12){let n=this.charCodeAt(this.tokenStart),i=n===fe||n===re,o=this.tokenStart+i;for(;o<this.tokenEnd&&O(this.charCodeAt(o));o++);o===this.tokenStart+i&&this.error(\"Integer is expected\",this.tokenStart+i),Ee.call(this,o-this.tokenStart,er),t=this.substring(e,o),o+1===this.tokenEnd?(this.next(),r=Jr.call(this)):(Ee.call(this,o-this.tokenStart+1,re),o+2===this.tokenEnd?(this.next(),this.skipSC(),et.call(this,Re),r=\"-\"+this.consume(10)):(tr.call(this,o-this.tokenStart+2,Re),this.next(),r=this.substrToCursor(o+1)))}else this.error();return t!==null&&t.charCodeAt(0)===fe&&(t=t.substr(1)),r!==null&&r.charCodeAt(0)===fe&&(r=r.substr(1)),{type:\"AnPlusB\",loc:this.getLocation(e,this.tokenStart),a:t,b:r}}function Xc(e){if(e.a){let t=e.a===\"+1\"&&\"n\"||e.a===\"1\"&&\"n\"||e.a===\"-1\"&&\"-n\"||e.a+\"n\";if(e.b){let r=e.b[0]===\"-\"||e.b[0]===\"+\"?e.b:\"+\"+e.b;this.tokenize(t+r)}else this.tokenize(t)}else this.tokenize(e.b)}var nn={};f(nn,{generate:()=>tu,name:()=>Zc,parse:()=>rn,structure:()=>eu,walkContext:()=>Jc});function _s(){return this.Raw(this.consumeUntilLeftCurlyBracketOrSemicolon,!0)}function $c(){for(let e=1,t;t=this.lookupType(e);e++){if(t===24)return!0;if(t===23||t===3)return!1}return!1}var Zc=\"Atrule\",Jc=\"atrule\",eu={name:String,prelude:[\"AtrulePrelude\",\"Raw\",null],block:[\"Block\",null]};function rn(e=!1){let t=this.tokenStart,r,n,i=null,o=null;switch(this.eat(3),r=this.substrToCursor(t+1),n=r.toLowerCase(),this.skipSC(),this.eof===!1&&this.tokenType!==23&&this.tokenType!==17&&(this.parseAtrulePrelude?i=this.parseWithFallback(this.AtrulePrelude.bind(this,r,e),_s):i=_s.call(this,this.tokenIndex),this.skipSC()),this.tokenType){case 17:this.next();break;case 23:hasOwnProperty.call(this.atrule,n)&&typeof this.atrule[n].block==\"function\"?o=this.atrule[n].block.call(this,e):o=this.Block($c.call(this));break}return{type:\"Atrule\",loc:this.getLocation(t,this.tokenStart),name:r,prelude:i,block:o}}function tu(e){this.token(3,\"@\"+e.name),e.prelude!==null&&this.node(e.prelude),e.block?this.node(e.block):this.token(17,\";\")}var sn={};f(sn,{generate:()=>ou,name:()=>ru,parse:()=>on,structure:()=>iu,walkContext:()=>nu});var ru=\"AtrulePrelude\",nu=\"atrulePrelude\",iu={children:[[]]};function on(e){let t=null;return e!==null&&(e=e.toLowerCase()),this.skipSC(),hasOwnProperty.call(this.atrule,e)&&typeof this.atrule[e].prelude==\"function\"?t=this.atrule[e].prelude.call(this):t=this.readSequence(this.scope.AtrulePrelude),this.skipSC(),this.eof!==!0&&this.tokenType!==23&&this.tokenType!==17&&this.error(\"Semicolon or block is expected\"),{type:\"AtrulePrelude\",loc:this.getLocationFromList(t),children:t}}function ou(e){this.children(e)}var cn={};f(cn,{generate:()=>mu,name:()=>pu,parse:()=>ln,structure:()=>hu});var su=36,Ws=42,rr=61,au=94,an=124,lu=126;function cu(){this.eof&&this.error(\"Unexpected end of input\");let e=this.tokenStart,t=!1;return this.isDelim(Ws)?(t=!0,this.next()):this.isDelim(an)||this.eat(1),this.isDelim(an)?this.charCodeAt(this.tokenStart+1)!==rr?(this.next(),this.eat(1)):t&&this.error(\"Identifier is expected\",this.tokenEnd):t&&this.error(\"Vertical line is expected\"),{type:\"Identifier\",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e)}}function uu(){let e=this.tokenStart,t=this.charCodeAt(e);return t!==rr&&t!==lu&&t!==au&&t!==su&&t!==Ws&&t!==an&&this.error(\"Attribute selector (=, ~=, ^=, $=, *=, |=) is expected\"),this.next(),t!==rr&&(this.isDelim(rr)||this.error(\"Equal sign is expected\"),this.next()),this.substrToCursor(e)}var pu=\"AttributeSelector\",hu={name:\"Identifier\",matcher:[String,null],value:[\"String\",\"Identifier\",null],flags:[String,null]};function ln(){let e=this.tokenStart,t,r=null,n=null,i=null;return this.eat(19),this.skipSC(),t=cu.call(this),this.skipSC(),this.tokenType!==20&&(this.tokenType!==1&&(r=uu.call(this),this.skipSC(),n=this.tokenType===5?this.String():this.Identifier(),this.skipSC()),this.tokenType===1&&(i=this.consume(1),this.skipSC())),this.eat(20),{type:\"AttributeSelector\",loc:this.getLocation(e,this.tokenStart),name:t,matcher:r,value:n,flags:i}}function mu(e){this.token(9,\"[\"),this.node(e.name),e.matcher!==null&&(this.tokenize(e.matcher),this.node(e.value)),e.flags!==null&&this.token(1,e.flags),this.token(9,\"]\")}var pn={};f(pn,{generate:()=>yu,name:()=>gu,parse:()=>un,structure:()=>xu,walkContext:()=>bu});var du=38;function Us(){return this.Raw(null,!0)}function qs(){return this.parseWithFallback(this.Rule,Us)}function js(){return this.Raw(this.consumeUntilSemicolonIncluded,!0)}function fu(){if(this.tokenType===17)return js.call(this,this.tokenIndex);let e=this.parseWithFallback(this.Declaration,js);return this.tokenType===17&&this.next(),e}var gu=\"Block\",bu=\"block\",xu={children:[[\"Atrule\",\"Rule\",\"Declaration\"]]};function un(e){let t=e?fu:qs,r=this.tokenStart,n=this.createList();this.eat(23);e:for(;!this.eof;)switch(this.tokenType){case 24:break e;case 13:case 25:this.next();break;case 3:n.push(this.parseWithFallback(this.Atrule.bind(this,e),Us));break;default:e&&this.isDelim(du)?n.push(qs.call(this)):n.push(t.call(this))}return this.eof||this.eat(24),{type:\"Block\",loc:this.getLocation(r,this.tokenStart),children:n}}function yu(e){this.token(23,\"{\"),this.children(e,t=>{t.type===\"Declaration\"&&this.token(17,\";\")}),this.token(24,\"}\")}var mn={};f(mn,{generate:()=>vu,name:()=>ku,parse:()=>hn,structure:()=>wu});var ku=\"Brackets\",wu={children:[[]]};function hn(e,t){let r=this.tokenStart,n=null;return this.eat(19),n=e.call(this,t),this.eof||this.eat(20),{type:\"Brackets\",loc:this.getLocation(r,this.tokenStart),children:n}}function vu(e){this.token(9,\"[\"),this.children(e),this.token(9,\"]\")}var fn={};f(fn,{generate:()=>Tu,name:()=>Su,parse:()=>dn,structure:()=>Cu});var Su=\"CDC\",Cu=[];function dn(){let e=this.tokenStart;return this.eat(15),{type:\"CDC\",loc:this.getLocation(e,this.tokenStart)}}function Tu(){this.token(15,\"-->\")}var bn={};f(bn,{generate:()=>Eu,name:()=>Au,parse:()=>gn,structure:()=>Lu});var Au=\"CDO\",Lu=[];function gn(){let e=this.tokenStart;return this.eat(14),{type:\"CDO\",loc:this.getLocation(e,this.tokenStart)}}function Eu(){this.token(14,\"<!--\")}var yn={};f(yn,{generate:()=>Du,name:()=>Pu,parse:()=>xn,structure:()=>Iu});var zu=46,Pu=\"ClassSelector\",Iu={name:String};function xn(){return this.eatDelim(zu),{type:\"ClassSelector\",loc:this.getLocation(this.tokenStart-1,this.tokenEnd),name:this.consume(1)}}function Du(e){this.token(9,\".\"),this.token(1,e.name)}var wn={};f(wn,{generate:()=>Bu,name:()=>Fu,parse:()=>kn,structure:()=>Mu});var Nu=43,Hs=47,Ou=62,Ru=126,Fu=\"Combinator\",Mu={name:String};function kn(){let e=this.tokenStart,t;switch(this.tokenType){case 13:t=\" \";break;case 9:switch(this.charCodeAt(this.tokenStart)){case Ou:case Nu:case Ru:this.next();break;case Hs:this.next(),this.eatIdent(\"deep\"),this.eatDelim(Hs);break;default:this.error(\"Combinator is expected\")}t=this.substrToCursor(e);break}return{type:\"Combinator\",loc:this.getLocation(e,this.tokenStart),name:t}}function Bu(e){this.tokenize(e.name)}var Sn={};f(Sn,{generate:()=>Uu,name:()=>qu,parse:()=>vn,structure:()=>ju});var _u=42,Wu=47,qu=\"Comment\",ju={value:String};function vn(){let e=this.tokenStart,t=this.tokenEnd;return this.eat(25),t-e+2>=2&&this.charCodeAt(t-2)===_u&&this.charCodeAt(t-1)===Wu&&(t-=2),{type:\"Comment\",loc:this.getLocation(e,this.tokenStart),value:this.substring(e+2,t)}}function Uu(e){this.token(25,\"/*\"+e.value+\"*/\")}var Tn={};f(Tn,{generate:()=>Vu,name:()=>Gu,parse:()=>Cn,structure:()=>Yu});var Hu=new Set([16,22,0]),Gu=\"Condition\",Yu={kind:String,children:[[\"Identifier\",\"Feature\",\"FeatureFunction\",\"FeatureRange\",\"SupportsDeclaration\"]]};function Gs(e){return this.lookupTypeNonSC(1)===1&&Hu.has(this.lookupTypeNonSC(2))?this.Feature(e):this.FeatureRange(e)}var Ku={media:Gs,container:Gs,supports(){return this.SupportsDeclaration()}};function Cn(e=\"media\"){let t=this.createList();e:for(;!this.eof;)switch(this.tokenType){case 25:case 13:this.next();continue;case 1:t.push(this.Identifier());break;case 21:{let r=this.parseWithFallback(()=>Ku[e].call(this,e),()=>null);r||(r=this.parseWithFallback(()=>{this.eat(21);let n=this.Condition(e);return this.eat(22),n},()=>this.GeneralEnclosed(e))),t.push(r);break}case 2:{let r=this.parseWithFallback(()=>this.FeatureFunction(e),()=>null);r||(r=this.GeneralEnclosed(e)),t.push(r);break}default:break e}return t.isEmpty&&this.error(\"Condition is expected\"),{type:\"Condition\",loc:this.getLocationFromList(t),kind:e,children:t}}function Vu(e){e.children.forEach(t=>{t.type===\"Condition\"?(this.token(21,\"(\"),this.node(t),this.token(22,\")\")):this.node(t)})}var Ln={};f(Ln,{generate:()=>sp,name:()=>np,parse:()=>An,structure:()=>op,walkContext:()=>ip});var Ks=33,Qu=35,Xu=36,$u=38,Zu=42,Ju=43,Ys=47;function ep(){return this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!0)}function tp(){return this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!1)}function rp(){let e=this.tokenIndex,t=this.Value();return t.type!==\"Raw\"&&this.eof===!1&&this.tokenType!==17&&this.isDelim(Ks)===!1&&this.isBalanceEdge(e)===!1&&this.error(),t}var np=\"Declaration\",ip=\"declaration\",op={important:[Boolean,String],property:String,value:[\"Value\",\"Raw\"]};function An(){let e=this.tokenStart,t=this.tokenIndex,r=ap.call(this),n=Ht(r),i=n?this.parseCustomProperty:this.parseValue,o=n?tp:ep,s=!1,u;this.skipSC(),this.eat(16);let c=this.tokenIndex;if(n||this.skipSC(),i?u=this.parseWithFallback(rp,o):u=o.call(this,this.tokenIndex),n&&u.type===\"Value\"&&u.children.isEmpty){for(let a=c-this.tokenIndex;a<=0;a++)if(this.lookupType(a)===13){u.children.appendData({type:\"WhiteSpace\",loc:null,value:\" \"});break}}return this.isDelim(Ks)&&(s=lp.call(this),this.skipSC()),this.eof===!1&&this.tokenType!==17&&this.isBalanceEdge(t)===!1&&this.error(),{type:\"Declaration\",loc:this.getLocation(e,this.tokenStart),important:s,property:r,value:u}}function sp(e){this.token(1,e.property),this.token(16,\":\"),this.node(e.value),e.important&&(this.token(9,\"!\"),this.token(1,e.important===!0?\"important\":e.important))}function ap(){let e=this.tokenStart;if(this.tokenType===9)switch(this.charCodeAt(this.tokenStart)){case Zu:case Xu:case Ju:case Qu:case $u:this.next();break;case Ys:this.next(),this.isDelim(Ys)&&this.next();break}return this.tokenType===4?this.eat(4):this.eat(1),this.substrToCursor(e)}function lp(){this.eat(9),this.skipSC();let e=this.consume(1);return e===\"important\"?!0:e}var Pn={};f(Pn,{generate:()=>hp,name:()=>up,parse:()=>zn,structure:()=>pp});var cp=38;function En(){return this.Raw(this.consumeUntilSemicolonIncluded,!0)}var up=\"DeclarationList\",pp={children:[[\"Declaration\",\"Atrule\",\"Rule\"]]};function zn(){let e=this.createList();for(;!this.eof;)switch(this.tokenType){case 13:case 25:case 17:this.next();break;case 3:e.push(this.parseWithFallback(this.Atrule.bind(this,!0),En));break;default:this.isDelim(cp)?e.push(this.parseWithFallback(this.Rule,En)):e.push(this.parseWithFallback(this.Declaration,En))}return{type:\"DeclarationList\",loc:this.getLocationFromList(e),children:e}}function hp(e){this.children(e,t=>{t.type===\"Declaration\"&&this.token(17,\";\")})}var Dn={};f(Dn,{generate:()=>fp,name:()=>mp,parse:()=>In,structure:()=>dp});var mp=\"Dimension\",dp={value:String,unit:String};function In(){let e=this.tokenStart,t=this.consumeNumber(12);return{type:\"Dimension\",loc:this.getLocation(e,this.tokenStart),value:t,unit:this.substring(e+t.length,this.tokenStart)}}function fp(e){this.token(12,e.value+e.unit)}var On={};f(On,{generate:()=>yp,name:()=>bp,parse:()=>Nn,structure:()=>xp});var gp=47,bp=\"Feature\",xp={kind:String,name:String,value:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\",null]};function Nn(e){let t=this.tokenStart,r,n=null;if(this.eat(21),this.skipSC(),r=this.consume(1),this.skipSC(),this.tokenType!==22){switch(this.eat(16),this.skipSC(),this.tokenType){case 10:this.lookupNonWSType(1)===9?n=this.Ratio():n=this.Number();break;case 12:n=this.Dimension();break;case 1:n=this.Identifier();break;case 2:n=this.parseWithFallback(()=>{let i=this.Function(this.readSequence,this.scope.Value);return this.skipSC(),this.isDelim(gp)&&this.error(),i},()=>this.Ratio());break;default:this.error(\"Number, dimension, ratio or identifier is expected\")}this.skipSC()}return this.eof||this.eat(22),{type:\"Feature\",loc:this.getLocation(t,this.tokenStart),kind:e,name:r,value:n}}function yp(e){this.token(21,\"(\"),this.token(1,e.name),e.value!==null&&(this.token(16,\":\"),this.node(e.value)),this.token(22,\")\")}var Fn={};f(Fn,{generate:()=>Sp,name:()=>kp,parse:()=>Rn,structure:()=>wp});var kp=\"FeatureFunction\",wp={kind:String,feature:String,value:[\"Declaration\",\"Selector\"]};function vp(e,t){let n=(this.features[e]||{})[t];return typeof n!=\"function\"&&this.error(`Unknown feature ${t}()`),n}function Rn(e=\"unknown\"){let t=this.tokenStart,r=this.consumeFunctionName(),n=vp.call(this,e,r.toLowerCase());this.skipSC();let i=this.parseWithFallback(()=>{let o=this.tokenIndex,s=n.call(this);return this.eof===!1&&this.isBalanceEdge(o)===!1&&this.error(),s},()=>this.Raw(null,!1));return this.eof||this.eat(22),{type:\"FeatureFunction\",loc:this.getLocation(t,this.tokenStart),kind:e,feature:r,value:i}}function Sp(e){this.token(2,e.feature+\"(\"),this.node(e.value),this.token(22,\")\")}var _n={};f(_n,{generate:()=>Ep,name:()=>Ap,parse:()=>Bn,structure:()=>Lp});var Vs=47,Cp=60,Qs=61,Tp=62,Ap=\"FeatureRange\",Lp={kind:String,left:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\"],leftComparison:String,middle:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\"],rightComparison:[String,null],right:[\"Identifier\",\"Number\",\"Dimension\",\"Ratio\",\"Function\",null]};function Mn(){switch(this.skipSC(),this.tokenType){case 10:return this.isDelim(Vs,this.lookupOffsetNonSC(1))?this.Ratio():this.Number();case 12:return this.Dimension();case 1:return this.Identifier();case 2:return this.parseWithFallback(()=>{let e=this.Function(this.readSequence,this.scope.Value);return this.skipSC(),this.isDelim(Vs)&&this.error(),e},()=>this.Ratio());default:this.error(\"Number, dimension, ratio or identifier is expected\")}}function Xs(e){if(this.skipSC(),this.isDelim(Cp)||this.isDelim(Tp)){let t=this.source[this.tokenStart];return this.next(),this.isDelim(Qs)?(this.next(),t+\"=\"):t}if(this.isDelim(Qs))return\"=\";this.error(`Expected ${e?'\":\", ':\"\"}\"<\", \">\", \"=\" or \")\"`)}function Bn(e=\"unknown\"){let t=this.tokenStart;this.skipSC(),this.eat(21);let r=Mn.call(this),n=Xs.call(this,r.type===\"Identifier\"),i=Mn.call(this),o=null,s=null;return this.lookupNonWSType(0)!==22&&(o=Xs.call(this),s=Mn.call(this)),this.skipSC(),this.eat(22),{type:\"FeatureRange\",loc:this.getLocation(t,this.tokenStart),kind:e,left:r,leftComparison:n,middle:i,rightComparison:o,right:s}}function Ep(e){this.token(21,\"(\"),this.node(e.left),this.tokenize(e.leftComparison),this.node(e.middle),e.right&&(this.tokenize(e.rightComparison),this.node(e.right)),this.token(22,\")\")}var qn={};f(qn,{generate:()=>Dp,name:()=>zp,parse:()=>Wn,structure:()=>Ip,walkContext:()=>Pp});var zp=\"Function\",Pp=\"function\",Ip={name:String,children:[[]]};function Wn(e,t){let r=this.tokenStart,n=this.consumeFunctionName(),i=n.toLowerCase(),o;return o=t.hasOwnProperty(i)?t[i].call(this,t):e.call(this,t),this.eof||this.eat(22),{type:\"Function\",loc:this.getLocation(r,this.tokenStart),name:n,children:o}}function Dp(e){this.token(2,e.name+\"(\"),this.children(e),this.token(22,\")\")}var Un={};f(Un,{generate:()=>Rp,name:()=>Np,parse:()=>jn,structure:()=>Op});var Np=\"GeneralEnclosed\",Op={kind:String,function:[String,null],children:[[]]};function jn(e){let t=this.tokenStart,r=null;this.tokenType===2?r=this.consumeFunctionName():this.eat(21);let n=this.parseWithFallback(()=>{let i=this.tokenIndex,o=this.readSequence(this.scope.Value);return this.eof===!1&&this.isBalanceEdge(i)===!1&&this.error(),o},()=>this.createSingleNodeList(this.Raw(null,!1)));return this.eof||this.eat(22),{type:\"GeneralEnclosed\",loc:this.getLocation(t,this.tokenStart),kind:e,function:r,children:n}}function Rp(e){e.function?this.token(2,e.function+\"(\"):this.token(21,\"(\"),this.children(e),this.token(22,\")\")}var Gn={};f(Gn,{generate:()=>_p,name:()=>Mp,parse:()=>Hn,structure:()=>Bp,xxx:()=>Fp});var Fp=\"XXX\",Mp=\"Hash\",Bp={value:String};function Hn(){let e=this.tokenStart;return this.eat(4),{type:\"Hash\",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e+1)}}function _p(e){this.token(4,\"#\"+e.value)}var Kn={};f(Kn,{generate:()=>jp,name:()=>Wp,parse:()=>Yn,structure:()=>qp});var Wp=\"Identifier\",qp={name:String};function Yn(){return{type:\"Identifier\",loc:this.getLocation(this.tokenStart,this.tokenEnd),name:this.consume(1)}}function jp(e){this.token(1,e.name)}var Qn={};f(Qn,{generate:()=>Gp,name:()=>Up,parse:()=>Vn,structure:()=>Hp});var Up=\"IdSelector\",Hp={name:String};function Vn(){let e=this.tokenStart;return this.eat(4),{type:\"IdSelector\",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e+1)}}function Gp(e){this.token(9,\"#\"+e.name)}var $n={};f($n,{generate:()=>Qp,name:()=>Kp,parse:()=>Xn,structure:()=>Vp});var Yp=46,Kp=\"Layer\",Vp={name:String};function Xn(){let e=this.tokenStart,t=this.consume(1);for(;this.isDelim(Yp);)this.eat(9),t+=\".\"+this.consume(1);return{type:\"Layer\",loc:this.getLocation(e,this.tokenStart),name:t}}function Qp(e){this.tokenize(e.name)}var Jn={};f(Jn,{generate:()=>Zp,name:()=>Xp,parse:()=>Zn,structure:()=>$p});var Xp=\"LayerList\",$p={children:[[\"Layer\"]]};function Zn(){let e=this.createList();for(this.skipSC();!this.eof&&(e.push(this.Layer()),this.lookupTypeNonSC(0)===18);)this.skipSC(),this.next(),this.skipSC();return{type:\"LayerList\",loc:this.getLocationFromList(e),children:e}}function Zp(e){this.children(e,()=>this.token(18,\",\"))}var ti={};f(ti,{generate:()=>th,name:()=>Jp,parse:()=>ei,structure:()=>eh});var Jp=\"MediaQuery\",eh={modifier:[String,null],mediaType:[String,null],condition:[\"Condition\",null]};function ei(){let e=this.tokenStart,t=null,r=null,n=null;if(this.skipSC(),this.tokenType===1&&this.lookupTypeNonSC(1)!==21){let i=this.consume(1),o=i.toLowerCase();switch(o===\"not\"||o===\"only\"?(this.skipSC(),t=o,r=this.consume(1)):r=i,this.lookupTypeNonSC(0)){case 1:{this.skipSC(),this.eatIdent(\"and\"),n=this.Condition(\"media\");break}case 23:case 17:case 18:case 0:break;default:this.error(\"Identifier or parenthesis is expected\")}}else switch(this.tokenType){case 1:case 21:case 2:{n=this.Condition(\"media\");break}case 23:case 17:case 0:break;default:this.error(\"Identifier or parenthesis is expected\")}return{type:\"MediaQuery\",loc:this.getLocation(e,this.tokenStart),modifier:t,mediaType:r,condition:n}}function th(e){e.mediaType?(e.modifier&&this.token(1,e.modifier),this.token(1,e.mediaType),e.condition&&(this.token(1,\"and\"),this.node(e.condition))):e.condition&&this.node(e.condition)}var ni={};f(ni,{generate:()=>ih,name:()=>rh,parse:()=>ri,structure:()=>nh});var rh=\"MediaQueryList\",nh={children:[[\"MediaQuery\"]]};function ri(){let e=this.createList();for(this.skipSC();!this.eof&&(e.push(this.MediaQuery()),this.tokenType===18);)this.next();return{type:\"MediaQueryList\",loc:this.getLocationFromList(e),children:e}}function ih(e){this.children(e,()=>this.token(18,\",\"))}var oi={};f(oi,{generate:()=>lh,name:()=>sh,parse:()=>ii,structure:()=>ah});var oh=38,sh=\"NestingSelector\",ah={};function ii(){let e=this.tokenStart;return this.eatDelim(oh),{type:\"NestingSelector\",loc:this.getLocation(e,this.tokenStart)}}function lh(){this.token(9,\"&\")}var ai={};f(ai,{generate:()=>ph,name:()=>ch,parse:()=>si,structure:()=>uh});var ch=\"Nth\",uh={nth:[\"AnPlusB\",\"Identifier\"],selector:[\"SelectorList\",null]};function si(){this.skipSC();let e=this.tokenStart,t=e,r=null,n;return this.lookupValue(0,\"odd\")||this.lookupValue(0,\"even\")?n=this.Identifier():n=this.AnPlusB(),t=this.tokenStart,this.skipSC(),this.lookupValue(0,\"of\")&&(this.next(),r=this.SelectorList(),t=this.tokenStart),{type:\"Nth\",loc:this.getLocation(e,t),nth:n,selector:r}}function ph(e){this.node(e.nth),e.selector!==null&&(this.token(1,\"of\"),this.node(e.selector))}var ci={};f(ci,{generate:()=>dh,name:()=>hh,parse:()=>li,structure:()=>mh});var hh=\"Number\",mh={value:String};function li(){return{type:\"Number\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consume(10)}}function dh(e){this.token(10,e.value)}var pi={};f(pi,{generate:()=>bh,name:()=>fh,parse:()=>ui,structure:()=>gh});var fh=\"Operator\",gh={value:String};function ui(){let e=this.tokenStart;return this.next(),{type:\"Operator\",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e)}}function bh(e){this.tokenize(e.value)}var mi={};f(mi,{generate:()=>kh,name:()=>xh,parse:()=>hi,structure:()=>yh});var xh=\"Parentheses\",yh={children:[[]]};function hi(e,t){let r=this.tokenStart,n=null;return this.eat(21),n=e.call(this,t),this.eof||this.eat(22),{type:\"Parentheses\",loc:this.getLocation(r,this.tokenStart),children:n}}function kh(e){this.token(21,\"(\"),this.children(e),this.token(22,\")\")}var fi={};f(fi,{generate:()=>Sh,name:()=>wh,parse:()=>di,structure:()=>vh});var wh=\"Percentage\",vh={value:String};function di(){return{type:\"Percentage\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consumeNumber(11)}}function Sh(e){this.token(11,e.value+\"%\")}var bi={};f(bi,{generate:()=>Lh,name:()=>Ch,parse:()=>gi,structure:()=>Ah,walkContext:()=>Th});var Ch=\"PseudoClassSelector\",Th=\"function\",Ah={name:String,children:[[\"Raw\"],null]};function gi(){let e=this.tokenStart,t=null,r,n;return this.eat(16),this.tokenType===2?(r=this.consumeFunctionName(),n=r.toLowerCase(),this.lookupNonWSType(0)==22?t=this.createList():hasOwnProperty.call(this.pseudo,n)?(this.skipSC(),t=this.pseudo[n].call(this),this.skipSC()):(t=this.createList(),t.push(this.Raw(null,!1))),this.eat(22)):r=this.consume(1),{type:\"PseudoClassSelector\",loc:this.getLocation(e,this.tokenStart),name:r,children:t}}function Lh(e){this.token(16,\":\"),e.children===null?this.token(1,e.name):(this.token(2,e.name+\"(\"),this.children(e),this.token(22,\")\"))}var yi={};f(yi,{generate:()=>Ih,name:()=>Eh,parse:()=>xi,structure:()=>Ph,walkContext:()=>zh});var Eh=\"PseudoElementSelector\",zh=\"function\",Ph={name:String,children:[[\"Raw\"],null]};function xi(){let e=this.tokenStart,t=null,r,n;return this.eat(16),this.eat(16),this.tokenType===2?(r=this.consumeFunctionName(),n=r.toLowerCase(),this.lookupNonWSType(0)==22?t=this.createList():hasOwnProperty.call(this.pseudo,n)?(this.skipSC(),t=this.pseudo[n].call(this),this.skipSC()):(t=this.createList(),t.push(this.Raw(null,!1))),this.eat(22)):r=this.consume(1),{type:\"PseudoElementSelector\",loc:this.getLocation(e,this.tokenStart),name:r,children:t}}function Ih(e){this.token(16,\":\"),this.token(16,\":\"),e.children===null?this.token(1,e.name):(this.token(2,e.name+\"(\"),this.children(e),this.token(22,\")\"))}var wi={};f(wi,{generate:()=>Oh,name:()=>Dh,parse:()=>ki,structure:()=>Nh});var $s=47;function Zs(){switch(this.skipSC(),this.tokenType){case 10:return this.Number();case 2:return this.Function(this.readSequence,this.scope.Value);default:this.error(\"Number of function is expected\")}}var Dh=\"Ratio\",Nh={left:[\"Number\",\"Function\"],right:[\"Number\",\"Function\",null]};function ki(){let e=this.tokenStart,t=Zs.call(this),r=null;return this.skipSC(),this.isDelim($s)&&(this.eatDelim($s),r=Zs.call(this)),{type:\"Ratio\",loc:this.getLocation(e,this.tokenStart),left:t,right:r}}function Oh(e){this.node(e.left),this.token(9,\"/\"),e.right?this.node(e.right):this.node(10,1)}var Si={};f(Si,{generate:()=>Bh,name:()=>Fh,parse:()=>vi,structure:()=>Mh});function Rh(){return this.tokenIndex>0&&this.lookupType(-1)===13?this.tokenIndex>1?this.getTokenStart(this.tokenIndex-1):this.firstCharOffset:this.tokenStart}var Fh=\"Raw\",Mh={value:String};function vi(e,t){let r=this.getTokenStart(this.tokenIndex),n;return this.skipUntilBalanced(this.tokenIndex,e||this.consumeUntilBalanceEnd),t&&this.tokenStart>r?n=Rh.call(this):n=this.tokenStart,{type:\"Raw\",loc:this.getLocation(r,n),value:this.substring(r,n)}}function Bh(e){this.tokenize(e.value)}var Ti={};f(Ti,{generate:()=>Uh,name:()=>Wh,parse:()=>Ci,structure:()=>jh,walkContext:()=>qh});function Js(){return this.Raw(this.consumeUntilLeftCurlyBracket,!0)}function _h(){let e=this.SelectorList();return e.type!==\"Raw\"&&this.eof===!1&&this.tokenType!==23&&this.error(),e}var Wh=\"Rule\",qh=\"rule\",jh={prelude:[\"SelectorList\",\"Raw\"],block:[\"Block\"]};function Ci(){let e=this.tokenIndex,t=this.tokenStart,r,n;return this.parseRulePrelude?r=this.parseWithFallback(_h,Js):r=Js.call(this,e),n=this.Block(!0),{type:\"Rule\",loc:this.getLocation(t,this.tokenStart),prelude:r,block:n}}function Uh(e){this.node(e.prelude),this.node(e.block)}var Li={};f(Li,{generate:()=>Yh,name:()=>Hh,parse:()=>Ai,structure:()=>Gh});var Hh=\"Scope\",Gh={root:[\"SelectorList\",\"Raw\",null],limit:[\"SelectorList\",\"Raw\",null]};function Ai(){let e=null,t=null;this.skipSC();let r=this.tokenStart;return this.tokenType===21&&(this.next(),this.skipSC(),e=this.parseWithFallback(this.SelectorList,()=>this.Raw(!1,!0)),this.skipSC(),this.eat(22)),this.lookupNonWSType(0)===1&&(this.skipSC(),this.eatIdent(\"to\"),this.skipSC(),this.eat(21),this.skipSC(),t=this.parseWithFallback(this.SelectorList,()=>this.Raw(!1,!0)),this.skipSC(),this.eat(22)),{type:\"Scope\",loc:this.getLocation(r,this.tokenStart),root:e,limit:t}}function Yh(e){e.root&&(this.token(21,\"(\"),this.node(e.root),this.token(22,\")\")),e.limit&&(this.token(1,\"to\"),this.token(21,\"(\"),this.node(e.limit),this.token(22,\")\"))}var zi={};f(zi,{generate:()=>Qh,name:()=>Kh,parse:()=>Ei,structure:()=>Vh});var Kh=\"Selector\",Vh={children:[[\"TypeSelector\",\"IdSelector\",\"ClassSelector\",\"AttributeSelector\",\"PseudoClassSelector\",\"PseudoElementSelector\",\"Combinator\"]]};function Ei(){let e=this.readSequence(this.scope.Selector);return this.getFirstListNode(e)===null&&this.error(\"Selector is expected\"),{type:\"Selector\",loc:this.getLocationFromList(e),children:e}}function Qh(e){this.children(e)}var Ii={};f(Ii,{generate:()=>Jh,name:()=>Xh,parse:()=>Pi,structure:()=>Zh,walkContext:()=>$h});var Xh=\"SelectorList\",$h=\"selector\",Zh={children:[[\"Selector\",\"Raw\"]]};function Pi(){let e=this.createList();for(;!this.eof;){if(e.push(this.Selector()),this.tokenType===18){this.next();continue}break}return{type:\"SelectorList\",loc:this.getLocationFromList(e),children:e}}function Jh(e){this.children(e,()=>this.token(18,\",\"))}var Fi={};f(Fi,{generate:()=>rm,name:()=>em,parse:()=>Ri,structure:()=>tm});var Oi={};f(Oi,{decode:()=>vt,encode:()=>Ni});var Di=92,ea=34,ta=39;function vt(e){let t=e.length,r=e.charCodeAt(0),n=r===ea||r===ta?1:0,i=n===1&&t>1&&e.charCodeAt(t-1)===r?t-2:t-1,o=\"\";for(let s=n;s<=i;s++){let u=e.charCodeAt(s);if(u===Di){if(s===i){s!==t-1&&(o=e.substr(s+1));break}if(u=e.charCodeAt(++s),K(Di,u)){let c=s-1,a=se(e,c);s=a-1,o+=je(e.substring(c+1,a))}else u===13&&e.charCodeAt(s+1)===10&&s++}else o+=e[s]}return o}function Ni(e,t){let r=t?\"'\":'\"',n=t?ta:ea,i=\"\",o=!1;for(let s=0;s<e.length;s++){let u=e.charCodeAt(s);if(u===0){i+=\"\\uFFFD\";continue}if(u<=31||u===127){i+=\"\\\\\"+u.toString(16),o=!0;continue}u===n||u===Di?(i+=\"\\\\\"+e.charAt(s),o=!1):(o&&(J(u)||me(u))&&(i+=\" \"),i+=e.charAt(s),o=!1)}return r+i+r}var em=\"String\",tm={value:String};function Ri(){return{type:\"String\",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:vt(this.consume(5))}}function rm(e){this.token(5,Ni(e.value))}var Bi={};f(Bi,{generate:()=>am,name:()=>im,parse:()=>Mi,structure:()=>sm,walkContext:()=>om});var nm=33;function ra(){return this.Raw(null,!1)}var im=\"StyleSheet\",om=\"stylesheet\",sm={children:[[\"Comment\",\"CDO\",\"CDC\",\"Atrule\",\"Rule\",\"Raw\"]]};function Mi(){let e=this.tokenStart,t=this.createList(),r;for(;!this.eof;){switch(this.tokenType){case 13:this.next();continue;case 25:if(this.charCodeAt(this.tokenStart+2)!==nm){this.next();continue}r=this.Comment();break;case 14:r=this.CDO();break;case 15:r=this.CDC();break;case 3:r=this.parseWithFallback(this.Atrule,ra);break;default:r=this.parseWithFallback(this.Rule,ra)}t.push(r)}return{type:\"StyleSheet\",loc:this.getLocation(e,this.tokenStart),children:t}}function am(e){this.children(e)}var Wi={};f(Wi,{generate:()=>um,name:()=>lm,parse:()=>_i,structure:()=>cm});var lm=\"SupportsDeclaration\",cm={declaration:\"Declaration\"};function _i(){let e=this.tokenStart;this.eat(21),this.skipSC();let t=this.Declaration();return this.eof||this.eat(22),{type:\"SupportsDeclaration\",loc:this.getLocation(e,this.tokenStart),declaration:t}}function um(e){this.token(21,\"(\"),this.node(e.declaration),this.token(22,\")\")}var Ui={};f(Ui,{generate:()=>dm,name:()=>hm,parse:()=>ji,structure:()=>mm});var pm=42,na=124;function qi(){this.tokenType!==1&&this.isDelim(pm)===!1&&this.error(\"Identifier or asterisk is expected\"),this.next()}var hm=\"TypeSelector\",mm={name:String};function ji(){let e=this.tokenStart;return this.isDelim(na)?(this.next(),qi.call(this)):(qi.call(this),this.isDelim(na)&&(this.next(),qi.call(this))),{type:\"TypeSelector\",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e)}}function dm(e){this.tokenize(e.name)}var Yi={};f(Yi,{generate:()=>ym,name:()=>bm,parse:()=>Gi,structure:()=>xm});var ia=43,oa=45,Hi=63;function St(e,t){let r=0;for(let n=this.tokenStart+e;n<this.tokenEnd;n++){let i=this.charCodeAt(n);if(i===oa&&t&&r!==0)return St.call(this,e+r+1,!1),-1;J(i)||this.error(t&&r!==0?\"Hyphen minus\"+(r<6?\" or hex digit\":\"\")+\" is expected\":r<6?\"Hex digit is expected\":\"Unexpected input\",n),++r>6&&this.error(\"Too many hex digits\",n)}return this.next(),r}function nr(e){let t=0;for(;this.isDelim(Hi);)++t>e&&this.error(\"Too many question marks\"),this.next()}function fm(e){this.charCodeAt(this.tokenStart)!==e&&this.error((e===ia?\"Plus sign\":\"Hyphen minus\")+\" is expected\")}function gm(){let e=0;switch(this.tokenType){case 10:if(e=St.call(this,1,!0),this.isDelim(Hi)){nr.call(this,6-e);break}if(this.tokenType===12||this.tokenType===10){fm.call(this,oa),St.call(this,1,!1);break}break;case 12:e=St.call(this,1,!0),e>0&&nr.call(this,6-e);break;default:if(this.eatDelim(ia),this.tokenType===1){e=St.call(this,0,!0),e>0&&nr.call(this,6-e);break}if(this.isDelim(Hi)){this.next(),nr.call(this,5);break}this.error(\"Hex digit or question mark is expected\")}}var bm=\"UnicodeRange\",xm={value:String};function Gi(){let e=this.tokenStart;return this.eatIdent(\"u\"),gm.call(this),{type:\"UnicodeRange\",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e)}}function ym(e){this.tokenize(e.value)}var Zi={};f(Zi,{generate:()=>Am,name:()=>Cm,parse:()=>$i,structure:()=>Tm});var Xi={};f(Xi,{decode:()=>Vi,encode:()=>Qi});var km=32,Ki=92,wm=34,vm=39,Sm=40,sa=41;function Vi(e){let t=e.length,r=4,n=e.charCodeAt(t-1)===sa?t-2:t-1,i=\"\";for(;r<n&&me(e.charCodeAt(r));)r++;for(;r<n&&me(e.charCodeAt(n));)n--;for(let o=r;o<=n;o++){let s=e.charCodeAt(o);if(s===Ki){if(o===n){o!==t-1&&(i=e.substr(o+1));break}if(s=e.charCodeAt(++o),K(Ki,s)){let u=o-1,c=se(e,u);o=c-1,i+=je(e.substring(u+1,c))}else s===13&&e.charCodeAt(o+1)===10&&o++}else i+=e[o]}return i}function Qi(e){let t=\"\",r=!1;for(let n=0;n<e.length;n++){let i=e.charCodeAt(n);if(i===0){t+=\"\\uFFFD\";continue}if(i<=31||i===127){t+=\"\\\\\"+i.toString(16),r=!0;continue}i===km||i===Ki||i===wm||i===vm||i===Sm||i===sa?(t+=\"\\\\\"+e.charAt(n),r=!1):(r&&J(i)&&(t+=\" \"),t+=e.charAt(n),r=!1)}return\"url(\"+t+\")\"}var Cm=\"Url\",Tm={value:String};function $i(){let e=this.tokenStart,t;switch(this.tokenType){case 7:t=Vi(this.consume(7));break;case 2:this.cmpStr(this.tokenStart,this.tokenEnd,\"url(\")||this.error(\"Function name must be `url`\"),this.eat(2),this.skipSC(),t=vt(this.consume(5)),this.skipSC(),this.eof||this.eat(22);break;default:this.error(\"Url or Function is expected\")}return{type:\"Url\",loc:this.getLocation(e,this.tokenStart),value:t}}function Am(e){this.token(7,Qi(e.value))}var eo={};f(eo,{generate:()=>zm,name:()=>Lm,parse:()=>Ji,structure:()=>Em});var Lm=\"Value\",Em={children:[[]]};function Ji(){let e=this.tokenStart,t=this.readSequence(this.scope.Value);return{type:\"Value\",loc:this.getLocation(e,this.tokenStart),children:t}}function zm(e){this.children(e)}var ro={};f(ro,{generate:()=>Nm,name:()=>Im,parse:()=>to,structure:()=>Dm});var Pm=Object.freeze({type:\"WhiteSpace\",loc:null,value:\" \"}),Im=\"WhiteSpace\",Dm={value:String};function to(){return this.eat(13),Pm}function Nm(e){this.token(13,e.value)}var aa={generic:!0,cssWideKeywords:Ve,...Bs,node:Ct};var no={};f(no,{AtrulePrelude:()=>ca,Selector:()=>pa,Value:()=>fa});var Om=35,Rm=42,la=43,Fm=45,Mm=47,Bm=117;function Tt(e){switch(this.tokenType){case 4:return this.Hash();case 18:return this.Operator();case 21:return this.Parentheses(this.readSequence,e.recognizer);case 19:return this.Brackets(this.readSequence,e.recognizer);case 5:return this.String();case 12:return this.Dimension();case 11:return this.Percentage();case 10:return this.Number();case 2:return this.cmpStr(this.tokenStart,this.tokenEnd,\"url(\")?this.Url():this.Function(this.readSequence,e.recognizer);case 7:return this.Url();case 1:return this.cmpChar(this.tokenStart,Bm)&&this.cmpChar(this.tokenStart+1,la)?this.UnicodeRange():this.Identifier();case 9:{let t=this.charCodeAt(this.tokenStart);if(t===Mm||t===Rm||t===la||t===Fm)return this.Operator();t===Om&&this.error(\"Hex or identifier is expected\",this.tokenStart+1);break}}}var ca={getNode:Tt};var _m=35,Wm=38,qm=42,jm=43,Um=47,ua=46,Hm=62,Gm=124,Ym=126;function Km(e,t){t.last!==null&&t.last.type!==\"Combinator\"&&e!==null&&e.type!==\"Combinator\"&&t.push({type:\"Combinator\",loc:null,name:\" \"})}function Vm(){switch(this.tokenType){case 19:return this.AttributeSelector();case 4:return this.IdSelector();case 16:return this.lookupType(1)===16?this.PseudoElementSelector():this.PseudoClassSelector();case 1:return this.TypeSelector();case 10:case 11:return this.Percentage();case 12:this.charCodeAt(this.tokenStart)===ua&&this.error(\"Identifier is expected\",this.tokenStart+1);break;case 9:{switch(this.charCodeAt(this.tokenStart)){case jm:case Hm:case Ym:case Um:return this.Combinator();case ua:return this.ClassSelector();case qm:case Gm:return this.TypeSelector();case _m:return this.IdSelector();case Wm:return this.NestingSelector()}break}}}var pa={onWhiteSpace:Km,getNode:Vm};function ha(){return this.createSingleNodeList(this.Raw(null,!1))}function ma(){let e=this.createList();if(this.skipSC(),e.push(this.Identifier()),this.skipSC(),this.tokenType===18){e.push(this.Operator());let t=this.tokenIndex,r=this.parseCustomProperty?this.Value(null):this.Raw(this.consumeUntilExclamationMarkOrSemicolon,!1);if(r.type===\"Value\"&&r.children.isEmpty){for(let n=t-this.tokenIndex;n<=0;n++)if(this.lookupType(n)===13){r.children.appendData({type:\"WhiteSpace\",loc:null,value:\" \"});break}}e.push(r)}return e}function da(e){return e!==null&&e.type===\"Operator\"&&(e.value[e.value.length-1]===\"-\"||e.value[e.value.length-1]===\"+\")}var fa={getNode:Tt,onWhiteSpace(e,t){da(e)&&(e.value=\" \"+e.value),da(t.last)&&(t.last.value+=\" \")},expression:ha,var:ma};var Qm=new Set([\"none\",\"and\",\"not\",\"or\"]),ga={parse:{prelude(){let e=this.createList();if(this.tokenType===1){let t=this.substring(this.tokenStart,this.tokenEnd);Qm.has(t.toLowerCase())||e.push(this.Identifier())}return e.push(this.Condition(\"container\")),e},block(e=!1){return this.Block(e)}}};var ba={parse:{prelude:null,block(){return this.Block(!0)}}};function io(e,t){return this.parseWithFallback(()=>{try{return e.call(this)}finally{this.skipSC(),this.lookupNonWSType(0)!==22&&this.error()}},t||(()=>this.Raw(null,!0)))}var xa={layer(){this.skipSC();let e=this.createList(),t=io.call(this,this.Layer);return(t.type!==\"Raw\"||t.value!==\"\")&&e.push(t),e},supports(){this.skipSC();let e=this.createList(),t=io.call(this,this.Declaration,()=>io.call(this,()=>this.Condition(\"supports\")));return(t.type!==\"Raw\"||t.value!==\"\")&&e.push(t),e}},ya={parse:{prelude(){let e=this.createList();switch(this.tokenType){case 5:e.push(this.String());break;case 7:case 2:e.push(this.Url());break;default:this.error(\"String or url() is expected\")}return this.skipSC(),this.tokenType===1&&this.cmpStr(this.tokenStart,this.tokenEnd,\"layer\")?e.push(this.Identifier()):this.tokenType===2&&this.cmpStr(this.tokenStart,this.tokenEnd,\"layer(\")&&e.push(this.Function(null,xa)),this.skipSC(),this.tokenType===2&&this.cmpStr(this.tokenStart,this.tokenEnd,\"supports(\")&&e.push(this.Function(null,xa)),(this.lookupNonWSType(0)===1||this.lookupNonWSType(0)===21)&&e.push(this.MediaQueryList()),e},block:null}};var ka={parse:{prelude(){return this.createSingleNodeList(this.LayerList())},block(){return this.Block(!1)}}};var wa={parse:{prelude(){return this.createSingleNodeList(this.MediaQueryList())},block(e=!1){return this.Block(e)}}};var va={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(!0)}}};var Sa={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(!0)}}};var Ca={parse:{prelude(){return this.createSingleNodeList(this.Scope())},block(e=!1){return this.Block(e)}}};var Ta={parse:{prelude:null,block(e=!1){return this.Block(e)}}};var Aa={parse:{prelude(){return this.createSingleNodeList(this.Condition(\"supports\"))},block(e=!1){return this.Block(e)}}};var La={container:ga,\"font-face\":ba,import:ya,layer:ka,media:wa,nest:va,page:Sa,scope:Ca,\"starting-style\":Ta,supports:Aa};function Ea(){let e=this.createList();this.skipSC();e:for(;!this.eof;){switch(this.tokenType){case 1:e.push(this.Identifier());break;case 5:e.push(this.String());break;case 18:e.push(this.Operator());break;case 22:break e;default:this.error(\"Identifier, string or comma is expected\")}this.skipSC()}return e}var Fe={parse(){return this.createSingleNodeList(this.SelectorList())}},oo={parse(){return this.createSingleNodeList(this.Selector())}},Xm={parse(){return this.createSingleNodeList(this.Identifier())}},$m={parse:Ea},ir={parse(){return this.createSingleNodeList(this.Nth())}},za={dir:Xm,has:Fe,lang:$m,matches:Fe,is:Fe,\"-moz-any\":Fe,\"-webkit-any\":Fe,where:Fe,not:Fe,\"nth-child\":ir,\"nth-last-child\":ir,\"nth-last-of-type\":ir,\"nth-of-type\":ir,slotted:oo,host:oo,\"host-context\":oo};var so={};f(so,{AnPlusB:()=>en,Atrule:()=>rn,AtrulePrelude:()=>on,AttributeSelector:()=>ln,Block:()=>un,Brackets:()=>hn,CDC:()=>dn,CDO:()=>gn,ClassSelector:()=>xn,Combinator:()=>kn,Comment:()=>vn,Condition:()=>Cn,Declaration:()=>An,DeclarationList:()=>zn,Dimension:()=>In,Feature:()=>Nn,FeatureFunction:()=>Rn,FeatureRange:()=>Bn,Function:()=>Wn,GeneralEnclosed:()=>jn,Hash:()=>Hn,IdSelector:()=>Vn,Identifier:()=>Yn,Layer:()=>Xn,LayerList:()=>Zn,MediaQuery:()=>ei,MediaQueryList:()=>ri,NestingSelector:()=>ii,Nth:()=>si,Number:()=>li,Operator:()=>ui,Parentheses:()=>hi,Percentage:()=>di,PseudoClassSelector:()=>gi,PseudoElementSelector:()=>xi,Ratio:()=>ki,Raw:()=>vi,Rule:()=>Ci,Scope:()=>Ai,Selector:()=>Ei,SelectorList:()=>Pi,String:()=>Ri,StyleSheet:()=>Mi,SupportsDeclaration:()=>_i,TypeSelector:()=>ji,UnicodeRange:()=>Gi,Url:()=>$i,Value:()=>Ji,WhiteSpace:()=>to});var Pa={parseContext:{default:\"StyleSheet\",stylesheet:\"StyleSheet\",atrule:\"Atrule\",atrulePrelude(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:\"MediaQueryList\",mediaQuery:\"MediaQuery\",condition(e){return this.Condition(e.kind)},rule:\"Rule\",selectorList:\"SelectorList\",selector:\"Selector\",block(){return this.Block(!0)},declarationList:\"DeclarationList\",declaration:\"Declaration\",value:\"Value\"},features:{supports:{selector(){return this.Selector()}},container:{style(){return this.Declaration()}}},scope:no,atrule:La,pseudo:za,node:so};var Ia={node:Ct};var Da=Zr({...aa,...Pa,...Ia});var Gb=\"3.1.0\";function ao(e){let t={};for(let r of Object.keys(e)){let n=e[r];n&&(Array.isArray(n)||n instanceof V?n=n.map(ao):n.constructor===Object&&(n=ao(n))),t[r]=n}return t}var Oa={};f(Oa,{decode:()=>Zm,encode:()=>Jm});var Na=92;function Zm(e){let t=e.length-1,r=\"\";for(let n=0;n<e.length;n++){let i=e.charCodeAt(n);if(i===Na){if(n===t)break;if(i=e.charCodeAt(++n),K(Na,i)){let o=n-1,s=se(e,o);n=s-1,r+=je(e.substring(o+1,s))}else i===13&&e.charCodeAt(n+1)===10&&n++}else r+=e[n]}return r}function Jm(e){let t=\"\";if(e.length===1&&e.charCodeAt(0)===45)return\"\\\\-\";for(let r=0;r<e.length;r++){let n=e.charCodeAt(r);if(n===0){t+=\"\\uFFFD\";continue}if(n<=31||n===127||n>=48&&n<=57&&(r===0||r===1&&e.charCodeAt(0)===45)){t+=\"\\\\\"+n.toString(16)+\" \";continue}_e(n)?t+=e.charAt(r):t+=\"\\\\\"+e.charAt(r)}return t}var{tokenize:$b,parse:Zb,generate:Jb,lexer:ex,createLexer:tx,walk:rx,find:nx,findLast:ix,findAll:ox,toPlainObject:sx,fromPlainObject:ax,fork:lx}=Da;export{Je as Lexer,V as List,ot as OffsetToLocation,st as TokenStream,ao as clone,tx as createLexer,Zr as createSyntax,ws as definitionSyntax,nx as find,ox as findAll,ix as findLast,lx as fork,ax as fromPlainObject,Jb as generate,Oa as ident,Ht as isCustomProperty,Ut as keyword,ex as lexer,Zb as parse,Cr as property,Oi as string,sx as toPlainObject,Ie as tokenNames,sr as tokenTypes,$b as tokenize,Xi as url,Xd as vendorPrefix,Gb as version,rx as walk};\n"
  },
  {
    "path": "src/lib/readability/Readability-readerable.js",
    "content": "/*\r\n * Copyright (c) 2010 Arc90 Inc\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n *     http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * This code is heavily based on Arc90's readability.js (1.7.1) script\r\n * available at: http://code.google.com/p/arc90labs-readability\r\n */\r\n\r\nvar REGEXPS = {\r\n  // NOTE: These two regular expressions are duplicated in\r\n  // Readability.js. Please keep both copies in sync.\r\n  unlikelyCandidates:\r\n    /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i,\r\n  okMaybeItsACandidate: /and|article|body|column|content|main|mathjax|shadow/i,\r\n};\r\n\r\nfunction isNodeVisible(node) {\r\n  // Have to null-check node.style and node.className.includes to deal with SVG and MathML nodes.\r\n  return (\r\n    (!node.style || node.style.display != \"none\") &&\r\n    !node.hasAttribute(\"hidden\") &&\r\n    //check for \"fallback-image\" so that wikimedia math images are displayed\r\n    (!node.hasAttribute(\"aria-hidden\") ||\r\n      node.getAttribute(\"aria-hidden\") != \"true\" ||\r\n      (node.className &&\r\n        node.className.includes &&\r\n        node.className.includes(\"fallback-image\")))\r\n  );\r\n}\r\n\r\n/**\r\n * Decides whether or not the document is reader-able without parsing the whole thing.\r\n * @param {Object} options Configuration object.\r\n * @param {number} [options.minContentLength=140] The minimum node content length used to decide if the document is readerable.\r\n * @param {number} [options.minScore=20] The minumum cumulated 'score' used to determine if the document is readerable.\r\n * @param {Function} [options.visibilityChecker=isNodeVisible] The function used to determine if a node is visible.\r\n * @return {boolean} Whether or not we suspect Readability.parse() will suceeed at returning an article object.\r\n */\r\nfunction isProbablyReaderable(doc, options = {}) {\r\n  // For backward compatibility reasons 'options' can either be a configuration object or the function used\r\n  // to determine if a node is visible.\r\n  if (typeof options == \"function\") {\r\n    options = { visibilityChecker: options };\r\n  }\r\n\r\n  var defaultOptions = {\r\n    minScore: 20,\r\n    minContentLength: 140,\r\n    visibilityChecker: isNodeVisible,\r\n  };\r\n  options = Object.assign(defaultOptions, options);\r\n\r\n  var nodes = doc.querySelectorAll(\"p, pre, article\");\r\n\r\n  // Get <div> nodes which have <br> node(s) and append them into the `nodes` variable.\r\n  // Some articles' DOM structures might look like\r\n  // <div>\r\n  //   Sentences<br>\r\n  //   <br>\r\n  //   Sentences<br>\r\n  // </div>\r\n  var brNodes = doc.querySelectorAll(\"div > br\");\r\n  if (brNodes.length) {\r\n    var set = new Set(nodes);\r\n    [].forEach.call(brNodes, function (node) {\r\n      set.add(node.parentNode);\r\n    });\r\n    nodes = Array.from(set);\r\n  }\r\n\r\n  var score = 0;\r\n  // This is a little cheeky, we use the accumulator 'score' to decide what to return from\r\n  // this callback:\r\n  return [].some.call(nodes, function (node) {\r\n    if (!options.visibilityChecker(node)) {\r\n      return false;\r\n    }\r\n\r\n    var matchString = node.className + \" \" + node.id;\r\n    if (\r\n      REGEXPS.unlikelyCandidates.test(matchString) &&\r\n      !REGEXPS.okMaybeItsACandidate.test(matchString)\r\n    ) {\r\n      return false;\r\n    }\r\n\r\n    if (node.matches(\"li p\")) {\r\n      return false;\r\n    }\r\n\r\n    var textContentLength = node.textContent.trim().length;\r\n    if (textContentLength < options.minContentLength) {\r\n      return false;\r\n    }\r\n\r\n    score += Math.sqrt(textContentLength - options.minContentLength);\r\n\r\n    if (score > options.minScore) {\r\n      return true;\r\n    }\r\n    return false;\r\n  });\r\n}\r\n\r\nif (typeof module === \"object\") {\r\n  /* eslint-disable-next-line no-redeclare */\r\n  /* global module */\r\n  module.exports = isProbablyReaderable;\r\n}\r\n"
  },
  {
    "path": "src/lib/readability/Readability.js",
    "content": "/*\r\n * Copyright (c) 2010 Arc90 Inc\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n *     http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/*\r\n * This code is heavily based on Arc90's readability.js (1.7.1) script\r\n * available at: http://code.google.com/p/arc90labs-readability\r\n */\r\n\r\n/**\r\n * Public constructor.\r\n * @param {HTMLDocument} doc     The document to parse.\r\n * @param {Object}       options The options object.\r\n */\r\nfunction Readability(doc, options) {\r\n  // In some older versions, people passed a URI as the first argument. Cope:\r\n  if (options && options.documentElement) {\r\n    doc = options;\r\n    options = arguments[2];\r\n  } else if (!doc || !doc.documentElement) {\r\n    throw new Error(\r\n      \"First argument to Readability constructor should be a document object.\"\r\n    );\r\n  }\r\n  options = options || {};\r\n\r\n  this._doc = doc;\r\n  this._docJSDOMParser = this._doc.firstChild.__JSDOMParser__;\r\n  this._articleTitle = null;\r\n  this._articleByline = null;\r\n  this._articleDir = null;\r\n  this._articleSiteName = null;\r\n  this._attempts = [];\r\n  this._metadata = {};\r\n\r\n  // Configurable options\r\n  this._debug = !!options.debug;\r\n  this._maxElemsToParse =\r\n    options.maxElemsToParse || this.DEFAULT_MAX_ELEMS_TO_PARSE;\r\n  this._nbTopCandidates =\r\n    options.nbTopCandidates || this.DEFAULT_N_TOP_CANDIDATES;\r\n  this._charThreshold = options.charThreshold || this.DEFAULT_CHAR_THRESHOLD;\r\n  this._classesToPreserve = this.CLASSES_TO_PRESERVE.concat(\r\n    options.classesToPreserve || []\r\n  );\r\n  this._keepClasses = !!options.keepClasses;\r\n  this._serializer =\r\n    options.serializer ||\r\n    function (el) {\r\n      return el.innerHTML;\r\n    };\r\n  this._disableJSONLD = !!options.disableJSONLD;\r\n  this._allowedVideoRegex = options.allowedVideoRegex || this.REGEXPS.videos;\r\n  this._linkDensityModifier = options.linkDensityModifier || 0;\r\n\r\n  // Start with all flags set\r\n  this._flags =\r\n    this.FLAG_STRIP_UNLIKELYS |\r\n    this.FLAG_WEIGHT_CLASSES |\r\n    this.FLAG_CLEAN_CONDITIONALLY;\r\n\r\n  // Control whether log messages are sent to the console\r\n  if (this._debug) {\r\n    let logNode = function (node) {\r\n      if (node.nodeType == node.TEXT_NODE) {\r\n        return `${node.nodeName} (\"${node.textContent}\")`;\r\n      }\r\n      let attrPairs = Array.from(node.attributes || [], function (attr) {\r\n        return `${attr.name}=\"${attr.value}\"`;\r\n      }).join(\" \");\r\n      return `<${node.localName} ${attrPairs}>`;\r\n    };\r\n    this.log = function () {\r\n      if (typeof console !== \"undefined\") {\r\n        let args = Array.from(arguments, arg => {\r\n          if (arg && arg.nodeType == this.ELEMENT_NODE) {\r\n            return logNode(arg);\r\n          }\r\n          return arg;\r\n        });\r\n        args.unshift(\"Reader: (Readability)\");\r\n        // eslint-disable-next-line no-console\r\n        console.log(...args);\r\n      } else if (typeof dump !== \"undefined\") {\r\n        /* global dump */\r\n        var msg = Array.prototype.map\r\n          .call(arguments, function (x) {\r\n            return x && x.nodeName ? logNode(x) : x;\r\n          })\r\n          .join(\" \");\r\n        dump(\"Reader: (Readability) \" + msg + \"\\n\");\r\n      }\r\n    };\r\n  } else {\r\n    this.log = function () {};\r\n  }\r\n}\r\n\r\nReadability.prototype = {\r\n  FLAG_STRIP_UNLIKELYS: 0x1,\r\n  FLAG_WEIGHT_CLASSES: 0x2,\r\n  FLAG_CLEAN_CONDITIONALLY: 0x4,\r\n\r\n  // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\r\n  ELEMENT_NODE: 1,\r\n  TEXT_NODE: 3,\r\n\r\n  // Max number of nodes supported by this parser. Default: 0 (no limit)\r\n  DEFAULT_MAX_ELEMS_TO_PARSE: 0,\r\n\r\n  // The number of top candidates to consider when analysing how\r\n  // tight the competition is among candidates.\r\n  DEFAULT_N_TOP_CANDIDATES: 5,\r\n\r\n  // Element tags to score by default.\r\n  DEFAULT_TAGS_TO_SCORE: \"section,h2,h3,h4,h5,h6,p,td,pre\"\r\n    .toUpperCase()\r\n    .split(\",\"),\r\n\r\n  // The default number of chars an article must have in order to return a result\r\n  DEFAULT_CHAR_THRESHOLD: 500,\r\n\r\n  // All of the regular expressions in use within readability.\r\n  // Defined up here so we don't instantiate them repeatedly in loops.\r\n  REGEXPS: {\r\n    // NOTE: These two regular expressions are duplicated in\r\n    // Readability-readerable.js. Please keep both copies in sync.\r\n    unlikelyCandidates:\r\n      /-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i,\r\n    okMaybeItsACandidate:\r\n      /and|article|body|column|content|main|mathjax|shadow/i,\r\n\r\n    positive:\r\n      /article|body|content|entry|hentry|h-entry|main|page|pagination|post|text|blog|story/i,\r\n    negative:\r\n      /-ad-|hidden|^hid$| hid$| hid |^hid |banner|combx|comment|com-|contact|footer|gdpr|masthead|media|meta|outbrain|promo|related|scroll|share|shoutbox|sidebar|skyscraper|sponsor|shopping|tags|widget/i,\r\n    extraneous:\r\n      /print|archive|comment|discuss|e[\\-]?mail|share|reply|all|login|sign|single|utility/i,\r\n    byline: /byline|author|dateline|writtenby|p-author/i,\r\n    replaceFonts: /<(\\/?)font[^>]*>/gi,\r\n    normalize: /\\s{2,}/g,\r\n    videos:\r\n      /\\/\\/(www\\.)?((dailymotion|youtube|youtube-nocookie|player\\.vimeo|v\\.qq|bilibili|live.bilibili)\\.com|(archive|upload\\.wikimedia)\\.org|player\\.twitch\\.tv)/i,\r\n    shareElements: /(\\b|_)(share|sharedaddy)(\\b|_)/i,\r\n    nextLink: /(next|weiter|continue|>([^\\|]|$)|»([^\\|]|$))/i,\r\n    prevLink: /(prev|earl|old|new|<|«)/i,\r\n    tokenize: /\\W+/g,\r\n    whitespace: /^\\s*$/,\r\n    hasContent: /\\S$/,\r\n    hashUrl: /^#.+/,\r\n    srcsetUrl: /(\\S+)(\\s+[\\d.]+[xw])?(\\s*(?:,|$))/g,\r\n    b64DataUrl: /^data:\\s*([^\\s;,]+)\\s*;\\s*base64\\s*,/i,\r\n    // Commas as used in Latin, Sindhi, Chinese and various other scripts.\r\n    // see: https://en.wikipedia.org/wiki/Comma#Comma_variants\r\n    commas: /\\u002C|\\u060C|\\uFE50|\\uFE10|\\uFE11|\\u2E41|\\u2E34|\\u2E32|\\uFF0C/g,\r\n    // See: https://schema.org/Article\r\n    jsonLdArticleTypes:\r\n      /^Article|AdvertiserContentArticle|NewsArticle|AnalysisNewsArticle|AskPublicNewsArticle|BackgroundNewsArticle|OpinionNewsArticle|ReportageNewsArticle|ReviewNewsArticle|Report|SatiricalArticle|ScholarlyArticle|MedicalScholarlyArticle|SocialMediaPosting|BlogPosting|LiveBlogPosting|DiscussionForumPosting|TechArticle|APIReference$/,\r\n    // used to see if a node's content matches words commonly used for ad blocks or loading indicators\r\n    adWords:\r\n      /^(ad(vertising|vertisement)?|pub(licité)?|werb(ung)?|广告|Реклама|Anuncio)$/iu,\r\n    loadingWords:\r\n      /^((loading|正在加载|Загрузка|chargement|cargando)(…|\\.\\.\\.)?)$/iu,\r\n  },\r\n\r\n  UNLIKELY_ROLES: [\r\n    \"menu\",\r\n    \"menubar\",\r\n    \"complementary\",\r\n    \"navigation\",\r\n    \"alert\",\r\n    \"alertdialog\",\r\n    \"dialog\",\r\n  ],\r\n\r\n  DIV_TO_P_ELEMS: new Set([\r\n    \"BLOCKQUOTE\",\r\n    \"DL\",\r\n    \"DIV\",\r\n    \"IMG\",\r\n    \"OL\",\r\n    \"P\",\r\n    \"PRE\",\r\n    \"TABLE\",\r\n    \"UL\",\r\n  ]),\r\n\r\n  ALTER_TO_DIV_EXCEPTIONS: [\"DIV\", \"ARTICLE\", \"SECTION\", \"P\", \"OL\", \"UL\"],\r\n\r\n  PRESENTATIONAL_ATTRIBUTES: [\r\n    \"align\",\r\n    \"background\",\r\n    \"bgcolor\",\r\n    \"border\",\r\n    \"cellpadding\",\r\n    \"cellspacing\",\r\n    \"frame\",\r\n    \"hspace\",\r\n    \"rules\",\r\n    \"style\",\r\n    \"valign\",\r\n    \"vspace\",\r\n  ],\r\n\r\n  DEPRECATED_SIZE_ATTRIBUTE_ELEMS: [\"TABLE\", \"TH\", \"TD\", \"HR\", \"PRE\"],\r\n\r\n  // The commented out elements qualify as phrasing content but tend to be\r\n  // removed by readability when put into paragraphs, so we ignore them here.\r\n  PHRASING_ELEMS: [\r\n    // \"CANVAS\", \"IFRAME\", \"SVG\", \"VIDEO\",\r\n    \"ABBR\",\r\n    \"AUDIO\",\r\n    \"B\",\r\n    \"BDO\",\r\n    \"BR\",\r\n    \"BUTTON\",\r\n    \"CITE\",\r\n    \"CODE\",\r\n    \"DATA\",\r\n    \"DATALIST\",\r\n    \"DFN\",\r\n    \"EM\",\r\n    \"EMBED\",\r\n    \"I\",\r\n    \"IMG\",\r\n    \"INPUT\",\r\n    \"KBD\",\r\n    \"LABEL\",\r\n    \"MARK\",\r\n    \"MATH\",\r\n    \"METER\",\r\n    \"NOSCRIPT\",\r\n    \"OBJECT\",\r\n    \"OUTPUT\",\r\n    \"PROGRESS\",\r\n    \"Q\",\r\n    \"RUBY\",\r\n    \"SAMP\",\r\n    \"SCRIPT\",\r\n    \"SELECT\",\r\n    \"SMALL\",\r\n    \"SPAN\",\r\n    \"STRONG\",\r\n    \"SUB\",\r\n    \"SUP\",\r\n    \"TEXTAREA\",\r\n    \"TIME\",\r\n    \"VAR\",\r\n    \"WBR\",\r\n  ],\r\n\r\n  // These are the classes that readability sets itself.\r\n  CLASSES_TO_PRESERVE: [\"page\"],\r\n\r\n  // These are the list of HTML entities that need to be escaped.\r\n  HTML_ESCAPE_MAP: {\r\n    lt: \"<\",\r\n    gt: \">\",\r\n    amp: \"&\",\r\n    quot: '\"',\r\n    apos: \"'\",\r\n  },\r\n\r\n  /**\r\n   * Run any post-process modifications to article content as necessary.\r\n   *\r\n   * @param Element\r\n   * @return void\r\n   **/\r\n  _postProcessContent(articleContent) {\r\n    // Readability cannot open relative uris so we convert them to absolute uris.\r\n    this._fixRelativeUris(articleContent);\r\n\r\n    this._simplifyNestedElements(articleContent);\r\n\r\n    if (!this._keepClasses) {\r\n      // Remove classes.\r\n      this._cleanClasses(articleContent);\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Iterates over a NodeList, calls `filterFn` for each node and removes node\r\n   * if function returned `true`.\r\n   *\r\n   * If function is not passed, removes all the nodes in node list.\r\n   *\r\n   * @param NodeList nodeList The nodes to operate on\r\n   * @param Function filterFn the function to use as a filter\r\n   * @return void\r\n   */\r\n  _removeNodes(nodeList, filterFn) {\r\n    // Avoid ever operating on live node lists.\r\n    if (this._docJSDOMParser && nodeList._isLiveNodeList) {\r\n      throw new Error(\"Do not pass live node lists to _removeNodes\");\r\n    }\r\n    for (var i = nodeList.length - 1; i >= 0; i--) {\r\n      var node = nodeList[i];\r\n      var parentNode = node.parentNode;\r\n      if (parentNode) {\r\n        if (!filterFn || filterFn.call(this, node, i, nodeList)) {\r\n          parentNode.removeChild(node);\r\n        }\r\n      }\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Iterates over a NodeList, and calls _setNodeTag for each node.\r\n   *\r\n   * @param NodeList nodeList The nodes to operate on\r\n   * @param String newTagName the new tag name to use\r\n   * @return void\r\n   */\r\n  _replaceNodeTags(nodeList, newTagName) {\r\n    // Avoid ever operating on live node lists.\r\n    if (this._docJSDOMParser && nodeList._isLiveNodeList) {\r\n      throw new Error(\"Do not pass live node lists to _replaceNodeTags\");\r\n    }\r\n    for (const node of nodeList) {\r\n      this._setNodeTag(node, newTagName);\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Iterate over a NodeList, which doesn't natively fully implement the Array\r\n   * interface.\r\n   *\r\n   * For convenience, the current object context is applied to the provided\r\n   * iterate function.\r\n   *\r\n   * @param  NodeList nodeList The NodeList.\r\n   * @param  Function fn       The iterate function.\r\n   * @return void\r\n   */\r\n  _forEachNode(nodeList, fn) {\r\n    Array.prototype.forEach.call(nodeList, fn, this);\r\n  },\r\n\r\n  /**\r\n   * Iterate over a NodeList, and return the first node that passes\r\n   * the supplied test function\r\n   *\r\n   * For convenience, the current object context is applied to the provided\r\n   * test function.\r\n   *\r\n   * @param  NodeList nodeList The NodeList.\r\n   * @param  Function fn       The test function.\r\n   * @return void\r\n   */\r\n  _findNode(nodeList, fn) {\r\n    return Array.prototype.find.call(nodeList, fn, this);\r\n  },\r\n\r\n  /**\r\n   * Iterate over a NodeList, return true if any of the provided iterate\r\n   * function calls returns true, false otherwise.\r\n   *\r\n   * For convenience, the current object context is applied to the\r\n   * provided iterate function.\r\n   *\r\n   * @param  NodeList nodeList The NodeList.\r\n   * @param  Function fn       The iterate function.\r\n   * @return Boolean\r\n   */\r\n  _someNode(nodeList, fn) {\r\n    return Array.prototype.some.call(nodeList, fn, this);\r\n  },\r\n\r\n  /**\r\n   * Iterate over a NodeList, return true if all of the provided iterate\r\n   * function calls return true, false otherwise.\r\n   *\r\n   * For convenience, the current object context is applied to the\r\n   * provided iterate function.\r\n   *\r\n   * @param  NodeList nodeList The NodeList.\r\n   * @param  Function fn       The iterate function.\r\n   * @return Boolean\r\n   */\r\n  _everyNode(nodeList, fn) {\r\n    return Array.prototype.every.call(nodeList, fn, this);\r\n  },\r\n\r\n  _getAllNodesWithTag(node, tagNames) {\r\n    if (node.querySelectorAll) {\r\n      return node.querySelectorAll(tagNames.join(\",\"));\r\n    }\r\n    return [].concat.apply(\r\n      [],\r\n      tagNames.map(function (tag) {\r\n        var collection = node.getElementsByTagName(tag);\r\n        return Array.isArray(collection) ? collection : Array.from(collection);\r\n      })\r\n    );\r\n  },\r\n\r\n  /**\r\n   * Removes the class=\"\" attribute from every element in the given\r\n   * subtree, except those that match CLASSES_TO_PRESERVE and\r\n   * the classesToPreserve array from the options object.\r\n   *\r\n   * @param Element\r\n   * @return void\r\n   */\r\n  _cleanClasses(node) {\r\n    var classesToPreserve = this._classesToPreserve;\r\n    var className = (node.getAttribute(\"class\") || \"\")\r\n      .split(/\\s+/)\r\n      .filter(cls => classesToPreserve.includes(cls))\r\n      .join(\" \");\r\n\r\n    if (className) {\r\n      node.setAttribute(\"class\", className);\r\n    } else {\r\n      node.removeAttribute(\"class\");\r\n    }\r\n\r\n    for (node = node.firstElementChild; node; node = node.nextElementSibling) {\r\n      this._cleanClasses(node);\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Tests whether a string is a URL or not.\r\n   *\r\n   * @param {string} str The string to test\r\n   * @return {boolean} true if str is a URL, false if not\r\n   */\r\n  _isUrl(str) {\r\n    try {\r\n      new URL(str);\r\n      return true;\r\n    } catch {\r\n      return false;\r\n    }\r\n  },\r\n  /**\r\n   * Converts each <a> and <img> uri in the given element to an absolute URI,\r\n   * ignoring #ref URIs.\r\n   *\r\n   * @param Element\r\n   * @return void\r\n   */\r\n  _fixRelativeUris(articleContent) {\r\n    var baseURI = this._doc.baseURI;\r\n    var documentURI = this._doc.documentURI;\r\n    function toAbsoluteURI(uri) {\r\n      // Leave hash links alone if the base URI matches the document URI:\r\n      if (baseURI == documentURI && uri.charAt(0) == \"#\") {\r\n        return uri;\r\n      }\r\n\r\n      // Otherwise, resolve against base URI:\r\n      try {\r\n        return new URL(uri, baseURI).href;\r\n      } catch (ex) {\r\n        // Something went wrong, just return the original:\r\n      }\r\n      return uri;\r\n    }\r\n\r\n    var links = this._getAllNodesWithTag(articleContent, [\"a\"]);\r\n    this._forEachNode(links, function (link) {\r\n      var href = link.getAttribute(\"href\");\r\n      if (href) {\r\n        // Remove links with javascript: URIs, since\r\n        // they won't work after scripts have been removed from the page.\r\n        if (href.indexOf(\"javascript:\") === 0) {\r\n          // if the link only contains simple text content, it can be converted to a text node\r\n          if (\r\n            link.childNodes.length === 1 &&\r\n            link.childNodes[0].nodeType === this.TEXT_NODE\r\n          ) {\r\n            var text = this._doc.createTextNode(link.textContent);\r\n            link.parentNode.replaceChild(text, link);\r\n          } else {\r\n            // if the link has multiple children, they should all be preserved\r\n            var container = this._doc.createElement(\"span\");\r\n            while (link.firstChild) {\r\n              container.appendChild(link.firstChild);\r\n            }\r\n            link.parentNode.replaceChild(container, link);\r\n          }\r\n        } else {\r\n          link.setAttribute(\"href\", toAbsoluteURI(href));\r\n        }\r\n      }\r\n    });\r\n\r\n    var medias = this._getAllNodesWithTag(articleContent, [\r\n      \"img\",\r\n      \"picture\",\r\n      \"figure\",\r\n      \"video\",\r\n      \"audio\",\r\n      \"source\",\r\n    ]);\r\n\r\n    this._forEachNode(medias, function (media) {\r\n      var src = media.getAttribute(\"src\");\r\n      var poster = media.getAttribute(\"poster\");\r\n      var srcset = media.getAttribute(\"srcset\");\r\n\r\n      if (src) {\r\n        media.setAttribute(\"src\", toAbsoluteURI(src));\r\n      }\r\n\r\n      if (poster) {\r\n        media.setAttribute(\"poster\", toAbsoluteURI(poster));\r\n      }\r\n\r\n      if (srcset) {\r\n        var newSrcset = srcset.replace(\r\n          this.REGEXPS.srcsetUrl,\r\n          function (_, p1, p2, p3) {\r\n            return toAbsoluteURI(p1) + (p2 || \"\") + p3;\r\n          }\r\n        );\r\n\r\n        media.setAttribute(\"srcset\", newSrcset);\r\n      }\r\n    });\r\n  },\r\n\r\n  _simplifyNestedElements(articleContent) {\r\n    var node = articleContent;\r\n\r\n    while (node) {\r\n      if (\r\n        node.parentNode &&\r\n        [\"DIV\", \"SECTION\"].includes(node.tagName) &&\r\n        !(node.id && node.id.startsWith(\"readability\"))\r\n      ) {\r\n        if (this._isElementWithoutContent(node)) {\r\n          node = this._removeAndGetNext(node);\r\n          continue;\r\n        } else if (\r\n          this._hasSingleTagInsideElement(node, \"DIV\") ||\r\n          this._hasSingleTagInsideElement(node, \"SECTION\")\r\n        ) {\r\n          var child = node.children[0];\r\n          for (var i = 0; i < node.attributes.length; i++) {\r\n            child.setAttributeNode(node.attributes[i].cloneNode());\r\n          }\r\n          node.parentNode.replaceChild(child, node);\r\n          node = child;\r\n          continue;\r\n        }\r\n      }\r\n\r\n      node = this._getNextNode(node);\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Get the article title as an H1.\r\n   *\r\n   * @return string\r\n   **/\r\n  _getArticleTitle() {\r\n    var doc = this._doc;\r\n    var curTitle = \"\";\r\n    var origTitle = \"\";\r\n\r\n    try {\r\n      curTitle = origTitle = doc.title.trim();\r\n\r\n      // If they had an element with id \"title\" in their HTML\r\n      if (typeof curTitle !== \"string\") {\r\n        curTitle = origTitle = this._getInnerText(\r\n          doc.getElementsByTagName(\"title\")[0]\r\n        );\r\n      }\r\n    } catch (e) {\r\n      /* ignore exceptions setting the title. */\r\n    }\r\n\r\n    var titleHadHierarchicalSeparators = false;\r\n    function wordCount(str) {\r\n      return str.split(/\\s+/).length;\r\n    }\r\n\r\n    // If there's a separator in the title, first remove the final part\r\n    const titleSeparators = /\\|\\-–—\\\\\\/>»/.source;\r\n    if (new RegExp(`\\\\s[${titleSeparators}]\\\\s`).test(curTitle)) {\r\n      titleHadHierarchicalSeparators = /\\s[\\\\\\/>»]\\s/.test(curTitle);\r\n      let allSeparators = Array.from(\r\n        origTitle.matchAll(new RegExp(`\\\\s[${titleSeparators}]\\\\s`, \"gi\"))\r\n      );\r\n      curTitle = origTitle.substring(0, allSeparators.pop().index);\r\n\r\n      // If the resulting title is too short, remove the first part instead:\r\n      if (wordCount(curTitle) < 3) {\r\n        curTitle = origTitle.replace(\r\n          new RegExp(`^[^${titleSeparators}]*[${titleSeparators}]`, \"gi\"),\r\n          \"\"\r\n        );\r\n      }\r\n    } else if (curTitle.includes(\": \")) {\r\n      // Check if we have an heading containing this exact string, so we\r\n      // could assume it's the full title.\r\n      var headings = this._getAllNodesWithTag(doc, [\"h1\", \"h2\"]);\r\n      var trimmedTitle = curTitle.trim();\r\n      var match = this._someNode(headings, function (heading) {\r\n        return heading.textContent.trim() === trimmedTitle;\r\n      });\r\n\r\n      // If we don't, let's extract the title out of the original title string.\r\n      if (!match) {\r\n        curTitle = origTitle.substring(origTitle.lastIndexOf(\":\") + 1);\r\n\r\n        // If the title is now too short, try the first colon instead:\r\n        if (wordCount(curTitle) < 3) {\r\n          curTitle = origTitle.substring(origTitle.indexOf(\":\") + 1);\r\n          // But if we have too many words before the colon there's something weird\r\n          // with the titles and the H tags so let's just use the original title instead\r\n        } else if (wordCount(origTitle.substr(0, origTitle.indexOf(\":\"))) > 5) {\r\n          curTitle = origTitle;\r\n        }\r\n      }\r\n    } else if (curTitle.length > 150 || curTitle.length < 15) {\r\n      var hOnes = doc.getElementsByTagName(\"h1\");\r\n\r\n      if (hOnes.length === 1) {\r\n        curTitle = this._getInnerText(hOnes[0]);\r\n      }\r\n    }\r\n\r\n    curTitle = curTitle.trim().replace(this.REGEXPS.normalize, \" \");\r\n    // If we now have 4 words or fewer as our title, and either no\r\n    // 'hierarchical' separators (\\, /, > or ») were found in the original\r\n    // title or we decreased the number of words by more than 1 word, use\r\n    // the original title.\r\n    var curTitleWordCount = wordCount(curTitle);\r\n    if (\r\n      curTitleWordCount <= 4 &&\r\n      (!titleHadHierarchicalSeparators ||\r\n        curTitleWordCount !=\r\n          wordCount(\r\n            origTitle.replace(new RegExp(`\\\\s[${titleSeparators}]\\\\s`, \"g\"), \"\")\r\n          ) -\r\n            1)\r\n    ) {\r\n      curTitle = origTitle;\r\n    }\r\n\r\n    return curTitle;\r\n  },\r\n\r\n  /**\r\n   * Prepare the HTML document for readability to scrape it.\r\n   * This includes things like stripping javascript, CSS, and handling terrible markup.\r\n   *\r\n   * @return void\r\n   **/\r\n  _prepDocument() {\r\n    var doc = this._doc;\r\n\r\n    // Remove all style tags in head\r\n    this._removeNodes(this._getAllNodesWithTag(doc, [\"style\"]));\r\n\r\n    if (doc.body) {\r\n      this._replaceBrs(doc.body);\r\n    }\r\n\r\n    this._replaceNodeTags(this._getAllNodesWithTag(doc, [\"font\"]), \"SPAN\");\r\n  },\r\n\r\n  /**\r\n   * Finds the next node, starting from the given node, and ignoring\r\n   * whitespace in between. If the given node is an element, the same node is\r\n   * returned.\r\n   */\r\n  _nextNode(node) {\r\n    var next = node;\r\n    while (\r\n      next &&\r\n      next.nodeType != this.ELEMENT_NODE &&\r\n      this.REGEXPS.whitespace.test(next.textContent)\r\n    ) {\r\n      next = next.nextSibling;\r\n    }\r\n    return next;\r\n  },\r\n\r\n  /**\r\n   * Replaces 2 or more successive <br> elements with a single <p>.\r\n   * Whitespace between <br> elements are ignored. For example:\r\n   *   <div>foo<br>bar<br> <br><br>abc</div>\r\n   * will become:\r\n   *   <div>foo<br>bar<p>abc</p></div>\r\n   */\r\n  _replaceBrs(elem) {\r\n    this._forEachNode(this._getAllNodesWithTag(elem, [\"br\"]), function (br) {\r\n      var next = br.nextSibling;\r\n\r\n      // Whether 2 or more <br> elements have been found and replaced with a\r\n      // <p> block.\r\n      var replaced = false;\r\n\r\n      // If we find a <br> chain, remove the <br>s until we hit another node\r\n      // or non-whitespace. This leaves behind the first <br> in the chain\r\n      // (which will be replaced with a <p> later).\r\n      while ((next = this._nextNode(next)) && next.tagName == \"BR\") {\r\n        replaced = true;\r\n        var brSibling = next.nextSibling;\r\n        next.remove();\r\n        next = brSibling;\r\n      }\r\n\r\n      // If we removed a <br> chain, replace the remaining <br> with a <p>. Add\r\n      // all sibling nodes as children of the <p> until we hit another <br>\r\n      // chain.\r\n      if (replaced) {\r\n        var p = this._doc.createElement(\"p\");\r\n        br.parentNode.replaceChild(p, br);\r\n\r\n        next = p.nextSibling;\r\n        while (next) {\r\n          // If we've hit another <br><br>, we're done adding children to this <p>.\r\n          if (next.tagName == \"BR\") {\r\n            var nextElem = this._nextNode(next.nextSibling);\r\n            if (nextElem && nextElem.tagName == \"BR\") {\r\n              break;\r\n            }\r\n          }\r\n\r\n          if (!this._isPhrasingContent(next)) {\r\n            break;\r\n          }\r\n\r\n          // Otherwise, make this node a child of the new <p>.\r\n          var sibling = next.nextSibling;\r\n          p.appendChild(next);\r\n          next = sibling;\r\n        }\r\n\r\n        while (p.lastChild && this._isWhitespace(p.lastChild)) {\r\n          p.lastChild.remove();\r\n        }\r\n\r\n        if (p.parentNode.tagName === \"P\") {\r\n          this._setNodeTag(p.parentNode, \"DIV\");\r\n        }\r\n      }\r\n    });\r\n  },\r\n\r\n  _setNodeTag(node, tag) {\r\n    this.log(\"_setNodeTag\", node, tag);\r\n    if (this._docJSDOMParser) {\r\n      node.localName = tag.toLowerCase();\r\n      node.tagName = tag.toUpperCase();\r\n      return node;\r\n    }\r\n\r\n    var replacement = node.ownerDocument.createElement(tag);\r\n    while (node.firstChild) {\r\n      replacement.appendChild(node.firstChild);\r\n    }\r\n    node.parentNode.replaceChild(replacement, node);\r\n    if (node.readability) {\r\n      replacement.readability = node.readability;\r\n    }\r\n\r\n    for (var i = 0; i < node.attributes.length; i++) {\r\n      replacement.setAttributeNode(node.attributes[i].cloneNode());\r\n    }\r\n    return replacement;\r\n  },\r\n\r\n  /**\r\n   * Prepare the article node for display. Clean out any inline styles,\r\n   * iframes, forms, strip extraneous <p> tags, etc.\r\n   *\r\n   * @param Element\r\n   * @return void\r\n   **/\r\n  _prepArticle(articleContent) {\r\n    this._cleanStyles(articleContent);\r\n\r\n    // Check for data tables before we continue, to avoid removing items in\r\n    // those tables, which will often be isolated even though they're\r\n    // visually linked to other content-ful elements (text, images, etc.).\r\n    this._markDataTables(articleContent);\r\n\r\n    this._fixLazyImages(articleContent);\r\n\r\n    // Clean out junk from the article content\r\n    this._cleanConditionally(articleContent, \"form\");\r\n    this._cleanConditionally(articleContent, \"fieldset\");\r\n    this._clean(articleContent, \"object\");\r\n    this._clean(articleContent, \"embed\");\r\n    this._clean(articleContent, \"footer\");\r\n    this._clean(articleContent, \"link\");\r\n    this._clean(articleContent, \"aside\");\r\n\r\n    // Clean out elements with little content that have \"share\" in their id/class combinations from final top candidates,\r\n    // which means we don't remove the top candidates even they have \"share\".\r\n\r\n    var shareElementThreshold = this.DEFAULT_CHAR_THRESHOLD;\r\n\r\n    this._forEachNode(articleContent.children, function (topCandidate) {\r\n      this._cleanMatchedNodes(topCandidate, function (node, matchString) {\r\n        return (\r\n          this.REGEXPS.shareElements.test(matchString) &&\r\n          node.textContent.length < shareElementThreshold\r\n        );\r\n      });\r\n    });\r\n\r\n    this._clean(articleContent, \"iframe\");\r\n    this._clean(articleContent, \"input\");\r\n    this._clean(articleContent, \"textarea\");\r\n    this._clean(articleContent, \"select\");\r\n    this._clean(articleContent, \"button\");\r\n    this._cleanHeaders(articleContent);\r\n\r\n    // Do these last as the previous stuff may have removed junk\r\n    // that will affect these\r\n    this._cleanConditionally(articleContent, \"table\");\r\n    this._cleanConditionally(articleContent, \"ul\");\r\n    this._cleanConditionally(articleContent, \"div\");\r\n\r\n    // replace H1 with H2 as H1 should be only title that is displayed separately\r\n    this._replaceNodeTags(\r\n      this._getAllNodesWithTag(articleContent, [\"h1\"]),\r\n      \"h2\"\r\n    );\r\n\r\n    // Remove extra paragraphs\r\n    this._removeNodes(\r\n      this._getAllNodesWithTag(articleContent, [\"p\"]),\r\n      function (paragraph) {\r\n        // At this point, nasty iframes have been removed; only embedded video\r\n        // ones remain.\r\n        var contentElementCount = this._getAllNodesWithTag(paragraph, [\r\n          \"img\",\r\n          \"embed\",\r\n          \"object\",\r\n          \"iframe\",\r\n        ]).length;\r\n        return (\r\n          contentElementCount === 0 && !this._getInnerText(paragraph, false)\r\n        );\r\n      }\r\n    );\r\n\r\n    this._forEachNode(\r\n      this._getAllNodesWithTag(articleContent, [\"br\"]),\r\n      function (br) {\r\n        var next = this._nextNode(br.nextSibling);\r\n        if (next && next.tagName == \"P\") {\r\n          br.remove();\r\n        }\r\n      }\r\n    );\r\n\r\n    // Remove single-cell tables\r\n    this._forEachNode(\r\n      this._getAllNodesWithTag(articleContent, [\"table\"]),\r\n      function (table) {\r\n        var tbody = this._hasSingleTagInsideElement(table, \"TBODY\")\r\n          ? table.firstElementChild\r\n          : table;\r\n        if (this._hasSingleTagInsideElement(tbody, \"TR\")) {\r\n          var row = tbody.firstElementChild;\r\n          if (this._hasSingleTagInsideElement(row, \"TD\")) {\r\n            var cell = row.firstElementChild;\r\n            cell = this._setNodeTag(\r\n              cell,\r\n              this._everyNode(cell.childNodes, this._isPhrasingContent)\r\n                ? \"P\"\r\n                : \"DIV\"\r\n            );\r\n            table.parentNode.replaceChild(cell, table);\r\n          }\r\n        }\r\n      }\r\n    );\r\n  },\r\n\r\n  /**\r\n   * Initialize a node with the readability object. Also checks the\r\n   * className/id for special names to add to its score.\r\n   *\r\n   * @param Element\r\n   * @return void\r\n   **/\r\n  _initializeNode(node) {\r\n    node.readability = { contentScore: 0 };\r\n\r\n    switch (node.tagName) {\r\n      case \"DIV\":\r\n        node.readability.contentScore += 5;\r\n        break;\r\n\r\n      case \"PRE\":\r\n      case \"TD\":\r\n      case \"BLOCKQUOTE\":\r\n        node.readability.contentScore += 3;\r\n        break;\r\n\r\n      case \"ADDRESS\":\r\n      case \"OL\":\r\n      case \"UL\":\r\n      case \"DL\":\r\n      case \"DD\":\r\n      case \"DT\":\r\n      case \"LI\":\r\n      case \"FORM\":\r\n        node.readability.contentScore -= 3;\r\n        break;\r\n\r\n      case \"H1\":\r\n      case \"H2\":\r\n      case \"H3\":\r\n      case \"H4\":\r\n      case \"H5\":\r\n      case \"H6\":\r\n      case \"TH\":\r\n        node.readability.contentScore -= 5;\r\n        break;\r\n    }\r\n\r\n    node.readability.contentScore += this._getClassWeight(node);\r\n  },\r\n\r\n  _removeAndGetNext(node) {\r\n    var nextNode = this._getNextNode(node, true);\r\n    node.remove();\r\n    return nextNode;\r\n  },\r\n\r\n  /**\r\n   * Traverse the DOM from node to node, starting at the node passed in.\r\n   * Pass true for the second parameter to indicate this node itself\r\n   * (and its kids) are going away, and we want the next node over.\r\n   *\r\n   * Calling this in a loop will traverse the DOM depth-first.\r\n   *\r\n   * @param {Element} node\r\n   * @param {boolean} ignoreSelfAndKids\r\n   * @return {Element}\r\n   */\r\n  _getNextNode(node, ignoreSelfAndKids) {\r\n    // First check for kids if those aren't being ignored\r\n    if (!ignoreSelfAndKids && node.firstElementChild) {\r\n      return node.firstElementChild;\r\n    }\r\n    // Then for siblings...\r\n    if (node.nextElementSibling) {\r\n      return node.nextElementSibling;\r\n    }\r\n    // And finally, move up the parent chain *and* find a sibling\r\n    // (because this is depth-first traversal, we will have already\r\n    // seen the parent nodes themselves).\r\n    do {\r\n      node = node.parentNode;\r\n    } while (node && !node.nextElementSibling);\r\n    return node && node.nextElementSibling;\r\n  },\r\n\r\n  // compares second text to first one\r\n  // 1 = same text, 0 = completely different text\r\n  // works the way that it splits both texts into words and then finds words that are unique in second text\r\n  // the result is given by the lower length of unique parts\r\n  _textSimilarity(textA, textB) {\r\n    var tokensA = textA\r\n      .toLowerCase()\r\n      .split(this.REGEXPS.tokenize)\r\n      .filter(Boolean);\r\n    var tokensB = textB\r\n      .toLowerCase()\r\n      .split(this.REGEXPS.tokenize)\r\n      .filter(Boolean);\r\n    if (!tokensA.length || !tokensB.length) {\r\n      return 0;\r\n    }\r\n    var uniqTokensB = tokensB.filter(token => !tokensA.includes(token));\r\n    var distanceB = uniqTokensB.join(\" \").length / tokensB.join(\" \").length;\r\n    return 1 - distanceB;\r\n  },\r\n\r\n  /**\r\n   * Checks whether an element node contains a valid byline\r\n   *\r\n   * @param node {Element}\r\n   * @param matchString {string}\r\n   * @return boolean\r\n   */\r\n  _isValidByline(node, matchString) {\r\n    var rel = node.getAttribute(\"rel\");\r\n    var itemprop = node.getAttribute(\"itemprop\");\r\n    var bylineLength = node.textContent.trim().length;\r\n\r\n    return (\r\n      (rel === \"author\" ||\r\n        (itemprop && itemprop.includes(\"author\")) ||\r\n        this.REGEXPS.byline.test(matchString)) &&\r\n      !!bylineLength &&\r\n      bylineLength < 100\r\n    );\r\n  },\r\n\r\n  _getNodeAncestors(node, maxDepth) {\r\n    maxDepth = maxDepth || 0;\r\n    var i = 0,\r\n      ancestors = [];\r\n    while (node.parentNode) {\r\n      ancestors.push(node.parentNode);\r\n      if (maxDepth && ++i === maxDepth) {\r\n        break;\r\n      }\r\n      node = node.parentNode;\r\n    }\r\n    return ancestors;\r\n  },\r\n\r\n  /***\r\n   * grabArticle - Using a variety of metrics (content score, classname, element types), find the content that is\r\n   *         most likely to be the stuff a user wants to read. Then return it wrapped up in a div.\r\n   *\r\n   * @param page a document to run upon. Needs to be a full document, complete with body.\r\n   * @return Element\r\n   **/\r\n  /* eslint-disable-next-line complexity */\r\n  _grabArticle(page) {\r\n    this.log(\"**** grabArticle ****\");\r\n    var doc = this._doc;\r\n    var isPaging = page !== null;\r\n    page = page ? page : this._doc.body;\r\n\r\n    // We can't grab an article if we don't have a page!\r\n    if (!page) {\r\n      this.log(\"No body found in document. Abort.\");\r\n      return null;\r\n    }\r\n\r\n    var pageCacheHtml = page.innerHTML;\r\n\r\n    while (true) {\r\n      this.log(\"Starting grabArticle loop\");\r\n      var stripUnlikelyCandidates = this._flagIsActive(\r\n        this.FLAG_STRIP_UNLIKELYS\r\n      );\r\n\r\n      // First, node prepping. Trash nodes that look cruddy (like ones with the\r\n      // class name \"comment\", etc), and turn divs into P tags where they have been\r\n      // used inappropriately (as in, where they contain no other block level elements.)\r\n      var elementsToScore = [];\r\n      var node = this._doc.documentElement;\r\n\r\n      let shouldRemoveTitleHeader = true;\r\n\r\n      while (node) {\r\n        if (node.tagName === \"HTML\") {\r\n          this._articleLang = node.getAttribute(\"lang\");\r\n        }\r\n\r\n        var matchString = node.className + \" \" + node.id;\r\n\r\n        if (!this._isProbablyVisible(node)) {\r\n          this.log(\"Removing hidden node - \" + matchString);\r\n          node = this._removeAndGetNext(node);\r\n          continue;\r\n        }\r\n\r\n        // User is not able to see elements applied with both \"aria-modal = true\" and \"role = dialog\"\r\n        if (\r\n          node.getAttribute(\"aria-modal\") == \"true\" &&\r\n          node.getAttribute(\"role\") == \"dialog\"\r\n        ) {\r\n          node = this._removeAndGetNext(node);\r\n          continue;\r\n        }\r\n\r\n        // If we don't have a byline yet check to see if this node is a byline; if it is store the byline and remove the node.\r\n        if (\r\n          !this._articleByline &&\r\n          !this._metadata.byline &&\r\n          this._isValidByline(node, matchString)\r\n        ) {\r\n          // Find child node matching [itemprop=\"name\"] and use that if it exists for a more accurate author name byline\r\n          var endOfSearchMarkerNode = this._getNextNode(node, true);\r\n          var next = this._getNextNode(node);\r\n          var itemPropNameNode = null;\r\n          while (next && next != endOfSearchMarkerNode) {\r\n            var itemprop = next.getAttribute(\"itemprop\");\r\n            if (itemprop && itemprop.includes(\"name\")) {\r\n              itemPropNameNode = next;\r\n              break;\r\n            } else {\r\n              next = this._getNextNode(next);\r\n            }\r\n          }\r\n          this._articleByline = (itemPropNameNode ?? node).textContent.trim();\r\n          node = this._removeAndGetNext(node);\r\n          continue;\r\n        }\r\n\r\n        if (shouldRemoveTitleHeader && this._headerDuplicatesTitle(node)) {\r\n          this.log(\r\n            \"Removing header: \",\r\n            node.textContent.trim(),\r\n            this._articleTitle.trim()\r\n          );\r\n          shouldRemoveTitleHeader = false;\r\n          node = this._removeAndGetNext(node);\r\n          continue;\r\n        }\r\n\r\n        // Remove unlikely candidates\r\n        if (stripUnlikelyCandidates) {\r\n          if (\r\n            this.REGEXPS.unlikelyCandidates.test(matchString) &&\r\n            !this.REGEXPS.okMaybeItsACandidate.test(matchString) &&\r\n            !this._hasAncestorTag(node, \"table\") &&\r\n            !this._hasAncestorTag(node, \"code\") &&\r\n            node.tagName !== \"BODY\" &&\r\n            node.tagName !== \"A\"\r\n          ) {\r\n            this.log(\"Removing unlikely candidate - \" + matchString);\r\n            node = this._removeAndGetNext(node);\r\n            continue;\r\n          }\r\n\r\n          if (this.UNLIKELY_ROLES.includes(node.getAttribute(\"role\"))) {\r\n            this.log(\r\n              \"Removing content with role \" +\r\n                node.getAttribute(\"role\") +\r\n                \" - \" +\r\n                matchString\r\n            );\r\n            node = this._removeAndGetNext(node);\r\n            continue;\r\n          }\r\n        }\r\n\r\n        // Remove DIV, SECTION, and HEADER nodes without any content(e.g. text, image, video, or iframe).\r\n        if (\r\n          (node.tagName === \"DIV\" ||\r\n            node.tagName === \"SECTION\" ||\r\n            node.tagName === \"HEADER\" ||\r\n            node.tagName === \"H1\" ||\r\n            node.tagName === \"H2\" ||\r\n            node.tagName === \"H3\" ||\r\n            node.tagName === \"H4\" ||\r\n            node.tagName === \"H5\" ||\r\n            node.tagName === \"H6\") &&\r\n          this._isElementWithoutContent(node)\r\n        ) {\r\n          node = this._removeAndGetNext(node);\r\n          continue;\r\n        }\r\n\r\n        if (this.DEFAULT_TAGS_TO_SCORE.includes(node.tagName)) {\r\n          elementsToScore.push(node);\r\n        }\r\n\r\n        // Turn all divs that don't have children block level elements into p's\r\n        if (node.tagName === \"DIV\") {\r\n          // Put phrasing content into paragraphs.\r\n          var p = null;\r\n          var childNode = node.firstChild;\r\n          while (childNode) {\r\n            var nextSibling = childNode.nextSibling;\r\n            if (this._isPhrasingContent(childNode)) {\r\n              if (p !== null) {\r\n                p.appendChild(childNode);\r\n              } else if (!this._isWhitespace(childNode)) {\r\n                p = doc.createElement(\"p\");\r\n                node.replaceChild(p, childNode);\r\n                p.appendChild(childNode);\r\n              }\r\n            } else if (p !== null) {\r\n              while (p.lastChild && this._isWhitespace(p.lastChild)) {\r\n                p.lastChild.remove();\r\n              }\r\n              p = null;\r\n            }\r\n            childNode = nextSibling;\r\n          }\r\n\r\n          // Sites like http://mobile.slate.com encloses each paragraph with a DIV\r\n          // element. DIVs with only a P element inside and no text content can be\r\n          // safely converted into plain P elements to avoid confusing the scoring\r\n          // algorithm with DIVs with are, in practice, paragraphs.\r\n          if (\r\n            this._hasSingleTagInsideElement(node, \"P\") &&\r\n            this._getLinkDensity(node) < 0.25\r\n          ) {\r\n            var newNode = node.children[0];\r\n            node.parentNode.replaceChild(newNode, node);\r\n            node = newNode;\r\n            elementsToScore.push(node);\r\n          } else if (!this._hasChildBlockElement(node)) {\r\n            node = this._setNodeTag(node, \"P\");\r\n            elementsToScore.push(node);\r\n          }\r\n        }\r\n        node = this._getNextNode(node);\r\n      }\r\n\r\n      /**\r\n       * Loop through all paragraphs, and assign a score to them based on how content-y they look.\r\n       * Then add their score to their parent node.\r\n       *\r\n       * A score is determined by things like number of commas, class names, etc. Maybe eventually link density.\r\n       **/\r\n      var candidates = [];\r\n      this._forEachNode(elementsToScore, function (elementToScore) {\r\n        if (\r\n          !elementToScore.parentNode ||\r\n          typeof elementToScore.parentNode.tagName === \"undefined\"\r\n        ) {\r\n          return;\r\n        }\r\n\r\n        // If this paragraph is less than 25 characters, don't even count it.\r\n        var innerText = this._getInnerText(elementToScore);\r\n        if (innerText.length < 25) {\r\n          return;\r\n        }\r\n\r\n        // Exclude nodes with no ancestor.\r\n        var ancestors = this._getNodeAncestors(elementToScore, 5);\r\n        if (ancestors.length === 0) {\r\n          return;\r\n        }\r\n\r\n        var contentScore = 0;\r\n\r\n        // Add a point for the paragraph itself as a base.\r\n        contentScore += 1;\r\n\r\n        // Add points for any commas within this paragraph.\r\n        contentScore += innerText.split(this.REGEXPS.commas).length;\r\n\r\n        // For every 100 characters in this paragraph, add another point. Up to 3 points.\r\n        contentScore += Math.min(Math.floor(innerText.length / 100), 3);\r\n\r\n        // Initialize and score ancestors.\r\n        this._forEachNode(ancestors, function (ancestor, level) {\r\n          if (\r\n            !ancestor.tagName ||\r\n            !ancestor.parentNode ||\r\n            typeof ancestor.parentNode.tagName === \"undefined\"\r\n          ) {\r\n            return;\r\n          }\r\n\r\n          if (typeof ancestor.readability === \"undefined\") {\r\n            this._initializeNode(ancestor);\r\n            candidates.push(ancestor);\r\n          }\r\n\r\n          // Node score divider:\r\n          // - parent:             1 (no division)\r\n          // - grandparent:        2\r\n          // - great grandparent+: ancestor level * 3\r\n          if (level === 0) {\r\n            var scoreDivider = 1;\r\n          } else if (level === 1) {\r\n            scoreDivider = 2;\r\n          } else {\r\n            scoreDivider = level * 3;\r\n          }\r\n          ancestor.readability.contentScore += contentScore / scoreDivider;\r\n        });\r\n      });\r\n\r\n      // After we've calculated scores, loop through all of the possible\r\n      // candidate nodes we found and find the one with the highest score.\r\n      var topCandidates = [];\r\n      for (var c = 0, cl = candidates.length; c < cl; c += 1) {\r\n        var candidate = candidates[c];\r\n\r\n        // Scale the final candidates score based on link density. Good content\r\n        // should have a relatively small link density (5% or less) and be mostly\r\n        // unaffected by this operation.\r\n        var candidateScore =\r\n          candidate.readability.contentScore *\r\n          (1 - this._getLinkDensity(candidate));\r\n        candidate.readability.contentScore = candidateScore;\r\n\r\n        this.log(\"Candidate:\", candidate, \"with score \" + candidateScore);\r\n\r\n        for (var t = 0; t < this._nbTopCandidates; t++) {\r\n          var aTopCandidate = topCandidates[t];\r\n\r\n          if (\r\n            !aTopCandidate ||\r\n            candidateScore > aTopCandidate.readability.contentScore\r\n          ) {\r\n            topCandidates.splice(t, 0, candidate);\r\n            if (topCandidates.length > this._nbTopCandidates) {\r\n              topCandidates.pop();\r\n            }\r\n            break;\r\n          }\r\n        }\r\n      }\r\n\r\n      var topCandidate = topCandidates[0] || null;\r\n      var neededToCreateTopCandidate = false;\r\n      var parentOfTopCandidate;\r\n\r\n      // If we still have no top candidate, just use the body as a last resort.\r\n      // We also have to copy the body node so it is something we can modify.\r\n      if (topCandidate === null || topCandidate.tagName === \"BODY\") {\r\n        // Move all of the page's children into topCandidate\r\n        topCandidate = doc.createElement(\"DIV\");\r\n        neededToCreateTopCandidate = true;\r\n        // Move everything (not just elements, also text nodes etc.) into the container\r\n        // so we even include text directly in the body:\r\n        while (page.firstChild) {\r\n          this.log(\"Moving child out:\", page.firstChild);\r\n          topCandidate.appendChild(page.firstChild);\r\n        }\r\n\r\n        page.appendChild(topCandidate);\r\n\r\n        this._initializeNode(topCandidate);\r\n      } else if (topCandidate) {\r\n        // Find a better top candidate node if it contains (at least three) nodes which belong to `topCandidates` array\r\n        // and whose scores are quite closed with current `topCandidate` node.\r\n        var alternativeCandidateAncestors = [];\r\n        for (var i = 1; i < topCandidates.length; i++) {\r\n          if (\r\n            topCandidates[i].readability.contentScore /\r\n              topCandidate.readability.contentScore >=\r\n            0.75\r\n          ) {\r\n            alternativeCandidateAncestors.push(\r\n              this._getNodeAncestors(topCandidates[i])\r\n            );\r\n          }\r\n        }\r\n        var MINIMUM_TOPCANDIDATES = 3;\r\n        if (alternativeCandidateAncestors.length >= MINIMUM_TOPCANDIDATES) {\r\n          parentOfTopCandidate = topCandidate.parentNode;\r\n          while (parentOfTopCandidate.tagName !== \"BODY\") {\r\n            var listsContainingThisAncestor = 0;\r\n            for (\r\n              var ancestorIndex = 0;\r\n              ancestorIndex < alternativeCandidateAncestors.length &&\r\n              listsContainingThisAncestor < MINIMUM_TOPCANDIDATES;\r\n              ancestorIndex++\r\n            ) {\r\n              listsContainingThisAncestor += Number(\r\n                alternativeCandidateAncestors[ancestorIndex].includes(\r\n                  parentOfTopCandidate\r\n                )\r\n              );\r\n            }\r\n            if (listsContainingThisAncestor >= MINIMUM_TOPCANDIDATES) {\r\n              topCandidate = parentOfTopCandidate;\r\n              break;\r\n            }\r\n            parentOfTopCandidate = parentOfTopCandidate.parentNode;\r\n          }\r\n        }\r\n        if (!topCandidate.readability) {\r\n          this._initializeNode(topCandidate);\r\n        }\r\n\r\n        // Because of our bonus system, parents of candidates might have scores\r\n        // themselves. They get half of the node. There won't be nodes with higher\r\n        // scores than our topCandidate, but if we see the score going *up* in the first\r\n        // few steps up the tree, that's a decent sign that there might be more content\r\n        // lurking in other places that we want to unify in. The sibling stuff\r\n        // below does some of that - but only if we've looked high enough up the DOM\r\n        // tree.\r\n        parentOfTopCandidate = topCandidate.parentNode;\r\n        var lastScore = topCandidate.readability.contentScore;\r\n        // The scores shouldn't get too low.\r\n        var scoreThreshold = lastScore / 3;\r\n        while (parentOfTopCandidate.tagName !== \"BODY\") {\r\n          if (!parentOfTopCandidate.readability) {\r\n            parentOfTopCandidate = parentOfTopCandidate.parentNode;\r\n            continue;\r\n          }\r\n          var parentScore = parentOfTopCandidate.readability.contentScore;\r\n          if (parentScore < scoreThreshold) {\r\n            break;\r\n          }\r\n          if (parentScore > lastScore) {\r\n            // Alright! We found a better parent to use.\r\n            topCandidate = parentOfTopCandidate;\r\n            break;\r\n          }\r\n          lastScore = parentOfTopCandidate.readability.contentScore;\r\n          parentOfTopCandidate = parentOfTopCandidate.parentNode;\r\n        }\r\n\r\n        // If the top candidate is the only child, use parent instead. This will help sibling\r\n        // joining logic when adjacent content is actually located in parent's sibling node.\r\n        parentOfTopCandidate = topCandidate.parentNode;\r\n        while (\r\n          parentOfTopCandidate.tagName != \"BODY\" &&\r\n          parentOfTopCandidate.children.length == 1\r\n        ) {\r\n          topCandidate = parentOfTopCandidate;\r\n          parentOfTopCandidate = topCandidate.parentNode;\r\n        }\r\n        if (!topCandidate.readability) {\r\n          this._initializeNode(topCandidate);\r\n        }\r\n      }\r\n\r\n      // Now that we have the top candidate, look through its siblings for content\r\n      // that might also be related. Things like preambles, content split by ads\r\n      // that we removed, etc.\r\n      var articleContent = doc.createElement(\"DIV\");\r\n      if (isPaging) {\r\n        articleContent.id = \"readability-content\";\r\n      }\r\n\r\n      var siblingScoreThreshold = Math.max(\r\n        10,\r\n        topCandidate.readability.contentScore * 0.2\r\n      );\r\n      // Keep potential top candidate's parent node to try to get text direction of it later.\r\n      parentOfTopCandidate = topCandidate.parentNode;\r\n      var siblings = parentOfTopCandidate.children;\r\n\r\n      for (var s = 0, sl = siblings.length; s < sl; s++) {\r\n        var sibling = siblings[s];\r\n        var append = false;\r\n\r\n        this.log(\r\n          \"Looking at sibling node:\",\r\n          sibling,\r\n          sibling.readability\r\n            ? \"with score \" + sibling.readability.contentScore\r\n            : \"\"\r\n        );\r\n        this.log(\r\n          \"Sibling has score\",\r\n          sibling.readability ? sibling.readability.contentScore : \"Unknown\"\r\n        );\r\n\r\n        if (sibling === topCandidate) {\r\n          append = true;\r\n        } else {\r\n          var contentBonus = 0;\r\n\r\n          // Give a bonus if sibling nodes and top candidates have the example same classname\r\n          if (\r\n            sibling.className === topCandidate.className &&\r\n            topCandidate.className !== \"\"\r\n          ) {\r\n            contentBonus += topCandidate.readability.contentScore * 0.2;\r\n          }\r\n\r\n          if (\r\n            sibling.readability &&\r\n            sibling.readability.contentScore + contentBonus >=\r\n              siblingScoreThreshold\r\n          ) {\r\n            append = true;\r\n          } else if (sibling.nodeName === \"P\") {\r\n            var linkDensity = this._getLinkDensity(sibling);\r\n            var nodeContent = this._getInnerText(sibling);\r\n            var nodeLength = nodeContent.length;\r\n\r\n            if (nodeLength > 80 && linkDensity < 0.25) {\r\n              append = true;\r\n            } else if (\r\n              nodeLength < 80 &&\r\n              nodeLength > 0 &&\r\n              linkDensity === 0 &&\r\n              nodeContent.search(/\\.( |$)/) !== -1\r\n            ) {\r\n              append = true;\r\n            }\r\n          }\r\n        }\r\n\r\n        if (append) {\r\n          this.log(\"Appending node:\", sibling);\r\n\r\n          if (!this.ALTER_TO_DIV_EXCEPTIONS.includes(sibling.nodeName)) {\r\n            // We have a node that isn't a common block level element, like a form or td tag.\r\n            // Turn it into a div so it doesn't get filtered out later by accident.\r\n            this.log(\"Altering sibling:\", sibling, \"to div.\");\r\n\r\n            sibling = this._setNodeTag(sibling, \"DIV\");\r\n          }\r\n\r\n          articleContent.appendChild(sibling);\r\n          // Fetch children again to make it compatible\r\n          // with DOM parsers without live collection support.\r\n          siblings = parentOfTopCandidate.children;\r\n          // siblings is a reference to the children array, and\r\n          // sibling is removed from the array when we call appendChild().\r\n          // As a result, we must revisit this index since the nodes\r\n          // have been shifted.\r\n          s -= 1;\r\n          sl -= 1;\r\n        }\r\n      }\r\n\r\n      if (this._debug) {\r\n        this.log(\"Article content pre-prep: \" + articleContent.innerHTML);\r\n      }\r\n      // So we have all of the content that we need. Now we clean it up for presentation.\r\n      this._prepArticle(articleContent);\r\n      if (this._debug) {\r\n        this.log(\"Article content post-prep: \" + articleContent.innerHTML);\r\n      }\r\n\r\n      if (neededToCreateTopCandidate) {\r\n        // We already created a fake div thing, and there wouldn't have been any siblings left\r\n        // for the previous loop, so there's no point trying to create a new div, and then\r\n        // move all the children over. Just assign IDs and class names here. No need to append\r\n        // because that already happened anyway.\r\n        topCandidate.id = \"readability-page-1\";\r\n        topCandidate.className = \"page\";\r\n      } else {\r\n        var div = doc.createElement(\"DIV\");\r\n        div.id = \"readability-page-1\";\r\n        div.className = \"page\";\r\n        while (articleContent.firstChild) {\r\n          div.appendChild(articleContent.firstChild);\r\n        }\r\n        articleContent.appendChild(div);\r\n      }\r\n\r\n      if (this._debug) {\r\n        this.log(\"Article content after paging: \" + articleContent.innerHTML);\r\n      }\r\n\r\n      var parseSuccessful = true;\r\n\r\n      // Now that we've gone through the full algorithm, check to see if\r\n      // we got any meaningful content. If we didn't, we may need to re-run\r\n      // grabArticle with different flags set. This gives us a higher likelihood of\r\n      // finding the content, and the sieve approach gives us a higher likelihood of\r\n      // finding the -right- content.\r\n      var textLength = this._getInnerText(articleContent, true).length;\r\n      if (textLength < this._charThreshold) {\r\n        parseSuccessful = false;\r\n        // eslint-disable-next-line no-unsanitized/property\r\n        page.innerHTML = pageCacheHtml;\r\n\r\n        this._attempts.push({\r\n          articleContent,\r\n          textLength,\r\n        });\r\n\r\n        if (this._flagIsActive(this.FLAG_STRIP_UNLIKELYS)) {\r\n          this._removeFlag(this.FLAG_STRIP_UNLIKELYS);\r\n        } else if (this._flagIsActive(this.FLAG_WEIGHT_CLASSES)) {\r\n          this._removeFlag(this.FLAG_WEIGHT_CLASSES);\r\n        } else if (this._flagIsActive(this.FLAG_CLEAN_CONDITIONALLY)) {\r\n          this._removeFlag(this.FLAG_CLEAN_CONDITIONALLY);\r\n        } else {\r\n          // No luck after removing flags, just return the longest text we found during the different loops\r\n          this._attempts.sort(function (a, b) {\r\n            return b.textLength - a.textLength;\r\n          });\r\n\r\n          // But first check if we actually have something\r\n          if (!this._attempts[0].textLength) {\r\n            return null;\r\n          }\r\n\r\n          articleContent = this._attempts[0].articleContent;\r\n          parseSuccessful = true;\r\n        }\r\n      }\r\n\r\n      if (parseSuccessful) {\r\n        // Find out text direction from ancestors of final top candidate.\r\n        var ancestors = [parentOfTopCandidate, topCandidate].concat(\r\n          this._getNodeAncestors(parentOfTopCandidate)\r\n        );\r\n        this._someNode(ancestors, function (ancestor) {\r\n          if (!ancestor.tagName) {\r\n            return false;\r\n          }\r\n          var articleDir = ancestor.getAttribute(\"dir\");\r\n          if (articleDir) {\r\n            this._articleDir = articleDir;\r\n            return true;\r\n          }\r\n          return false;\r\n        });\r\n        return articleContent;\r\n      }\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Converts some of the common HTML entities in string to their corresponding characters.\r\n   *\r\n   * @param str {string} - a string to unescape.\r\n   * @return string without HTML entity.\r\n   */\r\n  _unescapeHtmlEntities(str) {\r\n    if (!str) {\r\n      return str;\r\n    }\r\n\r\n    var htmlEscapeMap = this.HTML_ESCAPE_MAP;\r\n    return str\r\n      .replace(/&(quot|amp|apos|lt|gt);/g, function (_, tag) {\r\n        return htmlEscapeMap[tag];\r\n      })\r\n      .replace(/&#(?:x([0-9a-f]+)|([0-9]+));/gi, function (_, hex, numStr) {\r\n        var num = parseInt(hex || numStr, hex ? 16 : 10);\r\n\r\n        // these character references are replaced by a conforming HTML parser\r\n        if (num == 0 || num > 0x10ffff || (num >= 0xd800 && num <= 0xdfff)) {\r\n          num = 0xfffd;\r\n        }\r\n\r\n        return String.fromCodePoint(num);\r\n      });\r\n  },\r\n\r\n  /**\r\n   * Try to extract metadata from JSON-LD object.\r\n   * For now, only Schema.org objects of type Article or its subtypes are supported.\r\n   * @return Object with any metadata that could be extracted (possibly none)\r\n   */\r\n  _getJSONLD(doc) {\r\n    var scripts = this._getAllNodesWithTag(doc, [\"script\"]);\r\n\r\n    var metadata;\r\n\r\n    this._forEachNode(scripts, function (jsonLdElement) {\r\n      if (\r\n        !metadata &&\r\n        jsonLdElement.getAttribute(\"type\") === \"application/ld+json\"\r\n      ) {\r\n        try {\r\n          // Strip CDATA markers if present\r\n          var content = jsonLdElement.textContent.replace(\r\n            /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g,\r\n            \"\"\r\n          );\r\n          var parsed = JSON.parse(content);\r\n\r\n          if (Array.isArray(parsed)) {\r\n            parsed = parsed.find(it => {\r\n              return (\r\n                it[\"@type\"] &&\r\n                it[\"@type\"].match(this.REGEXPS.jsonLdArticleTypes)\r\n              );\r\n            });\r\n            if (!parsed) {\r\n              return;\r\n            }\r\n          }\r\n\r\n          var schemaDotOrgRegex = /^https?\\:\\/\\/schema\\.org\\/?$/;\r\n          var matches =\r\n            (typeof parsed[\"@context\"] === \"string\" &&\r\n              parsed[\"@context\"].match(schemaDotOrgRegex)) ||\r\n            (typeof parsed[\"@context\"] === \"object\" &&\r\n              typeof parsed[\"@context\"][\"@vocab\"] == \"string\" &&\r\n              parsed[\"@context\"][\"@vocab\"].match(schemaDotOrgRegex));\r\n\r\n          if (!matches) {\r\n            return;\r\n          }\r\n\r\n          if (!parsed[\"@type\"] && Array.isArray(parsed[\"@graph\"])) {\r\n            parsed = parsed[\"@graph\"].find(it => {\r\n              return (it[\"@type\"] || \"\").match(this.REGEXPS.jsonLdArticleTypes);\r\n            });\r\n          }\r\n\r\n          if (\r\n            !parsed ||\r\n            !parsed[\"@type\"] ||\r\n            !parsed[\"@type\"].match(this.REGEXPS.jsonLdArticleTypes)\r\n          ) {\r\n            return;\r\n          }\r\n\r\n          metadata = {};\r\n\r\n          if (\r\n            typeof parsed.name === \"string\" &&\r\n            typeof parsed.headline === \"string\" &&\r\n            parsed.name !== parsed.headline\r\n          ) {\r\n            // we have both name and headline element in the JSON-LD. They should both be the same but some websites like aktualne.cz\r\n            // put their own name into \"name\" and the article title to \"headline\" which confuses Readability. So we try to check if either\r\n            // \"name\" or \"headline\" closely matches the html title, and if so, use that one. If not, then we use \"name\" by default.\r\n\r\n            var title = this._getArticleTitle();\r\n            var nameMatches = this._textSimilarity(parsed.name, title) > 0.75;\r\n            var headlineMatches =\r\n              this._textSimilarity(parsed.headline, title) > 0.75;\r\n\r\n            if (headlineMatches && !nameMatches) {\r\n              metadata.title = parsed.headline;\r\n            } else {\r\n              metadata.title = parsed.name;\r\n            }\r\n          } else if (typeof parsed.name === \"string\") {\r\n            metadata.title = parsed.name.trim();\r\n          } else if (typeof parsed.headline === \"string\") {\r\n            metadata.title = parsed.headline.trim();\r\n          }\r\n          if (parsed.author) {\r\n            if (typeof parsed.author.name === \"string\") {\r\n              metadata.byline = parsed.author.name.trim();\r\n            } else if (\r\n              Array.isArray(parsed.author) &&\r\n              parsed.author[0] &&\r\n              typeof parsed.author[0].name === \"string\"\r\n            ) {\r\n              metadata.byline = parsed.author\r\n                .filter(function (author) {\r\n                  return author && typeof author.name === \"string\";\r\n                })\r\n                .map(function (author) {\r\n                  return author.name.trim();\r\n                })\r\n                .join(\", \");\r\n            }\r\n          }\r\n          if (typeof parsed.description === \"string\") {\r\n            metadata.excerpt = parsed.description.trim();\r\n          }\r\n          if (parsed.publisher && typeof parsed.publisher.name === \"string\") {\r\n            metadata.siteName = parsed.publisher.name.trim();\r\n          }\r\n          if (typeof parsed.datePublished === \"string\") {\r\n            metadata.datePublished = parsed.datePublished.trim();\r\n          }\r\n        } catch (err) {\r\n          this.log(err.message);\r\n        }\r\n      }\r\n    });\r\n    return metadata ? metadata : {};\r\n  },\r\n\r\n  /**\r\n   * Attempts to get excerpt and byline metadata for the article.\r\n   *\r\n   * @param {Object} jsonld — object containing any metadata that\r\n   * could be extracted from JSON-LD object.\r\n   *\r\n   * @return Object with optional \"excerpt\" and \"byline\" properties\r\n   */\r\n  _getArticleMetadata(jsonld) {\r\n    var metadata = {};\r\n    var values = {};\r\n    var metaElements = this._doc.getElementsByTagName(\"meta\");\r\n\r\n    // property is a space-separated list of values\r\n    var propertyPattern =\r\n      /\\s*(article|dc|dcterm|og|twitter)\\s*:\\s*(author|creator|description|published_time|title|site_name)\\s*/gi;\r\n\r\n    // name is a single value\r\n    var namePattern =\r\n      /^\\s*(?:(dc|dcterm|og|twitter|parsely|weibo:(article|webpage))\\s*[-\\.:]\\s*)?(author|creator|pub-date|description|title|site_name)\\s*$/i;\r\n\r\n    // Find description tags.\r\n    this._forEachNode(metaElements, function (element) {\r\n      var elementName = element.getAttribute(\"name\");\r\n      var elementProperty = element.getAttribute(\"property\");\r\n      var content = element.getAttribute(\"content\");\r\n      if (!content) {\r\n        return;\r\n      }\r\n      var matches = null;\r\n      var name = null;\r\n\r\n      if (elementProperty) {\r\n        matches = elementProperty.match(propertyPattern);\r\n        if (matches) {\r\n          // Convert to lowercase, and remove any whitespace\r\n          // so we can match below.\r\n          name = matches[0].toLowerCase().replace(/\\s/g, \"\");\r\n          // multiple authors\r\n          values[name] = content.trim();\r\n        }\r\n      }\r\n      if (!matches && elementName && namePattern.test(elementName)) {\r\n        name = elementName;\r\n        if (content) {\r\n          // Convert to lowercase, remove any whitespace, and convert dots\r\n          // to colons so we can match below.\r\n          name = name.toLowerCase().replace(/\\s/g, \"\").replace(/\\./g, \":\");\r\n          values[name] = content.trim();\r\n        }\r\n      }\r\n    });\r\n\r\n    // get title\r\n    metadata.title =\r\n      jsonld.title ||\r\n      values[\"dc:title\"] ||\r\n      values[\"dcterm:title\"] ||\r\n      values[\"og:title\"] ||\r\n      values[\"weibo:article:title\"] ||\r\n      values[\"weibo:webpage:title\"] ||\r\n      values.title ||\r\n      values[\"twitter:title\"] ||\r\n      values[\"parsely-title\"];\r\n\r\n    if (!metadata.title) {\r\n      metadata.title = this._getArticleTitle();\r\n    }\r\n\r\n    const articleAuthor =\r\n      typeof values[\"article:author\"] === \"string\" &&\r\n      !this._isUrl(values[\"article:author\"])\r\n        ? values[\"article:author\"]\r\n        : undefined;\r\n\r\n    // get author\r\n    metadata.byline =\r\n      jsonld.byline ||\r\n      values[\"dc:creator\"] ||\r\n      values[\"dcterm:creator\"] ||\r\n      values.author ||\r\n      values[\"parsely-author\"] ||\r\n      articleAuthor;\r\n\r\n    // get description\r\n    metadata.excerpt =\r\n      jsonld.excerpt ||\r\n      values[\"dc:description\"] ||\r\n      values[\"dcterm:description\"] ||\r\n      values[\"og:description\"] ||\r\n      values[\"weibo:article:description\"] ||\r\n      values[\"weibo:webpage:description\"] ||\r\n      values.description ||\r\n      values[\"twitter:description\"];\r\n\r\n    // get site name\r\n    metadata.siteName = jsonld.siteName || values[\"og:site_name\"];\r\n\r\n    // get article published time\r\n    metadata.publishedTime =\r\n      jsonld.datePublished ||\r\n      values[\"article:published_time\"] ||\r\n      values[\"parsely-pub-date\"] ||\r\n      null;\r\n\r\n    // in many sites the meta value is escaped with HTML entities,\r\n    // so here we need to unescape it\r\n    metadata.title = this._unescapeHtmlEntities(metadata.title);\r\n    metadata.byline = this._unescapeHtmlEntities(metadata.byline);\r\n    metadata.excerpt = this._unescapeHtmlEntities(metadata.excerpt);\r\n    metadata.siteName = this._unescapeHtmlEntities(metadata.siteName);\r\n    metadata.publishedTime = this._unescapeHtmlEntities(metadata.publishedTime);\r\n\r\n    return metadata;\r\n  },\r\n\r\n  /**\r\n   * Check if node is image, or if node contains exactly only one image\r\n   * whether as a direct child or as its descendants.\r\n   *\r\n   * @param Element\r\n   **/\r\n  _isSingleImage(node) {\r\n    while (node) {\r\n      if (node.tagName === \"IMG\") {\r\n        return true;\r\n      }\r\n      if (node.children.length !== 1 || node.textContent.trim() !== \"\") {\r\n        return false;\r\n      }\r\n      node = node.children[0];\r\n    }\r\n    return false;\r\n  },\r\n\r\n  /**\r\n   * Find all <noscript> that are located after <img> nodes, and which contain only one\r\n   * <img> element. Replace the first image with the image from inside the <noscript> tag,\r\n   * and remove the <noscript> tag. This improves the quality of the images we use on\r\n   * some sites (e.g. Medium).\r\n   *\r\n   * @param Element\r\n   **/\r\n  _unwrapNoscriptImages(doc) {\r\n    // Find img without source or attributes that might contains image, and remove it.\r\n    // This is done to prevent a placeholder img is replaced by img from noscript in next step.\r\n    var imgs = Array.from(doc.getElementsByTagName(\"img\"));\r\n    this._forEachNode(imgs, function (img) {\r\n      for (var i = 0; i < img.attributes.length; i++) {\r\n        var attr = img.attributes[i];\r\n        switch (attr.name) {\r\n          case \"src\":\r\n          case \"srcset\":\r\n          case \"data-src\":\r\n          case \"data-srcset\":\r\n            return;\r\n        }\r\n\r\n        if (/\\.(jpg|jpeg|png|webp)/i.test(attr.value)) {\r\n          return;\r\n        }\r\n      }\r\n\r\n      img.remove();\r\n    });\r\n\r\n    // Next find noscript and try to extract its image\r\n    var noscripts = Array.from(doc.getElementsByTagName(\"noscript\"));\r\n    this._forEachNode(noscripts, function (noscript) {\r\n      // Parse content of noscript and make sure it only contains image\r\n      if (!this._isSingleImage(noscript)) {\r\n        return;\r\n      }\r\n      var tmp = doc.createElement(\"div\");\r\n      // We're running in the document context, and using unmodified\r\n      // document contents, so doing this should be safe.\r\n      // (Also we heavily discourage people from allowing script to\r\n      // run at all in this document...)\r\n      // eslint-disable-next-line no-unsanitized/property\r\n      tmp.innerHTML = noscript.innerHTML;\r\n\r\n      // If noscript has previous sibling and it only contains image,\r\n      // replace it with noscript content. However we also keep old\r\n      // attributes that might contains image.\r\n      var prevElement = noscript.previousElementSibling;\r\n      if (prevElement && this._isSingleImage(prevElement)) {\r\n        var prevImg = prevElement;\r\n        if (prevImg.tagName !== \"IMG\") {\r\n          prevImg = prevElement.getElementsByTagName(\"img\")[0];\r\n        }\r\n\r\n        var newImg = tmp.getElementsByTagName(\"img\")[0];\r\n        for (var i = 0; i < prevImg.attributes.length; i++) {\r\n          var attr = prevImg.attributes[i];\r\n          if (attr.value === \"\") {\r\n            continue;\r\n          }\r\n\r\n          if (\r\n            attr.name === \"src\" ||\r\n            attr.name === \"srcset\" ||\r\n            /\\.(jpg|jpeg|png|webp)/i.test(attr.value)\r\n          ) {\r\n            if (newImg.getAttribute(attr.name) === attr.value) {\r\n              continue;\r\n            }\r\n\r\n            var attrName = attr.name;\r\n            if (newImg.hasAttribute(attrName)) {\r\n              attrName = \"data-old-\" + attrName;\r\n            }\r\n\r\n            newImg.setAttribute(attrName, attr.value);\r\n          }\r\n        }\r\n\r\n        noscript.parentNode.replaceChild(tmp.firstElementChild, prevElement);\r\n      }\r\n    });\r\n  },\r\n\r\n  /**\r\n   * Removes script tags from the document.\r\n   *\r\n   * @param Element\r\n   **/\r\n  _removeScripts(doc) {\r\n    this._removeNodes(this._getAllNodesWithTag(doc, [\"script\", \"noscript\"]));\r\n  },\r\n\r\n  /**\r\n   * Check if this node has only whitespace and a single element with given tag\r\n   * Returns false if the DIV node contains non-empty text nodes\r\n   * or if it contains no element with given tag or more than 1 element.\r\n   *\r\n   * @param Element\r\n   * @param string tag of child element\r\n   **/\r\n  _hasSingleTagInsideElement(element, tag) {\r\n    // There should be exactly 1 element child with given tag\r\n    if (element.children.length != 1 || element.children[0].tagName !== tag) {\r\n      return false;\r\n    }\r\n\r\n    // And there should be no text nodes with real content\r\n    return !this._someNode(element.childNodes, function (node) {\r\n      return (\r\n        node.nodeType === this.TEXT_NODE &&\r\n        this.REGEXPS.hasContent.test(node.textContent)\r\n      );\r\n    });\r\n  },\r\n\r\n  _isElementWithoutContent(node) {\r\n    return (\r\n      node.nodeType === this.ELEMENT_NODE &&\r\n      !node.textContent.trim().length &&\r\n      (!node.children.length ||\r\n        node.children.length ==\r\n          node.getElementsByTagName(\"br\").length +\r\n            node.getElementsByTagName(\"hr\").length)\r\n    );\r\n  },\r\n\r\n  /**\r\n   * Determine whether element has any children block level elements.\r\n   *\r\n   * @param Element\r\n   */\r\n  _hasChildBlockElement(element) {\r\n    return this._someNode(element.childNodes, function (node) {\r\n      return (\r\n        this.DIV_TO_P_ELEMS.has(node.tagName) ||\r\n        this._hasChildBlockElement(node)\r\n      );\r\n    });\r\n  },\r\n\r\n  /***\r\n   * Determine if a node qualifies as phrasing content.\r\n   * https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Phrasing_content\r\n   **/\r\n  _isPhrasingContent(node) {\r\n    return (\r\n      node.nodeType === this.TEXT_NODE ||\r\n      this.PHRASING_ELEMS.includes(node.tagName) ||\r\n      ((node.tagName === \"A\" ||\r\n        node.tagName === \"DEL\" ||\r\n        node.tagName === \"INS\") &&\r\n        this._everyNode(node.childNodes, this._isPhrasingContent))\r\n    );\r\n  },\r\n\r\n  _isWhitespace(node) {\r\n    return (\r\n      (node.nodeType === this.TEXT_NODE &&\r\n        node.textContent.trim().length === 0) ||\r\n      (node.nodeType === this.ELEMENT_NODE && node.tagName === \"BR\")\r\n    );\r\n  },\r\n\r\n  /**\r\n   * Get the inner text of a node - cross browser compatibly.\r\n   * This also strips out any excess whitespace to be found.\r\n   *\r\n   * @param Element\r\n   * @param Boolean normalizeSpaces (default: true)\r\n   * @return string\r\n   **/\r\n  _getInnerText(e, normalizeSpaces) {\r\n    normalizeSpaces =\r\n      typeof normalizeSpaces === \"undefined\" ? true : normalizeSpaces;\r\n    var textContent = e.textContent.trim();\r\n\r\n    if (normalizeSpaces) {\r\n      return textContent.replace(this.REGEXPS.normalize, \" \");\r\n    }\r\n    return textContent;\r\n  },\r\n\r\n  /**\r\n   * Get the number of times a string s appears in the node e.\r\n   *\r\n   * @param Element\r\n   * @param string - what to split on. Default is \",\"\r\n   * @return number (integer)\r\n   **/\r\n  _getCharCount(e, s) {\r\n    s = s || \",\";\r\n    return this._getInnerText(e).split(s).length - 1;\r\n  },\r\n\r\n  /**\r\n   * Remove the style attribute on every e and under.\r\n   * TODO: Test if getElementsByTagName(*) is faster.\r\n   *\r\n   * @param Element\r\n   * @return void\r\n   **/\r\n  _cleanStyles(e) {\r\n    if (!e || e.tagName.toLowerCase() === \"svg\") {\r\n      return;\r\n    }\r\n\r\n    // Remove `style` and deprecated presentational attributes\r\n    for (var i = 0; i < this.PRESENTATIONAL_ATTRIBUTES.length; i++) {\r\n      e.removeAttribute(this.PRESENTATIONAL_ATTRIBUTES[i]);\r\n    }\r\n\r\n    if (this.DEPRECATED_SIZE_ATTRIBUTE_ELEMS.includes(e.tagName)) {\r\n      e.removeAttribute(\"width\");\r\n      e.removeAttribute(\"height\");\r\n    }\r\n\r\n    var cur = e.firstElementChild;\r\n    while (cur !== null) {\r\n      this._cleanStyles(cur);\r\n      cur = cur.nextElementSibling;\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Get the density of links as a percentage of the content\r\n   * This is the amount of text that is inside a link divided by the total text in the node.\r\n   *\r\n   * @param Element\r\n   * @return number (float)\r\n   **/\r\n  _getLinkDensity(element) {\r\n    var textLength = this._getInnerText(element).length;\r\n    if (textLength === 0) {\r\n      return 0;\r\n    }\r\n\r\n    var linkLength = 0;\r\n\r\n    // XXX implement _reduceNodeList?\r\n    this._forEachNode(element.getElementsByTagName(\"a\"), function (linkNode) {\r\n      var href = linkNode.getAttribute(\"href\");\r\n      var coefficient = href && this.REGEXPS.hashUrl.test(href) ? 0.3 : 1;\r\n      linkLength += this._getInnerText(linkNode).length * coefficient;\r\n    });\r\n\r\n    return linkLength / textLength;\r\n  },\r\n\r\n  /**\r\n   * Get an elements class/id weight. Uses regular expressions to tell if this\r\n   * element looks good or bad.\r\n   *\r\n   * @param Element\r\n   * @return number (Integer)\r\n   **/\r\n  _getClassWeight(e) {\r\n    if (!this._flagIsActive(this.FLAG_WEIGHT_CLASSES)) {\r\n      return 0;\r\n    }\r\n\r\n    var weight = 0;\r\n\r\n    // Look for a special classname\r\n    if (typeof e.className === \"string\" && e.className !== \"\") {\r\n      if (this.REGEXPS.negative.test(e.className)) {\r\n        weight -= 25;\r\n      }\r\n\r\n      if (this.REGEXPS.positive.test(e.className)) {\r\n        weight += 25;\r\n      }\r\n    }\r\n\r\n    // Look for a special ID\r\n    if (typeof e.id === \"string\" && e.id !== \"\") {\r\n      if (this.REGEXPS.negative.test(e.id)) {\r\n        weight -= 25;\r\n      }\r\n\r\n      if (this.REGEXPS.positive.test(e.id)) {\r\n        weight += 25;\r\n      }\r\n    }\r\n\r\n    return weight;\r\n  },\r\n\r\n  /**\r\n   * Clean a node of all elements of type \"tag\".\r\n   * (Unless it's a youtube/vimeo video. People love movies.)\r\n   *\r\n   * @param Element\r\n   * @param string tag to clean\r\n   * @return void\r\n   **/\r\n  _clean(e, tag) {\r\n    var isEmbed = [\"object\", \"embed\", \"iframe\"].includes(tag);\r\n\r\n    this._removeNodes(this._getAllNodesWithTag(e, [tag]), function (element) {\r\n      // Allow youtube and vimeo videos through as people usually want to see those.\r\n      if (isEmbed) {\r\n        // First, check the elements attributes to see if any of them contain youtube or vimeo\r\n        for (var i = 0; i < element.attributes.length; i++) {\r\n          if (this._allowedVideoRegex.test(element.attributes[i].value)) {\r\n            return false;\r\n          }\r\n        }\r\n\r\n        // For embed with <object> tag, check inner HTML as well.\r\n        if (\r\n          element.tagName === \"object\" &&\r\n          this._allowedVideoRegex.test(element.innerHTML)\r\n        ) {\r\n          return false;\r\n        }\r\n      }\r\n\r\n      return true;\r\n    });\r\n  },\r\n\r\n  /**\r\n   * Check if a given node has one of its ancestor tag name matching the\r\n   * provided one.\r\n   * @param  HTMLElement node\r\n   * @param  String      tagName\r\n   * @param  Number      maxDepth\r\n   * @param  Function    filterFn a filter to invoke to determine whether this node 'counts'\r\n   * @return Boolean\r\n   */\r\n  _hasAncestorTag(node, tagName, maxDepth, filterFn) {\r\n    maxDepth = maxDepth || 3;\r\n    tagName = tagName.toUpperCase();\r\n    var depth = 0;\r\n    while (node.parentNode) {\r\n      if (maxDepth > 0 && depth > maxDepth) {\r\n        return false;\r\n      }\r\n      if (\r\n        node.parentNode.tagName === tagName &&\r\n        (!filterFn || filterFn(node.parentNode))\r\n      ) {\r\n        return true;\r\n      }\r\n      node = node.parentNode;\r\n      depth++;\r\n    }\r\n    return false;\r\n  },\r\n\r\n  /**\r\n   * Return an object indicating how many rows and columns this table has.\r\n   */\r\n  _getRowAndColumnCount(table) {\r\n    var rows = 0;\r\n    var columns = 0;\r\n    var trs = table.getElementsByTagName(\"tr\");\r\n    for (var i = 0; i < trs.length; i++) {\r\n      var rowspan = trs[i].getAttribute(\"rowspan\") || 0;\r\n      if (rowspan) {\r\n        rowspan = parseInt(rowspan, 10);\r\n      }\r\n      rows += rowspan || 1;\r\n\r\n      // Now look for column-related info\r\n      var columnsInThisRow = 0;\r\n      var cells = trs[i].getElementsByTagName(\"td\");\r\n      for (var j = 0; j < cells.length; j++) {\r\n        var colspan = cells[j].getAttribute(\"colspan\") || 0;\r\n        if (colspan) {\r\n          colspan = parseInt(colspan, 10);\r\n        }\r\n        columnsInThisRow += colspan || 1;\r\n      }\r\n      columns = Math.max(columns, columnsInThisRow);\r\n    }\r\n    return { rows, columns };\r\n  },\r\n\r\n  /**\r\n   * Look for 'data' (as opposed to 'layout') tables, for which we use\r\n   * similar checks as\r\n   * https://searchfox.org/mozilla-central/rev/f82d5c549f046cb64ce5602bfd894b7ae807c8f8/accessible/generic/TableAccessible.cpp#19\r\n   */\r\n  _markDataTables(root) {\r\n    var tables = root.getElementsByTagName(\"table\");\r\n    for (var i = 0; i < tables.length; i++) {\r\n      var table = tables[i];\r\n      var role = table.getAttribute(\"role\");\r\n      if (role == \"presentation\") {\r\n        table._readabilityDataTable = false;\r\n        continue;\r\n      }\r\n      var datatable = table.getAttribute(\"datatable\");\r\n      if (datatable == \"0\") {\r\n        table._readabilityDataTable = false;\r\n        continue;\r\n      }\r\n      var summary = table.getAttribute(\"summary\");\r\n      if (summary) {\r\n        table._readabilityDataTable = true;\r\n        continue;\r\n      }\r\n\r\n      var caption = table.getElementsByTagName(\"caption\")[0];\r\n      if (caption && caption.childNodes.length) {\r\n        table._readabilityDataTable = true;\r\n        continue;\r\n      }\r\n\r\n      // If the table has a descendant with any of these tags, consider a data table:\r\n      var dataTableDescendants = [\"col\", \"colgroup\", \"tfoot\", \"thead\", \"th\"];\r\n      var descendantExists = function (tag) {\r\n        return !!table.getElementsByTagName(tag)[0];\r\n      };\r\n      if (dataTableDescendants.some(descendantExists)) {\r\n        this.log(\"Data table because found data-y descendant\");\r\n        table._readabilityDataTable = true;\r\n        continue;\r\n      }\r\n\r\n      // Nested tables indicate a layout table:\r\n      if (table.getElementsByTagName(\"table\")[0]) {\r\n        table._readabilityDataTable = false;\r\n        continue;\r\n      }\r\n\r\n      var sizeInfo = this._getRowAndColumnCount(table);\r\n\r\n      if (sizeInfo.columns == 1 || sizeInfo.rows == 1) {\r\n        // single colum/row tables are commonly used for page layout purposes.\r\n        table._readabilityDataTable = false;\r\n        continue;\r\n      }\r\n\r\n      if (sizeInfo.rows >= 10 || sizeInfo.columns > 4) {\r\n        table._readabilityDataTable = true;\r\n        continue;\r\n      }\r\n      // Now just go by size entirely:\r\n      table._readabilityDataTable = sizeInfo.rows * sizeInfo.columns > 10;\r\n    }\r\n  },\r\n\r\n  /* convert images and figures that have properties like data-src into images that can be loaded without JS */\r\n  _fixLazyImages(root) {\r\n    this._forEachNode(\r\n      this._getAllNodesWithTag(root, [\"img\", \"picture\", \"figure\"]),\r\n      function (elem) {\r\n        // In some sites (e.g. Kotaku), they put 1px square image as base64 data uri in the src attribute.\r\n        // So, here we check if the data uri is too short, just might as well remove it.\r\n        if (elem.src && this.REGEXPS.b64DataUrl.test(elem.src)) {\r\n          // Make sure it's not SVG, because SVG can have a meaningful image in under 133 bytes.\r\n          var parts = this.REGEXPS.b64DataUrl.exec(elem.src);\r\n          if (parts[1] === \"image/svg+xml\") {\r\n            return;\r\n          }\r\n\r\n          // Make sure this element has other attributes which contains image.\r\n          // If it doesn't, then this src is important and shouldn't be removed.\r\n          var srcCouldBeRemoved = false;\r\n          for (var i = 0; i < elem.attributes.length; i++) {\r\n            var attr = elem.attributes[i];\r\n            if (attr.name === \"src\") {\r\n              continue;\r\n            }\r\n\r\n            if (/\\.(jpg|jpeg|png|webp)/i.test(attr.value)) {\r\n              srcCouldBeRemoved = true;\r\n              break;\r\n            }\r\n          }\r\n\r\n          // Here we assume if image is less than 100 bytes (or 133 after encoded to base64)\r\n          // it will be too small, therefore it might be placeholder image.\r\n          if (srcCouldBeRemoved) {\r\n            var b64starts = parts[0].length;\r\n            var b64length = elem.src.length - b64starts;\r\n            if (b64length < 133) {\r\n              elem.removeAttribute(\"src\");\r\n            }\r\n          }\r\n        }\r\n\r\n        // also check for \"null\" to work around https://github.com/jsdom/jsdom/issues/2580\r\n        if (\r\n          (elem.src || (elem.srcset && elem.srcset != \"null\")) &&\r\n          !elem.className.toLowerCase().includes(\"lazy\")\r\n        ) {\r\n          return;\r\n        }\r\n\r\n        for (var j = 0; j < elem.attributes.length; j++) {\r\n          attr = elem.attributes[j];\r\n          if (\r\n            attr.name === \"src\" ||\r\n            attr.name === \"srcset\" ||\r\n            attr.name === \"alt\"\r\n          ) {\r\n            continue;\r\n          }\r\n          var copyTo = null;\r\n          if (/\\.(jpg|jpeg|png|webp)\\s+\\d/.test(attr.value)) {\r\n            copyTo = \"srcset\";\r\n          } else if (/^\\s*\\S+\\.(jpg|jpeg|png|webp)\\S*\\s*$/.test(attr.value)) {\r\n            copyTo = \"src\";\r\n          }\r\n          if (copyTo) {\r\n            //if this is an img or picture, set the attribute directly\r\n            if (elem.tagName === \"IMG\" || elem.tagName === \"PICTURE\") {\r\n              elem.setAttribute(copyTo, attr.value);\r\n            } else if (\r\n              elem.tagName === \"FIGURE\" &&\r\n              !this._getAllNodesWithTag(elem, [\"img\", \"picture\"]).length\r\n            ) {\r\n              //if the item is a <figure> that does not contain an image or picture, create one and place it inside the figure\r\n              //see the nytimes-3 testcase for an example\r\n              var img = this._doc.createElement(\"img\");\r\n              img.setAttribute(copyTo, attr.value);\r\n              elem.appendChild(img);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    );\r\n  },\r\n\r\n  _getTextDensity(e, tags) {\r\n    var textLength = this._getInnerText(e, true).length;\r\n    if (textLength === 0) {\r\n      return 0;\r\n    }\r\n    var childrenLength = 0;\r\n    var children = this._getAllNodesWithTag(e, tags);\r\n    this._forEachNode(\r\n      children,\r\n      child => (childrenLength += this._getInnerText(child, true).length)\r\n    );\r\n    return childrenLength / textLength;\r\n  },\r\n\r\n  /**\r\n   * Clean an element of all tags of type \"tag\" if they look fishy.\r\n   * \"Fishy\" is an algorithm based on content length, classnames, link density, number of images & embeds, etc.\r\n   *\r\n   * @return void\r\n   **/\r\n  _cleanConditionally(e, tag) {\r\n    if (!this._flagIsActive(this.FLAG_CLEAN_CONDITIONALLY)) {\r\n      return;\r\n    }\r\n\r\n    // Gather counts for other typical elements embedded within.\r\n    // Traverse backwards so we can remove nodes at the same time\r\n    // without effecting the traversal.\r\n    //\r\n    // TODO: Consider taking into account original contentScore here.\r\n    this._removeNodes(this._getAllNodesWithTag(e, [tag]), function (node) {\r\n      // First check if this node IS data table, in which case don't remove it.\r\n      var isDataTable = function (t) {\r\n        return t._readabilityDataTable;\r\n      };\r\n\r\n      var isList = tag === \"ul\" || tag === \"ol\";\r\n      if (!isList) {\r\n        var listLength = 0;\r\n        var listNodes = this._getAllNodesWithTag(node, [\"ul\", \"ol\"]);\r\n        this._forEachNode(\r\n          listNodes,\r\n          list => (listLength += this._getInnerText(list).length)\r\n        );\r\n        isList = listLength / this._getInnerText(node).length > 0.9;\r\n      }\r\n\r\n      if (tag === \"table\" && isDataTable(node)) {\r\n        return false;\r\n      }\r\n\r\n      // Next check if we're inside a data table, in which case don't remove it as well.\r\n      if (this._hasAncestorTag(node, \"table\", -1, isDataTable)) {\r\n        return false;\r\n      }\r\n\r\n      if (this._hasAncestorTag(node, \"code\")) {\r\n        return false;\r\n      }\r\n\r\n      // keep element if it has a data tables\r\n      if (\r\n        [...node.getElementsByTagName(\"table\")].some(\r\n          tbl => tbl._readabilityDataTable\r\n        )\r\n      ) {\r\n        return false;\r\n      }\r\n\r\n      var weight = this._getClassWeight(node);\r\n\r\n      this.log(\"Cleaning Conditionally\", node);\r\n\r\n      var contentScore = 0;\r\n\r\n      if (weight + contentScore < 0) {\r\n        return true;\r\n      }\r\n\r\n      if (this._getCharCount(node, \",\") < 10) {\r\n        // If there are not very many commas, and the number of\r\n        // non-paragraph elements is more than paragraphs or other\r\n        // ominous signs, remove the element.\r\n        var p = node.getElementsByTagName(\"p\").length;\r\n        var img = node.getElementsByTagName(\"img\").length;\r\n        var li = node.getElementsByTagName(\"li\").length - 100;\r\n        var input = node.getElementsByTagName(\"input\").length;\r\n        var headingDensity = this._getTextDensity(node, [\r\n          \"h1\",\r\n          \"h2\",\r\n          \"h3\",\r\n          \"h4\",\r\n          \"h5\",\r\n          \"h6\",\r\n        ]);\r\n\r\n        var embedCount = 0;\r\n        var embeds = this._getAllNodesWithTag(node, [\r\n          \"object\",\r\n          \"embed\",\r\n          \"iframe\",\r\n        ]);\r\n\r\n        for (var i = 0; i < embeds.length; i++) {\r\n          // If this embed has attribute that matches video regex, don't delete it.\r\n          for (var j = 0; j < embeds[i].attributes.length; j++) {\r\n            if (this._allowedVideoRegex.test(embeds[i].attributes[j].value)) {\r\n              return false;\r\n            }\r\n          }\r\n\r\n          // For embed with <object> tag, check inner HTML as well.\r\n          if (\r\n            embeds[i].tagName === \"object\" &&\r\n            this._allowedVideoRegex.test(embeds[i].innerHTML)\r\n          ) {\r\n            return false;\r\n          }\r\n\r\n          embedCount++;\r\n        }\r\n\r\n        var innerText = this._getInnerText(node);\r\n\r\n        // toss any node whose inner text contains nothing but suspicious words\r\n        if (\r\n          this.REGEXPS.adWords.test(innerText) ||\r\n          this.REGEXPS.loadingWords.test(innerText)\r\n        ) {\r\n          return true;\r\n        }\r\n\r\n        var contentLength = innerText.length;\r\n        var linkDensity = this._getLinkDensity(node);\r\n        var textishTags = [\"SPAN\", \"LI\", \"TD\"].concat(\r\n          Array.from(this.DIV_TO_P_ELEMS)\r\n        );\r\n        var textDensity = this._getTextDensity(node, textishTags);\r\n        var isFigureChild = this._hasAncestorTag(node, \"figure\");\r\n\r\n        // apply shadiness checks, then check for exceptions\r\n        const shouldRemoveNode = () => {\r\n          const errs = [];\r\n          if (!isFigureChild && img > 1 && p / img < 0.5) {\r\n            errs.push(`Bad p to img ratio (img=${img}, p=${p})`);\r\n          }\r\n          if (!isList && li > p) {\r\n            errs.push(`Too many li's outside of a list. (li=${li} > p=${p})`);\r\n          }\r\n          if (input > Math.floor(p / 3)) {\r\n            errs.push(`Too many inputs per p. (input=${input}, p=${p})`);\r\n          }\r\n          if (\r\n            !isList &&\r\n            !isFigureChild &&\r\n            headingDensity < 0.9 &&\r\n            contentLength < 25 &&\r\n            (img === 0 || img > 2) &&\r\n            linkDensity > 0\r\n          ) {\r\n            errs.push(\r\n              `Suspiciously short. (headingDensity=${headingDensity}, img=${img}, linkDensity=${linkDensity})`\r\n            );\r\n          }\r\n          if (\r\n            !isList &&\r\n            weight < 25 &&\r\n            linkDensity > 0.2 + this._linkDensityModifier\r\n          ) {\r\n            errs.push(\r\n              `Low weight and a little linky. (linkDensity=${linkDensity})`\r\n            );\r\n          }\r\n          if (weight >= 25 && linkDensity > 0.5 + this._linkDensityModifier) {\r\n            errs.push(\r\n              `High weight and mostly links. (linkDensity=${linkDensity})`\r\n            );\r\n          }\r\n          if ((embedCount === 1 && contentLength < 75) || embedCount > 1) {\r\n            errs.push(\r\n              `Suspicious embed. (embedCount=${embedCount}, contentLength=${contentLength})`\r\n            );\r\n          }\r\n          if (img === 0 && textDensity === 0) {\r\n            errs.push(\r\n              `No useful content. (img=${img}, textDensity=${textDensity})`\r\n            );\r\n          }\r\n\r\n          if (errs.length) {\r\n            this.log(\"Checks failed\", errs);\r\n            return true;\r\n          }\r\n\r\n          return false;\r\n        };\r\n\r\n        var haveToRemove = shouldRemoveNode();\r\n\r\n        // Allow simple lists of images to remain in pages\r\n        if (isList && haveToRemove) {\r\n          for (var x = 0; x < node.children.length; x++) {\r\n            let child = node.children[x];\r\n            // Don't filter in lists with li's that contain more than one child\r\n            if (child.children.length > 1) {\r\n              return haveToRemove;\r\n            }\r\n          }\r\n          let li_count = node.getElementsByTagName(\"li\").length;\r\n          // Only allow the list to remain if every li contains an image\r\n          if (img == li_count) {\r\n            return false;\r\n          }\r\n        }\r\n        return haveToRemove;\r\n      }\r\n      return false;\r\n    });\r\n  },\r\n\r\n  /**\r\n   * Clean out elements that match the specified conditions\r\n   *\r\n   * @param Element\r\n   * @param Function determines whether a node should be removed\r\n   * @return void\r\n   **/\r\n  _cleanMatchedNodes(e, filter) {\r\n    var endOfSearchMarkerNode = this._getNextNode(e, true);\r\n    var next = this._getNextNode(e);\r\n    while (next && next != endOfSearchMarkerNode) {\r\n      if (filter.call(this, next, next.className + \" \" + next.id)) {\r\n        next = this._removeAndGetNext(next);\r\n      } else {\r\n        next = this._getNextNode(next);\r\n      }\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Clean out spurious headers from an Element.\r\n   *\r\n   * @param Element\r\n   * @return void\r\n   **/\r\n  _cleanHeaders(e) {\r\n    let headingNodes = this._getAllNodesWithTag(e, [\"h1\", \"h2\"]);\r\n    this._removeNodes(headingNodes, function (node) {\r\n      let shouldRemove = this._getClassWeight(node) < 0;\r\n      if (shouldRemove) {\r\n        this.log(\"Removing header with low class weight:\", node);\r\n      }\r\n      return shouldRemove;\r\n    });\r\n  },\r\n\r\n  /**\r\n   * Check if this node is an H1 or H2 element whose content is mostly\r\n   * the same as the article title.\r\n   *\r\n   * @param Element  the node to check.\r\n   * @return boolean indicating whether this is a title-like header.\r\n   */\r\n  _headerDuplicatesTitle(node) {\r\n    if (node.tagName != \"H1\" && node.tagName != \"H2\") {\r\n      return false;\r\n    }\r\n    var heading = this._getInnerText(node, false);\r\n    this.log(\"Evaluating similarity of header:\", heading, this._articleTitle);\r\n    return this._textSimilarity(this._articleTitle, heading) > 0.75;\r\n  },\r\n\r\n  _flagIsActive(flag) {\r\n    return (this._flags & flag) > 0;\r\n  },\r\n\r\n  _removeFlag(flag) {\r\n    this._flags = this._flags & ~flag;\r\n  },\r\n\r\n  _isProbablyVisible(node) {\r\n    // Have to null-check node.style and node.className.includes to deal with SVG and MathML nodes.\r\n    return (\r\n      (!node.style || node.style.display != \"none\") &&\r\n      (!node.style || node.style.visibility != \"hidden\") &&\r\n      !node.hasAttribute(\"hidden\") &&\r\n      //check for \"fallback-image\" so that wikimedia math images are displayed\r\n      (!node.hasAttribute(\"aria-hidden\") ||\r\n        node.getAttribute(\"aria-hidden\") != \"true\" ||\r\n        (node.className &&\r\n          node.className.includes &&\r\n          node.className.includes(\"fallback-image\")))\r\n    );\r\n  },\r\n\r\n  /**\r\n   * Runs readability.\r\n   *\r\n   * Workflow:\r\n   *  1. Prep the document by removing script tags, css, etc.\r\n   *  2. Build readability's DOM tree.\r\n   *  3. Grab the article content from the current dom tree.\r\n   *  4. Replace the current DOM tree with the new one.\r\n   *  5. Read peacefully.\r\n   *\r\n   * @return void\r\n   **/\r\n  parse() {\r\n    // Avoid parsing too large documents, as per configuration option\r\n    if (this._maxElemsToParse > 0) {\r\n      var numTags = this._doc.getElementsByTagName(\"*\").length;\r\n      if (numTags > this._maxElemsToParse) {\r\n        throw new Error(\r\n          \"Aborting parsing document; \" + numTags + \" elements found\"\r\n        );\r\n      }\r\n    }\r\n\r\n    // Unwrap image from noscript\r\n    this._unwrapNoscriptImages(this._doc);\r\n\r\n    // Extract JSON-LD metadata before removing scripts\r\n    var jsonLd = this._disableJSONLD ? {} : this._getJSONLD(this._doc);\r\n\r\n    // Remove script tags from the document.\r\n    this._removeScripts(this._doc);\r\n\r\n    this._prepDocument();\r\n\r\n    var metadata = this._getArticleMetadata(jsonLd);\r\n    this._metadata = metadata;\r\n    this._articleTitle = metadata.title;\r\n\r\n    var articleContent = this._grabArticle();\r\n    if (!articleContent) {\r\n      return null;\r\n    }\r\n\r\n    this.log(\"Grabbed: \" + articleContent.innerHTML);\r\n\r\n    this._postProcessContent(articleContent);\r\n\r\n    // If we haven't found an excerpt in the article's metadata, use the article's\r\n    // first paragraph as the excerpt. This is used for displaying a preview of\r\n    // the article's content.\r\n    if (!metadata.excerpt) {\r\n      var paragraphs = articleContent.getElementsByTagName(\"p\");\r\n      if (paragraphs.length) {\r\n        metadata.excerpt = paragraphs[0].textContent.trim();\r\n      }\r\n    }\r\n\r\n    var textContent = articleContent.textContent;\r\n    return {\r\n      title: this._articleTitle,\r\n      byline: metadata.byline || this._articleByline,\r\n      dir: this._articleDir,\r\n      lang: this._articleLang,\r\n      content: this._serializer(articleContent),\r\n      textContent,\r\n      length: textContent.length,\r\n      excerpt: metadata.excerpt,\r\n      siteName: metadata.siteName || this._articleSiteName,\r\n      publishedTime: metadata.publishedTime,\r\n    };\r\n  },\r\n};\r\n\r\nif (typeof module === \"object\") {\r\n  /* eslint-disable-next-line no-redeclare */\r\n  /* global module */\r\n  module.exports = Readability;\r\n}\r\n"
  },
  {
    "path": "src/lib/rest-form-api/index.js",
    "content": "/*\n * Copyright 2010-2024 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * author: gildas.lormeau <at> gmail.com\n * author: dcardin2007 <at> gmail.com\n *\n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or\n *   modify it under the terms of the GNU Affero General Public License\n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n *\n *   The code in this file is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero\n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may\n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU\n *   AGPL normally required by section 4, provided you include this license\n *   notice and a URL through which recipients can access the Corresponding\n *   Source.\n */\n\n/* global fetch, Blob, AbortController, FormData */\n\nconst AUTHORIZATION_HEADER = \"Authorization\";\nconst BEARER_PREFIX_AUTHORIZATION = \"Bearer \";\nconst ACCEPT_HEADER = \"Accept\";\nconst CONTENT_TYPE = \"application/json\";\n\nexport { RestFormApi };\n\nclass RestFormApi {\n\tconstructor(token, restApiUrl, fileFieldName, urlFieldName) {\n\t\tthis.headers = new Map([\n\t\t\t[AUTHORIZATION_HEADER, BEARER_PREFIX_AUTHORIZATION + token],\n\t\t\t[ACCEPT_HEADER, CONTENT_TYPE]\n\t\t]);\n\t\tthis.restApiUrl = restApiUrl;\n\t\tthis.fileFieldName = fileFieldName;\n\t\tthis.urlFieldName = urlFieldName;\n\t}\n\n\tasync upload(filename, content, url) {\n\t\tthis.controller = new AbortController();\n\t\tconst blob = content instanceof Blob ? content : new Blob([content], { type: \"text/html\" });\n\t\tlet formData = new FormData();\n\t\tif (this.fileFieldName) {\n\t\t\tformData.append(this.fileFieldName, blob, filename);\n\t\t}\n\t\tif (this.urlFieldName) {\n\t\t\tformData.append(this.urlFieldName, url);\n\t\t}\n\t\tconst response = await fetch(this.restApiUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: formData,\n\t\t\theaders: this.headers,\n\t\t\tsignal: this.controller.signal\n\t\t});\n\t\tif ([200, 201, 202].includes(response.status)) {\n\t\t\treturn response.json();\n\t\t} else {\n\t\t\tthrow new Error(await response.text());\n\t\t}\n\t}\n\n\tabort() {\n\t\tif (this.controller) {\n\t\t\tthis.controller.abort();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lib/s3/s3.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global crypto, TextEncoder, fetch, URLSearchParams, AbortController, Response */\n\nconst EMPTY_STRING = \"\";\nconst CONFLICT_ACTION_UNIQUIFY = \"uniquify\";\nconst CONFLICT_ACTION_OVERWRITE = \"overwrite\";\nconst CONFLICT_ACTION_PROMPT = \"prompt\";\nconst EXTENSION_SEPARATOR = \".\";\nconst INDEX_FILENAME_PREFIX = \" (\";\nconst INDEX_FILENAME_SUFFIX = \")\";\nconst INDEX_FILENAME_REGEXP = /\\s\\((\\d+)\\)$/;\nconst ABORT_ERROR_NAME = \"AbortError\";\nconst S3_SERVICE = \"s3\";\nconst S3_DOMAIN = S3_SERVICE + \".amazonaws.com\";\n\nexport { S3 };\n\nclass S3 {\n\tconstructor(region, bucket, accessKey, secretKey, domain = S3_DOMAIN) {\n\t\tthis.api = new API({ domain, region, bucket, accessKey, secretKey });\n\t\tthis.headObjectSupported = true;\n\t\tthis.listObjectsSupported = true;\n\t}\n\n\tasync upload(path, blob, options) {\n\t\tconst { filenameConflictAction, prompt } = options;\n\t\tthis.controller = new AbortController();\n\t\toptions.signal = this.controller.signal;\n\t\ttry {\n\t\t\tif (filenameConflictAction == CONFLICT_ACTION_OVERWRITE) {\n\t\t\t\treturn this.api.putObject({ path }, { body: await getUint8Array(blob) });\n\t\t\t} else {\n\t\t\t\tlet response;\n\t\t\t\tif (this.headObjectSupported) {\n\t\t\t\t\tresponse = await this.api.headObject({ path }, options);\n\t\t\t\t}\n\t\t\t\tif (!this.headObjectSupported || response.status == 403) {\n\t\t\t\t\tthis.headObjectSupported = false;\n\t\t\t\t\tif (this.listObjectsSupported) {\n\t\t\t\t\t\tresponse = await this.api.listObjects({ path }, options);\n\t\t\t\t\t}\n\t\t\t\t\tif (!this.listObjectsSupported || response.status == 403) {\n\t\t\t\t\t\tthis.listObjectsSupported = false;\n\t\t\t\t\t\tresponse = await this.api.getObject({ path }, options);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (response.status == 200) {\n\t\t\t\t\tif (filenameConflictAction == CONFLICT_ACTION_PROMPT) {\n\t\t\t\t\t\tif (prompt) {\n\t\t\t\t\t\t\tpath = await prompt(path);\n\t\t\t\t\t\t\tif (path) {\n\t\t\t\t\t\t\t\treturn this.upload(path, blob, options);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn response;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toptions.filenameConflictAction = CONFLICT_ACTION_UNIQUIFY;\n\t\t\t\t\t\t\treturn this.upload(path, blob, options);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (filenameConflictAction == CONFLICT_ACTION_UNIQUIFY) {\n\t\t\t\t\t\tconst { filenameWithoutExtension, extension, indexFilename } = splitFilename(path);\n\t\t\t\t\t\toptions.indexFilename = indexFilename + 1;\n\t\t\t\t\t\tpath = getFilename(filenameWithoutExtension, options.indexFilename, extension);\n\t\t\t\t\t\treturn this.upload(path, blob, options);\n\t\t\t\t\t}\n\t\t\t\t} else if (response.status == 404) {\n\t\t\t\t\tblob = new Uint8Array(await blob.arrayBuffer());\n\t\t\t\t\treturn this.api.putObject({ path }, { body: await getUint8Array(blob) });\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(response.statusText || \"Error \" + response.status);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error.name != ABORT_ERROR_NAME) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\tabort() {\n\t\tif (this.controller) {\n\t\t\tthis.controller.abort();\n\t\t}\n\t}\n}\n\nasync function getUint8Array(blob) {\n\treturn new Uint8Array(await new Response(blob).arrayBuffer());\n}\n\nfunction splitFilename(filename) {\n\tlet filenameWithoutExtension = filename;\n\tlet extension = EMPTY_STRING;\n\tconst indexExtensionSeparator = filename.lastIndexOf(EXTENSION_SEPARATOR);\n\tif (indexExtensionSeparator > -1) {\n\t\tfilenameWithoutExtension = filename.substring(0, indexExtensionSeparator);\n\t\textension = filename.substring(indexExtensionSeparator + 1);\n\t}\n\tlet indexFilename;\n\t({ filenameWithoutExtension, indexFilename } = extractIndexFilename(filenameWithoutExtension));\n\treturn { filenameWithoutExtension, extension, indexFilename };\n}\n\nfunction extractIndexFilename(filenameWithoutExtension) {\n\tconst indexFilenameMatch = filenameWithoutExtension.match(INDEX_FILENAME_REGEXP);\n\tlet indexFilename = 0;\n\tif (indexFilenameMatch && indexFilenameMatch.length > 1) {\n\t\tconst parsedIndexFilename = Number(indexFilenameMatch[indexFilenameMatch.length - 1]);\n\t\tif (!Number.isNaN(parsedIndexFilename)) {\n\t\t\tindexFilename = parsedIndexFilename;\n\t\t\tfilenameWithoutExtension = filenameWithoutExtension.replace(INDEX_FILENAME_REGEXP, EMPTY_STRING);\n\t\t}\n\t}\n\treturn { filenameWithoutExtension, indexFilename };\n}\n\nfunction getFilename(filenameWithoutExtension, indexFilename, extension) {\n\treturn filenameWithoutExtension +\n\t\tINDEX_FILENAME_PREFIX + indexFilename + INDEX_FILENAME_SUFFIX +\n\t\t(extension ? EXTENSION_SEPARATOR + extension : EMPTY_STRING);\n}\n\nconst AWS4 = \"AWS4\";\nconst AWS4_ALGORITHM = AWS4 + \"-HMAC-SHA256\";\nconst AWS4_REQUEST = \"aws4_request\";\n\nconst GET_METHOD = \"GET\";\nconst PUT_METHOD = \"PUT\";\nconst HEAD_METHOD = \"HEAD\";\n\nclass API {\n\tconstructor({ domain, region, bucket, accessKey, secretKey }) {\n\t\tthis.domain = domain;\n\t\tthis.region = region;\n\t\tthis.bucket = bucket;\n\t\tthis.accessKey = accessKey;\n\t\tthis.secretKey = secretKey;\n\t}\n\n\tasync putObject({ path }, { headers = {}, body }) {\n\t\treturn fetchS3(this, { path }, { method: PUT_METHOD, headers, body });\n\t}\n\n\tasync getObject({ path }, { headers = {} } = {}) {\n\t\treturn fetchS3(this, { path }, { method: GET_METHOD, headers });\n\t}\n\n\tasync headObject({ path }, { headers = {} } = {}) {\n\t\treturn fetchS3(this, { path }, { method: HEAD_METHOD, headers });\n\t}\n\n\tasync listObjects({ path }, { headers = {}, continuationToken, delimiter, encodingType, prefix, maxKeys } = {}) {\n\t\tconst searchParams = new URLSearchParams();\n\t\tsearchParams.set(\"list-type\", \"2\");\n\t\tif (continuationToken) {\n\t\t\tsearchParams.set(\"continuation-token\", continuationToken);\n\t\t}\n\t\tif (delimiter) {\n\t\t\tsearchParams.set(\"delimiter\", delimiter);\n\t\t}\n\t\tif (encodingType) {\n\t\t\tsearchParams.set(\"encoding-type\", encodingType);\n\t\t}\n\t\tif (prefix) {\n\t\t\tsearchParams.set(\"prefix\", prefix);\n\t\t}\n\t\tif (maxKeys) {\n\t\t\tsearchParams.set(\"max-keys\", maxKeys);\n\t\t}\n\t\treturn fetchS3(this, { path, searchParams }, { method: \"GET\", headers });\n\t}\n}\n\nasync function fetchS3({ region, bucket, accessKey, secretKey, domain }, { path = \"/\", searchParams = new URLSearchParams() }, { method, headers = {}, body }) {\n\tconst date = new Date();\n\tconst isoDate = getISODate(date);\n\tconst service = S3_SERVICE;\n\tif (!path.startsWith(\"/\")) {\n\t\tpath = \"/\" + path;\n\t}\n\theaders.host = bucket + \".\" + domain;\n\tif (body) {\n\t\theaders[\"content-length\"] = body.byteLength;\n\t}\n\theaders[\"x-amz-content-sha256\"] = await getHexHash(body);\n\theaders[\"x-amz-date\"] = isoDate;\n\theaders.authorization = AWS4_ALGORITHM + \" \" +\n\t\t\"Credential=\" + accessKey + \"/\" + getCredentialScope(isoDate, region, service) + \",\" +\n\t\t\"SignedHeaders=\" + getSignedHeaders(headers) + \",\" +\n\t\t\"Signature=\" + await getSignature({ region, secretKey, service }, { path, searchParams }, { method, headers, body, isoDate });\n\tconst url = \"https://\" + bucket + \".\" + domain + path + (searchParams.size ? \"?\" + searchParams : \"\");\n\tconst options = { method, headers };\n\tif (body) {\n\t\toptions.body = body;\n\t}\n\treturn fetch(url, options);\n}\n\nasync function getSignature({ region, secretKey, service }, { path, searchParams }, { method, headers, body, isoDate }) {\n\tconst stringToSign = await getStringToSign(path, searchParams, headers, body, isoDate, region, method, service);\n\tconst signingKey = await getSigningKey(secretKey, isoDate, region, service);\n\tconst signature = await getHMAC(signingKey, getEncodedText(stringToSign));\n\treturn getHexadecimal(signature);\n}\n\nasync function getStringToSign(path, searchParams, headers, body, isoDate, region, method, service) {\n\tconst canonicalRequest = await getCanonicalRequest(path, searchParams, headers, method, body);\n\treturn AWS4_ALGORITHM + \"\\n\" +\n\t\tisoDate + \"\\n\" +\n\t\tgetCredentialScope(isoDate, region, service) + \"\\n\" +\n\t\tgetHexadecimal(await getHashSHA256(getEncodedText(canonicalRequest)));\n}\n\nasync function getCanonicalRequest(path, searchParams, headers, method, body = new Uint8Array(0)) {\n\treturn method + \"\\n\" +\n\t\tgetCanonicalURI(path) + \"\\n\" +\n\t\tgetCanonicalQuery(searchParams) + \"\\n\" +\n\t\tgetCanonicalHeaders(headers) + \"\\n\" +\n\t\tgetSignedHeaders(headers) + \"\\n\" +\n\t\tawait getHexHash(body);\n}\n\nfunction getCanonicalURI(path) {\n\treturn decodeURIComponent(path).replace(/[^A-Za-z0-9-._~/]/g, encodeHexadecimal);\n}\n\nfunction encodeHexadecimal(character) {\n\tlet result = encodeURIComponent(character);\n\tif (result.startsWith(\"%\")) {\n\t\tresult = result.toUpperCase();\n\t} else {\n\t\tresult = \"%\" + result.charCodeAt(0).toString(16).toUpperCase();\n\t}\n\treturn result;\n}\n\nfunction getCanonicalQuery(searchParams) {\n\tif (searchParams) {\n\t\tlet result = \"\";\n\t\tsearchParams.sort();\n\t\tfor (const [key, value] of searchParams) {\n\t\t\tresult += encodeURIComponent(key) + \"=\" + encodeURIComponent(value) + \"&\";\n\t\t}\n\t\treturn result.slice(0, -1);\n\t} else {\n\t\treturn \"\";\n\t}\n}\n\nfunction getCanonicalHeaders(headers) {\n\tlet result = \"\";\n\tconst sortedHeaders = Object.keys(headers).sort();\n\tfor (const header of sortedHeaders) {\n\t\tresult += header + \":\" + headers[header] + \"\\n\";\n\t}\n\treturn result;\n}\n\nfunction getSignedHeaders(headers) {\n\treturn Object.keys(headers).map(header => header.toLowerCase()).sort().join(\";\");\n}\n\nasync function getHexHash(body = new Uint8Array(0)) {\n\treturn getHexadecimal(await getHashSHA256(body));\n}\n\nfunction getCredentialScope(isoDate, region, service) {\n\treturn isoDate.substring(0, 8) + \"/\" + region + \"/\" + service + \"/\" + AWS4_REQUEST;\n}\n\nasync function getSigningKey(secretKey, isoDate, region, service) {\n\tconst dateKey = await getHMAC(getEncodedText(AWS4 + secretKey), getEncodedText(isoDate.substring(0, 8)));\n\tconst dateRegionKey = await getHMAC(dateKey, getEncodedText(region));\n\tconst dateRegionServiceKey = await getHMAC(dateRegionKey, getEncodedText(service));\n\treturn getHMAC(dateRegionServiceKey, getEncodedText(AWS4_REQUEST));\n}\n\nasync function getHashSHA256(value) {\n\treturn crypto.subtle.digest(\"SHA-256\", value);\n}\n\nasync function getHMAC(key, value) {\n\tconst algorithm = { name: \"HMAC\", hash: { name: \"SHA-256\" } };\n\tconst importedKey = await crypto.subtle.importKey(\"raw\", key, algorithm, false, [\"sign\"]);\n\treturn crypto.subtle.sign(algorithm, importedKey, value);\n}\n\nfunction getEncodedText(text) {\n\treturn new TextEncoder().encode(text);\n}\n\nfunction getHexadecimal(hash) {\n\treturn Array.from(new Uint8Array(hash)).map(byte => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction getISODate(date) {\n\tconst result = new Date(date);\n\treturn result.toISOString().replace(/[:-]|\\.\\d{3}/g, \"\");\n}"
  },
  {
    "path": "src/lib/single-file/background.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\nimport \"./browser-polyfill/chrome-browser-polyfill.js\";\nimport \"./fetch/bg/fetch.js\";\nimport \"./frame-tree/bg/frame-tree.js\";\nimport \"./lazy/bg/lazy-timeout.js\";"
  },
  {
    "path": "src/lib/single-file/browser-polyfill/chrome-browser-polyfill.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global window */\n\nif (typeof globalThis == \"undefined\") {\n\twindow.globalThis = window;\n}\n\n(() => {\n\n\tconst nativeAPI = globalThis.chrome;\n\tglobalThis.__defineGetter__(\"browser\", () => ({\n\t\taction: {\n\t\t\tonClicked: {\n\t\t\t\taddListener: listener => nativeAPI.action.onClicked.addListener(listener)\n\t\t\t},\n\t\t\tsetBadgeText: options => nativeAPI.action.setBadgeText(options),\n\t\t\tsetBadgeBackgroundColor: options => nativeAPI.action.setBadgeBackgroundColor(options),\n\t\t\tsetTitle: options => nativeAPI.action.setTitle(options),\n\t\t\tsetIcon: options => nativeAPI.action.setIcon(options)\n\t\t},\n\t\tbookmarks: {\n\t\t\tget: id => nativeAPI.bookmarks.get(id),\n\t\t\tonCreated: {\n\t\t\t\taddListener: listener => nativeAPI.bookmarks.onCreated.addListener(listener),\n\t\t\t\tremoveListener: listener => nativeAPI.bookmarks.onCreated.removeListener(listener)\n\t\t\t},\n\t\t\tonChanged: {\n\t\t\t\taddListener: listener => nativeAPI.bookmarks.onChanged.addListener(listener),\n\t\t\t\tremoveListener: listener => nativeAPI.bookmarks.onChanged.removeListener(listener)\n\t\t\t},\n\t\t\tonMoved: {\n\t\t\t\taddListener: listener => nativeAPI.bookmarks.onMoved.addListener(listener),\n\t\t\t\tremoveListener: listener => nativeAPI.bookmarks.onMoved.removeListener(listener)\n\t\t\t},\n\t\t\tupdate: (id, changes) => nativeAPI.bookmarks.update(id, changes)\n\t\t},\n\t\tcommands: {\n\t\t\tonCommand: {\n\t\t\t\taddListener: listener => nativeAPI.commands.onCommand.addListener(listener)\n\t\t\t}\n\t\t},\n\t\tdownloads: {\n\t\t\tdownload: options => nativeAPI.downloads.download(options),\n\t\t\tonChanged: {\n\t\t\t\taddListener: listener => nativeAPI.downloads.onChanged.addListener(listener),\n\t\t\t\tremoveListener: listener => nativeAPI.downloads.onChanged.removeListener(listener)\n\t\t\t},\n\t\t\tsearch: query => nativeAPI.downloads.search(query)\n\t\t},\n\t\ti18n: {\n\t\t\tgetUILanguage: () => nativeAPI.i18n.getUILanguage(),\n\t\t\tgetMessage: (messageName, substitutions) => nativeAPI.i18n.getMessage(messageName, substitutions)\n\t\t},\n\t\tidentity: {\n\t\t\tgetRedirectURL: () => nativeAPI.identity.getRedirectURL(),\n\t\t\tgetAuthToken: details => nativeAPI.identity.getAuthToken(details),\n\t\t\tlaunchWebAuthFlow: details => nativeAPI.identity.launchWebAuthFlow(details),\n\t\t\tremoveCachedAuthToken: details => nativeAPI.identity.removeCachedAuthToken(details)\n\t\t},\n\t\tcontextMenus: {\n\t\t\tonClicked: {\n\t\t\t\taddListener: listener => nativeAPI.contextMenus.onClicked.addListener(listener)\n\t\t\t},\n\t\t\tcreate: options => nativeAPI.contextMenus.create(options),\n\t\t\tupdate: (menuItemId, options) => nativeAPI.contextMenus.update(menuItemId, options),\n\t\t\tremoveAll: () => nativeAPI.contextMenus.removeAll()\n\t\t},\n\t\tpermissions: {\n\t\t\trequest: permissions => nativeAPI.permissions.request(permissions),\n\t\t\tremove: permissions => nativeAPI.permissions.remove(permissions)\n\t\t},\n\t\truntime: {\n\t\t\tid: nativeAPI.runtime.id,\n\t\t\tsendNativeMessage: (application, message) => new Promise((resolve, reject) => {\n\t\t\t\tnativeAPI.runtime.sendNativeMessage(application, message, result => {\n\t\t\t\t\tif (nativeAPI.runtime.lastError) {\n\t\t\t\t\t\treject(nativeAPI.runtime.lastError);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(result);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}),\n\t\t\tgetManifest: () => nativeAPI.runtime.getManifest(),\n\t\t\tonMessage: {\n\t\t\t\taddListener: listener => nativeAPI.runtime.onMessage.addListener((message, sender, sendResponse) => {\n\t\t\t\t\tconst response = listener(message, sender);\n\t\t\t\t\tif (response && typeof response.then == \"function\") {\n\t\t\t\t\t\tresponse\n\t\t\t\t\t\t\t.then(response => {\n\t\t\t\t\t\t\t\tif (response !== undefined) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tsendResponse(response);\n\t\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\t// ignored\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tremoveListener: listener => nativeAPI.runtime.onMessage.removeListener(listener)\n\t\t\t},\n\t\t\tonMessageExternal: {\n\t\t\t\taddListener: listener => nativeAPI.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {\n\t\t\t\t\tconst response = listener(message, sender);\n\t\t\t\t\tif (response && typeof response.then == \"function\") {\n\t\t\t\t\t\tresponse\n\t\t\t\t\t\t\t.then(response => {\n\t\t\t\t\t\t\t\tif (response !== undefined) {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tsendResponse(response);\n\t\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\t\t\t// ignored\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t\tsendMessage: message => new Promise((resolve, reject) => {\n\t\t\t\tnativeAPI.runtime.sendMessage(message, response => {\n\t\t\t\t\tif (nativeAPI.runtime.lastError) {\n\t\t\t\t\t\treject(nativeAPI.runtime.lastError);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (nativeAPI.runtime.lastError) {\n\t\t\t\t\treject(nativeAPI.runtime.lastError);\n\t\t\t\t}\n\t\t\t}),\n\t\t\tgetURL: (path) => nativeAPI.runtime.getURL(path),\n\t\t\tgetContexts: (filter) => nativeAPI.runtime.getContexts(filter),\n\t\t\tget lastError() {\n\t\t\t\treturn nativeAPI.runtime.lastError;\n\t\t\t}\n\t\t},\n\t\tscripting: {\n\t\t\texecuteScript: injection => nativeAPI.scripting.executeScript(injection)\n\t\t},\n\t\tstorage: {\n\t\t\tlocal: {\n\t\t\t\tset: value => nativeAPI.storage.local.set(value),\n\t\t\t\tget: keys => nativeAPI.storage.local.get(keys),\n\t\t\t\tclear: () => nativeAPI.storage.local.clear(),\n\t\t\t\tremove: keys => nativeAPI.storage.local.remove(keys)\n\t\t\t},\n\t\t\tsync: {\n\t\t\t\tset: value => nativeAPI.storage.sync.set(value),\n\t\t\t\tget: keys => nativeAPI.storage.sync.get(keys),\n\t\t\t\tclear: () => nativeAPI.storage.sync.clear(),\n\t\t\t\tremove: keys => nativeAPI.storage.sync.remove(keys)\n\t\t\t}\n\t\t},\n\t\ttabs: {\n\t\t\tonCreated: {\n\t\t\t\taddListener: listener => nativeAPI.tabs.onCreated.addListener(listener)\n\t\t\t},\n\t\t\tonActivated: {\n\t\t\t\taddListener: listener => nativeAPI.tabs.onActivated.addListener(listener)\n\t\t\t},\n\t\t\tonUpdated: {\n\t\t\t\taddListener: listener => nativeAPI.tabs.onUpdated.addListener(listener),\n\t\t\t\tremoveListener: listener => nativeAPI.tabs.onUpdated.removeListener(listener)\n\t\t\t},\n\t\t\tonRemoved: {\n\t\t\t\taddListener: listener => nativeAPI.tabs.onRemoved.addListener(listener),\n\t\t\t\tremoveListener: listener => nativeAPI.tabs.onRemoved.removeListener(listener)\n\t\t\t},\n\t\t\tonReplaced: {\n\t\t\t\taddListener: listener => nativeAPI.tabs.onReplaced.addListener(listener),\n\t\t\t\tremoveListener: listener => nativeAPI.tabs.onReplaced.removeListener(listener)\n\t\t\t},\n\t\t\tcaptureVisibleTab: (windowId, options) => nativeAPI.tabs.captureVisibleTab(windowId, options),\n\t\t\tsendMessage: (tabId, message, options = {}) => new Promise((resolve, reject) => {\n\t\t\t\tnativeAPI.tabs.sendMessage(tabId, message, options, response => {\n\t\t\t\t\tif (nativeAPI.runtime.lastError) {\n\t\t\t\t\t\treject(nativeAPI.runtime.lastError);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (nativeAPI.runtime.lastError) {\n\t\t\t\t\treject(nativeAPI.runtime.lastError);\n\t\t\t\t}\n\t\t\t}),\n\t\t\tquery: options => nativeAPI.tabs.query(options),\n\t\t\tcreate: createProperties => nativeAPI.tabs.create(createProperties),\n\t\t\tget: options => nativeAPI.tabs.get(options),\n\t\t\tremove: tabId => nativeAPI.tabs.remove(tabId),\n\t\t\tupdate: (tabId, updateProperties) => nativeAPI.tabs.update(tabId, updateProperties)\n\t\t},\n\t\tdevtools: {\n\t\t\tinspectedWindow: {\n\t\t\t\tonResourceContentCommitted: {\n\t\t\t\t\taddListener: listener => nativeAPI.devtools.inspectedWindow.onResourceContentCommitted.addListener(listener)\n\t\t\t\t},\n\t\t\t\tget tabId() {\n\t\t\t\t\treturn nativeAPI.devtools.inspectedWindow.tabId;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\toffscreen: {\n\t\t\tcreateDocument: parameters => nativeAPI.offscreen.createDocument(parameters)\n\t\t},\n\t\tdeclarativeNetRequest: {\n\t\t\tupdateSessionRules: parameters => nativeAPI.declarativeNetRequest.updateSessionRules(parameters)\n\t\t}\n\t}));\n\n})();"
  },
  {
    "path": "src/lib/single-file/fetch/bg/fetch.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, fetch, setTimeout */\n\nconst MAX_CONTENT_SIZE = 8 * (1024 * 1024);\nconst REQUEST_WAIT_DELAY = 1000;\n\nlet requestId = 1;\n\nbrowser.runtime.onMessage.addListener((message, sender) => {\n\tif (message.method && message.method.startsWith(\"singlefile.fetch\")) {\n\t\treturn new Promise(resolve => {\n\t\t\tonRequest(message, sender)\n\t\t\t\t.then(resolve)\n\t\t\t\t.catch(error => resolve({ error: error && (error.message || error.toString()) }));\n\t\t});\n\t}\n});\n\nasync function onRequest(message, sender) {\n\tif (message.method == \"singlefile.fetch\") {\n\t\ttry {\n\t\t\tconst response = await fetchResource(message.url, { referrer: message.referrer, headers: message.headers });\n\t\t\treturn sendResponse(sender.tab.id, message.requestId, response);\n\t\t} catch (error) {\n\t\t\treturn sendResponse(sender.tab.id, message.requestId, { error: error.message, array: [] });\n\t\t}\n\t} else if (message.method == \"singlefile.fetchFrame\") {\n\t\treturn browser.tabs.sendMessage(sender.tab.id, message);\n\t}\n}\n\nasync function sendResponse(tabId, requestId, response) {\n\tfor (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE <= response.array.length; blockIndex++) {\n\t\tconst message = {\n\t\t\tmethod: \"singlefile.fetchResponse\",\n\t\t\trequestId,\n\t\t\theaders: response.headers,\n\t\t\tstatus: response.status,\n\t\t\terror: response.error\n\t\t};\n\t\tmessage.truncated = response.array.length > MAX_CONTENT_SIZE;\n\t\tif (message.truncated) {\n\t\t\tmessage.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > response.array.length;\n\t\t\tmessage.array = response.array.slice(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);\n\t\t} else {\n\t\t\tmessage.array = response.array;\n\t\t}\n\t\tawait browser.tabs.sendMessage(tabId, message);\n\t}\n\treturn {};\n}\n\nasync function fetchResource(url, options = {}) {\n\toptions.cache = \"no-store\";\n\tconst response = await fetch(url, options);\n\tif (options.referrer && (response.status == 401 || response.status == 403 || response.status == 404)) {\n\t\tconst requestId = await enableReferrerOnError(url, options.referrer);\n\t\tawait new Promise(resolve => setTimeout(resolve, REQUEST_WAIT_DELAY));\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\t\t\tconst array = Array.from(new Uint8Array(await response.arrayBuffer()));\n\t\t\tconst headers = { \"content-type\": response.headers.get(\"content-type\") };\n\t\t\tconst status = response.status;\n\t\t\treturn {\n\t\t\t\tarray,\n\t\t\t\theaders,\n\t\t\t\tstatus\n\t\t\t};\n\t\t} finally {\n\t\t\tawait disableReferrerOnError(requestId);\n\t\t}\n\t}\n\n\tconst array = Array.from(new Uint8Array(await response.arrayBuffer()));\n\tconst headers = { \"content-type\": response.headers.get(\"content-type\") };\n\tconst status = response.status;\n\treturn {\n\t\tarray,\n\t\theaders,\n\t\tstatus\n\t};\n}\n\nasync function enableReferrerOnError(url, referrer) {\n\tconst id = requestId++;\n\tawait browser.declarativeNetRequest.updateSessionRules({\n\t\taddRules: [{\n\t\t\taction: {\n\t\t\t\ttype: \"modifyHeaders\",\n\t\t\t\trequestHeaders: [\n\t\t\t\t\t{\n\t\t\t\t\t\theader: \"Referer\",\n\t\t\t\t\t\toperation: \"set\",\n\t\t\t\t\t\tvalue: referrer\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\tcondition: {\n\t\t\t\tinitiatorDomains: [browser.runtime.id],\n\t\t\t\turlFilter: url,\n\t\t\t\tresourceTypes: [\"xmlhttprequest\"]\n\t\t\t},\n\t\t\tid\n\t\t}]\n\t});\n\treturn id;\n}\n\nasync function disableReferrerOnError(requestId) {\n\tawait browser.declarativeNetRequest.updateSessionRules({\n\t\tremoveRuleIds: [requestId]\n\t});\n}"
  },
  {
    "path": "src/lib/single-file/fetch/content/content-fetch.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, window, document, CustomEvent */\n\nconst FETCH_SUPPORTED_REQUEST_EVENT = \"single-file-request-fetch-supported\";\nconst FETCH_SUPPORTED_RESPONSE_EVENT = \"single-file-response-fetch-supported\";\nconst FETCH_REQUEST_EVENT = \"single-file-request-fetch\";\nconst FETCH_RESPONSE_EVENT = \"single-file-response-fetch\";\nconst ERR_HOST_FETCH = \"Host fetch error (SingleFile)\";\nconst USE_HOST_FETCH = Boolean(window.wrappedJSObject);\n\nconst fetch = window.fetch.bind(window);\n\nlet requestId = 0, pendingResponses = new Map(), hostFetchSupported;\n\nbrowser.runtime.onMessage.addListener(message => {\n\tif (message.method == \"singlefile.fetchFrame\" && window.frameId && window.frameId == message.frameId) {\n\t\treturn onFetchFrame(message);\n\t}\n\tif (message.method == \"singlefile.fetchResponse\") {\n\t\treturn onFetchResponse(message);\n\t}\n});\n\nasync function onFetchFrame(message) {\n\ttry {\n\t\tconst response = await fetch(message.url, { cache: \"force-cache\", headers: message.headers, referrerPolicy: \"strict-origin-when-cross-origin\" });\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\theaders: [...response.headers],\n\t\t\tarray: Array.from(new Uint8Array(await response.arrayBuffer()))\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\terror: error && (error.message || error.toString())\n\t\t};\n\t}\n}\n\nasync function onFetchResponse(message) {\n\tconst pendingResponse = pendingResponses.get(message.requestId);\n\tif (pendingResponse) {\n\t\tif (message.error) {\n\t\t\tpendingResponse.reject(new Error(message.error));\n\t\t\tpendingResponses.delete(message.requestId);\n\t\t} else {\n\t\t\tif (message.truncated) {\n\t\t\t\tif (pendingResponse.array) {\n\t\t\t\t\tpendingResponse.array = pendingResponse.array.concat(message.array);\n\t\t\t\t} else {\n\t\t\t\t\tpendingResponse.array = message.array;\n\t\t\t\t\tpendingResponses.set(message.requestId, pendingResponse);\n\t\t\t\t}\n\t\t\t\tif (message.finished) {\n\t\t\t\t\tmessage.array = pendingResponse.array;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!message.truncated || message.finished) {\n\t\t\t\tpendingResponse.resolve({\n\t\t\t\t\tstatus: message.status,\n\t\t\t\t\theaders: { get: headerName => message.headers && message.headers[headerName] },\n\t\t\t\t\tarrayBuffer: async () => new Uint8Array(message.array).buffer\n\t\t\t\t});\n\t\t\t\tpendingResponses.delete(message.requestId);\n\t\t\t}\n\t\t}\n\t}\n\treturn {};\n}\n\nasync function hostFetch(url, options) {\n\tif (hostFetchSupported === undefined) {\n\t\thostFetchSupported = false;\n\t\tdocument.addEventListener(FETCH_SUPPORTED_RESPONSE_EVENT, () => hostFetchSupported = true, false);\n\t\tdocument.dispatchEvent(new CustomEvent(FETCH_SUPPORTED_REQUEST_EVENT));\n\t}\n\tif (hostFetchSupported) {\n\t\tconst result = new Promise((resolve, reject) => {\n\t\t\tdocument.dispatchEvent(new CustomEvent(FETCH_REQUEST_EVENT, { detail: JSON.stringify({ url, options }) }));\n\t\t\tdocument.addEventListener(FETCH_RESPONSE_EVENT, onResponseFetch, false);\n\n\t\t\tfunction onResponseFetch(event) {\n\t\t\t\tif (event.detail) {\n\t\t\t\t\tif (event.detail.url == url) {\n\t\t\t\t\t\tdocument.removeEventListener(FETCH_RESPONSE_EVENT, onResponseFetch, false);\n\t\t\t\t\t\tif (event.detail.response) {\n\t\t\t\t\t\t\tresolve({\n\t\t\t\t\t\t\t\tstatus: event.detail.status,\n\t\t\t\t\t\t\t\theaders: new Map(event.detail.headers),\n\t\t\t\t\t\t\t\tarrayBuffer: async () => event.detail.response\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treject(event.detail.error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treject();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t} else {\n\t\tthrow new Error(ERR_HOST_FETCH);\n\t}\n}\n\nexport {\n\tfetchResource as fetch,\n\tframeFetch\n};\n\nasync function fetchResource(url, options = {}, useHostFetch = true) {\n\ttry {\n\t\tconst fetchOptions = {\n\t\t\tcache: options.cache || \"force-cache\",\n\t\t\theaders: options.headers,\n\t\t\treferrerPolicy: options.referrerPolicy || \"strict-origin-when-cross-origin\"\n\t\t};\n\t\tlet response;\n\t\ttry {\n\t\t\tif ((options.referrer && !USE_HOST_FETCH) || !useHostFetch) {\n\t\t\t\tresponse = await fetch(url, fetchOptions);\n\t\t\t} else {\n\t\t\t\tresponse = await hostFetch(url, fetchOptions);\n\t\t\t}\n\t\t\tif (response.status == 401 || response.status == 403 || response.status == 404) {\n\t\t\t\tif (fetchOptions.referrerPolicy != \"no-referrer\" && !options.referrer) {\n\t\t\t\t\tresponse = await fetchResource(url, { ...fetchOptions, referrerPolicy: \"no-referrer\" }, useHostFetch);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error && error.message == ERR_HOST_FETCH) {\n\t\t\t\tresponse = await fetchResource(url, { ...fetchOptions }, false);\n\t\t\t} else if (fetchOptions.referrerPolicy != \"no-referrer\" && !options.referrer) {\n\t\t\t\tresponse = await fetchResource(url, { ...fetchOptions, referrerPolicy: \"no-referrer\" }, useHostFetch);\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t\treturn response;\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\trequestId++;\n\t\tconst promise = new Promise((resolve, reject) => pendingResponses.set(requestId, { resolve, reject }));\n\t\tawait sendMessage({ method: \"singlefile.fetch\", url, requestId, referrer: options.referrer, headers: options.headers });\n\t\treturn promise;\n\t}\n}\n\nasync function frameFetch(url, options) {\n\tconst response = await sendMessage({ method: \"singlefile.fetchFrame\", url, frameId: options.frameId, referrer: options.referrer, headers: options.headers });\n\treturn {\n\t\tstatus: response.status,\n\t\theaders: new Map(response.headers),\n\t\tarrayBuffer: async () => new Uint8Array(response.array).buffer\n\t};\n}\n\nasync function sendMessage(message) {\n\tconst response = await browser.runtime.sendMessage(message);\n\tif (!response || response.error) {\n\t\tthrow new Error(response && response.error && response.error.toString());\n\t} else {\n\t\treturn response;\n\t}\n}"
  },
  {
    "path": "src/lib/single-file/frame-tree/bg/frame-tree.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nbrowser.runtime.onMessage.addListener((message, sender) => {\n\tif (message.method == \"singlefile.frameTree.initResponse\" || message.method == \"singlefile.frameTree.ackInitRequest\") {\n\t\tbrowser.tabs.sendMessage(sender.tab.id, message, { frameId: 0 });\n\t\treturn Promise.resolve({});\n\t}\n});"
  },
  {
    "path": "src/lib/single-file/lazy/bg/lazy-timeout.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, setTimeout, clearTimeout */\n\nconst timeouts = new Map();\n\nbrowser.runtime.onMessage.addListener((message, sender) => {\n\tif (message.method == \"singlefile.lazyTimeout.setTimeout\") {\n\t\tlet tabTimeouts = timeouts.get(sender.tab.id);\n\t\tlet frameTimeouts;\n\t\tif (tabTimeouts) {\n\t\t\tframeTimeouts = tabTimeouts.get(sender.frameId);\n\t\t\tif (frameTimeouts) {\n\t\t\t\tconst previousTimeoutId = frameTimeouts.get(message.type);\n\t\t\t\tif (previousTimeoutId) {\n\t\t\t\t\tclearTimeout(previousTimeoutId);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tframeTimeouts = new Map();\n\t\t\t}\n\t\t}\n\t\tconst timeoutId = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tconst tabTimeouts = timeouts.get(sender.tab.id);\n\t\t\t\tconst frameTimeouts = tabTimeouts.get(sender.frameId);\n\t\t\t\tif (tabTimeouts && frameTimeouts) {\n\t\t\t\t\tdeleteTimeout(frameTimeouts, message.type);\n\t\t\t\t}\n\t\t\t\tawait browser.tabs.sendMessage(sender.tab.id, { method: \"singlefile.lazyTimeout.onTimeout\", type: message.type });\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t} catch (error) {\n\t\t\t\t// ignored\n\t\t\t}\n\t\t}, message.delay);\n\t\tif (!tabTimeouts) {\n\t\t\ttabTimeouts = new Map();\n\t\t\tframeTimeouts = new Map();\n\t\t\ttabTimeouts.set(sender.frameId, frameTimeouts);\n\t\t\ttimeouts.set(sender.tab.id, tabTimeouts);\n\t\t}\n\t\tframeTimeouts.set(message.type, timeoutId);\n\t\treturn Promise.resolve({});\n\t}\n\tif (message.method == \"singlefile.lazyTimeout.clearTimeout\") {\n\t\tlet tabTimeouts = timeouts.get(sender.tab.id);\n\t\tif (tabTimeouts) {\n\t\t\tconst frameTimeouts = tabTimeouts.get(sender.frameId);\n\t\t\tif (frameTimeouts) {\n\t\t\t\tconst timeoutId = frameTimeouts.get(message.type);\n\t\t\t\tif (timeoutId) {\n\t\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\t}\n\t\t\t\tdeleteTimeout(frameTimeouts, message.type);\n\t\t\t}\n\t\t}\n\t\treturn Promise.resolve({});\n\t}\n});\n\nbrowser.tabs.onRemoved.addListener(tabId => timeouts.delete(tabId));\n\nfunction deleteTimeout(framesTimeouts, type) {\n\tframesTimeouts.delete(type);\n}"
  },
  {
    "path": "src/lib/webdav/webdav.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global fetch, btoa, AbortController */\n\nconst EMPTY_STRING = \"\";\nconst CONFLICT_ACTION_SKIP = \"skip\";\nconst CONFLICT_ACTION_UNIQUIFY = \"uniquify\";\nconst CONFLICT_ACTION_OVERWRITE = \"overwrite\";\nconst CONFLICT_ACTION_PROMPT = \"prompt\";\nconst BASIC_PREFIX_AUTHORIZATION = \"Basic \";\nconst AUTHORIZATION_HEADER = \"Authorization\";\nconst AUTHORIZATION_SEPARATOR = \":\";\nconst DIRECTORY_SEPARATOR = \"/\";\nconst EXTENSION_SEPARATOR = \".\";\nconst ERROR_PREFIX_MESSAGE = \"Error \";\nconst INDEX_FILENAME_PREFIX = \" (\";\nconst INDEX_FILENAME_SUFFIX = \")\";\nconst INDEX_FILENAME_REGEXP = /\\s\\((\\d+)\\)$/;\nconst ABORT_ERROR_NAME = \"AbortError\";\nconst HEAD_METHOD = \"HEAD\";\nconst PUT_METHOD = \"PUT\";\nconst DELETE_METHOD = \"DELETE\";\nconst PROPFIND_METHOD = \"PROPFIND\";\nconst MKCOL_METHOD = \"MKCOL\";\nconst CONTENT_TYPE_HEADER = \"Content-Type\";\nconst HTML_CONTENT_TYPE = \"text/html\";\nconst CREDENTIALS_PARAMETER = \"omit\";\nconst FOUND_STATUS = 200;\nconst CREATED_STATUS = 201;\nconst NOT_FOUND_STATUS = 404;\nconst MIN_ERROR_STATUS = 400;\n\nexport {\n\tWebDAV\n};\n\nclass WebDAV {\n\tconstructor(url, username, password) {\n\t\tif (!url.endsWith(DIRECTORY_SEPARATOR)) {\n\t\t\turl += DIRECTORY_SEPARATOR;\n\t\t}\n\t\tthis.url = url;\n\t\tthis.authorization = BASIC_PREFIX_AUTHORIZATION + btoa(username + AUTHORIZATION_SEPARATOR + password);\n\t}\n\n\tupload(filename, content, options) {\n\t\tthis.controller = new AbortController();\n\t\toptions.signal = this.controller.signal;\n\t\toptions.authorization = this.authorization;\n\t\toptions.url = this.url;\n\t\treturn upload(filename, content, options);\n\t}\n\n\tabort() {\n\t\tif (this.controller) {\n\t\t\tthis.controller.abort();\n\t\t}\n\t}\n}\n\nasync function upload(filename, content, options) {\n\tconst { authorization, filenameConflictAction, prompt, signal, preventRetry } = options;\n\tlet { url } = options;\n\ttry {\n\t\tif (filenameConflictAction == CONFLICT_ACTION_OVERWRITE) {\n\t\t\tlet response = await sendRequest(filename, PUT_METHOD, content);\n\t\t\tif (response.status == CREATED_STATUS) {\n\t\t\t\treturn response;\n\t\t\t} else if (response.status >= MIN_ERROR_STATUS) {\n\t\t\t\tresponse = await sendRequest(filename, DELETE_METHOD);\n\t\t\t\tif (response.status >= MIN_ERROR_STATUS) {\n\t\t\t\t\tthrow new Error(ERROR_PREFIX_MESSAGE + response.status);\n\t\t\t\t}\n\t\t\t\treturn await upload(filename, content, options);\n\t\t\t}\n\t\t} else {\n\t\t\tlet response = await sendRequest(filename, HEAD_METHOD);\n\t\t\tif (response.status == FOUND_STATUS) {\n\t\t\t\tif (filenameConflictAction == CONFLICT_ACTION_UNIQUIFY || (filenameConflictAction == CONFLICT_ACTION_PROMPT && !prompt)) {\n\t\t\t\t\tconst { filenameWithoutExtension, extension, indexFilename } = splitFilename(filename);\n\t\t\t\t\toptions.indexFilename = indexFilename + 1;\n\t\t\t\t\treturn await upload(getFilename(filenameWithoutExtension, extension), content, options);\n\t\t\t\t} else if (filenameConflictAction == CONFLICT_ACTION_PROMPT) {\n\t\t\t\t\tfilename = await prompt(filename);\n\t\t\t\t\treturn filename ? upload(filename, content, options) : response;\n\t\t\t\t} else if (filenameConflictAction == CONFLICT_ACTION_SKIP) {\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t} else if (response.status == NOT_FOUND_STATUS) {\n\t\t\t\tresponse = await sendRequest(filename, PUT_METHOD, content);\n\t\t\t\tif (response.status >= MIN_ERROR_STATUS && !preventRetry) {\n\t\t\t\t\tif (filename.includes(DIRECTORY_SEPARATOR)) {\n\t\t\t\t\t\tawait createDirectories();\n\t\t\t\t\t\toptions.preventRetry = true;\n\t\t\t\t\t\treturn await upload(filename, content, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(ERROR_PREFIX_MESSAGE + response.status);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t} else if (response.status >= MIN_ERROR_STATUS) {\n\t\t\t\tthrow new Error(ERROR_PREFIX_MESSAGE + response.status);\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tif (error.name != ABORT_ERROR_NAME) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tfunction sendRequest(path, method, body) {\n\t\tconst headers = {\n\t\t\t[AUTHORIZATION_HEADER]: authorization\n\t\t};\n\t\tif (body) {\n\t\t\theaders[CONTENT_TYPE_HEADER] = HTML_CONTENT_TYPE;\n\t\t}\n\t\treturn fetch(url + path, { method, headers, signal, body, credentials: CREDENTIALS_PARAMETER });\n\t}\n\n\tfunction splitFilename(filename) {\n\t\tlet filenameWithoutExtension = filename;\n\t\tlet extension = EMPTY_STRING;\n\t\tconst indexExtensionSeparator = filename.lastIndexOf(EXTENSION_SEPARATOR);\n\t\tif (indexExtensionSeparator > -1) {\n\t\t\tfilenameWithoutExtension = filename.substring(0, indexExtensionSeparator);\n\t\t\textension = filename.substring(indexExtensionSeparator + 1);\n\t\t}\n\t\tlet indexFilename;\n\t\t({ filenameWithoutExtension, indexFilename } = extractIndexFilename(filenameWithoutExtension));\n\t\treturn { filenameWithoutExtension, extension, indexFilename };\n\t}\n\n\tfunction extractIndexFilename(filenameWithoutExtension) {\n\t\tconst indexFilenameMatch = filenameWithoutExtension.match(INDEX_FILENAME_REGEXP);\n\t\tlet indexFilename = 0;\n\t\tif (indexFilenameMatch && indexFilenameMatch.length > 1) {\n\t\t\tconst parsedIndexFilename = Number(indexFilenameMatch[indexFilenameMatch.length - 1]);\n\t\t\tif (!Number.isNaN(parsedIndexFilename)) {\n\t\t\t\tindexFilename = parsedIndexFilename;\n\t\t\t\tfilenameWithoutExtension = filenameWithoutExtension.replace(INDEX_FILENAME_REGEXP, EMPTY_STRING);\n\t\t\t}\n\t\t}\n\t\treturn { filenameWithoutExtension, indexFilename };\n\t}\n\n\tfunction getFilename(filenameWithoutExtension, extension) {\n\t\treturn filenameWithoutExtension +\n\t\t\tINDEX_FILENAME_PREFIX + options.indexFilename + INDEX_FILENAME_SUFFIX +\n\t\t\t(extension ? EXTENSION_SEPARATOR + extension : EMPTY_STRING);\n\t}\n\n\tasync function createDirectories() {\n\t\tconst filenameParts = filename.split(DIRECTORY_SEPARATOR);\n\t\tfilenameParts.pop();\n\t\tlet path = EMPTY_STRING;\n\t\tfor (const filenamePart of filenameParts) {\n\t\t\tif (filenamePart) {\n\t\t\t\tpath += filenamePart;\n\t\t\t\tconst response = await sendRequest(path, PROPFIND_METHOD);\n\t\t\t\tif (response.status == NOT_FOUND_STATUS) {\n\t\t\t\t\tconst response = await sendRequest(path, MKCOL_METHOD);\n\t\t\t\t\tif (response.status >= MIN_ERROR_STATUS) {\n\t\t\t\t\t\tthrow new Error(ERROR_PREFIX_MESSAGE + response.status);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpath += DIRECTORY_SEPARATOR;\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "src/lib/woleet/woleet.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n/* global fetch */\nconst urlService = \"https://api.woleet.io/v1/anchor\";\nconst apiKey = \"\";\nexport {\n\tanchor\n};\nasync function anchor(hash, userKey) {\n\tlet bearer = userKey || apiKey;\n\tconst response = await fetch(urlService, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"Authorization\": \"Bearer \" + bearer\n\t\t},\n\t\tbody: JSON.stringify({\n\t\t\t\"name\": hash,\n\t\t\t\"hash\": hash,\n\t\t\t\"public\": true\n\t\t})\n\t});\n\tif (response.status == 401) {\n\t\tconst error = new Error(\"Your access token on Woleet is invalid. Go to __DOC_LINK__ to create your account.\");\n\t\terror.link = \"https://app.woleet.io/\";\n\t\tthrow error;\n\t} else if (response.status == 402) {\n\t\tconst error = new Error(\"You have no more credits on Woleet. Go to __DOC_LINK__ to recharge them.\");\n\t\terror.link = \"https://app.woleet.io/\";\n\t\tthrow error;\n\t} else if (response.status >= 400) {\n\t\tthrow new Error((response.statusText || (\"Error \" + response.status)) + \" (Woleet)\");\n\t}\n\treturn response.json();\n}"
  },
  {
    "path": "src/lib/yabson/yabson.js",
    "content": "/* global TextEncoder, TextDecoder */\n\nconst DEFAULT_CHUNK_SIZE = 8 * 1024 * 1024;\nconst TYPE_REFERENCE = 0;\nconst SPECIAL_TYPES = [TYPE_REFERENCE];\nconst EMPTY_SLOT_VALUE = Symbol();\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\nconst types = new Array(256);\nlet typeIndex = 0;\n\nregisterType(serializeCircularReference, parseCircularReference, testCircularReference, TYPE_REFERENCE);\nregisterType(null, parseObject, testObject);\nregisterType(serializeArray, parseArray, testArray);\nregisterType(serializeString, parseString, testString);\nregisterType(serializeTypedArray, parseFloat64Array, testFloat64Array);\nregisterType(serializeTypedArray, parseFloat32Array, testFloat32Array);\nregisterType(serializeTypedArray, parseUint32Array, testUint32Array);\nregisterType(serializeTypedArray, parseInt32Array, testInt32Array);\nregisterType(serializeTypedArray, parseUint16Array, testUint16Array);\nregisterType(serializeTypedArray, parseInt16Array, testInt16Array);\nregisterType(serializeTypedArray, parseUint8ClampedArray, testUint8ClampedArray);\nregisterType(serializeTypedArray, parseUint8Array, testUint8Array);\nregisterType(serializeTypedArray, parseInt8Array, testInt8Array);\nregisterType(serializeArrayBuffer, parseArrayBuffer, testArrayBuffer);\nregisterType(serializeNumber, parseNumber, testNumber);\nregisterType(serializeUint32, parseUint32, testUint32);\nregisterType(serializeInt32, parseInt32, testInt32);\nregisterType(serializeUint16, parseUint16, testUint16);\nregisterType(serializeInt16, parseInt16, testInt16);\nregisterType(serializeUint8, parseUint8, testUint8);\nregisterType(serializeInt8, parseInt8, testInt8);\nregisterType(null, parseUndefined, testUndefined);\nregisterType(null, parseNull, testNull);\nregisterType(null, parseNaN, testNaN);\nregisterType(serializeBoolean, parseBoolean, testBoolean);\nregisterType(serializeSymbol, parseSymbol, testSymbol);\nregisterType(null, parseEmptySlot, testEmptySlot);\nregisterType(serializeMap, parseMap, testMap);\nregisterType(serializeSet, parseSet, testSet);\nregisterType(serializeDate, parseDate, testDate);\nregisterType(serializeError, parseError, testError);\nregisterType(serializeRegExp, parseRegExp, testRegExp);\nregisterType(serializeStringObject, parseStringObject, testStringObject);\nregisterType(serializeNumberObject, parseNumberObject, testNumberObject);\nregisterType(serializeBooleanObject, parseBooleanObject, testBooleanObject);\n\nexport {\n\tgetSerializer,\n\tgetParser,\n\tregisterType,\n\tclone,\n\tserialize,\n\tparse,\n\tserializeValue,\n\tserializeArray,\n\tserializeString,\n\tserializeTypedArray,\n\tserializeArrayBuffer,\n\tserializeNumber,\n\tserializeUint32,\n\tserializeInt32,\n\tserializeUint16,\n\tserializeInt16,\n\tserializeUint8,\n\tserializeInt8,\n\tserializeBoolean,\n\tserializeMap,\n\tserializeSet,\n\tserializeDate,\n\tserializeError,\n\tserializeRegExp,\n\tserializeStringObject,\n\tserializeNumberObject,\n\tserializeBooleanObject,\n\tserializeSymbol,\n\tparseValue,\n\tparseObject,\n\tparseArray,\n\tparseString,\n\tparseFloat64Array,\n\tparseFloat32Array,\n\tparseUint32Array,\n\tparseInt32Array,\n\tparseUint16Array,\n\tparseInt16Array,\n\tparseUint8ClampedArray,\n\tparseUint8Array,\n\tparseInt8Array,\n\tparseArrayBuffer,\n\tparseNumber,\n\tparseUint32,\n\tparseInt32,\n\tparseUint16,\n\tparseInt16,\n\tparseUint8,\n\tparseInt8,\n\tparseUndefined,\n\tparseNull,\n\tparseNaN,\n\tparseBoolean,\n\tparseMap,\n\tparseSet,\n\tparseDate,\n\tparseError,\n\tparseRegExp,\n\tparseStringObject,\n\tparseNumberObject,\n\tparseBooleanObject,\n\tparseSymbol,\n\ttestObject,\n\ttestArray,\n\ttestString,\n\ttestFloat64Array,\n\ttestFloat32Array,\n\ttestUint32Array,\n\ttestInt32Array,\n\ttestUint16Array,\n\ttestInt16Array,\n\ttestUint8ClampedArray,\n\ttestUint8Array,\n\ttestInt8Array,\n\ttestArrayBuffer,\n\ttestNumber,\n\ttestBigInt,\n\ttestUint32,\n\ttestInt32,\n\ttestUint16,\n\ttestInt16,\n\ttestUint8,\n\ttestInt8,\n\ttestInteger,\n\ttestUndefined,\n\ttestNull,\n\ttestNaN,\n\ttestBoolean,\n\ttestMap,\n\ttestSet,\n\ttestDate,\n\ttestError,\n\ttestRegExp,\n\ttestStringObject,\n\ttestNumberObject,\n\ttestBooleanObject,\n\ttestSymbol\n};\n\nfunction registerType(serialize, parse, test, type) {\n\tif (type === undefined) {\n\t\ttypeIndex++;\n\t\tif (types.length - typeIndex >= SPECIAL_TYPES.length) {\n\t\t\ttypes[types.length - typeIndex] = { serialize, parse, test };\n\t\t} else {\n\t\t\tthrow new Error(\"Reached maximum number of custom types\");\n\t\t}\n\t} else {\n\t\ttypes[type] = { serialize, parse, test };\n\t}\n}\n\nasync function clone(object, options) {\n\tconst serializer = getSerializer(object, options);\n\tconst parser = getParser();\n\tlet result;\n\tfor await (const chunk of serializer) {\n\t\tresult = await parser.next(chunk);\n\t}\n\tresult = await parser.next();\n\treturn result.value;\n}\n\nasync function serialize(object, options) {\n\tconst serializer = getSerializer(object, options);\n\tlet result = new Uint8Array([]);\n\tfor await (const chunk of serializer) {\n\t\tconst previousResult = result;\n\t\tresult = new Uint8Array(previousResult.length + chunk.length);\n\t\tresult.set(previousResult, 0);\n\t\tresult.set(chunk, previousResult.length);\n\t}\n\treturn result;\n}\n\nasync function parse(array) {\n\tconst parser = getParser();\n\tawait parser.next(array);\n\tconst result = await parser.next();\n\treturn result.value;\n}\n\nclass SerializerData {\n\tconstructor(appendData, chunkSize) {\n\t\tthis.stream = new WriteStream(appendData, chunkSize);\n\t\tthis.objects = [];\n\t}\n\n\tappend(array) {\n\t\treturn this.stream.append(array);\n\t}\n\n\tflush() {\n\t\treturn this.stream.flush();\n\t}\n\n\taddObject(value) {\n\t\tthis.objects.push(testReferenceable(value) && !testCircularReference(value, this) ? value : undefined);\n\t}\n}\n\nclass WriteStream {\n\tconstructor(appendData, chunkSize) {\n\t\tthis.offset = 0;\n\t\tthis.appendData = appendData;\n\t\tthis.value = new Uint8Array(chunkSize);\n\t}\n\n\tasync append(array) {\n\t\tif (this.offset + array.length > this.value.length) {\n\t\t\tconst offset = this.value.length - this.offset;\n\t\t\tawait this.append(new Uint8Array(array).subarray(0, offset));\n\t\t\tawait this.appendData({ value: this.value });\n\t\t\tthis.offset = 0;\n\t\t\tawait this.append(new Uint8Array(array).subarray(offset));\n\t\t} else {\n\t\t\tthis.value.set(array, this.offset);\n\t\t\tthis.offset += array.length;\n\t\t}\n\t}\n\n\tasync flush() {\n\t\tif (this.offset) {\n\t\t\tawait this.appendData({ value: new Uint8Array(this.value).subarray(0, this.offset), done: true });\n\t\t}\n\t}\n}\n\nfunction getSerializer(value, { chunkSize = DEFAULT_CHUNK_SIZE } = {}) {\n\tlet serializerData, result, setResult, iterationDone, previousResult, resolvePreviousResult;\n\treturn {\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn {\n\t\t\t\tnext() {\n\t\t\t\t\treturn iterationDone ? { done: iterationDone } : getResult();\n\t\t\t\t},\n\t\t\t\treturn() {\n\t\t\t\t\treturn { done: true };\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n\n\tasync function getResult() {\n\t\tif (resolvePreviousResult) {\n\t\t\tresolvePreviousResult();\n\t\t} else {\n\t\t\tinitSerializerData().catch(() => { /* ignored */ });\n\t\t}\n\t\tinitPreviousData();\n\t\tconst value = await getValue();\n\t\treturn { value };\n\t}\n\n\tasync function initSerializerData() {\n\t\tinitResult();\n\t\tserializerData = new SerializerData(appendData, chunkSize);\n\t\tawait serializeValue(serializerData, value);\n\t\tawait serializerData.flush();\n\t}\n\n\tfunction initResult() {\n\t\tresult = new Promise(resolve => setResult = resolve);\n\t}\n\n\tfunction initPreviousData() {\n\t\tpreviousResult = new Promise(resolve => resolvePreviousResult = resolve);\n\t}\n\n\tasync function appendData(result) {\n\t\tsetResult(result);\n\t\tawait previousResult;\n\t}\n\n\tasync function getValue() {\n\t\tconst { value, done } = await result;\n\t\titerationDone = done;\n\t\tif (!done) {\n\t\t\tinitResult();\n\t\t}\n\t\treturn value;\n\t}\n}\n\nasync function serializeValue(data, value) {\n\tconst type = types.findIndex(({ test } = {}) => test && test(value, data));\n\tdata.addObject(value);\n\tawait data.append(new Uint8Array([type]));\n\tconst serialize = types[type].serialize;\n\tif (serialize) {\n\t\tawait serialize(data, value);\n\t}\n\tif (type != TYPE_REFERENCE && testObject(value)) {\n\t\tawait serializeSymbols(data, value);\n\t\tawait serializeOwnProperties(data, value);\n\t}\n}\n\nasync function serializeSymbols(data, value) {\n\tconst ownPropertySymbols = Object.getOwnPropertySymbols(value);\n\tconst symbols = ownPropertySymbols.map(propertySymbol => [propertySymbol, value[propertySymbol]]);\n\tawait serializeArray(data, symbols);\n}\n\nasync function serializeOwnProperties(data, value) {\n\tif (!ArrayBuffer.isView(value)) {\n\t\tlet entries = Object.entries(value);\n\t\tif (testArray(value)) {\n\t\t\tentries = entries.filter(([key]) => !testInteger(Number(key)));\n\t\t}\n\t\tawait serializeValue(data, entries.length);\n\t\tfor (const [key, value] of entries) {\n\t\t\tawait serializeString(data, key);\n\t\t\tawait serializeValue(data, value);\n\t\t}\n\t} else {\n\t\tawait serializeValue(data, 0);\n\t}\n}\n\nasync function serializeCircularReference(data, value) {\n\tconst index = data.objects.indexOf(value);\n\tawait serializeValue(data, index);\n}\n\nasync function serializeArray(data, array) {\n\tawait serializeValue(data, array.length);\n\tconst notEmptyIndexes = Object.keys(array).filter(key => testInteger(Number(key))).map(key => Number(key));\n\tlet indexNotEmptyIndexes = 0, currentNotEmptyIndex = notEmptyIndexes[indexNotEmptyIndexes];\n\tfor (const [indexArray, value] of array.entries()) {\n\t\tif (currentNotEmptyIndex == indexArray) {\n\t\t\tcurrentNotEmptyIndex = notEmptyIndexes[++indexNotEmptyIndexes];\n\t\t\tawait serializeValue(data, value);\n\t\t} else {\n\t\t\tawait serializeValue(data, EMPTY_SLOT_VALUE);\n\t\t}\n\t}\n}\n\nasync function serializeString(data, string) {\n\tconst encodedString = textEncoder.encode(string);\n\tawait serializeValue(data, encodedString.length);\n\tawait data.append(encodedString);\n}\n\nasync function serializeTypedArray(data, array) {\n\tawait serializeValue(data, array.length);\n\tawait data.append(array.constructor.name == \"Uint8Array\" ? array : new Uint8Array(array.buffer));\n}\n\nasync function serializeArrayBuffer(data, arrayBuffer) {\n\tawait serializeValue(data, arrayBuffer.byteLength);\n\tawait data.append(new Uint8Array(arrayBuffer));\n}\n\nasync function serializeNumber(data, number) {\n\tconst serializedNumber = new Uint8Array(new Float64Array([number]).buffer);\n\tawait data.append(serializedNumber);\n}\n\nasync function serializeUint32(data, number) {\n\tconst serializedNumber = new Uint8Array(new Uint32Array([number]).buffer);\n\tawait data.append(serializedNumber);\n}\n\nasync function serializeInt32(data, number) {\n\tconst serializedNumber = new Uint8Array(new Int32Array([number]).buffer);\n\tawait data.append(serializedNumber);\n}\n\nasync function serializeUint16(data, number) {\n\tconst serializedNumber = new Uint8Array(new Uint16Array([number]).buffer);\n\tawait data.append(serializedNumber);\n}\n\nasync function serializeInt16(data, number) {\n\tconst serializedNumber = new Uint8Array(new Int16Array([number]).buffer);\n\tawait data.append(serializedNumber);\n}\n\nasync function serializeUint8(data, number) {\n\tconst serializedNumber = new Uint8Array([number]);\n\tawait data.append(serializedNumber);\n}\n\nasync function serializeInt8(data, number) {\n\tconst serializedNumber = new Uint8Array(new Int8Array([number]).buffer);\n\tawait data.append(serializedNumber);\n}\n\nasync function serializeBoolean(data, boolean) {\n\tconst serializedBoolean = new Uint8Array([Number(boolean)]);\n\tawait data.append(serializedBoolean);\n}\n\nasync function serializeMap(data, map) {\n\tconst entries = map.entries();\n\tawait serializeValue(data, map.size);\n\tfor (const [key, value] of entries) {\n\t\tawait serializeValue(data, key);\n\t\tawait serializeValue(data, value);\n\t}\n}\n\nasync function serializeSet(data, set) {\n\tawait serializeValue(data, set.size);\n\tfor (const value of set) {\n\t\tawait serializeValue(data, value);\n\t}\n}\n\nasync function serializeDate(data, date) {\n\tawait serializeNumber(data, date.getTime());\n}\n\nasync function serializeError(data, error) {\n\tawait serializeString(data, error.message);\n\tawait serializeString(data, error.stack);\n}\n\nasync function serializeRegExp(data, regExp) {\n\tawait serializeString(data, regExp.source);\n\tawait serializeString(data, regExp.flags);\n}\n\nasync function serializeStringObject(data, string) {\n\tawait serializeString(data, string.valueOf());\n}\n\nasync function serializeNumberObject(data, number) {\n\tawait serializeNumber(data, number.valueOf());\n}\n\nasync function serializeBooleanObject(data, boolean) {\n\tawait serializeBoolean(data, boolean.valueOf());\n}\n\nasync function serializeSymbol(data, symbol) {\n\tawait serializeString(data, symbol.description);\n}\n\nclass Reference {\n\tconstructor(index, data) {\n\t\tthis.index = index;\n\t\tthis.data = data;\n\t}\n\n\tgetObject() {\n\t\treturn this.data.objects[this.index];\n\t}\n}\n\nclass ParserData {\n\tconstructor(consumeData) {\n\t\tthis.stream = new ReadStream(consumeData);\n\t\tthis.objects = [];\n\t\tthis.setters = [];\n\t}\n\n\tconsume(size) {\n\t\treturn this.stream.consume(size);\n\t}\n\n\tgetObjectId() {\n\t\tconst objectIndex = this.objects.length;\n\t\tthis.objects.push(undefined);\n\t\treturn objectIndex;\n\t}\n\n\tresolveObject(objectId, value) {\n\t\tif (testReferenceable(value) && !testReference(value)) {\n\t\t\tthis.objects[objectId] = value;\n\t\t}\n\t}\n\n\tsetObject(functionArguments, setterFunction) {\n\t\tthis.setters.push({ functionArguments, setterFunction });\n\t}\n\n\texecuteSetters() {\n\t\tthis.setters.forEach(({ functionArguments, setterFunction }) => {\n\t\t\tconst resolvedArguments = functionArguments.map(argument => testReference(argument) ? argument.getObject() : argument);\n\t\t\tsetterFunction(...resolvedArguments);\n\t\t});\n\t}\n}\n\nclass ReadStream {\n\tconstructor(consumeData) {\n\t\tthis.offset = 0;\n\t\tthis.value = new Uint8Array(0);\n\t\tthis.consumeData = consumeData;\n\t}\n\n\tasync consume(size) {\n\t\tif (this.offset + size > this.value.length) {\n\t\t\tconst pending = new Uint8Array(this.value).subarray(this.offset, this.value.length);\n\t\t\tconst value = await this.consumeData();\n\t\t\tif (pending.length + value.length != this.value.length) {\n\t\t\t\tthis.value = new Uint8Array(pending.length + value.length);\n\t\t\t}\n\t\t\tthis.value.set(pending);\n\t\t\tthis.value.set(value, pending.length);\n\t\t\tthis.offset = 0;\n\t\t\treturn this.consume(size);\n\t\t} else {\n\t\t\tconst result = this.value.slice(this.offset, this.offset + size);\n\t\t\tthis.offset += result.length;\n\t\t\treturn result;\n\t\t}\n\t}\n}\n\nfunction getParser() {\n\tlet parserData, input, setInput, value, previousData, resolvePreviousData;\n\treturn {\n\t\tasync next(input) {\n\t\t\treturn input ? getResult(input) : { value: await value, done: true };\n\t\t},\n\t\treturn() {\n\t\t\treturn { done: true };\n\t\t}\n\t};\n\n\tasync function getResult(input) {\n\t\tif (previousData) {\n\t\t\tawait previousData;\n\t\t} else {\n\t\t\tinitParserData().catch(() => { /* ignored */ });\n\t\t}\n\t\tinitPreviousData();\n\t\tsetInput(input);\n\t\treturn { done: false };\n\t}\n\n\tasync function initParserData() {\n\t\tlet setValue;\n\t\tvalue = new Promise(resolve => setValue = resolve);\n\t\tparserData = new ParserData(consumeData);\n\t\tinitChunk();\n\t\tconst data = await parseValue(parserData);\n\t\tparserData.executeSetters();\n\t\tsetValue(data);\n\t}\n\n\tfunction initChunk() {\n\t\tinput = new Promise(resolve => setInput = resolve);\n\t}\n\n\tfunction initPreviousData() {\n\t\tpreviousData = new Promise(resolve => resolvePreviousData = resolve);\n\t}\n\n\tasync function consumeData() {\n\t\tconst data = await input;\n\t\tinitChunk();\n\t\tif (resolvePreviousData) {\n\t\t\tresolvePreviousData();\n\t\t}\n\t\treturn data;\n\t}\n}\n\nasync function parseValue(data) {\n\tconst array = await data.consume(1);\n\tconst parserType = array[0];\n\tconst parse = types[parserType].parse;\n\tconst valueId = data.getObjectId();\n\tconst result = await parse(data);\n\tif (parserType != TYPE_REFERENCE && testObject(result)) {\n\t\tawait parseSymbols(data, result);\n\t\tawait parseOwnProperties(data, result);\n\t}\n\tdata.resolveObject(valueId, result);\n\treturn result;\n}\n\nasync function parseSymbols(data, value) {\n\tconst symbols = await parseArray(data);\n\tdata.setObject([symbols], symbols => symbols.forEach(([symbol, propertyValue]) => value[symbol] = propertyValue));\n}\n\nasync function parseOwnProperties(data, object) {\n\tconst size = await parseValue(data);\n\tif (size) {\n\t\tawait parseNextProperty();\n\t}\n\n\tasync function parseNextProperty(indexKey = 0) {\n\t\tconst key = await parseString(data);\n\t\tconst value = await parseValue(data);\n\t\tdata.setObject([value], value => object[key] = value);\n\t\tif (indexKey < size - 1) {\n\t\t\tawait parseNextProperty(indexKey + 1);\n\t\t}\n\t}\n}\n\nasync function parseCircularReference(data) {\n\tconst index = await parseValue(data);\n\tconst result = new Reference(index, data);\n\treturn result;\n}\n\nfunction parseObject() {\n\treturn {};\n}\n\nasync function parseArray(data) {\n\tconst length = await parseValue(data);\n\tconst array = new Array(length);\n\tif (length) {\n\t\tawait parseNextSlot();\n\t}\n\treturn array;\n\n\tasync function parseNextSlot(indexArray = 0) {\n\t\tconst value = await parseValue(data);\n\t\tif (!testEmptySlot(value)) {\n\t\t\tdata.setObject([value], value => array[indexArray] = value);\n\t\t}\n\t\tif (indexArray < length - 1) {\n\t\t\tawait parseNextSlot(indexArray + 1);\n\t\t}\n\t}\n}\n\nfunction parseEmptySlot() {\n\treturn EMPTY_SLOT_VALUE;\n}\n\nasync function parseString(data) {\n\tconst size = await parseValue(data);\n\tconst array = await data.consume(size);\n\treturn textDecoder.decode(array);\n}\n\nasync function parseFloat64Array(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length * 8);\n\treturn new Float64Array(array.buffer);\n}\n\nasync function parseFloat32Array(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length * 4);\n\treturn new Float32Array(array.buffer);\n}\n\nasync function parseUint32Array(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length * 4);\n\treturn new Uint32Array(array.buffer);\n}\n\nasync function parseInt32Array(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length * 4);\n\treturn new Int32Array(array.buffer);\n}\n\nasync function parseUint16Array(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length * 2);\n\treturn new Uint16Array(array.buffer);\n}\n\nasync function parseInt16Array(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length * 2);\n\treturn new Int16Array(array.buffer);\n}\n\nasync function parseUint8ClampedArray(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length);\n\treturn new Uint8ClampedArray(array.buffer);\n}\n\nasync function parseUint8Array(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length);\n\treturn array;\n}\n\nasync function parseInt8Array(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length);\n\treturn new Int8Array(array.buffer);\n}\n\nasync function parseArrayBuffer(data) {\n\tconst length = await parseValue(data);\n\tconst array = await data.consume(length);\n\treturn array.buffer;\n}\n\nasync function parseNumber(data) {\n\tconst array = await data.consume(8);\n\treturn new Float64Array(array.buffer)[0];\n}\n\nasync function parseUint32(data) {\n\tconst array = await data.consume(4);\n\treturn new Uint32Array(array.buffer)[0];\n}\n\nasync function parseInt32(data) {\n\tconst array = await data.consume(4);\n\treturn new Int32Array(array.buffer)[0];\n}\n\nasync function parseUint16(data) {\n\tconst array = await data.consume(2);\n\treturn new Uint16Array(array.buffer)[0];\n}\n\nasync function parseInt16(data) {\n\tconst array = await data.consume(2);\n\treturn new Int16Array(array.buffer)[0];\n}\n\nasync function parseUint8(data) {\n\tconst array = await data.consume(1);\n\treturn new Uint8Array(array.buffer)[0];\n}\n\nasync function parseInt8(data) {\n\tconst array = await data.consume(1);\n\treturn new Int8Array(array.buffer)[0];\n}\n\nfunction parseUndefined() {\n\treturn undefined;\n}\n\nfunction parseNull() {\n\treturn null;\n}\n\nfunction parseNaN() {\n\treturn NaN;\n}\n\nasync function parseBoolean(data) {\n\tconst array = await data.consume(1);\n\treturn Boolean(array[0]);\n}\n\nasync function parseMap(data) {\n\tconst size = await parseValue(data);\n\tconst map = new Map();\n\tif (size) {\n\t\tawait parseNextEntry();\n\t}\n\treturn map;\n\n\tasync function parseNextEntry(indexKey = 0) {\n\t\tconst key = await parseValue(data);\n\t\tconst value = await parseValue(data);\n\t\tdata.setObject([key, value], (key, value) => map.set(key, value));\n\t\tif (indexKey < size - 1) {\n\t\t\tawait parseNextEntry(indexKey + 1);\n\t\t}\n\t}\n}\n\nasync function parseSet(data) {\n\tconst size = await parseValue(data);\n\tconst set = new Set();\n\tif (size) {\n\t\tawait parseNextEntry();\n\t}\n\treturn set;\n\n\tasync function parseNextEntry(indexKey = 0) {\n\t\tconst value = await parseValue(data);\n\t\tdata.setObject([value], value => set.add(value));\n\t\tif (indexKey < size - 1) {\n\t\t\tawait parseNextEntry(indexKey + 1);\n\t\t}\n\t}\n}\n\nasync function parseDate(data) {\n\tconst milliseconds = await parseNumber(data);\n\treturn new Date(milliseconds);\n}\n\nasync function parseError(data) {\n\tconst message = await parseString(data);\n\tconst stack = await parseString(data);\n\tconst error = new Error(message);\n\terror.stack = stack;\n\treturn error;\n}\n\nasync function parseRegExp(data) {\n\tconst source = await parseString(data);\n\tconst flags = await parseString(data);\n\treturn new RegExp(source, flags);\n}\n\nasync function parseStringObject(data) {\n\treturn new String(await parseString(data));\n}\n\nasync function parseNumberObject(data) {\n\treturn new Number(await parseNumber(data));\n}\n\nasync function parseBooleanObject(data) {\n\treturn new Boolean(await parseBoolean(data));\n}\n\nasync function parseSymbol(data) {\n\tconst description = await parseString(data);\n\treturn Symbol(description);\n}\n\nfunction testCircularReference(value, data) {\n\treturn testObject(value) && data.objects.includes(value);\n}\n\nfunction testReference(value) {\n\treturn value instanceof Reference;\n}\n\nfunction testObject(value) {\n\treturn value === Object(value);\n}\n\nfunction testArray(value) {\n\treturn typeof value.length == \"number\";\n}\n\nfunction testEmptySlot(value) {\n\treturn value === EMPTY_SLOT_VALUE;\n}\n\nfunction testString(value) {\n\treturn typeof value == \"string\";\n}\n\nfunction testFloat64Array(value) {\n\treturn value.constructor.name == \"Float64Array\";\n}\n\nfunction testUint32Array(value) {\n\treturn value.constructor.name == \"Uint32Array\";\n}\n\nfunction testInt32Array(value) {\n\treturn value.constructor.name == \"Int32Array\";\n}\n\nfunction testUint16Array(value) {\n\treturn value.constructor.name == \"Uint16Array\";\n}\n\nfunction testFloat32Array(value) {\n\treturn value.constructor.name == \"Float32Array\";\n}\n\nfunction testInt16Array(value) {\n\treturn value.constructor.name == \"Int16Array\";\n}\n\nfunction testUint8ClampedArray(value) {\n\treturn value.constructor.name == \"Uint8ClampedArray\";\n}\n\nfunction testUint8Array(value) {\n\treturn value.constructor.name == \"Uint8Array\";\n}\n\nfunction testInt8Array(value) {\n\treturn value.constructor.name == \"Int8Array\";\n}\n\nfunction testArrayBuffer(value) {\n\treturn value.constructor.name == \"ArrayBuffer\";\n}\n\nfunction testNumber(value) {\n\treturn typeof value == \"number\";\n}\n\nfunction testBigInt(value) {\n\treturn typeof value == \"bigint\";\n}\n\nfunction testUint32(value) {\n\treturn testInteger(value) && value >= 0 && value <= 4294967295;\n}\n\nfunction testInt32(value) {\n\treturn testInteger(value) && value >= -2147483648 && value <= 2147483647;\n}\n\nfunction testUint16(value) {\n\treturn testInteger(value) && value >= 0 && value <= 65535;\n}\n\nfunction testInt16(value) {\n\treturn testInteger(value) && value >= -32768 && value <= 32767;\n}\n\nfunction testUint8(value) {\n\treturn testInteger(value) && value >= 0 && value <= 255;\n}\n\nfunction testInt8(value) {\n\treturn testInteger(value) && value >= -128 && value <= 127;\n}\n\nfunction testInteger(value) {\n\treturn testNumber(value) && Number.isInteger(value);\n}\n\nfunction testUndefined(value) {\n\treturn value === undefined;\n}\n\nfunction testNull(value) {\n\treturn value === null;\n}\n\nfunction testNaN(value) {\n\treturn Number.isNaN(value);\n}\n\nfunction testBoolean(value) {\n\treturn typeof value == \"boolean\";\n}\n\nfunction testMap(value) {\n\treturn value instanceof Map;\n}\n\nfunction testSet(value) {\n\treturn value instanceof Set;\n}\n\nfunction testDate(value) {\n\treturn value instanceof Date;\n}\n\nfunction testError(value) {\n\treturn value instanceof Error;\n}\n\nfunction testRegExp(value) {\n\treturn value instanceof RegExp;\n}\n\nfunction testStringObject(value) {\n\treturn value instanceof String;\n}\n\nfunction testNumberObject(value) {\n\treturn value instanceof Number;\n}\n\nfunction testBooleanObject(value) {\n\treturn value instanceof Boolean;\n}\n\nfunction testSymbol(value) {\n\treturn typeof value == \"symbol\";\n}\n\nfunction testReferenceable(value) {\n\treturn testObject(value) || testSymbol(value);\n}"
  },
  {
    "path": "src/ui/bg/index.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nimport * as button from \"./ui-button.js\";\nimport * as menus from \"./ui-menus.js\";\nimport * as command from \"./ui-commands.js\";\n\nexport {\n\tonMessage,\n\trefreshTab,\n\tonForbiddenDomain,\n\tonStart,\n\tonError,\n\tonEdit,\n\tonEnd,\n\tonCancelled,\n\tonUploadProgress,\n\tonTabCreated,\n\tonTabActivated,\n\tonInit,\n\tinit\n};\n\nfunction init(businessApi) {\n\tmenus.init(businessApi);\n\tbutton.init(businessApi);\n\tcommand.init(businessApi);\n}\n\nfunction onMessage(message, sender) {\n\tif (message.method.endsWith(\".refreshMenu\")) {\n\t\treturn menus.onMessage(message, sender);\n\t} else {\n\t\treturn button.onMessage(message, sender);\n\t}\n}\n\nasync function refreshTab(tab) {\n\treturn Promise.all([menus.refreshTab(tab), button.refreshTab(tab)]);\n}\n\nfunction onForbiddenDomain(tab) {\n\tbutton.onForbiddenDomain(tab);\n}\n\nfunction onStart(tabId, step, autoSave) {\n\tbutton.onStart(tabId, step, autoSave);\n}\n\nasync function onError(tabId, message, link) {\n\tbutton.onError(tabId);\n\ttry {\n\t\tif (message) {\n\t\t\tawait browser.tabs.sendMessage(tabId, { method: \"content.error\", error: message.toString(), link });\n\t\t}\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nfunction onEdit(tabId) {\n\tbutton.onEdit(tabId);\n}\n\nfunction onEnd(tabId, autoSave) {\n\tbutton.onEnd(tabId, autoSave);\n}\n\nfunction onCancelled(tabId) {\n\tbutton.onCancelled(tabId);\n}\n\nfunction onUploadProgress(tabId, index, maxIndex) {\n\tbutton.onUploadProgress(tabId, index, maxIndex);\n}\n\nfunction onTabCreated(tab) {\n\tmenus.onTabCreated(tab);\n}\n\nfunction onTabActivated(tab) {\n\tmenus.onTabActivated(tab);\n}\n\nfunction onInit(tab) {\n\tmenus.onInit(tab);\n}"
  },
  {
    "path": "src/ui/bg/ui-batch-save-urls.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, window, document, location */\n\nconst URLLabel = document.getElementById(\"URLLabel\");\nconst addUrlsLabel = document.getElementById(\"addUrlsLabel\");\nconst filterButton = document.getElementById(\"filterButton\");\nconst filterPanel = document.getElementById(\"filterPanel\");\nconst filterInput = document.getElementById(\"filterInput\");\nconst urlsTable = document.getElementById(\"urlsTable\");\nconst removeAllButton = document.getElementById(\"removeAllButton\");\nconst addUrlForm = document.getElementById(\"addUrlForm\");\nconst addUrlInput = document.getElementById(\"addUrlInput\");\nconst addUrlButton = document.getElementById(\"addUrlButton\");\nconst addUrlsButton = document.getElementById(\"addUrlsButton\");\nconst addUrlsInput = document.getElementById(\"addUrlsInput\");\nconst addUrlsCancelButton = document.getElementById(\"addUrlsCancelButton\");\nconst addUrlsOKButton = document.getElementById(\"addUrlsOKButton\");\nconst saveUrlsButton = document.getElementById(\"saveUrlsButton\");\ndocument.title = browser.i18n.getMessage(\"batchSaveUrlsTitle\");\nconst noPendingsText = browser.i18n.getMessage(\"batchSaveUrlsNoURLs\");\naddUrlButton.textContent = browser.i18n.getMessage(\"batchSaveUrlsAddUrlButton\");\naddUrlsButton.textContent = browser.i18n.getMessage(\"batchSaveUrlsAddUrlsButton\");\nremoveAllButton.textContent = browser.i18n.getMessage(\"batchSaveUrlsRemoveAllButton\");\nsaveUrlsButton.textContent = browser.i18n.getMessage(\"batchSaveUrlsSavePagesButton\");\naddUrlsCancelButton.textContent = browser.i18n.getMessage(\"pendingsAddUrlsCancelButton\");\naddUrlsOKButton.textContent = browser.i18n.getMessage(\"pendingsAddUrlsOKButton\");\naddUrlsLabel.textContent = browser.i18n.getMessage(\"pendingsAddUrls\");\nURLLabel.textContent = browser.i18n.getMessage(\"batchSaveUrlsURLTitle\");\naddUrlForm.onsubmit = () => {\n\tconst value = addUrlInput.value.trim();\n\tif (!urls.includes(value)) {\n\t\turls.push(value);\n\t\taddUrlInput.value = \"\";\n\t\trefresh();\n\t}\n\treturn false;\n};\nremoveAllButton.onclick = async () => {\n\tconst displayedUrls = getDisplayedUrls();\n\turls = urls.filter(url => !displayedUrls.includes(url));\n\tawait refresh();\n};\naddUrlsButton.onclick = displayAddUrlsPopup;\nif (location.href.endsWith(\"#side-panel\")) {\n\tdocument.documentElement.classList.add(\"side-panel\");\n}\nsaveUrlsButton.onclick = async () => {\n\tconst displayedUrls = getDisplayedUrls();\n\tif (displayedUrls.length) {\n\t\tawait browser.runtime.sendMessage({ method: \"downloads.saveUrls\", urls: displayedUrls });\n\t\turls = urls.filter(url => !displayedUrls.includes(url));\n\t\trefresh();\n\t}\n};\n\nlet previousState;\nlet urls = [];\n\nfilterButton.onclick = () => {\n\tfilterPanel.hidden = !filterPanel.hidden;\n\tif (!filterPanel.hidden) {\n\t\tfilterButton.classList.add(\"filter-displayed\");\n\t\tfilterInput.focus();\n\t} else {\n\t\tfilterButton.classList.remove(\"filter-displayed\");\n\t}\n\trefresh(true);\n};\nfilterButton.onkeyup = event => {\n\tif (event.key == \"Enter\") {\n\t\tfilterButton.onclick();\n\t}\n};\nfilterInput.oninput = () => {\n\trefresh();\n};\nfilterInput.onkeyup = event => {\n\tif (event.key == \"Escape\") {\n\t\tfilterPanel.hidden = true;\n\t\tfilterButton.classList.remove(\"filter-displayed\");\n\t\tfilterButton.focus();\n\t\trefresh(true);\n\t}\n};\nbrowser.runtime.onMessage.addListener(message => {\n\tif (message.method == \"newUrls.addURLs\") {\n\t\turls = message.urls;\n\t\trefresh();\n\t}\n});\nrefresh();\n\nfunction resetTable() {\n\turlsTable.innerHTML = \"\";\n}\n\nfunction updateTable(urls) {\n\tif (urls.length) {\n\t\turls.forEach((url, indexUrl) => {\n\t\t\tconst row = document.createElement(\"div\");\n\t\t\tconst cellURL = document.createElement(\"span\");\n\t\t\tconst cellCancel = document.createElement(\"span\");\n\t\t\tconst buttonCancel = document.createElement(\"button\");\n\t\t\trow.className = \"urls-row\";\n\t\t\tcellURL.textContent = url;\n\t\t\tcellURL.className = \"result-url-title\";\n\t\t\tbuttonCancel.textContent = \"×\";\n\t\t\tbuttonCancel.onclick = () => cancel(indexUrl);\n\t\t\tcellCancel.appendChild(buttonCancel);\n\t\t\tcellCancel.className = \"result-cancel\";\n\t\t\trow.appendChild(cellURL);\n\t\t\trow.appendChild(cellCancel);\n\t\t\turlsTable.appendChild(row);\n\t\t});\n\t}\n}\n\nasync function cancel(index) {\n\turls.splice(index, 1);\n\tawait refresh();\n}\n\nasync function displayAddUrlsPopup() {\n\tdocument.getElementById(\"formAddUrls\").style.setProperty(\"display\", \"flex\");\n\tdocument.querySelector(\"#formAddUrls .popup-content\").style.setProperty(\"align-self\", \"center\");\n\taddUrlsInput.value = \"\";\n\taddUrlsInput.focus();\n\tdocument.body.style.setProperty(\"overflow-y\", \"hidden\");\n\tconst newUrls = await new Promise(resolve => {\n\t\taddUrlsOKButton.onclick = event => hideAndResolve(event, addUrlsInput.value);\n\t\taddUrlsCancelButton.onclick = event => hideAndResolve(event);\n\t\twindow.onkeyup = event => {\n\t\t\tif (event.key == \"Escape\") {\n\t\t\t\thideAndResolve(event);\n\t\t\t}\n\t\t};\n\n\t\tfunction hideAndResolve(event, value = \"\") {\n\t\t\tevent.preventDefault();\n\t\t\tdocument.getElementById(\"formAddUrls\").style.setProperty(\"display\", \"none\");\n\t\t\tdocument.body.style.setProperty(\"overflow-y\", \"\");\n\t\t\tresolve(value.split(\"\\n\").map(url => url.trim()).filter(url => url));\n\t\t}\n\t});\n\turls = Array.from(new Set(urls.concat(newUrls)));\n\trefresh();\n}\n\nasync function refresh(force) {\n\tconst displayedUrls = getDisplayedUrls();\n\tconst currentState = JSON.stringify(displayedUrls);\n\tif (previousState != currentState || force) {\n\t\tpreviousState = currentState;\n\t\tresetTable();\n\t\tupdateTable(displayedUrls);\n\t\tif (!displayedUrls.length) {\n\t\t\tconst row = document.createElement(\"div\");\n\t\t\trow.className = \"urls-row\";\n\t\t\tconst cell = document.createElement(\"span\");\n\t\t\tcell.className = \"no-result\";\n\t\t\tif (filterPanel.hidden) {\n\t\t\t\tcell.textContent = noPendingsText;\n\t\t\t}\n\t\t\trow.appendChild(cell);\n\t\t\turlsTable.appendChild(row);\n\t\t}\n\t}\n\tsaveUrlsButton.disabled = removeAllButton.disabled = !displayedUrls.length;\n}\n\nfunction getDisplayedUrls() {\n\tlet displayedUrls = urls;\n\tif (!filterPanel.hidden) {\n\t\tdisplayedUrls = urls.filter(url => url.includes(filterInput.value));\n\t}\n\treturn displayedUrls;\n}"
  },
  {
    "path": "src/ui/bg/ui-button.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nimport { queryTabs } from \"./../../core/bg/tabs-util.js\";\nimport * as tabsData from \"./../../core/bg/tabs-data.js\";\nimport { autoSaveIsEnabled } from \"../../core/bg/autosave-util.js\";\n\nconst DEFAULT_ICON_PATH = \"/src/ui/resources/icon_128.png\";\nconst WAIT_ICON_PATH_PREFIX = \"/src/ui/resources/icon_128_wait\";\nconst BUTTON_DEFAULT_TOOLTIP_MESSAGE = browser.i18n.getMessage(\"buttonDefaultTooltip\");\nconst BUTTON_BLOCKED_TOOLTIP_MESSAGE = browser.i18n.getMessage(\"buttonBlockedTooltip\");\nconst BUTTON_DEFAULT_BADGE_MESSAGE = \"\";\nconst BUTTON_INITIALIZING_BADGE_MESSAGE = browser.i18n.getMessage(\"buttonInitializingBadge\");\nconst BUTTON_INITIALIZING_TOOLTIP_MESSAGE = browser.i18n.getMessage(\"buttonInitializingTooltip\");\nconst BUTTON_ERROR_BADGE_MESSAGE = browser.i18n.getMessage(\"buttonErrorBadge\");\nconst BUTTON_BLOCKED_BADGE_MESSAGE = browser.i18n.getMessage(\"buttonBlockedBadge\");\nconst BUTTON_OK_BADGE_MESSAGE = browser.i18n.getMessage(\"buttonOKBadge\");\nconst BUTTON_SAVE_PROGRESS_TOOLTIP_MESSAGE = browser.i18n.getMessage(\"buttonSaveProgressTooltip\");\nconst BUTTON_UPLOAD_PROGRESS_TOOLTIP_MESSAGE = browser.i18n.getMessage(\"buttonUploadProgressTooltip\");\nconst BUTTON_AUTOSAVE_ACTIVE_BADGE_MESSAGE = browser.i18n.getMessage(\"buttonAutoSaveActiveBadge\");\nconst BUTTON_AUTOSAVE_ACTIVE_TOOLTIP_MESSAGE = browser.i18n.getMessage(\"buttonAutoSaveActiveTooltip\");\nconst DEFAULT_COLOR = [2, 147, 20, 192];\nconst ACTIVE_COLOR = [4, 229, 36, 192];\nconst FORBIDDEN_COLOR = [255, 255, 255, 1];\nconst ERROR_COLOR = [229, 4, 12, 192];\nconst AUTOSAVE_DEFAULT_COLOR = [208, 208, 208, 192];\nconst AUTOSAVE_INITIALIZING_COLOR = [64, 64, 64, 192];\nconst INJECT_SCRIPTS_STEP = 1;\n\nconst BUTTON_STATES = {\n\tdefault: {\n\t\tsetBadgeBackgroundColor: { color: DEFAULT_COLOR },\n\t\tsetBadgeText: { text: BUTTON_DEFAULT_BADGE_MESSAGE },\n\t\tsetTitle: { title: BUTTON_DEFAULT_TOOLTIP_MESSAGE },\n\t\tsetIcon: { path: DEFAULT_ICON_PATH }\n\t},\n\tinject: {\n\t\tsetBadgeBackgroundColor: { color: DEFAULT_COLOR },\n\t\tsetBadgeText: { text: BUTTON_INITIALIZING_BADGE_MESSAGE },\n\t\tsetTitle: { title: BUTTON_INITIALIZING_TOOLTIP_MESSAGE },\n\t},\n\texecute: {\n\t\tsetBadgeBackgroundColor: { color: ACTIVE_COLOR },\n\t\tsetBadgeText: { text: BUTTON_INITIALIZING_BADGE_MESSAGE },\n\t},\n\tprogress: {\n\t\tsetBadgeBackgroundColor: { color: ACTIVE_COLOR },\n\t\tsetBadgeText: { text: BUTTON_DEFAULT_BADGE_MESSAGE }\n\t},\n\tedit: {\n\t\tsetBadgeBackgroundColor: { color: DEFAULT_COLOR },\n\t\tsetBadgeText: { text: BUTTON_DEFAULT_BADGE_MESSAGE },\n\t\tsetTitle: { title: BUTTON_DEFAULT_TOOLTIP_MESSAGE },\n\t\tsetIcon: { path: DEFAULT_ICON_PATH }\n\t},\n\tend: {\n\t\tsetBadgeBackgroundColor: { color: ACTIVE_COLOR },\n\t\tsetBadgeText: { text: BUTTON_OK_BADGE_MESSAGE },\n\t\tsetTitle: { title: BUTTON_DEFAULT_TOOLTIP_MESSAGE },\n\t\tsetIcon: { path: DEFAULT_ICON_PATH }\n\t},\n\terror: {\n\t\tsetBadgeBackgroundColor: { color: ERROR_COLOR },\n\t\tsetBadgeText: { text: BUTTON_ERROR_BADGE_MESSAGE },\n\t\tsetTitle: { title: BUTTON_DEFAULT_BADGE_MESSAGE },\n\t\tsetIcon: { path: DEFAULT_ICON_PATH }\n\t},\n\tforbidden: {\n\t\tsetBadgeBackgroundColor: { color: FORBIDDEN_COLOR },\n\t\tsetBadgeText: { text: BUTTON_BLOCKED_BADGE_MESSAGE },\n\t\tsetTitle: { title: BUTTON_BLOCKED_TOOLTIP_MESSAGE },\n\t\tsetIcon: { path: DEFAULT_ICON_PATH }\n\t},\n\tautosave: {\n\t\tinject: {\n\t\t\tsetBadgeBackgroundColor: { color: AUTOSAVE_INITIALIZING_COLOR },\n\t\t\tsetBadgeText: { text: BUTTON_AUTOSAVE_ACTIVE_BADGE_MESSAGE },\n\t\t\tsetTitle: { title: BUTTON_AUTOSAVE_ACTIVE_TOOLTIP_MESSAGE },\n\t\t\tsetIcon: { path: DEFAULT_ICON_PATH }\n\t\t},\n\t\tdefault: {\n\t\t\tsetBadgeBackgroundColor: { color: AUTOSAVE_DEFAULT_COLOR },\n\t\t\tsetBadgeText: { text: BUTTON_AUTOSAVE_ACTIVE_BADGE_MESSAGE },\n\t\t\tsetTitle: { title: BUTTON_AUTOSAVE_ACTIVE_TOOLTIP_MESSAGE },\n\t\t\tsetIcon: { path: DEFAULT_ICON_PATH }\n\t\t}\n\t}\n};\n\nlet business;\n\nbrowser.action.onClicked.addListener(async tab => {\n\tconst highlightedTabs = await queryTabs({ currentWindow: true, highlighted: true });\n\tconst sameWorkspaceTabs = highlightedTabs.filter(highlightedTab =>\n\t\thighlightedTab.windowId === tab.windowId &&\n\t\t(tab.workspaceId === undefined || highlightedTab.workspaceId === tab.workspaceId)\n\t);\n\tif (sameWorkspaceTabs.length <= 1) {\n\t\ttoggleSaveTab(tab);\n\t} else {\n\t\tbusiness.saveTabs(sameWorkspaceTabs);\n\t}\n\n\tfunction toggleSaveTab(tab) {\n\t\tif (business.isSavingTab(tab)) {\n\t\t\tbusiness.cancelTab(tab.id);\n\t\t} else {\n\t\t\tbusiness.saveTabs([tab]);\n\t\t}\n\t}\n});\n\nexport {\n\tonMessage,\n\tonStart,\n\tonUploadProgress,\n\tonForbiddenDomain,\n\tonError,\n\tonEdit,\n\tonEnd,\n\tonCancelled,\n\trefreshTab,\n\tinit\n};\n\nfunction init(businessApi) {\n\tbusiness = businessApi;\n}\n\nfunction onMessage(message, sender) {\n\tif (message.method.endsWith(\".processInit\")) {\n\t\tconst allTabsData = tabsData.getTemporary(sender.tab.id);\n\t\tdelete allTabsData[sender.tab.id].button;\n\t\trefreshTab(sender.tab);\n\t}\n\tif (message.method.endsWith(\".processProgress\")) {\n\t\tif (message.maxIndex) {\n\t\t\tonSaveProgress(sender.tab.id, message.index, message.maxIndex);\n\t\t}\n\t}\n\tif (message.method.endsWith(\".processEnd\")) {\n\t\tonEnd(sender.tab.id);\n\t}\n\tif (message.method.endsWith(\".processError\")) {\n\t\tif (message.error) {\n\t\t\tconsole.error(\"Initialization error\", message.error); // eslint-disable-line no-console\n\t\t}\n\t\tonError(sender.tab.id);\n\t}\n\tif (message.method.endsWith(\".processCancelled\")) {\n\t\tonCancelled(sender.tab);\n\t}\n\treturn Promise.resolve({});\n}\n\nfunction onStart(tabId, step, autoSave) {\n\tlet state;\n\tif (autoSave) {\n\t\tstate = getButtonState(\"inject\", true);\n\t} else {\n\t\tstate = step == INJECT_SCRIPTS_STEP ? getButtonState(\"inject\") : getButtonState(\"execute\");\n\t\tstate.setTitle = { title: BUTTON_INITIALIZING_TOOLTIP_MESSAGE + \" (\" + step + \"/2)\" };\n\t\tstate.setIcon = { path: WAIT_ICON_PATH_PREFIX + \"0.png\" };\n\t}\n\trefresh(tabId, state);\n}\n\nfunction onError(tabId) {\n\trefresh(tabId, getButtonState(\"error\"));\n}\n\nfunction onEdit(tabId) {\n\trefresh(tabId, getButtonState(\"edit\"));\n}\n\nfunction onEnd(tabId, autoSave) {\n\trefresh(tabId, autoSave ? getButtonState(\"default\", true) : getButtonState(\"end\"));\n}\n\nfunction onForbiddenDomain(tab) {\n\trefresh(tab.id, getButtonState(\"forbidden\"));\n}\n\nfunction onCancelled(tab) {\n\trefreshTab(tab);\n}\n\nfunction onSaveProgress(tabId, index, maxIndex) {\n\tonProgress(tabId, index, maxIndex, BUTTON_SAVE_PROGRESS_TOOLTIP_MESSAGE);\n}\n\nfunction onUploadProgress(tabId, index, maxIndex) {\n\tonProgress(tabId, index, maxIndex, BUTTON_UPLOAD_PROGRESS_TOOLTIP_MESSAGE);\n}\n\nfunction onProgress(tabId, index, maxIndex, tooltipMessage) {\n\tconst progress = Math.max(Math.min(20, Math.floor((index / maxIndex) * 20)), 0);\n\tconst barProgress = Math.min(Math.floor((index / maxIndex) * 8), 8);\n\tconst path = WAIT_ICON_PATH_PREFIX + barProgress + \".png\";\n\tconst state = getButtonState(\"progress\");\n\tstate.setTitle = { title: tooltipMessage + (progress * 5) + \"%\" };\n\tstate.setIcon = { path };\n\trefresh(tabId, state);\n}\n\nasync function refreshTab(tab) {\n\tconst autoSave = await autoSaveIsEnabled(tab);\n\tconst state = getButtonState(\"default\", autoSave);\n\tawait refresh(tab.id, state);\n}\n\nasync function refresh(tabId, state) {\n\ttry {\n\t\tconst allTabsData = tabsData.getTemporary(tabId);\n\t\tif (state) {\n\t\t\tif (!allTabsData[tabId].button) {\n\t\t\t\tallTabsData[tabId].button = { lastState: null };\n\t\t\t}\n\t\t\tconst lastState = allTabsData[tabId].button.lastState || {};\n\t\t\tconst newState = {};\n\t\t\tObject.keys(state).forEach(property => {\n\t\t\t\tif (state[property] !== undefined && (JSON.stringify(lastState[property]) != JSON.stringify(state[property]))) {\n\t\t\t\t\tnewState[property] = state[property];\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (Object.keys(newState).length) {\n\t\t\t\tallTabsData[tabId].button.lastState = state;\n\t\t\t\tawait refreshAsync(tabId, newState);\n\t\t\t}\n\t\t}\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nasync function refreshAsync(tabId, state) {\n\tfor (const browserActionMethod of Object.keys(state)) {\n\t\tawait refreshProperty(tabId, browserActionMethod, state[browserActionMethod]);\n\t}\n}\n\nasync function refreshProperty(tabId, browserActionMethod, browserActionParameter) {\n\tif (browser.action[browserActionMethod]) {\n\t\tconst parameter = JSON.parse(JSON.stringify(browserActionParameter));\n\t\tparameter.tabId = tabId;\n\t\tawait browser.action[browserActionMethod](parameter);\n\t}\n}\n\nfunction getButtonState(name, autoSave) {\n\treturn JSON.parse(JSON.stringify(autoSave ? BUTTON_STATES.autosave[name] : BUTTON_STATES[name]));\n}"
  },
  {
    "path": "src/ui/bg/ui-commands.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser */\n\nimport { queryTabs } from \"./../../core/bg/tabs-util.js\";\nimport * as config from \"./../../core/bg/config.js\";\n\nconst commands = browser.commands;\n\nlet business;\n\nexport {\n\tinit\n};\n\nfunction init(businessApi) {\n\tbusiness = businessApi;\n}\n\ncommands.onCommand.addListener(async command => {\n\tif (command == \"save-selected-tabs\") {\n\t\tconst highlightedTabs = await queryTabs({ currentWindow: true, highlighted: true });\n\t\tbusiness.saveTabs(highlightedTabs, { optionallySelected: true });\n\t} else if (command == \"save-all-tabs\") {\n\t\tconst tabs = await queryTabs({ currentWindow: true });\n\t\tbusiness.saveTabs(tabs);\n\t} else if (command.startsWith(\"custom-command-\")) {\n\t\tconst profiles = await config.getProfiles();\n\t\tlet selectedProfile;\n\t\tObject.keys(profiles).some(profile => {\n\t\t\tif (profiles[profile].customShortcut == command) {\n\t\t\t\tselectedProfile = profile;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\tif (selectedProfile) {\n\t\t\tconst highlightedTabs = await queryTabs({ currentWindow: true, highlighted: true });\n\t\t\tbusiness.saveTabs(highlightedTabs, profiles[selectedProfile]);\n\t\t}\n\t}\n});"
  },
  {
    "path": "src/ui/bg/ui-editor.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, document, matchMedia, addEventListener, prompt, URL, MouseEvent, Blob, webkitRequestFileSystem, TEMPORARY, DOMParser, fetch, setTimeout, TextDecoder, singlefile */\n\nimport * as download from \"../../core/common/download.js\";\nimport { onError } from \"./../common/common-content-ui.js\";\nimport * as zip from \"./../../../lib/single-file-zip.js\";\nimport * as yabson from \"./../../lib/yabson/yabson.js\";\n\nconst EMBEDDED_IMAGE_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelEmbeddedImageButton\");\nconst SHARE_PAGE_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelSharePageButton\");\nconst SHARE_SELECTION_BUTTON_MESSAGE = browser.i18n.getMessage(\"topPanelShareSelectionButton\");\nconst ERROR_TITLE_MESSAGE = browser.i18n.getMessage(\"topPanelError\");\n\nconst FS_SIZE = 100 * 1024 * 1024;\nconst SHADOWROOT_ATTRIBUTE_NAME = \"shadowrootmode\";\nconst INFOBAR_TAGNAME = \"single-file-infobar\";\n\nconst editorElement = document.querySelector(\".editor\");\nconst toolbarElement = document.querySelector(\".toolbar\");\nconst highlightYellowButton = document.querySelector(\".highlight-yellow-button\");\nconst highlightPinkButton = document.querySelector(\".highlight-pink-button\");\nconst highlightBlueButton = document.querySelector(\".highlight-blue-button\");\nconst highlightGreenButton = document.querySelector(\".highlight-green-button\");\nconst highlightButtons = Array.from(document.querySelectorAll(\".highlight-button\"));\nconst toggleNotesButton = document.querySelector(\".toggle-notes-button\");\nconst toggleHighlightsButton = document.querySelector(\".toggle-highlights-button\");\nconst removeHighlightButton = document.querySelector(\".remove-highlight-button\");\nconst addYellowNoteButton = document.querySelector(\".add-note-yellow-button\");\nconst addPinkNoteButton = document.querySelector(\".add-note-pink-button\");\nconst addBlueNoteButton = document.querySelector(\".add-note-blue-button\");\nconst addGreenNoteButton = document.querySelector(\".add-note-green-button\");\nconst editPageButton = document.querySelector(\".edit-page-button\");\nconst formatPageButton = document.querySelector(\".format-page-button\");\nconst cutInnerPageButton = document.querySelector(\".cut-inner-page-button\");\nconst cutOuterPageButton = document.querySelector(\".cut-outer-page-button\");\nconst undoCutPageButton = document.querySelector(\".undo-cut-page-button\");\nconst undoAllCutPageButton = document.querySelector(\".undo-all-cut-page-button\");\nconst redoCutPageButton = document.querySelector(\".redo-cut-page-button\");\nconst savePageButton = document.querySelector(\".save-page-button\");\nconst printPageButton = document.querySelector(\".print-page-button\");\nconst importMhtButton = document.querySelector(\".import-mht-button\");\nconst lastButton = toolbarElement.querySelector(\".buttons:last-of-type [type=button]:last-of-type\");\n\nlet tabData, tabDataContents = [], downloadParser, scrollY, transform, overflow;\n\naddYellowNoteButton.title = browser.i18n.getMessage(\"editorAddYellowNote\");\naddPinkNoteButton.title = browser.i18n.getMessage(\"editorAddPinkNote\");\naddBlueNoteButton.title = browser.i18n.getMessage(\"editorAddBlueNote\");\naddGreenNoteButton.title = browser.i18n.getMessage(\"editorAddGreenNote\");\nhighlightYellowButton.title = browser.i18n.getMessage(\"editorHighlightYellow\");\nhighlightPinkButton.title = browser.i18n.getMessage(\"editorHighlightPink\");\nhighlightBlueButton.title = browser.i18n.getMessage(\"editorHighlightBlue\");\nhighlightGreenButton.title = browser.i18n.getMessage(\"editorHighlightGreen\");\ntoggleNotesButton.title = browser.i18n.getMessage(\"editorToggleNotes\");\ntoggleHighlightsButton.title = browser.i18n.getMessage(\"editorToggleHighlights\");\nremoveHighlightButton.title = browser.i18n.getMessage(\"editorRemoveHighlight\");\neditPageButton.title = browser.i18n.getMessage(\"editorEditPage\");\nformatPageButton.title = browser.i18n.getMessage(\"editorFormatPage\");\ncutInnerPageButton.title = browser.i18n.getMessage(\"editorCutInnerPage\");\ncutOuterPageButton.title = browser.i18n.getMessage(\"editorCutOuterPage\");\nundoCutPageButton.title = browser.i18n.getMessage(\"editorUndoCutPage\");\nundoAllCutPageButton.title = browser.i18n.getMessage(\"editorUndoAllCutPage\");\nredoCutPageButton.title = browser.i18n.getMessage(\"editorRedoCutPage\");\nsavePageButton.title = browser.i18n.getMessage(\"editorSavePage\");\nprintPageButton.title = browser.i18n.getMessage(\"editorPrintPage\");\nimportMhtButton.title = browser.i18n.getMessage(\"editorImportMht\");\n\naddYellowNoteButton.onmouseup = () => editorElement.contentWindow.postMessage(JSON.stringify({ method: \"addNote\", color: \"note-yellow\" }), \"*\");\naddPinkNoteButton.onmouseup = () => editorElement.contentWindow.postMessage(JSON.stringify({ method: \"addNote\", color: \"note-pink\" }), \"*\");\naddBlueNoteButton.onmouseup = () => editorElement.contentWindow.postMessage(JSON.stringify({ method: \"addNote\", color: \"note-blue\" }), \"*\");\naddGreenNoteButton.onmouseup = () => editorElement.contentWindow.postMessage(JSON.stringify({ method: \"addNote\", color: \"note-green\" }), \"*\");\ndocument.addEventListener(\"mouseup\", event => {\n\tif (event.target.tagName.toLowerCase() != INFOBAR_TAGNAME) {\n\t\teditorElement.contentWindow.focus();\n\t\ttoolbarOnTouchEnd(event);\n\t}\n}, true);\ndocument.onmousemove = toolbarOnTouchMove;\nhighlightButtons.forEach(highlightButton => {\n\thighlightButton.onmouseup = () => {\n\t\tif (toolbarElement.classList.contains(\"cut-inner-mode\")) {\n\t\t\tdisableCutInnerPage();\n\t\t}\n\t\tif (toolbarElement.classList.contains(\"cut-outer-mode\")) {\n\t\t\tdisableCutOuterPage();\n\t\t}\n\t\tif (toolbarElement.classList.contains(\"remove-highlight-mode\")) {\n\t\t\tdisableRemoveHighlights();\n\t\t}\n\t\tconst disabled = highlightButton.classList.contains(\"highlight-disabled\");\n\t\tresetHighlightButtons();\n\t\tif (disabled) {\n\t\t\thighlightButton.classList.remove(\"highlight-disabled\");\n\t\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"enableHighlight\", color: \"single-file-highlight-\" + highlightButton.dataset.color }), \"*\");\n\t\t} else {\n\t\t\thighlightButton.classList.add(\"highlight-disabled\");\n\t\t}\n\t};\n});\ntoggleNotesButton.onmouseup = () => {\n\tif (toggleNotesButton.getAttribute(\"src\") == \"/src/ui/resources/button_note_visible.png\") {\n\t\ttoggleNotesButton.src = \"/src/ui/resources/button_note_hidden.png\";\n\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"hideNotes\" }), \"*\");\n\t} else {\n\t\ttoggleNotesButton.src = \"/src/ui/resources/button_note_visible.png\";\n\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"displayNotes\" }), \"*\");\n\t}\n};\ntoggleHighlightsButton.onmouseup = () => {\n\tif (toggleHighlightsButton.getAttribute(\"src\") == \"/src/ui/resources/button_highlighter_visible.png\") {\n\t\ttoggleHighlightsButton.src = \"/src/ui/resources/button_highlighter_hidden.png\";\n\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"hideHighlights\" }), \"*\");\n\t} else {\n\t\tdisplayHighlights();\n\t}\n};\nremoveHighlightButton.onmouseup = () => {\n\tif (toolbarElement.classList.contains(\"cut-inner-mode\")) {\n\t\tdisableCutInnerPage();\n\t}\n\tif (toolbarElement.classList.contains(\"cut-outer-mode\")) {\n\t\tdisableCutOuterPage();\n\t}\n\tif (removeHighlightButton.classList.contains(\"remove-highlight-disabled\")) {\n\t\tremoveHighlightButton.classList.remove(\"remove-highlight-disabled\");\n\t\ttoolbarElement.classList.add(\"remove-highlight-mode\");\n\t\tresetHighlightButtons();\n\t\tdisplayHighlights();\n\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"enableRemoveHighlights\" }), \"*\");\n\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"displayHighlights\" }), \"*\");\n\t} else {\n\t\tdisableRemoveHighlights();\n\t}\n};\neditPageButton.onmouseup = () => {\n\tif (toolbarElement.classList.contains(\"cut-inner-mode\")) {\n\t\tdisableCutInnerPage();\n\t}\n\tif (toolbarElement.classList.contains(\"cut-outer-mode\")) {\n\t\tdisableCutOuterPage();\n\t}\n\tif (editPageButton.classList.contains(\"edit-disabled\")) {\n\t\tenableEditPage();\n\t} else {\n\t\tdisableEditPage();\n\t}\n};\nformatPageButton.onmouseup = () => {\n\tif (formatPageButton.classList.contains(\"format-disabled\")) {\n\t\tformatPage();\n\t} else {\n\t\tcancelFormatPage();\n\t}\n};\ncutInnerPageButton.onmouseup = () => {\n\tif (toolbarElement.classList.contains(\"edit-mode\")) {\n\t\tdisableEditPage();\n\t}\n\tif (toolbarElement.classList.contains(\"cut-outer-mode\")) {\n\t\tdisableCutOuterPage();\n\t}\n\tif (cutInnerPageButton.classList.contains(\"cut-disabled\")) {\n\t\tenableCutInnerPage();\n\n\t} else {\n\t\tdisableCutInnerPage();\n\t}\n};\ncutOuterPageButton.onmouseup = () => {\n\tif (toolbarElement.classList.contains(\"edit-mode\")) {\n\t\tdisableEditPage();\n\t}\n\tif (toolbarElement.classList.contains(\"cut-inner-mode\")) {\n\t\tdisableCutInnerPage();\n\t}\n\tif (cutOuterPageButton.classList.contains(\"cut-disabled\")) {\n\t\tenableCutOuterPage();\n\t} else {\n\t\tdisableCutOuterPage();\n\t}\n};\nundoCutPageButton.onmouseup = () => {\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"undoCutPage\" }), \"*\");\n};\nundoAllCutPageButton.onmouseup = () => {\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"undoAllCutPage\" }), \"*\");\n};\nredoCutPageButton.onmouseup = () => {\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"redoCutPage\" }), \"*\");\n};\nsavePageButton.onmouseup = () => {\n\tsavePage();\n};\nif (typeof print == \"function\") {\n\tprintPageButton.onmouseup = () => {\n\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"printPage\" }), \"*\");\n\t};\n} else {\n\tprintPageButton.remove();\n}\nimportMhtButton.onmouseup = async () => {\n\tconst fileInput = document.createElement(\"input\");\n\tfileInput.type = \"file\";\n\tfileInput.accept = \".mht,.mhtml\";\n\tfileInput.onchange = async () => {\n\t\tif (fileInput.files && fileInput.files[0]) {\n\t\t\tconst file = fileInput.files[0];\n\t\t\tlet filename = file.name || \"Untitled.mht\";\n\t\t\tfilename = filename.replace(/(\\.mhtml|\\.mht)$/i, \".html\");\n\t\t\tif (!filename.endsWith(\".html\")) {\n\t\t\t\tfilename += \".html\";\n\t\t\t}\n\t\t\tlet content = new TextDecoder().decode(await file.arrayBuffer());\n\t\t\teditorElement.contentWindow.postMessage(JSON.stringify({\n\t\t\t\tmethod: \"importMht\",\n\t\t\t\tcontent,\n\t\t\t\tfilename\n\t\t\t}), \"*\");\n\t\t}\n\t};\n\tfileInput.click();\n};\n\nlet toolbarPositionPointer, toolbarMoving, toolbarTranslateMax;\nlet orientationPortrait = matchMedia(\"(orientation: portrait)\").matches;\nlet toolbarTranslate = 0;\ntoolbarElement.ondragstart = event => event.preventDefault();\ntoolbarElement.ontouchstart = toolbarOnTouchStart;\ntoolbarElement.onmousedown = toolbarOnTouchStart;\ntoolbarElement.ontouchmove = toolbarOnTouchMove;\ntoolbarElement.ontouchend = toolbarOnTouchEnd;\n\nfunction viewportSizeChange() {\n\torientationPortrait = matchMedia(\"(orientation: portrait)\").matches;\n\ttoolbarElement.style.setProperty(\"transform\", orientationPortrait ? `translate(0, ${toolbarTranslate}px)` : `translate(${toolbarTranslate}px, 0)`);\n}\n\nfunction toolbarOnTouchStart(event) {\n\tconst position = getPosition(event);\n\ttoolbarPositionPointer = (orientationPortrait ? position.pageY : position.pageX) - toolbarTranslate;\n\ttoolbarTranslateMax = (orientationPortrait ? -lastButton.getBoundingClientRect().top : -lastButton.getBoundingClientRect().left) + toolbarTranslate;\n}\n\nfunction toolbarOnTouchMove(event) {\n\tif (toolbarPositionPointer != null && (event.buttons === undefined || event.buttons == 1)) {\n\t\tconst position = getPosition(event);\n\t\tconst lastToolbarTranslate = toolbarTranslate;\n\t\tlet newToolbarTranslate = (orientationPortrait ? position.pageY : position.pageX) - toolbarPositionPointer;\n\t\tif (newToolbarTranslate > 0) {\n\t\t\tnewToolbarTranslate = 0;\n\t\t}\n\t\tif (newToolbarTranslate < toolbarTranslateMax) {\n\t\t\tnewToolbarTranslate = toolbarTranslateMax;\n\t\t}\n\t\tif (Math.abs(lastToolbarTranslate - newToolbarTranslate) > (toolbarMoving ? 1 : 8)) {\n\t\t\ttoolbarTranslate = newToolbarTranslate;\n\t\t\tconst newTransform = orientationPortrait ? `translate(0px, ${toolbarTranslate}px)` : `translate(${toolbarTranslate}px, 0px)`;\n\t\t\ttoolbarMoving = true;\n\t\t\ttoolbarElement.style.setProperty(\"transform\", newTransform);\n\t\t\teditorElement.style.setProperty(\"pointer-events\", \"none\");\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n}\n\nfunction toolbarOnTouchEnd(event) {\n\tif (toolbarMoving) {\n\t\teditorElement.style.removeProperty(\"pointer-events\");\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t}\n\ttoolbarPositionPointer = null;\n\ttoolbarMoving = false;\n}\n\nlet updatedResources = {};\n\naddEventListener(\"resize\", viewportSizeChange);\naddEventListener(\"message\", async event => {\n\tconst message = JSON.parse(event.data);\n\tif (message.method == \"setContent\") {\n\t\ttabData.options.openEditor = false;\n\t\ttabData.options.openSavedPage = false;\n\t\tif (message.compressContent) {\n\t\t\ttabData.options.compressContent = true;\n\t\t\tif (tabData.selfExtractingArchive !== undefined) {\n\t\t\t\ttabData.options.selfExtractingArchive = tabData.selfExtractingArchive;\n\t\t\t}\n\t\t\tif (tabData.disableCompression !== undefined) {\n\t\t\t\ttabData.options.disableCompression = tabData.disableCompression;\n\t\t\t}\n\t\t\tif (tabData.extractDataFromPageTags !== undefined) {\n\t\t\t\ttabData.options.extractDataFromPage = tabData.extractDataFromPageTags;\n\t\t\t}\n\t\t\tif (tabData.insertTextBody !== undefined) {\n\t\t\t\ttabData.options.insertTextBody = tabData.insertTextBody;\n\t\t\t}\n\t\t\tif (tabData.embeddedImage !== undefined || tabData.options.insertEmbeddedScreenshotImage) {\n\t\t\t\tif (tabData.options.insertEmbeddedScreenshotImage) {\n\t\t\t\t\ttoolbarElement.style.display = \"none\";\n\t\t\t\t\teditorElement.style.height = message.documentHeight + \"px\";\n\t\t\t\t\tdocument.documentElement.style.height = message.documentHeight + \"px\";\n\t\t\t\t\tconst infobarElement = document.querySelector(INFOBAR_TAGNAME);\n\t\t\t\t\tif (infobarElement) {\n\t\t\t\t\t\tinfobarElement.style.display = \"none\";\n\t\t\t\t\t}\n\t\t\t\t\tconst screenshotBlobURI = await browser.runtime.sendMessage({\n\t\t\t\t\t\tmethod: \"tabs.getScreenshot\",\n\t\t\t\t\t\twidth: document.documentElement.scrollWidth,\n\t\t\t\t\t\theight: document.documentElement.scrollHeight,\n\t\t\t\t\t\tinnerHeight: globalThis.innerHeight\n\t\t\t\t\t});\n\t\t\t\t\ttabData.options.embeddedImage = new Uint8Array(await (await fetch(screenshotBlobURI)).arrayBuffer());\n\t\t\t\t\teditorElement.style.height = \"\";\n\t\t\t\t\tdocument.documentElement.style.height = \"\";\n\t\t\t\t\ttoolbarElement.style.display = \"\";\n\t\t\t\t\tif (infobarElement) {\n\t\t\t\t\t\tinfobarElement.style.display = \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttabData.options.embeddedImage = tabData.embeddedImage;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (tabData.insertMetaCSP !== undefined) {\n\t\t\t\ttabData.options.insertMetaCSP = tabData.insertMetaCSP;\n\t\t\t}\n\t\t\tconst pageData = await getContentPageData(tabData.content, message.content, { password: tabData.options.password });\n\t\t\tpageData.content = message.content;\n\t\t\tpageData.title = message.title;\n\t\t\tpageData.doctype = message.doctype;\n\t\t\tpageData.viewport = message.viewport;\n\t\t\tpageData.url = message.url;\n\t\t\tpageData.filename = message.filename || tabData.filename;\n\t\t\tpageData.mimeType = \"text/html\";\n\t\t\tif (message.foregroundSave) {\n\t\t\t\ttabData.options.backgroundSave = false;\n\t\t\t\ttabData.options.foregroundSave = true;\n\t\t\t}\n\t\t\tif (tabData.options.addProof) {\n\t\t\t\tpageData.hash = await singlefile.helper.digest(\"SHA-256\", message.content);\n\t\t\t}\n\t\t\ttabData.options.url = message.url;\n\t\t\tawait download.downloadPage(pageData, tabData.options);\n\t\t} else {\n\t\t\tconst pageData = {\n\t\t\t\tcontent: message.content,\n\t\t\t\tfilename: message.filename || tabData.filename,\n\t\t\t\tmimeType: \"text/html\",\n\t\t\t\ttitle: message.title,\n\t\t\t\turl: message.url\n\t\t\t};\n\t\t\tif (tabData.options.addProof) {\n\t\t\t\tpageData.hash = await singlefile.helper.digest(\"SHA-256\", message.content);\n\t\t\t}\n\t\t\ttabData.options.compressContent = false;\n\t\t\ttabData.options.url = message.url;\n\t\t\tawait download.downloadPage(pageData, tabData.options);\n\t\t}\n\t}\n\tif (message.method == \"onUpdate\") {\n\t\ttabData.docSaved = message.saved;\n\t}\n\tif (message.method == \"onInit\") {\n\t\ttabData.options.disableFormatPage = !message.formatPageEnabled;\n\t\tformatPageButton.hidden = !message.formatPageEnabled;\n\t\tdocument.title = \"[SingleFile] \" + message.title;\n\t\tif (message.filename) {\n\t\t\ttabData.filename = message.filename;\n\t\t}\n\t\tif (message.icon) {\n\t\t\tdocument.querySelectorAll(\"head > link[rel=icon]\").forEach(element => element.remove());\n\t\t\tconst linkElement = document.createElement(\"link\");\n\t\t\tlinkElement.rel = \"icon\";\n\t\t\tlinkElement.href = message.icon;\n\t\t\tdocument.head.appendChild(linkElement);\n\t\t}\n\t\tif (tabData.options.displayInfobarInEditor) {\n\t\t\tdisplayInfobar();\n\t\t}\n\t\ttabData.docSaved = true;\n\t\tif (!message.reset) {\n\t\t\tconst defaultEditorMode = tabData.options.defaultEditorMode;\n\t\t\tif (defaultEditorMode == \"edit\") {\n\t\t\t\tenableEditPage();\n\t\t\t} else if (defaultEditorMode == \"format\" && !tabData.options.disableFormatPage) {\n\t\t\t\tformatPage();\n\t\t\t} else if (defaultEditorMode == \"cut\") {\n\t\t\t\tenableCutInnerPage();\n\t\t\t} else if (defaultEditorMode == \"cut-external\") {\n\t\t\t\tenableCutOuterPage();\n\t\t\t}\n\t\t}\n\t}\n\tif (message.method == \"onError\") {\n\t\tbrowser.runtime.sendMessage({ method: \"ui.processError\", error: message.error });\n\t\tonError(message.error);\n\t}\n\tif (message.method == \"savePage\") {\n\t\tsavePage();\n\t}\n\tif (message.method == \"displayInfobar\") {\n\t\tconst doc = new DOMParser().parseFromString(message.content, \"text/html\");\n\t\tdeserializeShadowRoots(doc.body);\n\t\tconst infobarElement = doc.querySelector(INFOBAR_TAGNAME);\n\t\tinfobarElement.shadowRoot.querySelector(\"style\").textContent += \".infobar { position: absolute; }\";\n\t\tdocument.querySelector(\".editor-container\").appendChild(infobarElement);\n\t}\n});\n\nbrowser.runtime.onMessage.addListener(message => {\n\tif (message.method == \"devtools.resourceCommitted\" ||\n\t\tmessage.method == \"content.save\" ||\n\t\tmessage.method == \"editor.setTabData\" ||\n\t\tmessage.method == \"options.refresh\" ||\n\t\tmessage.method == \"content.error\" ||\n\t\tmessage.method == \"content.download\" ||\n\t\tmessage.method == \"content.beginScrollTo\" ||\n\t\tmessage.method == \"content.scrollTo\" ||\n\t\tmessage.method == \"content.endScrollTo\") {\n\t\treturn onMessage(message);\n\t}\n});\n\naddEventListener(\"load\", () => {\n\tbrowser.runtime.sendMessage({ method: \"editor.getTabData\" });\n});\n\naddEventListener(\"beforeunload\", event => {\n\tif (tabData.options.warnUnsavedPage && !tabData.docSaved) {\n\t\tevent.preventDefault();\n\t\tevent.returnValue = \"\";\n\t}\n});\n\nasync function onMessage(message) {\n\tif (message.method == \"devtools.resourceCommitted\") {\n\t\tupdatedResources[message.url] = { content: message.content, type: message.type, encoding: message.encoding };\n\t\treturn {};\n\t}\n\tif (message.method == \"content.save\") {\n\t\ttabData.options = message.options;\n\t\tsavePage();\n\t\tawait browser.runtime.sendMessage({ method: \"ui.processInit\" });\n\t\treturn {};\n\t}\n\tif (message.method == \"editor.setTabData\") {\n\t\tif (message.truncated) {\n\t\t\ttabDataContents.push(message.content);\n\t\t} else {\n\t\t\ttabDataContents = [message.content];\n\t\t}\n\t\tif (!message.truncated || message.finished) {\n\t\t\tif (message.content) {\n\t\t\t\ttabData = JSON.parse(tabDataContents.join(\"\"));\n\t\t\t\ttabData.tabId = message.tabId;\n\t\t\t\ttabData.options = message.options;\n\t\t\t\ttabDataContents = [];\n\t\t\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"init\", content: tabData.content, password: tabData.options.password, compressContent: message.compressContent }), \"*\");\n\t\t\t\teditorElement.contentWindow.focus();\n\t\t\t\tsaveTabData();\n\t\t\t} else {\n\t\t\t\ttabData = { tabId: message.tabId };\n\t\t\t\tloadTabData().then(() => {\n\t\t\t\t\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"init\", content: tabData.content }), \"*\");\n\t\t\t\t\teditorElement.contentWindow.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn {};\n\t}\n\tif (message.method == \"options.refresh\") {\n\t\tawait refreshOptions(message.profileName);\n\t\treturn {};\n\t}\n\tif (message.method == \"content.error\") {\n\t\tonError(message.error, message.link);\n\t\treturn {};\n\t}\n\tif (message.method == \"content.download\") {\n\t\tawait downloadContent(message);\n\t\treturn {};\n\t}\n\tif (message.method == \"content.beginScrollTo\") {\n\t\tscrollY = globalThis.scrollY;\n\t\ttransform = document.documentElement.style.getPropertyValue(\"transform\");\n\t\toverflow = document.documentElement.style.getPropertyValue(\"overflow\");\n\t\tglobalThis.scrollTo(0, 0);\n\t\tdocument.documentElement.style.setProperty(\"transform\", \"translateY(0px)\");\n\t\tdocument.documentElement.style.setProperty(\"overflow\", \"hidden\");\n\t\treturn {};\n\t}\n\tif (message.method == \"content.scrollTo\") {\n\t\tdocument.documentElement.style.setProperty(\"transform\", \"translateY(-\" + message.y + \"px)\");\n\t\tawait new Promise(resolve => setTimeout(resolve, 500));\n\t\treturn {};\n\t}\n\tif (message.method == \"content.endScrollTo\") {\n\t\tglobalThis.scrollTo(0, scrollY);\n\t\tdocument.documentElement.style.setProperty(\"transform\", transform);\n\t\tdocument.documentElement.style.setProperty(\"overflow\", overflow);\n\t\treturn {};\n\t}\n}\n\nasync function downloadContent(message) {\n\tif (!downloadParser) {\n\t\tdownloadParser = yabson.getParser();\n\t}\n\tconst result = await downloadParser.next(message.data);\n\tif (result.done) {\n\t\tdownloadParser = null;\n\t\tif (result.value.foregroundSave || result.value.sharePage) {\n\t\t\teditorElement.contentWindow.postMessage(JSON.stringify({\n\t\t\t\tmethod: \"download\",\n\t\t\t\tfilename: result.value.filename,\n\t\t\t\tcontent: Array.from(new Uint8Array(result.value.content)),\n\t\t\t\tmimeType: result.value.mimeType,\n\t\t\t\tsharePage: result.value.sharePage\n\t\t\t}), \"*\");\n\t\t} else {\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tlink.download = result.value.filename;\n\t\t\tlink.href = URL.createObjectURL(new Blob([result.value.content], { type: result.value.mimeType }));\n\t\t\tlink.dispatchEvent(new MouseEvent(\"click\"));\n\t\t\tURL.revokeObjectURL(link.href);\n\t\t}\n\t\treturn browser.runtime.sendMessage({ method: \"downloads.end\", taskId: result.value.taskId }).then(() => ({}));\n\t} else {\n\t\treturn Promise.resolve({});\n\t}\n}\n\nfunction loadTabData() {\n\treturn new Promise((resolve, reject) => {\n\t\twebkitRequestFileSystem(TEMPORARY, FS_SIZE, fs => {\n\t\t\tfs.root.getFile(tabData.tabId, {}, function (fileEntry) {\n\t\t\t\tfileEntry.file(data => {\n\t\t\t\t\tdata.text()\n\t\t\t\t\t\t.then(jsonData => {\n\t\t\t\t\t\t\ttabData = JSON.parse(jsonData);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(reject);\n\t\t\t\t}, reject);\n\t\t\t}, reject);\n\t\t}, reject);\n\t});\n}\n\nfunction saveTabData() {\n\treturn new Promise((resolve, reject) => {\n\t\tconst data = JSON.stringify(tabData);\n\t\twebkitRequestFileSystem(TEMPORARY, FS_SIZE, fs => {\n\t\t\tfs.root.getFile(tabData.tabId, { create: true }, function (fileEntry) {\n\t\t\t\tfileEntry.createWriter(function (fileWriter) {\n\t\t\t\t\tfileWriter.onwriteend = () => resolve();\n\t\t\t\t\tfileWriter.onerror = reject;\n\t\t\t\t\tfileWriter.write(new Blob([data], { type: \"text/plain\" }));\n\t\t\t\t}, reject);\n\t\t\t}, reject);\n\t\t}, reject);\n\t});\n}\n\nasync function refreshOptions(profileName) {\n\tconst profiles = await browser.runtime.sendMessage({ method: \"config.getProfiles\" });\n\ttabData.options = profiles[profileName];\n}\n\nfunction disableEditPage() {\n\teditPageButton.classList.add(\"edit-disabled\");\n\ttoolbarElement.classList.remove(\"edit-mode\");\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"disableEditPage\" }), \"*\");\n}\n\nfunction disableCutInnerPage() {\n\tcutInnerPageButton.classList.add(\"cut-disabled\");\n\ttoolbarElement.classList.remove(\"cut-inner-mode\");\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"disableCutInnerPage\" }), \"*\");\n}\n\nfunction disableCutOuterPage() {\n\tcutOuterPageButton.classList.add(\"cut-disabled\");\n\ttoolbarElement.classList.remove(\"cut-outer-mode\");\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"disableCutOuterPage\" }), \"*\");\n}\n\nfunction resetHighlightButtons() {\n\thighlightButtons.forEach(highlightButton => highlightButton.classList.add(\"highlight-disabled\"));\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"disableHighlight\" }), \"*\");\n}\n\nfunction disableRemoveHighlights() {\n\ttoolbarElement.classList.remove(\"remove-highlight-mode\");\n\tremoveHighlightButton.classList.add(\"remove-highlight-disabled\");\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"disableRemoveHighlights\" }), \"*\");\n}\n\nfunction displayHighlights() {\n\ttoggleHighlightsButton.src = \"/src/ui/resources/button_highlighter_visible.png\";\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"displayHighlights\" }), \"*\");\n}\n\nfunction enableEditPage() {\n\teditPageButton.classList.remove(\"edit-disabled\");\n\ttoolbarElement.classList.add(\"edit-mode\");\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"enableEditPage\" }), \"*\");\n}\n\nfunction formatPage() {\n\tformatPageButton.classList.remove(\"format-disabled\");\n\tupdatedResources = {};\n\teditorElement.contentWindow.postMessage(JSON.stringify({\n\t\tmethod: \"formatPage\",\n\t\tapplySystemTheme: tabData.options.applySystemTheme,\n\t\tcontentWidth: tabData.options.contentWidth\n\t}), \"*\");\n}\n\nfunction cancelFormatPage() {\n\tformatPageButton.classList.add(\"format-disabled\");\n\tupdatedResources = {};\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"cancelFormatPage\" }), \"*\");\n}\n\nfunction enableCutInnerPage() {\n\tcutInnerPageButton.classList.remove(\"cut-disabled\");\n\ttoolbarElement.classList.add(\"cut-inner-mode\");\n\tresetHighlightButtons();\n\tdisableRemoveHighlights();\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"enableCutInnerPage\" }), \"*\");\n}\n\nfunction enableCutOuterPage() {\n\tcutOuterPageButton.classList.remove(\"cut-disabled\");\n\ttoolbarElement.classList.add(\"cut-outer-mode\");\n\tresetHighlightButtons();\n\tdisableRemoveHighlights();\n\teditorElement.contentWindow.postMessage(JSON.stringify({ method: \"enableCutOuterPage\" }), \"*\");\n}\n\nfunction savePage() {\n\teditorElement.contentWindow.postMessage(JSON.stringify({\n\t\tmethod: \"getContent\",\n\t\tcompressHTML: tabData.options.compressHTML,\n\t\tincludeInfobar: tabData.options.includeInfobar,\n\t\topenInfobar: tabData.options.openInfobar,\n\t\tinfobarPositionAbsolute: tabData.options.infobarPositionAbsolute,\n\t\tinfobarPositionTop: tabData.options.infobarPositionTop,\n\t\tinfobarPositionBottom: tabData.options.infobarPositionBottom,\n\t\tinfobarPositionLeft: tabData.options.infobarPositionLeft,\n\t\tinfobarPositionRight: tabData.options.infobarPositionRight,\n\t\tbackgroundSave: tabData.options.backgroundSave,\n\t\tupdatedResources,\n\t\tfilename: tabData.filename,\n\t\tsharePage: tabData.options.sharePage,\n\t\tlabels: {\n\t\t\tEMBEDDED_IMAGE_BUTTON_MESSAGE,\n\t\t\tSHARE_PAGE_BUTTON_MESSAGE,\n\t\t\tSHARE_SELECTION_BUTTON_MESSAGE,\n\t\t\tERROR_TITLE_MESSAGE\n\t\t}\n\t}), \"*\");\n}\n\nfunction displayInfobar() {\n\teditorElement.contentWindow.postMessage(JSON.stringify({\n\t\tmethod: \"displayInfobar\",\n\t\topenInfobar: tabData.options.openInfobar,\n\t\tinfobarPositionAbsolute: tabData.options.infobarPositionAbsolute,\n\t\tinfobarPositionTop: tabData.options.infobarPositionTop,\n\t\tinfobarPositionBottom: tabData.options.infobarPositionBottom,\n\t\tinfobarPositionLeft: tabData.options.infobarPositionLeft,\n\t\tinfobarPositionRight: tabData.options.infobarPositionRight\n\t}), \"*\");\n}\n\nfunction getPosition(event) {\n\tif (event.touches && event.touches.length) {\n\t\tconst touch = event.touches[0];\n\t\treturn touch;\n\t} else {\n\t\treturn event;\n\t}\n}\n\nasync function getContentPageData(zipContent, page, options) {\n\tzip.configure({ workerScripts: { inflate: [\"/lib/single-file-z-worker.js\"] } });\n\tconst zipReader = new zip.ZipReader(new zip.Uint8ArrayReader(new Uint8Array(zipContent)));\n\tconst entries = await zipReader.getEntries();\n\tconst resources = [];\n\tawait Promise.all(entries.map(async entry => {\n\t\tlet data;\n\t\tif (!options.password && entry.bitFlag.encrypted) {\n\t\t\toptions.password = prompt(\"Please enter the password to view the page\");\n\t\t}\n\t\tif (entry.filename.match(/^([0-9_]+\\/)?index.html$/)) {\n\t\t\tdata = page;\n\t\t} else {\n\t\t\tif (entry.filename.endsWith(\".html\")) {\n\t\t\t\tdata = await entry.getData(new zip.TextWriter(), options);\n\t\t\t} else {\n\t\t\t\tdata = await entry.getData(new zip.Uint8ArrayWriter(), options);\n\t\t\t}\n\t\t}\n\t\tconst extensionMatch = entry.filename.match(/\\.([^.]+)/);\n\t\tresources.push({\n\t\t\tfilename: entry.filename.match(/^([0-9_]+\\/)?(.*)$/)[2],\n\t\t\textension: extensionMatch && extensionMatch[1],\n\t\t\tcontent: data,\n\t\t\turl: entry.comment\n\t\t});\n\t}));\n\treturn getPageData(resources);\n}\n\nfunction getPageData(resources) {\n\tconst pageData = JSON.parse(JSON.stringify(EMPTY_PAGE_DATA));\n\tfor (const resource of resources) {\n\t\tconst resourcePageData = getPageDataResource(resource, \"\", pageData);\n\t\tconst filename = resource.filename.substring(resourcePageData.prefixPath.length);\n\t\tresource.name = filename;\n\t\tif (filename.startsWith(\"images/\")) {\n\t\t\tresourcePageData.resources.images.push(resource);\n\t\t}\n\t\tif (filename.startsWith(\"fonts/\")) {\n\t\t\tresourcePageData.resources.fonts.push(resource);\n\t\t}\n\t\tif (filename.startsWith(\"scripts/\")) {\n\t\t\tresourcePageData.resources.scripts.push(resource);\n\t\t}\n\t\tif (filename.endsWith(\".css\")) {\n\t\t\tresourcePageData.resources.stylesheets.push(resource);\n\t\t}\n\t\tif (filename.endsWith(\".html\")) {\n\t\t\tresourcePageData.content = resource.content;\n\t\t}\n\t}\n\treturn pageData;\n}\n\nconst EMPTY_PAGE_DATA = {\n\tname: \"\",\n\tprefixPath: \"\",\n\tresources: {\n\t\tstylesheets: [],\n\t\timages: [],\n\t\tfonts: [],\n\t\tscripts: [],\n\t\tframes: []\n\t}\n};\n\nfunction getPageDataResource(resource, prefixPath = \"\", pageData) {\n\tconst filename = resource.filename.substring(prefixPath.length);\n\tresource.name = filename;\n\tif (filename.startsWith(\"frames/\")) {\n\t\tconst framesIndex = Number(filename.match(/^frames\\/(\\d+)\\//)[1]);\n\t\tconst framePath = \"frames/\" + framesIndex + \"/\";\n\t\tif (!pageData.resources.frames[framesIndex]) {\n\t\t\tpageData.resources.frames[framesIndex] = Object.assign(JSON.parse(JSON.stringify(EMPTY_PAGE_DATA)), {\n\t\t\t\tname: framePath,\n\t\t\t\tprefixPath: prefixPath + framePath\n\t\t\t});\n\t\t}\n\t\treturn getPageDataResource(resource, prefixPath + framePath, pageData.resources.frames[framesIndex]);\n\t} else {\n\t\treturn pageData;\n\t}\n}\n\nfunction deserializeShadowRoots(node) {\n\tnode.querySelectorAll(`template[${SHADOWROOT_ATTRIBUTE_NAME}]`).forEach(element => {\n\t\tif (element.parentElement) {\n\t\t\tlet shadowRoot;\n\t\t\ttry {\n\t\t\t\tshadowRoot = element.parentElement.attachShadow({ mode: \"open\" });\n\t\t\t\tconst contentDocument = (new DOMParser()).parseFromString(element.innerHTML, \"text/html\");\n\t\t\t\tArray.from(contentDocument.head.childNodes).forEach(node => shadowRoot.appendChild(node));\n\t\t\t\tArray.from(contentDocument.body.childNodes).forEach(node => shadowRoot.appendChild(node));\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t} catch (error) {\n\t\t\t\t// ignored\n\t\t\t}\n\t\t\tif (shadowRoot) {\n\t\t\t\tdeserializeShadowRoots(shadowRoot);\n\t\t\t\telement.remove();\n\t\t\t}\n\t\t}\n\t});\n}"
  },
  {
    "path": "src/ui/bg/ui-help.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, document */\n\nlet BACKGROUND_SAVE_SUPPORTED,\n\tSHARE_API_SUPPORTED;\nbrowser.runtime.sendMessage({ method: \"config.getConstants\" }).then(data => {\n\t({\n\t\tBACKGROUND_SAVE_SUPPORTED,\n\t\tSHARE_API_SUPPORTED\n\t} = data);\n\tinit();\n});\n\nfunction init() {\n\tif (!BACKGROUND_SAVE_SUPPORTED) {\n\t\tdocument.getElementById(\"backgroundSaveOption\").hidden = true;\n\t\tdocument.getElementById(\"confirmFilenameOption\").hidden = true;\n\t\tdocument.getElementById(\"filenameConflictActionOption\").hidden = true;\n\t}\n\tif (!SHARE_API_SUPPORTED) {\n\t\tdocument.getElementById(\"sharePageOption\").hidden = true;\n\t}\n}"
  },
  {
    "path": "src/ui/bg/ui-menus.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, URL */\n\nimport * as config from \"./../../core/bg/config.js\";\nimport { queryTabs } from \"./../../core/bg/tabs-util.js\";\nimport * as tabsData from \"./../../core/bg/tabs-data.js\";\n\nimport { refreshAutoSaveTabs } from \"./../../core/bg/autosave-util.js\";\nimport * as button from \"./ui-button.js\";\n\nconst menus = browser.contextMenus;\nconst MENU_ID_SAVE_PAGE = \"save-page\";\nconst MENU_ID_EDIT_AND_SAVE_PAGE = \"edit-and-save-page\";\nconst MENU_ID_SAVE_WITH_PROFILE = \"save-with-profile\";\nconst MENU_ID_SAVE_SELECTED_LINKS = \"save-selected-links\";\nconst MENU_ID_VIEW_PENDINGS = \"view-pendings\";\nconst MENU_ID_SELECT_PROFILE = \"select-profile\";\nconst MENU_ID_SAVE_WITH_PROFILE_PREFIX = \"wasve-with-profile-\";\nconst MENU_ID_SELECT_PROFILE_PREFIX = \"select-profile-\";\nconst MENU_ID_ASSOCIATE_WITH_PROFILE = \"associate-with-profile\";\nconst MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX = \"associate-with-profile-\";\nconst MENU_ID_SAVE_SELECTED = \"save-selected\";\nconst MENU_ID_SAVE_FRAME = \"save-frame\";\nconst MENU_ID_SAVE_TABS = \"save-tabs\";\nconst MENU_ID_SAVE_SELECTED_TABS = \"save-selected-tabs\";\nconst MENU_ID_SAVE_UNPINNED_TABS = \"save-unpinned-tabs\";\nconst MENU_ID_SAVE_ALL_TABS = \"save-all-tabs\";\nconst MENU_ID_BATCH_SAVE_URLS = \"batch-save-urls\";\nconst MENU_ID_BUTTON_SAVE_SELECTED_TABS = \"button-\" + MENU_ID_SAVE_SELECTED_TABS;\nconst MENU_ID_BUTTON_SAVE_UNPINNED_TABS = \"button-\" + MENU_ID_SAVE_UNPINNED_TABS;\nconst MENU_ID_BUTTON_SAVE_ALL_TABS = \"button-\" + MENU_ID_SAVE_ALL_TABS;\nconst MENU_ID_AUTO_SAVE = \"auto-save\";\nconst MENU_ID_AUTO_SAVE_DISABLED = \"auto-save-disabled\";\nconst MENU_ID_AUTO_SAVE_TAB = \"auto-save-tab\";\nconst MENU_ID_AUTO_SAVE_UNPINNED = \"auto-save-unpinned\";\nconst MENU_ID_AUTO_SAVE_ALL = \"auto-save-all\";\nconst MENU_CREATE_DOMAIN_RULE_MESSAGE = browser.i18n.getMessage(\"menuCreateDomainRule\");\nconst MENU_UPDATE_RULE_MESSAGE = browser.i18n.getMessage(\"menuUpdateRule\");\nconst MENU_SAVE_PAGE_MESSAGE = browser.i18n.getMessage(\"menuSavePage\");\nconst MENU_SAVE_WITH_PROFILE = browser.i18n.getMessage(\"menuSaveWithProfile\");\nconst MENU_SAVE_SELECTED_LINKS = browser.i18n.getMessage(\"menuSaveSelectedLinks\");\nconst MENU_EDIT_PAGE_MESSAGE = browser.i18n.getMessage(\"menuEditPage\");\nconst MENU_EDIT_AND_SAVE_PAGE_MESSAGE = browser.i18n.getMessage(\"menuEditAndSavePage\");\nconst MENU_VIEW_PENDINGS_MESSAGE = browser.i18n.getMessage(\"menuViewPendingSaves\");\nconst MENU_SAVE_SELECTION_MESSAGE = browser.i18n.getMessage(\"menuSaveSelection\");\nconst MENU_SAVE_FRAME_MESSAGE = browser.i18n.getMessage(\"menuSaveFrame\");\nconst MENU_SAVE_TABS_MESSAGE = browser.i18n.getMessage(\"menuSaveTabs\");\nconst MENU_SAVE_SELECTED_TABS_MESSAGE = browser.i18n.getMessage(\"menuSaveSelectedTabs\");\nconst MENU_SAVE_UNPINNED_TABS_MESSAGE = browser.i18n.getMessage(\"menuSaveUnpinnedTabs\");\nconst MENU_SAVE_ALL_TABS_MESSAGE = browser.i18n.getMessage(\"menuSaveAllTabs\");\nconst MENU_BATCH_SAVE_URLS_MESSAGE = browser.i18n.getMessage(\"menuBatchSaveUrls\");\nconst MENU_SELECT_PROFILE_MESSAGE = browser.i18n.getMessage(\"menuSelectProfile\");\nconst PROFILE_DEFAULT_SETTINGS_MESSAGE = browser.i18n.getMessage(\"profileDefaultSettings\");\nconst MENU_AUTOSAVE_MESSAGE = browser.i18n.getMessage(\"menuAutoSave\");\nconst MENU_AUTOSAVE_DISABLED_MESSAGE = browser.i18n.getMessage(\"menuAutoSaveDisabled\");\nconst MENU_AUTOSAVE_TAB_MESSAGE = browser.i18n.getMessage(\"menuAutoSaveTab\");\nconst MENU_AUTOSAVE_UNPINNED_TABS_MESSAGE = browser.i18n.getMessage(\"menuAutoSaveUnpinnedTabs\");\nconst MENU_AUTOSAVE_ALL_TABS_MESSAGE = browser.i18n.getMessage(\"menuAutoSaveAllTabs\");\nconst MENU_TOP_VISIBLE_ENTRIES = [\n\tMENU_ID_EDIT_AND_SAVE_PAGE,\n\tMENU_ID_SAVE_SELECTED_LINKS,\n\tMENU_ID_SAVE_SELECTED,\n\tMENU_ID_SAVE_FRAME,\n\tMENU_ID_AUTO_SAVE,\n\tMENU_ID_ASSOCIATE_WITH_PROFILE\n];\n\nconst menusCheckedState = new Map();\nconst menusTitleState = new Map();\nlet contextMenuVisibleState = true;\nlet allMenuVisibleState = true;\nlet profileIndexes = new Map();\nlet menusCreated, pendingRefresh, business;\nPromise.resolve().then(initialize);\nexport {\n\tonMessage,\n\trefreshTab as onTabCreated,\n\trefreshTab as onTabActivated,\n\trefreshTab as onInit,\n\tcreateMenus as refreshTab,\n\tinit\n};\n\nfunction init(businessApi) {\n\tbusiness = businessApi;\n}\n\nfunction onMessage(message) {\n\tif (message.method.endsWith(\"refreshMenu\")) {\n\t\tcreateMenus();\n\t\treturn Promise.resolve({});\n\t}\n}\n\nasync function createMenus(tab) {\n\tconst [profiles, allTabsData] = await Promise.all([config.getProfiles(), tabsData.get()]);\n\tlet options = await config.getOptions(tab && tab.url);\n\tif (options) {\n\t\tconst pageContextsEnabled = [\"page\", \"frame\", \"image\", \"link\", \"video\", \"audio\", \"selection\"];\n\t\tconst defaultContextsDisabled = [];\n\t\tif (options.profileName == config.DISABLED_PROFILE_NAME) {\n\t\t\toptions = await config.getOptions();\n\t\t\toptions.profileName = config.DISABLED_PROFILE_NAME;\n\t\t}\n\t\tif (options.browserActionMenuEnabled) {\n\t\t\tdefaultContextsDisabled.push(\"action\");\n\t\t}\n\t\tif (options.tabMenuEnabled) {\n\t\t\ttry {\n\t\t\t\tawait menus.create({\n\t\t\t\t\tid: \"temporary-id\",\n\t\t\t\t\tcontexts: [\"tab\"],\n\t\t\t\t\ttitle: \"title\"\n\t\t\t\t});\n\t\t\t\tdefaultContextsDisabled.push(\"tab\");\n\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t} catch (error) {\n\t\t\t\toptions.tabMenuEnabled = false;\n\t\t\t}\n\t\t}\n\t\tawait menus.removeAll();\n\t\tconst defaultContextsEnabled = defaultContextsDisabled.concat(...pageContextsEnabled);\n\t\tconst defaultContexts = options.contextMenuEnabled ? defaultContextsEnabled : defaultContextsDisabled;\n\t\tmenus.create({\n\t\t\tid: MENU_ID_SAVE_PAGE,\n\t\t\tcontexts: defaultContexts,\n\t\t\ttitle: MENU_SAVE_PAGE_MESSAGE\n\t\t});\n\t\tmenus.create({\n\t\t\tid: MENU_ID_EDIT_AND_SAVE_PAGE,\n\t\t\tcontexts: defaultContexts,\n\t\t\ttitle: MENU_EDIT_AND_SAVE_PAGE_MESSAGE\n\t\t});\n\t\tmenus.create({\n\t\t\tid: MENU_ID_SAVE_SELECTED_LINKS,\n\t\t\tcontexts: options.contextMenuEnabled ? defaultContextsDisabled.concat([\"selection\"]) : defaultContextsDisabled,\n\t\t\ttitle: MENU_SAVE_SELECTED_LINKS\n\t\t});\n\t\tif (Object.keys(profiles).length > 1) {\n\t\t\tmenus.create({\n\t\t\t\tid: MENU_ID_SAVE_WITH_PROFILE,\n\t\t\t\tcontexts: defaultContexts,\n\t\t\t\ttitle: MENU_SAVE_WITH_PROFILE\n\t\t\t});\n\t\t}\n\t\tif (options.contextMenuEnabled) {\n\t\t\tmenus.create({\n\t\t\t\tid: \"separator-1\",\n\t\t\t\tcontexts: pageContextsEnabled,\n\t\t\t\ttype: \"separator\"\n\t\t\t});\n\t\t}\n\t\tmenus.create({\n\t\t\tid: MENU_ID_SAVE_SELECTED,\n\t\t\tcontexts: defaultContexts,\n\t\t\ttitle: MENU_SAVE_SELECTION_MESSAGE\n\t\t});\n\t\tif (options.contextMenuEnabled) {\n\t\t\tmenus.create({\n\t\t\t\tid: MENU_ID_SAVE_FRAME,\n\t\t\t\tcontexts: [\"frame\"],\n\t\t\t\ttitle: MENU_SAVE_FRAME_MESSAGE\n\t\t\t});\n\t\t}\n\t\tmenus.create({\n\t\t\tid: MENU_ID_SAVE_TABS,\n\t\t\tcontexts: defaultContextsDisabled,\n\t\t\ttitle: MENU_SAVE_TABS_MESSAGE\n\t\t});\n\t\tmenus.create({\n\t\t\tid: MENU_ID_BUTTON_SAVE_SELECTED_TABS,\n\t\t\tcontexts: defaultContextsDisabled,\n\t\t\ttitle: MENU_SAVE_SELECTED_TABS_MESSAGE,\n\t\t\tparentId: MENU_ID_SAVE_TABS\n\t\t});\n\t\tmenus.create({\n\t\t\tid: MENU_ID_BUTTON_SAVE_UNPINNED_TABS,\n\t\t\tcontexts: defaultContextsDisabled,\n\t\t\ttitle: MENU_SAVE_UNPINNED_TABS_MESSAGE,\n\t\t\tparentId: MENU_ID_SAVE_TABS\n\t\t});\n\t\tmenus.create({\n\t\t\tid: MENU_ID_BUTTON_SAVE_ALL_TABS,\n\t\t\tcontexts: defaultContextsDisabled,\n\t\t\ttitle: MENU_SAVE_ALL_TABS_MESSAGE,\n\t\t\tparentId: MENU_ID_SAVE_TABS\n\t\t});\n\t\tif (options.contextMenuEnabled) {\n\t\t\tmenus.create({\n\t\t\t\tid: MENU_ID_SAVE_SELECTED_TABS,\n\t\t\t\tcontexts: pageContextsEnabled,\n\t\t\t\ttitle: MENU_SAVE_SELECTED_TABS_MESSAGE\n\t\t\t});\n\t\t\tmenus.create({\n\t\t\t\tid: MENU_ID_SAVE_UNPINNED_TABS,\n\t\t\t\tcontexts: pageContextsEnabled,\n\t\t\t\ttitle: MENU_SAVE_UNPINNED_TABS_MESSAGE\n\t\t\t});\n\t\t\tmenus.create({\n\t\t\t\tid: MENU_ID_SAVE_ALL_TABS,\n\t\t\t\tcontexts: pageContextsEnabled,\n\t\t\t\ttitle: MENU_SAVE_ALL_TABS_MESSAGE\n\t\t\t});\n\t\t\tmenus.create({\n\t\t\t\tid: \"separator-2\",\n\t\t\t\tcontexts: pageContextsEnabled,\n\t\t\t\ttype: \"separator\"\n\t\t\t});\n\t\t}\n\t\tif (Object.keys(profiles).length > 1) {\n\t\t\tmenus.create({\n\t\t\t\tid: MENU_ID_SELECT_PROFILE,\n\t\t\t\ttitle: MENU_SELECT_PROFILE_MESSAGE,\n\t\t\t\tcontexts: defaultContexts,\n\t\t\t});\n\t\t\tmenus.create({\n\t\t\t\tid: MENU_ID_SAVE_WITH_PROFILE_PREFIX + \"default\",\n\t\t\t\tcontexts: defaultContexts,\n\t\t\t\ttitle: PROFILE_DEFAULT_SETTINGS_MESSAGE,\n\t\t\t\tparentId: MENU_ID_SAVE_WITH_PROFILE\n\t\t\t});\n\t\t\tconst defaultProfileId = MENU_ID_SELECT_PROFILE_PREFIX + \"default\";\n\t\t\tconst defaultProfileChecked = !allTabsData.profileName || allTabsData.profileName == config.DEFAULT_PROFILE_NAME;\n\t\t\tmenus.create({\n\t\t\t\tid: defaultProfileId,\n\t\t\t\ttype: \"radio\",\n\t\t\t\tcontexts: defaultContexts,\n\t\t\t\ttitle: PROFILE_DEFAULT_SETTINGS_MESSAGE,\n\t\t\t\tchecked: defaultProfileChecked,\n\t\t\t\tparentId: MENU_ID_SELECT_PROFILE\n\t\t\t});\n\t\t\tmenusCheckedState.set(defaultProfileId, defaultProfileChecked);\n\t\t\tmenus.create({\n\t\t\t\tid: MENU_ID_ASSOCIATE_WITH_PROFILE,\n\t\t\t\ttitle: MENU_CREATE_DOMAIN_RULE_MESSAGE,\n\t\t\t\tcontexts: defaultContexts,\n\t\t\t});\n\t\t\tmenusTitleState.set(MENU_ID_ASSOCIATE_WITH_PROFILE, MENU_CREATE_DOMAIN_RULE_MESSAGE);\n\t\t\tlet rule;\n\t\t\tif (tab && tab.url) {\n\t\t\t\trule = await config.getRule(tab.url, true);\n\t\t\t}\n\t\t\tconst currentProfileId = MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + \"current\";\n\t\t\tconst currentProfileChecked = !rule || (rule.profile == config.CURRENT_PROFILE_NAME);\n\t\t\tmenus.create({\n\t\t\t\tid: currentProfileId,\n\t\t\t\ttype: \"radio\",\n\t\t\t\tcontexts: defaultContexts,\n\t\t\t\ttitle: config.CURRENT_PROFILE_NAME,\n\t\t\t\tchecked: currentProfileChecked,\n\t\t\t\tparentId: MENU_ID_ASSOCIATE_WITH_PROFILE\n\t\t\t});\n\t\t\tmenusCheckedState.set(currentProfileId, currentProfileChecked);\n\n\t\t\tconst associatedDefaultProfileId = MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + \"default\";\n\t\t\tconst associatedDefaultProfileChecked = Boolean(rule) && (rule.profile == config.DEFAULT_PROFILE_NAME);\n\t\t\tmenus.create({\n\t\t\t\tid: associatedDefaultProfileId,\n\t\t\t\ttype: \"radio\",\n\t\t\t\tcontexts: defaultContexts,\n\t\t\t\ttitle: PROFILE_DEFAULT_SETTINGS_MESSAGE,\n\t\t\t\tchecked: associatedDefaultProfileChecked,\n\t\t\t\tparentId: MENU_ID_ASSOCIATE_WITH_PROFILE\n\t\t\t});\n\t\t\tmenusCheckedState.set(associatedDefaultProfileId, associatedDefaultProfileChecked);\n\t\t\tprofileIndexes = new Map();\n\t\t\tObject.keys(profiles).forEach((profileName, profileIndex) => {\n\t\t\t\tif (profileName != config.DEFAULT_PROFILE_NAME) {\n\t\t\t\t\tlet profileId = MENU_ID_SAVE_WITH_PROFILE_PREFIX + profileIndex;\n\t\t\t\t\tmenus.create({\n\t\t\t\t\t\tid: profileId,\n\t\t\t\t\t\tcontexts: defaultContexts,\n\t\t\t\t\t\ttitle: profileName,\n\t\t\t\t\t\tparentId: MENU_ID_SAVE_WITH_PROFILE\n\t\t\t\t\t});\n\t\t\t\t\tprofileId = MENU_ID_SELECT_PROFILE_PREFIX + profileIndex;\n\t\t\t\t\tlet profileChecked = allTabsData.profileName == profileName;\n\t\t\t\t\tmenus.create({\n\t\t\t\t\t\tid: profileId,\n\t\t\t\t\t\ttype: \"radio\",\n\t\t\t\t\t\tcontexts: defaultContexts,\n\t\t\t\t\t\ttitle: profileName,\n\t\t\t\t\t\tchecked: profileChecked,\n\t\t\t\t\t\tparentId: MENU_ID_SELECT_PROFILE\n\t\t\t\t\t});\n\t\t\t\t\tmenusCheckedState.set(profileId, profileChecked);\n\t\t\t\t\tprofileId = MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + profileIndex;\n\t\t\t\t\tprofileChecked = Boolean(rule) && rule.profile == profileName;\n\t\t\t\t\tmenus.create({\n\t\t\t\t\t\tid: profileId,\n\t\t\t\t\t\ttype: \"radio\",\n\t\t\t\t\t\tcontexts: defaultContexts,\n\t\t\t\t\t\ttitle: profileName,\n\t\t\t\t\t\tchecked: profileChecked,\n\t\t\t\t\t\tparentId: MENU_ID_ASSOCIATE_WITH_PROFILE\n\t\t\t\t\t});\n\t\t\t\t\tmenusCheckedState.set(profileId, profileChecked);\n\t\t\t\t\tprofileIndexes.set(profileName, profileIndex);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (options.contextMenuEnabled) {\n\t\t\t\tmenus.create({\n\t\t\t\t\tid: \"separator-3\",\n\t\t\t\t\tcontexts: pageContextsEnabled,\n\t\t\t\t\ttype: \"separator\"\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tmenus.create({\n\t\t\tid: MENU_ID_AUTO_SAVE,\n\t\t\tcontexts: defaultContexts,\n\t\t\ttitle: MENU_AUTOSAVE_MESSAGE\n\t\t});\n\t\tmenus.create({\n\t\t\tid: MENU_ID_AUTO_SAVE_DISABLED,\n\t\t\ttype: \"radio\",\n\t\t\ttitle: MENU_AUTOSAVE_DISABLED_MESSAGE,\n\t\t\tcontexts: defaultContexts,\n\t\t\tchecked: true,\n\t\t\tparentId: MENU_ID_AUTO_SAVE\n\t\t});\n\t\tmenusCheckedState.set(MENU_ID_AUTO_SAVE_DISABLED, true);\n\t\tmenus.create({\n\t\t\tid: MENU_ID_AUTO_SAVE_TAB,\n\t\t\ttype: \"radio\",\n\t\t\ttitle: MENU_AUTOSAVE_TAB_MESSAGE,\n\t\t\tcontexts: defaultContexts,\n\t\t\tchecked: false,\n\t\t\tparentId: MENU_ID_AUTO_SAVE\n\t\t});\n\t\tmenusCheckedState.set(MENU_ID_AUTO_SAVE_TAB, false);\n\t\tmenus.create({\n\t\t\tid: MENU_ID_AUTO_SAVE_UNPINNED,\n\t\t\ttype: \"radio\",\n\t\t\ttitle: MENU_AUTOSAVE_UNPINNED_TABS_MESSAGE,\n\t\t\tcontexts: defaultContexts,\n\t\t\tchecked: false,\n\t\t\tparentId: MENU_ID_AUTO_SAVE\n\t\t});\n\t\tmenusCheckedState.set(MENU_ID_AUTO_SAVE_UNPINNED, false);\n\t\tmenus.create({\n\t\t\tid: MENU_ID_AUTO_SAVE_ALL,\n\t\t\ttype: \"radio\",\n\t\t\ttitle: MENU_AUTOSAVE_ALL_TABS_MESSAGE,\n\t\t\tcontexts: defaultContexts,\n\t\t\tchecked: false,\n\t\t\tparentId: MENU_ID_AUTO_SAVE\n\t\t});\n\t\tmenusCheckedState.set(MENU_ID_AUTO_SAVE_ALL, false);\n\t\tmenus.create({\n\t\t\tid: \"separator-4\",\n\t\t\tcontexts: defaultContexts,\n\t\t\ttype: \"separator\"\n\t\t});\n\t\tmenus.create({\n\t\t\tid: MENU_ID_BATCH_SAVE_URLS,\n\t\t\tcontexts: defaultContexts,\n\t\t\ttitle: MENU_BATCH_SAVE_URLS_MESSAGE\n\t\t});\n\t\tmenus.create({\n\t\t\tid: MENU_ID_VIEW_PENDINGS,\n\t\t\tcontexts: defaultContexts,\n\t\t\ttitle: MENU_VIEW_PENDINGS_MESSAGE\n\t\t});\n\t}\n\tmenusCreated = true;\n\tif (pendingRefresh) {\n\t\tpendingRefresh = false;\n\t\t(await browser.tabs.query({})).forEach(async tab => await refreshTab(tab));\n\t}\n}\n\nasync function initialize() {\n\tcreateMenus();\n\tmenus.onClicked.addListener(async (event, tab) => {\n\t\tif (event.menuItemId == MENU_ID_SAVE_PAGE) {\n\t\t\tif (event.linkUrl) {\n\t\t\t\tbusiness.saveUrls([event.linkUrl]);\n\t\t\t} else {\n\t\t\t\tbusiness.saveTabs([tab]);\n\t\t\t}\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_EDIT_AND_SAVE_PAGE) {\n\t\t\tconst allTabsData = await tabsData.get(tab.id);\n\t\t\tif (allTabsData[tab.id].savedPageDetected) {\n\t\t\t\tbusiness.openEditor(tab);\n\t\t\t} else {\n\t\t\t\tif (event.linkUrl) {\n\t\t\t\t\tbusiness.saveUrls([event.linkUrl], { openEditor: true });\n\t\t\t\t} else {\n\t\t\t\t\tbusiness.saveTabs([tab], { openEditor: true });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_SAVE_SELECTED_LINKS) {\n\t\t\tbusiness.saveSelectedLinks(tab);\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_VIEW_PENDINGS) {\n\t\t\tawait browser.tabs.create({ active: true, url: \"/src/ui/pages/pendings.html\" });\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_SAVE_SELECTED) {\n\t\t\tbusiness.saveTabs([tab], { selected: true });\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_SAVE_FRAME) {\n\t\t\tbusiness.saveTabs([tab], { frameId: event.frameId });\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_SAVE_SELECTED_TABS || event.menuItemId == MENU_ID_BUTTON_SAVE_SELECTED_TABS) {\n\t\t\tconst tabs = await queryTabs({ currentWindow: true, highlighted: true });\n\t\t\tbusiness.saveTabs(tabs);\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_SAVE_UNPINNED_TABS || event.menuItemId == MENU_ID_BUTTON_SAVE_UNPINNED_TABS) {\n\t\t\tconst tabs = await queryTabs({ currentWindow: true, pinned: false });\n\t\t\tbusiness.saveTabs(tabs);\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_SAVE_ALL_TABS || event.menuItemId == MENU_ID_BUTTON_SAVE_ALL_TABS) {\n\t\t\tconst tabs = await queryTabs({ currentWindow: true });\n\t\t\tbusiness.saveTabs(tabs);\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_BATCH_SAVE_URLS) {\n\t\t\tbusiness.batchSaveUrls();\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_AUTO_SAVE_TAB) {\n\t\t\tconst allTabsData = await tabsData.get(tab.id);\n\t\t\tallTabsData[tab.id].autoSave = true;\n\t\t\tawait tabsData.set(allTabsData);\n\t\t\trefreshExternalComponents(tab);\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_AUTO_SAVE_DISABLED) {\n\t\t\tconst allTabsData = await tabsData.get();\n\t\t\tObject.keys(allTabsData).forEach(tabId => {\n\t\t\t\tif (typeof allTabsData[tabId] == \"object\" && allTabsData[tabId].autoSave) {\n\t\t\t\t\tallTabsData[tabId].autoSave = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tallTabsData.autoSaveUnpinned = allTabsData.autoSaveAll = false;\n\t\t\tawait tabsData.set(allTabsData);\n\t\t\trefreshExternalComponents(tab);\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_AUTO_SAVE_ALL) {\n\t\t\tconst allTabsData = await tabsData.get();\n\t\t\tallTabsData.autoSaveAll = event.checked;\n\t\t\tawait tabsData.set(allTabsData);\n\t\t\trefreshExternalComponents(tab);\n\t\t}\n\t\tif (event.menuItemId == MENU_ID_AUTO_SAVE_UNPINNED) {\n\t\t\tconst allTabsData = await tabsData.get();\n\t\t\tallTabsData.autoSaveUnpinned = event.checked;\n\t\t\tawait tabsData.set(allTabsData);\n\t\t\trefreshExternalComponents(tab);\n\t\t}\n\t\tif (event.menuItemId.startsWith(MENU_ID_SAVE_WITH_PROFILE_PREFIX)) {\n\t\t\tconst profiles = await config.getProfiles();\n\t\t\tconst profileId = event.menuItemId.split(MENU_ID_SAVE_WITH_PROFILE_PREFIX)[1];\n\t\t\tlet profileName;\n\t\t\tif (profileId == \"default\") {\n\t\t\t\tprofileName = config.DEFAULT_PROFILE_NAME;\n\t\t\t} else {\n\t\t\t\tconst profileIndex = Number(profileId);\n\t\t\t\tprofileName = Object.keys(profiles)[profileIndex];\n\t\t\t}\n\t\t\tprofiles[profileName].profileName = profileName;\n\t\t\tbusiness.saveTabs([tab], profiles[profileName]);\n\t\t}\n\t\tif (event.menuItemId.startsWith(MENU_ID_SELECT_PROFILE_PREFIX)) {\n\t\t\tconst [profiles, allTabsData] = await Promise.all([config.getProfiles(), tabsData.get()]);\n\t\t\tconst profileId = event.menuItemId.split(MENU_ID_SELECT_PROFILE_PREFIX)[1];\n\t\t\tif (profileId == \"default\") {\n\t\t\t\tallTabsData.profileName = config.DEFAULT_PROFILE_NAME;\n\t\t\t} else {\n\t\t\t\tconst profileIndex = Number(profileId);\n\t\t\t\tallTabsData.profileName = Object.keys(profiles)[profileIndex];\n\t\t\t}\n\t\t\tawait tabsData.set(allTabsData);\n\t\t\trefreshExternalComponents(tab);\n\t\t}\n\t\tif (event.menuItemId.startsWith(MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX)) {\n\t\t\tconst [profiles, rule] = await Promise.all([config.getProfiles(), config.getRule(tab.url, true)]);\n\t\t\tconst profileId = event.menuItemId.split(MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX)[1];\n\t\t\tlet profileName;\n\t\t\tif (profileId == \"default\") {\n\t\t\t\tprofileName = config.DEFAULT_PROFILE_NAME;\n\t\t\t} else if (profileId == \"current\") {\n\t\t\t\tprofileName = config.CURRENT_PROFILE_NAME;\n\t\t\t} else {\n\t\t\t\tconst profileIndex = Number(profileId);\n\t\t\t\tprofileName = Object.keys(profiles)[profileIndex];\n\t\t\t}\n\t\t\tif (rule) {\n\t\t\t\tawait config.updateRule(rule.url, rule.url, profileName, profileName);\n\t\t\t} else {\n\t\t\t\tawait updateTitleValue(MENU_ID_ASSOCIATE_WITH_PROFILE, MENU_UPDATE_RULE_MESSAGE);\n\t\t\t\tawait config.addRule(new URL(tab.url).hostname, profileName, profileName);\n\t\t\t}\n\t\t}\n\t});\n\tif (menusCreated) {\n\t\tpendingRefresh = true;\n\t} else {\n\t\t(await browser.tabs.query({})).forEach(async tab => await refreshTab(tab));\n\t}\n}\n\nasync function refreshExternalComponents(tab) {\n\tconst allTabsData = await tabsData.get(tab.id);\n\tawait refreshAutoSaveTabs();\n\tawait button.refreshTab(tab);\n\ttry {\n\t\tawait browser.runtime.sendMessage({ method: \"options.refresh\", profileName: allTabsData.profileName });\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nasync function refreshTab(tab) {\n\tif (menusCreated) {\n\t\tconst promises = [];\n\t\tconst allTabsData = await tabsData.get(tab.id);\n\t\tif (allTabsData[tab.id].editorDetected) {\n\t\t\tupdateAllVisibleValues(false);\n\t\t} else {\n\t\t\tupdateAllVisibleValues(true);\n\t\t\tpromises.push(updateCheckedValue(MENU_ID_AUTO_SAVE_DISABLED, !allTabsData[tab.id].autoSave));\n\t\t\tpromises.push(updateCheckedValue(MENU_ID_AUTO_SAVE_TAB, allTabsData[tab.id].autoSave));\n\t\t\tpromises.push(updateCheckedValue(MENU_ID_AUTO_SAVE_UNPINNED, Boolean(allTabsData.autoSaveUnpinned)));\n\t\t\tpromises.push(updateCheckedValue(MENU_ID_AUTO_SAVE_ALL, Boolean(allTabsData.autoSaveAll)));\n\t\t\tif (tab && tab.url) {\n\t\t\t\tconst options = await config.getOptions(tab.url);\n\t\t\t\tpromises.push(updateVisibleValue(tab, options.contextMenuEnabled));\n\t\t\t\tpromises.push(updateTitleValue(MENU_ID_EDIT_AND_SAVE_PAGE, allTabsData[tab.id].savedPageDetected ? MENU_EDIT_PAGE_MESSAGE : MENU_EDIT_AND_SAVE_PAGE_MESSAGE));\n\t\t\t\tpromises.push(menus.update(MENU_ID_SAVE_SELECTED, { visible: !options.saveRawPage }));\n\t\t\t\tpromises.push(menus.update(MENU_ID_EDIT_AND_SAVE_PAGE, { visible: !options.openEditor || allTabsData[tab.id].savedPageDetected }));\n\t\t\t\tlet selectedEntryId = MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + \"default\";\n\t\t\t\tlet title = MENU_CREATE_DOMAIN_RULE_MESSAGE;\n\t\t\t\tconst [profiles, rule] = await Promise.all([config.getProfiles(), config.getRule(tab.url)]);\n\t\t\t\tif (rule) {\n\t\t\t\t\tconst profileIndex = profileIndexes.get(rule.profile);\n\t\t\t\t\tif (profileIndex) {\n\t\t\t\t\t\tselectedEntryId = MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + profileIndex;\n\t\t\t\t\t\ttitle = MENU_UPDATE_RULE_MESSAGE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Object.keys(profiles).length > 1) {\n\t\t\t\t\tObject.keys(profiles).forEach((profileName, profileIndex) => {\n\t\t\t\t\t\tif (profileName == config.DEFAULT_PROFILE_NAME) {\n\t\t\t\t\t\t\tpromises.push(updateCheckedValue(MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + \"default\", selectedEntryId == MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + \"default\"));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpromises.push(updateCheckedValue(MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + profileIndex, selectedEntryId == MENU_ID_ASSOCIATE_WITH_PROFILE_PREFIX + profileIndex));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tpromises.push(updateTitleValue(MENU_ID_ASSOCIATE_WITH_PROFILE, title));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tawait Promise.all(promises);\n\t}\n}\n\nasync function updateAllVisibleValues(visible) {\n\tconst lastVisibleState = allMenuVisibleState;\n\tallMenuVisibleState = visible;\n\tif (lastVisibleState === undefined || lastVisibleState != visible) {\n\t\tconst promises = [];\n\t\ttry {\n\t\t\tMENU_TOP_VISIBLE_ENTRIES.forEach(id => promises.push(menus.update(id, { visible })));\n\t\t\tawait Promise.all(promises);\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t}\n}\n\nasync function updateVisibleValue(tab, visible) {\n\tconst lastVisibleState = contextMenuVisibleState;\n\tcontextMenuVisibleState = visible;\n\tif (lastVisibleState === undefined || lastVisibleState != visible) {\n\t\tawait createMenus(tab);\n\t}\n}\n\nasync function updateTitleValue(id, title) {\n\tconst lastTitleValue = menusTitleState.get(id);\n\ttry {\n\t\tif (lastTitleValue === undefined) {\n\t\t\tawait menus.update(id, { title });\n\t\t} else if (lastTitleValue != title) {\n\t\t\tawait menus.update(id, { title });\n\t\t}\n\t\tmenusTitleState.set(id, title);\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nasync function updateCheckedValue(id, checked) {\n\tchecked = Boolean(checked);\n\ttry {\n\t\tawait menus.update(id, { checked });\n\t\tmenusCheckedState.set(id, checked);\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}"
  },
  {
    "path": "src/ui/bg/ui-options-editor.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, document, alert */\n\nconst titleLabel = document.getElementById(\"titleLabel\");\n\nconst optionsInput = document.getElementById(\"optionsInput\");\nconst saveButton = document.getElementById(\"saveButton\");\n\ntitleLabel.textContent = browser.i18n.getMessage(\"optionsEditorTitle\");\nsaveButton.textContent = browser.i18n.getMessage(\"optionsEditorSaveButton\");\nconst invalidJSONMessage = browser.i18n.getMessage(\"optionsEditorInvalidJSON\");\nconst configSavedMessage = browser.i18n.getMessage(\"optionsEditorConfigSaved\");\n\ninit();\nsaveButton.addEventListener(\"click\", async () => {\n    let config;\n    try {\n        config = JSON.parse(optionsInput.value);\n        // eslint-disable-next-line no-unused-vars\n    } catch (error) {\n        alert(invalidJSONMessage);\n    }\n    if (config) {\n        await browser.runtime.sendMessage({ method: \"config.set\", config });\n        await refreshExternalComponents(config);\n        alert(configSavedMessage);\n    }\n    saveButton.blur();\n});\n\nasync function init() {\n    const config = await browser.runtime.sendMessage({ method: \"config.get\" });\n    optionsInput.value = JSON.stringify(config, null, 4);\n}\n\nasync function refreshExternalComponents(config) {\n    try {\n        await browser.runtime.sendMessage({ method: \"ui.refreshMenu\" });\n        for (const profileName of Object.keys(config.profiles)) {\n            await browser.runtime.sendMessage({ method: \"options.refresh\", profileName });\n            await browser.runtime.sendMessage({ method: \"options.refreshPanel\", profileName });\n        }\n        // eslint-disable-next-line no-unused-vars\n    } catch (error) {\n        // ignored\n    }\n}"
  },
  {
    "path": "src/ui/bg/ui-options.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, window, document, localStorage, FileReader, location, fetch, TextDecoder, DOMParser, HTMLElement, MouseEvent, btoa */\n\nconst HELP_ICON_URL = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABIUlEQVQ4y+2TsarCMBSGvxTBRdqiUZAWOrhJB9EXcPKFfCvfQYfulUKHDqXg4CYUJSioYO4mSDX3ttzt3n87fMlHTpIjlsulxpDZbEYYhgghSNOUOI5Ny2mZYBAELBYLer0eAJ7ncTweKYri4x7LJJRS0u12n7XrukgpjSc0CpVSXK/XZ32/31FKNW85z3PW6zXT6RSAJEnIsqy5UGvNZrNhu90CcDqd+C6tT6J+v//2Th+PB2VZ1hN2Oh3G4zGTyQTbtl/YbrdjtVpxu91+Ljyfz0RRhG3bzOfzF+Y4TvNXvlwuaK2pE4tfzr/wzwsty0IIURlL0998KxRCMBqN8H2/wlzXJQxD2u12vVkeDoeUZUkURRU+GAw4HA7s9/sK+wK6CWHasQ/S/wAAAABJRU5ErkJggg==\";\nconst HELP_PAGE_PATH_PREFIX = \"/src/ui/pages/help\";\nconst HELP_PAGE_PATH_DEFAULT = \"/src/ui/pages/help.html\";\nlet DEFAULT_PROFILE_NAME,\n\tDISABLED_PROFILE_NAME,\n\tCURRENT_PROFILE_NAME,\n\tBACKGROUND_SAVE_SUPPORTED,\n\tSHARE_API_SUPPORTED;\nbrowser.runtime.sendMessage({ method: \"config.getConstants\" }).then(data => {\n\t({\n\t\tDEFAULT_PROFILE_NAME,\n\t\tDISABLED_PROFILE_NAME,\n\t\tCURRENT_PROFILE_NAME,\n\t\tBACKGROUND_SAVE_SUPPORTED,\n\t\tSHARE_API_SUPPORTED\n\t} = data);\n\tinit();\n});\nconst removeHiddenElementsLabel = document.getElementById(\"removeHiddenElementsLabel\");\nconst removedElementsSelectorLabel = document.getElementById(\"removedElementsSelectorLabel\");\nconst removeUnusedStylesLabel = document.getElementById(\"removeUnusedStylesLabel\");\nconst removeUnusedFontsLabel = document.getElementById(\"removeUnusedFontsLabel\");\nconst removeFramesLabel = document.getElementById(\"removeFramesLabel\");\nconst blockScriptsLabel = document.getElementById(\"blockScriptsLabel\");\nconst blockAudiosLabel = document.getElementById(\"blockAudiosLabel\");\nconst blockVideosLabel = document.getElementById(\"blockVideosLabel\");\nconst blockFontsLabel = document.getElementById(\"blockFontsLabel\");\nconst blockStylesheetsLabel = document.getElementById(\"blockStylesheetsLabel\");\nconst blockImagesLabel = document.getElementById(\"blockImagesLabel\");\nconst acceptHeaderDocumentLabel = document.getElementById(\"acceptHeaderDocumentLabel\");\nconst acceptHeaderScriptLabel = document.getElementById(\"acceptHeaderScriptLabel\");\nconst acceptHeaderAudioLabel = document.getElementById(\"acceptHeaderAudioLabel\");\nconst acceptHeaderVideoLabel = document.getElementById(\"acceptHeaderVideoLabel\");\nconst acceptHeaderFontLabel = document.getElementById(\"acceptHeaderFontLabel\");\nconst acceptHeaderStylesheetLabel = document.getElementById(\"acceptHeaderStylesheetLabel\");\nconst acceptHeaderImageLabel = document.getElementById(\"acceptHeaderImageLabel\");\nconst saveRawPageLabel = document.getElementById(\"saveRawPageLabel\");\nconst insertMetaCSPLabel = document.getElementById(\"insertMetaCSPLabel\");\nconst saveToClipboardLabel = document.getElementById(\"saveToClipboardLabel\");\nconst saveToFilesystemLabel = document.getElementById(\"saveToFilesystemLabel\");\nconst sharePageLabel = document.getElementById(\"sharePageLabel\");\nconst addProofLabel = document.getElementById(\"addProofLabel\");\nconst woleetKeyLabel = document.getElementById(\"woleetKeyLabel\");\nconst saveToGDriveLabel = document.getElementById(\"saveToGDriveLabel\");\nconst saveToDropboxLabel = document.getElementById(\"saveToDropboxLabel\");\nconst saveWithWebDAVLabel = document.getElementById(\"saveWithWebDAVLabel\");\nconst webDAVURLLabel = document.getElementById(\"webDAVURLLabel\");\nconst webDAVUserLabel = document.getElementById(\"webDAVUserLabel\");\nconst webDAVPasswordLabel = document.getElementById(\"webDAVPasswordLabel\");\nconst saveWithMCPLabel = document.getElementById(\"saveWithMCPLabel\");\nconst mcpServerUrlLabel = document.getElementById(\"mcpServerUrlLabel\");\nconst mcpAuthTokenLabel = document.getElementById(\"mcpAuthTokenLabel\");\nconst saveToGitHubLabel = document.getElementById(\"saveToGitHubLabel\");\nconst githubTokenLabel = document.getElementById(\"githubTokenLabel\");\nconst githubUserLabel = document.getElementById(\"githubUserLabel\");\nconst githubRepositoryLabel = document.getElementById(\"githubRepositoryLabel\");\nconst githubBranchLabel = document.getElementById(\"githubBranchLabel\");\nconst saveWithCompanionLabel = document.getElementById(\"saveWithCompanionLabel\");\nconst saveToS3Label = document.getElementById(\"saveToS3Label\");\nconst S3DomainLabel = document.getElementById(\"S3DomainLabel\");\nconst S3RegionLabel = document.getElementById(\"S3RegionLabel\");\nconst S3BucketLabel = document.getElementById(\"S3BucketLabel\");\nconst S3AccessKeyLabel = document.getElementById(\"S3AccessKeyLabel\");\nconst S3SecretKeyLabel = document.getElementById(\"S3SecretKeyLabel\");\nconst compressHTMLLabel = document.getElementById(\"compressHTMLLabel\");\nconst insertTextBodyLabel = document.getElementById(\"insertTextBodyLabel\");\nconst insertEmbeddedImageLabel = document.getElementById(\"insertEmbeddedImageLabel\");\nconst insertEmbeddedCustomImageLabel = document.getElementById(\"insertEmbeddedCustomImageLabel\");\nconst insertEmbeddedScreenshotImageLabel = document.getElementById(\"insertEmbeddedScreenshotImageLabel\");\nconst compressCSSLabel = document.getElementById(\"compressCSSLabel\");\nconst groupDuplicateStylesheetsLabel = document.getElementById(\"groupDuplicateStylesheetsLabel\");\nconst moveStylesInHeadLabel = document.getElementById(\"moveStylesInHeadLabel\");\nconst imageReductionFactorLabel = document.getElementById(\"imageReductionFactorLabel\");\nconst loadDeferredImagesLabel = document.getElementById(\"loadDeferredImagesLabel\");\nconst loadDeferredImagesMaxIdleTimeLabel = document.getElementById(\"loadDeferredImagesMaxIdleTimeLabel\");\nconst loadDeferredImagesKeepZoomLevelLabel = document.getElementById(\"loadDeferredImagesKeepZoomLevelLabel\");\nconst loadDeferredImagesDispatchScrollEventLabel = document.getElementById(\"loadDeferredImagesDispatchScrollEventLabel\");\nconst loadDeferredImagesBeforeFramesLabel = document.getElementById(\"loadDeferredImagesBeforeFramesLabel\");\nconst addMenuEntryLabel = document.getElementById(\"addMenuEntryLabel\");\nconst filenameTemplateLabel = document.getElementById(\"filenameTemplateLabel\");\nconst filenameMaxLengthLabel = document.getElementById(\"filenameMaxLengthLabel\");\nconst filenameMaxLengthBytesUnitLabel = document.getElementById(\"filenameMaxLengthBytesUnitLabel\");\nconst filenameMaxLengthCharsUnitLabel = document.getElementById(\"filenameMaxLengthCharsUnitLabel\");\nconst filenameReplacementCharacterLabel = document.getElementById(\"filenameReplacementCharacterLabel\");\nconst replaceEmojisInFilenameLabel = document.getElementById(\"replaceEmojisInFilenameLabel\");\nconst saveFilenameTemplateDataLabel = document.getElementById(\"saveFilenameTemplateDataLabel\");\nconst shadowEnabledLabel = document.getElementById(\"shadowEnabledLabel\");\nconst setMaxResourceSizeLabel = document.getElementById(\"setMaxResourceSizeLabel\");\nconst maxResourceSizeLabel = document.getElementById(\"maxResourceSizeLabel\");\nconst setMaxResourceDelayLabel = document.getElementById(\"setMaxResourceDelayLabel\");\nconst maxResourceDelayLabel = document.getElementById(\"maxResourceDelayLabel\");\nconst confirmFilenameLabel = document.getElementById(\"confirmFilenameLabel\");\nconst filenameConflictActionLabel = document.getElementById(\"filenameConflictActionLabel\");\nconst filenameConflictActionUniquifyLabel = document.getElementById(\"filenameConflictActionUniquifyLabel\");\nconst filenameConflictActionOverwriteLabel = document.getElementById(\"filenameConflictActionOverwriteLabel\");\nconst filenameConflictActionPromptLabel = document.getElementById(\"filenameConflictActionPromptLabel\");\nconst filenameConflictActionSkipLabel = document.getElementById(\"filenameConflictActionSkipLabel\");\nconst displayInfobarLabel = document.getElementById(\"displayInfobarLabel\");\nconst displayStatsLabel = document.getElementById(\"displayStatsLabel\");\nconst backgroundSaveLabel = document.getElementById(\"backgroundSaveLabel\");\nconst autoSaveDelayLabel = document.getElementById(\"autoSaveDelayLabel\");\nconst autoSaveLoadLabel = document.getElementById(\"autoSaveLoadLabel\");\nconst autoSaveUnloadLabel = document.getElementById(\"autoSaveUnloadLabel\");\nconst autoSaveLoadOrUnloadLabel = document.getElementById(\"autoSaveLoadOrUnloadLabel\");\nconst autoSaveDiscardLabel = document.getElementById(\"autoSaveDiscardLabel\");\nconst autoSaveRemoveLabel = document.getElementById(\"autoSaveRemoveLabel\");\nconst autoSaveRepeatLabel = document.getElementById(\"autoSaveRepeatLabel\");\nconst autoSaveRepeatDelayLabel = document.getElementById(\"autoSaveRepeatDelayLabel\");\nconst autoSaveExternalSaveLabel = document.getElementById(\"autoSaveExternalSaveLabel\");\nconst removeAlternativeFontsLabel = document.getElementById(\"removeAlternativeFontsLabel\");\nconst removeAlternativeImagesLabel = document.getElementById(\"removeAlternativeImagesLabel\");\nconst removeAlternativeMediasLabel = document.getElementById(\"removeAlternativeMediasLabel\");\nconst saveCreatedBookmarksLabel = document.getElementById(\"saveCreatedBookmarksLabel\");\nconst passReferrerOnErrorLabel = document.getElementById(\"passReferrerOnErrorLabel\");\nconst replaceBookmarkURLLabel = document.getElementById(\"replaceBookmarkURLLabel\");\nconst allowedBookmarkFoldersLabel = document.getElementById(\"allowedBookmarkFoldersLabel\");\nconst ignoredBookmarkFoldersLabel = document.getElementById(\"ignoredBookmarkFoldersLabel\");\nconst createRootDirectoryLabel = document.getElementById(\"createRootDirectoryLabel\");\nconst disableCompressionLabel = document.getElementById(\"disableCompressionLabel\");\nconst preventAppendedDataLabel = document.getElementById(\"preventAppendedDataLabel\");\nconst passwordLabel = document.getElementById(\"passwordLabel\");\nconst titleLabel = document.getElementById(\"titleLabel\");\nconst userInterfaceLabel = document.getElementById(\"userInterfaceLabel\");\nconst filenameLabel = document.getElementById(\"filenameLabel\");\nconst htmlContentLabel = document.getElementById(\"htmlContentLabel\");\nconst fileFormatLabel = document.getElementById(\"fileFormatLabel\");\nconst fileFormatSelectHTMLLabel = document.getElementById(\"fileFormatSelectHTMLLabel\");\nconst fileFormatSelectSelfExtractingUniversalLabel = document.getElementById(\"fileFormatSelectSelfExtractingUniversalLabel\");\nconst fileFormatSelectSelfExtractingLabel = document.getElementById(\"fileFormatSelectSelfExtractingLabel\");\nconst fileFormatSelectZIPLabel = document.getElementById(\"fileFormatSelectZIPLabel\");\nconst fileFormatSelectLabel = document.getElementById(\"fileFormatSelectLabel\");\nconst infobarLabel = document.getElementById(\"infobarLabel\");\nconst imagesLabel = document.getElementById(\"imagesLabel\");\nconst stylesheetsLabel = document.getElementById(\"stylesheetsLabel\");\nconst fontsLabel = document.getElementById(\"fontsLabel\");\nconst networkLabel = document.getElementById(\"networkLabel\");\nconst blockResourcesLabel = document.getElementById(\"blockResourcesLabel\");\nconst acceptHeadersLabel = document.getElementById(\"acceptHeadersLabel\");\nconst destinationLabel = document.getElementById(\"destinationLabel\");\nconst bookmarksLabel = document.getElementById(\"bookmarksLabel\");\nconst autoSaveLabel = document.getElementById(\"autoSaveLabel\");\nconst autoSettingsLabel = document.getElementById(\"autoSettingsLabel\");\nconst autoSettingsUrlLabel = document.getElementById(\"autoSettingsUrlLabel\");\nconst autoSettingsProfileLabel = document.getElementById(\"autoSettingsProfileLabel\");\nconst autoSettingsAutoSaveProfileLabel = document.getElementById(\"autoSettingsAutoSaveProfileLabel\");\nconst showAllProfilesLabel = document.getElementById(\"showAllProfilesLabel\");\nconst showAutoSaveProfileLabel = document.getElementById(\"showAutoSaveProfileLabel\");\nconst groupDuplicateImagesLabel = document.getElementById(\"groupDuplicateImagesLabel\");\nconst confirmInfobarLabel = document.getElementById(\"confirmInfobarLabel\");\nconst autoCloseLabel = document.getElementById(\"autoCloseLabel\");\nconst editorLabel = document.getElementById(\"editorLabel\");\nconst openEditorLabel = document.getElementById(\"openEditorLabel\");\nconst openSavedPageLabel = document.getElementById(\"openSavedPageLabel\");\nconst autoOpenEditorLabel = document.getElementById(\"autoOpenEditorLabel\");\nconst defaultEditorModeLabel = document.getElementById(\"defaultEditorModeLabel\");\nconst applySystemThemeLabel = document.getElementById(\"applySystemThemeLabel\");\nconst contentWidthLabel = document.getElementById(\"contentWidthLabel\");\nconst warnUnsavedPageLabel = document.getElementById(\"warnUnsavedPageLabel\");\nconst displayInfobarInEditorLabel = document.getElementById(\"displayInfobarInEditorLabel\");\nconst infobarTemplateLabel = document.getElementById(\"infobarTemplateLabel\");\nconst blockMixedContentLabel = document.getElementById(\"blockMixedContentLabel\");\nconst saveOriginalURLsLabel = document.getElementById(\"saveOriginalURLsLabel\");\nconst includeInfobarLabel = document.getElementById(\"includeInfobarLabel\");\nconst openInfobarLabel = document.getElementById(\"openInfobarLabel\");\nconst removeInfobarSavedDateLabel = document.getElementById(\"removeInfobarSavedDateLabel\");\nconst miscLabel = document.getElementById(\"miscLabel\");\nconst helpLabel = document.getElementById(\"helpLabel\");\nconst synchronizeLabel = document.getElementById(\"synchronizeLabel\");\nconst customShortcutLabel = document.getElementById(\"customShortcutLabel\");\nconst customShortcutDefaultLabel = document.getElementById(\"customShortcutDefaultLabel\");\nconst customShortcut1Label = document.getElementById(\"customShortcut0Label\");\nconst customShortcut2Label = document.getElementById(\"customShortcut1Label\");\nconst customShortcut3Label = document.getElementById(\"customShortcut2Label\");\nconst customShortcut4Label = document.getElementById(\"customShortcut3Label\");\nconst customShortcut5Label = document.getElementById(\"customShortcut4Label\");\nconst customShortcut6Label = document.getElementById(\"customShortcut5Label\");\nconst customShortcut7Label = document.getElementById(\"customShortcut6Label\");\nconst customShortcut8Label = document.getElementById(\"customShortcut7Label\");\nconst customShortcut9Label = document.getElementById(\"customShortcut8Label\");\nconst customShortcut10Label = document.getElementById(\"customShortcut9Label\");\nconst addProfileButton = document.getElementById(\"addProfileButton\");\nconst deleteProfileButton = document.getElementById(\"deleteProfileButton\");\nconst renameProfileButton = document.getElementById(\"renameProfileButton\");\nconst resetButton = document.getElementById(\"resetButton\");\nconst exportButton = document.getElementById(\"exportButton\");\nconst importButton = document.getElementById(\"importButton\");\nconst fileInput = document.getElementById(\"fileInput\");\nconst profileNamesInput = document.getElementById(\"profileNamesInput\");\nconst customShortcutInput = document.getElementById(\"customShortcutInput\");\nconst removeHiddenElementsInput = document.getElementById(\"removeHiddenElementsInput\");\nconst removedElementsSelectorInput = document.getElementById(\"removedElementsSelectorInput\");\nconst removeUnusedStylesInput = document.getElementById(\"removeUnusedStylesInput\");\nconst removeUnusedFontsInput = document.getElementById(\"removeUnusedFontsInput\");\nconst removeFramesInput = document.getElementById(\"removeFramesInput\");\nconst blockScriptsInput = document.getElementById(\"blockScriptsInput\");\nconst blockVideosInput = document.getElementById(\"blockVideosInput\");\nconst blockAudiosInput = document.getElementById(\"blockAudiosInput\");\nconst blockFontsInput = document.getElementById(\"blockFontsInput\");\nconst blockStylesheetsInput = document.getElementById(\"blockStylesheetsInput\");\nconst blockImagesInput = document.getElementById(\"blockImagesInput\");\nconst acceptHeaderDocumentInput = document.getElementById(\"acceptHeaderDocumentInput\");\nconst acceptHeaderScriptInput = document.getElementById(\"acceptHeaderScriptInput\");\nconst acceptHeaderAudioInput = document.getElementById(\"acceptHeaderAudioInput\");\nconst acceptHeaderVideoInput = document.getElementById(\"acceptHeaderVideoInput\");\nconst acceptHeaderFontInput = document.getElementById(\"acceptHeaderFontInput\");\nconst acceptHeaderStylesheetInput = document.getElementById(\"acceptHeaderStylesheetInput\");\nconst acceptHeaderImageInput = document.getElementById(\"acceptHeaderImageInput\");\nconst saveRawPageInput = document.getElementById(\"saveRawPageInput\");\nconst insertMetaCSPInput = document.getElementById(\"insertMetaCSPInput\");\nconst saveToClipboardInput = document.getElementById(\"saveToClipboardInput\");\nconst addProofInput = document.getElementById(\"addProofInput\");\nconst woleetKeyInput = document.getElementById(\"woleetKeyInput\");\nconst saveToGDriveInput = document.getElementById(\"saveToGDriveInput\");\nconst saveToDropboxInput = document.getElementById(\"saveToDropboxInput\");\nconst saveWithWebDAVInput = document.getElementById(\"saveWithWebDAVInput\");\nconst webDAVURLInput = document.getElementById(\"webDAVURLInput\");\nconst webDAVUserInput = document.getElementById(\"webDAVUserInput\");\nconst webDAVPasswordInput = document.getElementById(\"webDAVPasswordInput\");\nconst saveWithMCPInput = document.getElementById(\"saveWithMCPInput\");\nconst mcpServerUrlInput = document.getElementById(\"mcpServerUrlInput\");\nconst mcpAuthTokenInput = document.getElementById(\"mcpAuthTokenInput\");\nconst saveToGitHubInput = document.getElementById(\"saveToGitHubInput\");\nconst saveToS3Input = document.getElementById(\"saveToS3Input\");\nconst githubTokenInput = document.getElementById(\"githubTokenInput\");\nconst githubUserInput = document.getElementById(\"githubUserInput\");\nconst githubRepositoryInput = document.getElementById(\"githubRepositoryInput\");\nconst githubBranchInput = document.getElementById(\"githubBranchInput\");\nconst saveWithCompanionInput = document.getElementById(\"saveWithCompanionInput\");\nconst sharePageInput = document.getElementById(\"sharePageInput\");\nconst saveToFilesystemInput = document.getElementById(\"saveToFilesystemInput\");\nconst compressHTMLInput = document.getElementById(\"compressHTMLInput\");\nconst insertTextBodyInput = document.getElementById(\"insertTextBodyInput\");\nconst insertEmbeddedImageInput = document.getElementById(\"insertEmbeddedImageInput\");\nconst insertEmbeddedCustomImageInput = document.getElementById(\"insertEmbeddedCustomImageInput\");\nconst insertEmbeddedScreenshotImageInput = document.getElementById(\"insertEmbeddedScreenshotImageInput\");\nconst compressCSSInput = document.getElementById(\"compressCSSInput\");\nconst groupDuplicateStylesheetsInput = document.getElementById(\"groupDuplicateStylesheetsInput\");\nconst imageReductionFactorInput = document.getElementById(\"imageReductionFactorInput\");\nconst moveStylesInHeadInput = document.getElementById(\"moveStylesInHeadInput\");\nconst loadDeferredImagesInput = document.getElementById(\"loadDeferredImagesInput\");\nconst loadDeferredImagesMaxIdleTimeInput = document.getElementById(\"loadDeferredImagesMaxIdleTimeInput\");\nconst loadDeferredImagesKeepZoomLevelInput = document.getElementById(\"loadDeferredImagesKeepZoomLevelInput\");\nconst loadDeferredImagesDispatchScrollEventInput = document.getElementById(\"loadDeferredImagesDispatchScrollEventInput\");\nconst loadDeferredImagesBeforeFramesInput = document.getElementById(\"loadDeferredImagesBeforeFramesInput\");\nconst contextMenuEnabledInput = document.getElementById(\"contextMenuEnabledInput\");\nconst filenameTemplateInput = document.getElementById(\"filenameTemplateInput\");\nconst filenameMaxLengthInput = document.getElementById(\"filenameMaxLengthInput\");\nconst filenameMaxLengthUnitInput = document.getElementById(\"filenameMaxLengthUnitInput\");\nconst filenameReplacementCharacterInput = document.getElementById(\"filenameReplacementCharacterInput\");\nconst replaceEmojisInFilenameInput = document.getElementById(\"replaceEmojisInFilenameInput\");\nconst saveFilenameTemplateDataInput = document.getElementById(\"saveFilenameTemplateDataInput\");\nconst shadowEnabledInput = document.getElementById(\"shadowEnabledInput\");\nconst maxResourceSizeInput = document.getElementById(\"maxResourceSizeInput\");\nconst maxResourceSizeEnabledInput = document.getElementById(\"maxResourceSizeEnabledInput\");\nconst maxResourceDelayInput = document.getElementById(\"maxResourceDelayInput\");\nconst maxResourceDelayEnabledInput = document.getElementById(\"maxResourceDelayEnabledInput\");\nconst confirmFilenameInput = document.getElementById(\"confirmFilenameInput\");\nconst filenameConflictActionInput = document.getElementById(\"filenameConflictActionInput\");\nconst displayInfobarInput = document.getElementById(\"displayInfobarInput\");\nconst displayStatsInput = document.getElementById(\"displayStatsInput\");\nconst backgroundSaveInput = document.getElementById(\"backgroundSaveInput\");\nconst autoSaveDelayInput = document.getElementById(\"autoSaveDelayInput\");\nconst autoSaveLoadInput = document.getElementById(\"autoSaveLoadInput\");\nconst autoSaveUnloadInput = document.getElementById(\"autoSaveUnloadInput\");\nconst autoSaveDiscardInput = document.getElementById(\"autoSaveDiscardInput\");\nconst autoSaveRemoveInput = document.getElementById(\"autoSaveRemoveInput\");\nconst autoSaveLoadOrUnloadInput = document.getElementById(\"autoSaveLoadOrUnloadInput\");\nconst autoSaveRepeatInput = document.getElementById(\"autoSaveRepeatInput\");\nconst autoSaveRepeatDelayInput = document.getElementById(\"autoSaveRepeatDelayInput\");\nconst autoSaveExternalSaveInput = document.getElementById(\"autoSaveExternalSaveInput\");\nconst removeAlternativeFontsInput = document.getElementById(\"removeAlternativeFontsInput\");\nconst removeAlternativeImagesInput = document.getElementById(\"removeAlternativeImagesInput\");\nconst removeAlternativeMediasInput = document.getElementById(\"removeAlternativeMediasInput\");\nconst saveCreatedBookmarksInput = document.getElementById(\"saveCreatedBookmarksInput\");\nconst passReferrerOnErrorInput = document.getElementById(\"passReferrerOnErrorInput\");\nconst replaceBookmarkURLInput = document.getElementById(\"replaceBookmarkURLInput\");\nconst allowedBookmarkFoldersInput = document.getElementById(\"allowedBookmarkFoldersInput\");\nconst ignoredBookmarkFoldersInput = document.getElementById(\"ignoredBookmarkFoldersInput\");\nconst fileFormatSelectInput = document.getElementById(\"fileFormatSelectInput\");\nconst createRootDirectoryInput = document.getElementById(\"createRootDirectoryInput\");\nconst disableCompressionInput = document.getElementById(\"disableCompressionInput\");\nconst preventAppendedDataInput = document.getElementById(\"preventAppendedDataInput\");\nconst passwordInput = document.getElementById(\"passwordInput\");\nconst groupDuplicateImagesInput = document.getElementById(\"groupDuplicateImagesInput\");\nconst infobarTemplateInput = document.getElementById(\"infobarTemplateInput\");\nconst blockMixedContentInput = document.getElementById(\"blockMixedContentInput\");\nconst saveOriginalURLsInput = document.getElementById(\"saveOriginalURLsInput\");\nconst includeInfobarInput = document.getElementById(\"includeInfobarInput\");\nconst openInfobarInput = document.getElementById(\"openInfobarInput\");\nconst removeInfobarSavedDateInput = document.getElementById(\"removeInfobarSavedDateInput\");\nconst confirmInfobarInput = document.getElementById(\"confirmInfobarInput\");\nconst autoCloseInput = document.getElementById(\"autoCloseInput\");\nconst openEditorInput = document.getElementById(\"openEditorInput\");\nconst openSavedPageInput = document.getElementById(\"openSavedPageInput\");\nconst autoOpenEditorInput = document.getElementById(\"autoOpenEditorInput\");\nconst defaultEditorModeInput = document.getElementById(\"defaultEditorModeInput\");\nconst defaultEditorModeNormalLabel = document.getElementById(\"defaultEditorModeNormalLabel\");\nconst defaultEditorModeEditLabel = document.getElementById(\"defaultEditorModeEditLabel\");\nconst defaultEditorModeFormatLabel = document.getElementById(\"defaultEditorModeFormatLabel\");\nconst defaultEditorModeCutLabel = document.getElementById(\"defaultEditorModeCutLabel\");\nconst defaultEditorModeCutExternalLabel = document.getElementById(\"defaultEditorModeCutExternalLabel\");\nconst applySystemThemeInput = document.getElementById(\"applySystemThemeInput\");\nconst contentWidthInput = document.getElementById(\"contentWidthInput\");\nconst warnUnsavedPageInput = document.getElementById(\"warnUnsavedPageInput\");\nconst displayInfobarInEditorInput = document.getElementById(\"displayInfobarInEditorInput\");\nconst expandAllButton = document.getElementById(\"expandAllButton\");\nconst rulesDeleteAllButton = document.getElementById(\"rulesDeleteAllButton\");\nconst ruleUrlInput = document.getElementById(\"ruleUrlInput\");\nconst ruleProfileInput = document.getElementById(\"ruleProfileInput\");\nconst ruleAutoSaveProfileInput = document.getElementById(\"ruleAutoSaveProfileInput\");\nconst ruleEditProfileInput = document.getElementById(\"ruleEditProfileInput\");\nconst ruleEditAutoSaveProfileInput = document.getElementById(\"ruleEditAutoSaveProfileInput\");\nconst ruleAddButton = document.getElementById(\"ruleAddButton\");\nconst ruleCancelButton = document.getElementById(\"ruleCancelButton\");\nconst rulesElement = document.querySelector(\".rules-table\");\nconst rulesContainerElement = document.querySelector(\".rules-table-container\");\nconst ruleEditUrlInput = document.getElementById(\"ruleEditUrlInput\");\nconst ruleEditButton = document.getElementById(\"ruleEditButton\");\nconst createURLElement = rulesElement.querySelector(\".rule-create\");\nconst showAllProfilesInput = document.getElementById(\"showAllProfilesInput\");\nconst showAutoSaveProfileInput = document.getElementById(\"showAutoSaveProfileInput\");\nconst synchronizeInput = document.getElementById(\"synchronizeInput\");\nconst resetAllButton = document.getElementById(\"resetAllButton\");\nconst resetCurrentButton = document.getElementById(\"resetCurrentButton\");\nconst resetCancelButton = document.getElementById(\"resetCancelButton\");\nconst confirmButton = document.getElementById(\"confirmButton\");\nconst cancelButton = document.getElementById(\"cancelButton\");\nconst promptInput = document.getElementById(\"promptInput\");\nconst promptCancelButton = document.getElementById(\"promptCancelButton\");\nconst promptConfirmButton = document.getElementById(\"promptConfirmButton\");\nconst manifest = browser.runtime.getManifest();\nconst requestPermissionIdentity = manifest.optional_permissions && manifest.optional_permissions.includes(\"identity\");\nconst saveToRestFormApiLabel = document.getElementById(\"saveToRestFormApiLabel\");\nconst saveToRestFormApiUrlLabel = document.getElementById(\"saveToRestFormApiUrlLabel\");\nconst saveToRestFormApiFileFieldNameLabel = document.getElementById(\"saveToRestFormApiFileFieldNameLabel\");\nconst saveToRestFormApiUrlFieldNameLabel = document.getElementById(\"saveToRestFormApiUrlFieldNameLabel\");\nconst saveToRestFormApiTokenLabel = document.getElementById(\"saveToRestFormApiTokenLabel\");\nconst saveToRestFormApiInput = document.getElementById(\"saveToRestFormApiInput\");\nconst saveToRestFormApiUrlInput = document.getElementById(\"saveToRestFormApiUrlInput\");\nconst saveToRestFormApiFileFieldNameInput = document.getElementById(\"saveToRestFormApiFileFieldNameInput\");\nconst saveToRestFormApiUrlFieldNameInput = document.getElementById(\"saveToRestFormApiUrlFieldNameInput\");\nconst saveToRestFormApiTokenInput = document.getElementById(\"saveToRestFormApiTokenInput\");\nconst S3DomainInput = document.getElementById(\"S3DomainInput\");\nconst S3RegionInput = document.getElementById(\"S3RegionInput\");\nconst S3BucketInput = document.getElementById(\"S3BucketInput\");\nconst S3AccessKeyInput = document.getElementById(\"S3AccessKeyInput\");\nconst S3SecretKeyInput = document.getElementById(\"S3SecretKeyInput\");\n\nlet sidePanelDisplay, lastURLValue = \"\", lastProfileValue = \"\", lastAutoSaveProfileValue = \"\";\nif (location.href.endsWith(\"#side-panel\")) {\n\tsidePanelDisplay = true;\n\tdocument.querySelector(\".options-title\").remove();\n\tdocument.documentElement.classList.add(\"side-panel\");\n}\nbrowser.runtime.onMessage.addListener(message => {\n\tif (message.method == \"options.refresh\" || (message.method == \"options.refreshPanel\" && sidePanelDisplay)) {\n\t\trefresh(message.profileName);\n\t}\n});\nlet pendingSave = Promise.resolve();\nlet autoSaveProfileChanged;\nruleProfileInput.onchange = () => {\n\tif (!autoSaveProfileChanged && ruleProfileInput.value != CURRENT_PROFILE_NAME) {\n\t\truleAutoSaveProfileInput.value = ruleProfileInput.value;\n\t}\n};\nruleAutoSaveProfileInput.onchange = () => {\n\tautoSaveProfileChanged = true;\n};\nrulesDeleteAllButton.addEventListener(\"click\", async event => {\n\tif (await confirm(browser.i18n.getMessage(\"optionsDeleteDisplayedRulesConfirm\"), event.clientY - 100)) {\n\t\tawait browser.runtime.sendMessage({ method: \"config.deleteRules\", profileName: !showAllProfilesInput.checked && profileNamesInput.value });\n\t\tawait refresh();\n\t\tawait refreshExternalComponents();\n\t}\n}, false);\ncreateURLElement.onsubmit = async event => {\n\tevent.preventDefault();\n\ttry {\n\t\tawait browser.runtime.sendMessage({ method: \"config.addRule\", url: ruleUrlInput.value, profileName: ruleProfileInput.value, autoSaveProfileName: ruleAutoSaveProfileInput.value });\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n\truleUrlInput.value = \"\";\n\truleProfileInput.value = ruleAutoSaveProfileInput.value = DEFAULT_PROFILE_NAME;\n\tautoSaveProfileChanged = false;\n\tawait refresh();\n\tawait refreshExternalComponents();\n\truleUrlInput.focus();\n};\nruleUrlInput.onclick = ruleUrlInput.onkeyup = ruleUrlInput.onchange = async () => {\n\truleAddButton.disabled = !ruleUrlInput.value;\n\tconst rules = await browser.runtime.sendMessage({ method: \"config.getRules\" });\n\tif (rules.find(rule => rule.url == ruleUrlInput.value)) {\n\t\truleAddButton.disabled = true;\n\t}\n};\nruleEditUrlInput.onclick = ruleEditUrlInput.onkeyup = ruleEditUrlInput.onchange = async () => {\n\truleEditButton.disabled = !ruleEditUrlInput.value;\n\tconst rules = await browser.runtime.sendMessage({ method: \"config.getRules\" });\n\tif (rules.find(rule => rule.url == ruleEditUrlInput.value)) {\n\t\truleEditButton.disabled = true;\n\t}\n};\nruleCancelButton.onclick = async () => {\n\truleEditUrlInput.value = lastURLValue;\n\truleEditProfileInput.value = lastProfileValue;\n\truleEditAutoSaveProfileInput.value = lastAutoSaveProfileValue;\n\tlastURLValue = \"\";\n\tlastProfileValue = \"\";\n\tlastAutoSaveProfileValue = \"\";\n};\nif (getLocalStorageItem(\"optionShowAutoSaveProfile\")) {\n\tshowAutoSaveProfileInput.checked = true;\n\trulesContainerElement.classList.remove(\"compact\");\n}\nshowAutoSaveProfileInput.addEventListener(\"click\", () => {\n\tif (showAutoSaveProfileInput.checked) {\n\t\tsetLocalStorageItem(\"optionShowAutoSaveProfile\", 1);\n\t\trulesContainerElement.classList.remove(\"compact\");\n\t} else {\n\t\tremoveLocalStorageItem(\"optionShowAutoSaveProfile\");\n\t\trulesContainerElement.classList.add(\"compact\");\n\t}\n}, false);\nif (getLocalStorageItem(\"optionShowAllProfiles\")) {\n\tshowAllProfilesInput.checked = true;\n}\nshowAllProfilesInput.addEventListener(\"click\", () => {\n\tif (showAllProfilesInput.checked) {\n\t\tsetLocalStorageItem(\"optionShowAllProfiles\", 1);\n\t} else {\n\t\tremoveLocalStorageItem(\"optionShowAllProfiles\");\n\t}\n}, false);\naddProfileButton.addEventListener(\"click\", async event => {\n\tconst profileName = await prompt(browser.i18n.getMessage(\"profileAddPrompt\"), event.clientY + 50);\n\tif (profileName) {\n\t\ttry {\n\t\t\tawait browser.runtime.sendMessage({ method: \"config.createProfile\", profileName, fromProfileName: profileNamesInput.value });\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t\tif (sidePanelDisplay) {\n\t\t\tawait refresh();\n\t\t} else {\n\t\t\tawait refresh(profileName);\n\t\t}\n\t\tawait refreshExternalComponents();\n\t}\n}, false);\ndeleteProfileButton.addEventListener(\"click\", async event => {\n\tif (await confirm(browser.i18n.getMessage(\"profileDeleteConfirm\"), event.clientY + 50)) {\n\t\ttry {\n\t\t\tawait browser.runtime.sendMessage({ method: \"config.deleteProfile\", profileName: profileNamesInput.value });\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t\tprofileNamesInput.value = null;\n\t\tawait refresh();\n\t\tawait refreshExternalComponents();\n\t}\n}, false);\nrenameProfileButton.addEventListener(\"click\", async event => {\n\tconst profileName = await prompt(browser.i18n.getMessage(\"profileRenamePrompt\"), event.clientY + 50, profileNamesInput.value);\n\tif (profileName) {\n\t\ttry {\n\t\t\tawait browser.runtime.sendMessage({ method: \"config.renameProfile\", profileName: profileNamesInput.value, newProfileName: profileName });\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t\tawait refresh(profileName);\n\t\tawait refreshExternalComponents();\n\t}\n}, false);\nresetButton.addEventListener(\"click\", async event => {\n\tconst choice = await reset(event.clientY - 250);\n\tif (choice) {\n\t\tif (choice == \"all\") {\n\t\t\tawait browser.runtime.sendMessage({ method: \"config.resetProfiles\" });\n\t\t\tawait refresh(DEFAULT_PROFILE_NAME);\n\t\t\tawait refreshExternalComponents();\n\t\t}\n\t\tif (choice == \"current\") {\n\t\t\tawait browser.runtime.sendMessage({ method: \"config.resetProfile\", profileName: profileNamesInput.value });\n\t\t\tawait refresh();\n\t\t\tawait refreshExternalComponents();\n\t\t}\n\t\tawait update();\n\t}\n}, false);\nexportButton.addEventListener(\"click\", async () => {\n\tconst response = await browser.runtime.sendMessage({ method: \"config.exportConfig\" });\n\tif (response.filename && response.textContent) {\n\t\tconst link = document.createElement(\"a\");\n\t\tlink.download = response.filename;\n\t\tlink.href = \"data:application/octet-stream;base64,\" + btoa(unescape(encodeURIComponent(response.textContent)));\n\t\tlink.target = \"_blank\";\n\t\tlink.dispatchEvent(new MouseEvent(\"click\"));\n\t}\n}, false);\nimportButton.addEventListener(\"click\", () => {\n\tfileInput.onchange = async () => {\n\t\tif (fileInput.files.length) {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsText(fileInput.files[0]);\n\t\t\tconst serializedConfig = await new Promise((resolve, reject) => {\n\t\t\t\treader.addEventListener(\"load\", () => resolve(reader.result), false);\n\t\t\t\treader.addEventListener(\"error\", reject, false);\n\t\t\t});\n\t\t\tconst config = JSON.parse(serializedConfig);\n\t\t\tObject.keys(config.profiles).forEach(profileName => {\n\t\t\t\tconst profile = config.profiles[profileName];\n\t\t\t\tif (profile.saveToGDrive && !profile.forceWebAuthFlow) {\n\t\t\t\t\tprofile.saveToGDrive = false;\n\t\t\t\t}\n\t\t\t\tprofile.saveToClipboard = false;\n\t\t\t\tprofile.saveWithCompanion = false;\n\t\t\t\tprofile.saveCreatedBookmarks = false;\n\t\t\t\tprofile.passReferrerOnError = false;\n\t\t\t});\n\t\t\tawait browser.runtime.sendMessage({ method: \"config.importConfig\", config });\n\t\t\tawait refresh(DEFAULT_PROFILE_NAME);\n\t\t\tawait refreshExternalComponents();\n\t\t\tfileInput.value = \"\";\n\t\t}\n\t};\n\tfileInput.click();\n}, false);\nautoSaveUnloadInput.addEventListener(\"click\", async () => {\n\tif (!autoSaveLoadInput.checked && !autoSaveUnloadInput.checked) {\n\t\tautoSaveLoadOrUnloadInput.checked = true;\n\t}\n}, false);\nautoSaveLoadInput.addEventListener(\"click\", async () => {\n\tif (!autoSaveLoadInput.checked && !autoSaveUnloadInput.checked) {\n\t\tautoSaveLoadOrUnloadInput.checked = true;\n\t}\n}, false);\nautoSaveLoadOrUnloadInput.addEventListener(\"click\", async () => {\n\tif (autoSaveLoadOrUnloadInput.checked) {\n\t\tautoSaveUnloadInput.checked = autoSaveLoadInput.checked = false;\n\t} else {\n\t\tautoSaveUnloadInput.checked = false;\n\t}\n}, false);\nexpandAllButton.addEventListener(\"click\", () => {\n\tif (expandAllButton.className) {\n\t\texpandAllButton.className = \"\";\n\t} else {\n\t\texpandAllButton.className = \"opened\";\n\t}\n\tdocument.querySelectorAll(\"details\").forEach(detailElement => detailElement.open = Boolean(expandAllButton.className));\n}, false);\nsaveToFilesystemInput.addEventListener(\"click\", () => disableDestinationPermissions([\"clipboardWrite\", \"nativeMessaging\"]), false);\nsaveToClipboardInput.addEventListener(\"click\", () => disableDestinationPermissions([\"nativeMessaging\"]), false);\nsaveWithCompanionInput.addEventListener(\"click\", () => disableDestinationPermissions([\"clipboardWrite\"]), false);\nsaveToGDriveInput.addEventListener(\"click\", () => disableDestinationPermissions([\"clipboardWrite\", \"nativeMessaging\"], false), false);\nsaveToDropboxInput.addEventListener(\"click\", () => disableDestinationPermissions([\"clipboardWrite\", \"nativeMessaging\"], true, false), false);\nsaveWithWebDAVInput.addEventListener(\"click\", () => disableDestinationPermissions([\"clipboardWrite\", \"nativeMessaging\"]), false);\nsaveWithMCPInput.addEventListener(\"click\", () => disableDestinationPermissions([\"clipboardWrite\", \"nativeMessaging\"]), false);\nsaveToRestFormApiInput.addEventListener(\"click\", () => disableDestinationPermissions([\"clipboardWrite\", \"nativeMessaging\"]), false);\nsharePageInput.addEventListener(\"click\", () => disableDestinationPermissions([\"clipboardWrite\", \"nativeMessaging\"]), false);\nsaveCreatedBookmarksInput.addEventListener(\"click\", saveCreatedBookmarks, false);\nautoSaveExternalSaveInput.addEventListener(\"click\", () => enableExternalSave(autoSaveExternalSaveInput), false);\nsaveWithCompanionInput.addEventListener(\"click\", () => enableExternalSave(saveWithCompanionInput), false);\nsaveToClipboardInput.addEventListener(\"click\", onClickSaveToClipboard, false);\nsaveToGDriveInput.addEventListener(\"click\", onClickSaveToGDrive, false);\naddProofInput.addEventListener(\"click\", async event => {\n\tif (addProofInput.checked) {\n\t\taddProofInput.checked = false;\n\t\tif (await confirm(browser.i18n.getMessage(\"optionsAddProofConfirm\"), event.clientY - 100)) {\n\t\t\taddProofInput.checked = true;\n\t\t\twoleetKeyInput.disabled = false;\n\t\t}\n\t\tawait update();\n\t}\n});\nbrowser.runtime.sendMessage({ method: \"config.isSync\" }).then(data => synchronizeInput.checked = data.sync);\nsynchronizeInput.addEventListener(\"click\", async () => {\n\tif (synchronizeInput.checked) {\n\t\tawait browser.runtime.sendMessage({ method: \"config.enableSync\" });\n\t\tawait refresh(DEFAULT_PROFILE_NAME);\n\t} else {\n\t\tawait browser.runtime.sendMessage({ method: \"config.disableSync\" });\n\t\tawait refresh();\n\t}\n}, false);\ninsertEmbeddedImageInput.addEventListener(\"click\", () => {\n\tif (insertEmbeddedImageInput.checked) {\n\t\tinsertEmbeddedScreenshotImageInput.checked = true;\n\t} else {\n\t\tinsertEmbeddedScreenshotImageInput.checked = false;\n\t\tinsertEmbeddedCustomImageInput.checked = false;\n\t}\n}, false);\nfileFormatSelectInput.addEventListener(\"change\", () => {\n\tif (fileFormatSelectInput.value == \"html\") {\n\t\tinsertEmbeddedScreenshotImageInput.checked = false;\n\t\tinsertEmbeddedCustomImageInput.checked = false;\n\t}\n}, false);\ndocument.body.onchange = async event => {\n\tlet target = event.target;\n\tif (target != ruleUrlInput &&\n\t\ttarget != ruleProfileInput &&\n\t\ttarget != ruleAutoSaveProfileInput &&\n\t\ttarget != ruleEditUrlInput &&\n\t\ttarget != ruleEditProfileInput &&\n\t\ttarget != ruleEditAutoSaveProfileInput &&\n\t\ttarget != showAutoSaveProfileInput &&\n\t\ttarget != saveCreatedBookmarksInput) {\n\t\tif (target != profileNamesInput && target != showAllProfilesInput) {\n\t\t\tawait update();\n\t\t}\n\t\tif (target == profileNamesInput) {\n\t\t\tawait refresh(profileNamesInput.value);\n\t\t\tif (sidePanelDisplay) {\n\t\t\t\tconst tabsData = await browser.runtime.sendMessage({ method: \"tabsData.get\" });\n\t\t\t\ttabsData.profileName = profileNamesInput.value;\n\t\t\t\tawait browser.runtime.sendMessage({ method: \"tabsData.set\", tabsData: tabsData });\n\t\t\t\tawait browser.runtime.sendMessage({ method: \"ui.refreshMenu\" });\n\t\t\t}\n\t\t} else {\n\t\t\tif (target == contextMenuEnabledInput) {\n\t\t\t\tawait browser.runtime.sendMessage({ method: \"ui.refreshMenu\" });\n\t\t\t}\n\t\t\tif (target == openEditorInput) {\n\t\t\t\tawait browser.runtime.sendMessage({ method: \"ui.refreshMenu\" });\n\t\t\t}\n\t\t\tawait refresh();\n\t\t}\n\t}\n};\n\naddProfileButton.title = browser.i18n.getMessage(\"profileAddButtonTooltip\");\ndeleteProfileButton.title = browser.i18n.getMessage(\"profileDeleteButtonTooltip\");\nrenameProfileButton.title = browser.i18n.getMessage(\"profileRenameButtonTooltip\");\nremoveHiddenElementsLabel.textContent = browser.i18n.getMessage(\"optionRemoveHiddenElements\");\nremovedElementsSelectorLabel.textContent = browser.i18n.getMessage(\"optionRemovedElementsSelector\");\nremoveUnusedStylesLabel.textContent = browser.i18n.getMessage(\"optionRemoveUnusedStyles\");\nremoveUnusedFontsLabel.textContent = browser.i18n.getMessage(\"optionRemoveUnusedFonts\");\nremoveFramesLabel.textContent = browser.i18n.getMessage(\"optionRemoveFrames\");\nblockScriptsLabel.textContent = browser.i18n.getMessage(\"optionResourceScript\");\nblockAudiosLabel.textContent = browser.i18n.getMessage(\"optionResourceAudio\");\nblockVideosLabel.textContent = browser.i18n.getMessage(\"optionResourceVideo\");\nblockFontsLabel.textContent = browser.i18n.getMessage(\"optionResourceFont\");\nblockStylesheetsLabel.textContent = browser.i18n.getMessage(\"optionResourceStylesheet\");\nblockImagesLabel.textContent = browser.i18n.getMessage(\"optionResourceImage\");\nacceptHeaderDocumentLabel.textContent = browser.i18n.getMessage(\"optionResourceDocument\");\nacceptHeaderScriptLabel.textContent = browser.i18n.getMessage(\"optionResourceScript\");\nacceptHeaderAudioLabel.textContent = browser.i18n.getMessage(\"optionResourceAudio\");\nacceptHeaderVideoLabel.textContent = browser.i18n.getMessage(\"optionResourceVideo\");\nacceptHeaderFontLabel.textContent = browser.i18n.getMessage(\"optionResourceFont\");\nacceptHeaderStylesheetLabel.textContent = browser.i18n.getMessage(\"optionResourceStylesheet\");\nacceptHeaderImageLabel.textContent = browser.i18n.getMessage(\"optionResourceImage\");\nsaveRawPageLabel.textContent = browser.i18n.getMessage(\"optionSaveRawPage\");\ninsertMetaCSPLabel.textContent = browser.i18n.getMessage(\"optionInsertMetaCSP\");\nsaveToClipboardLabel.textContent = browser.i18n.getMessage(\"optionSaveToClipboard\");\nsaveToFilesystemLabel.textContent = browser.i18n.getMessage(\"optionSaveToFilesystem\");\nsharePageLabel.textContent = browser.i18n.getMessage(\"optionSharePage\");\naddProofLabel.textContent = browser.i18n.getMessage(\"optionAddProof\");\nwoleetKeyLabel.textContent = browser.i18n.getMessage(\"optionWoleetKey\");\nsaveToGDriveLabel.textContent = browser.i18n.getMessage(\"optionSaveToGDrive\");\nsaveToDropboxLabel.textContent = browser.i18n.getMessage(\"optionSaveToDropbox\");\nsaveWithWebDAVLabel.textContent = browser.i18n.getMessage(\"optionSaveWithWebDAV\");\nwebDAVURLLabel.textContent = browser.i18n.getMessage(\"optionWebDAVURL\");\nwebDAVUserLabel.textContent = browser.i18n.getMessage(\"optionWebDAVUser\");\nwebDAVPasswordLabel.textContent = browser.i18n.getMessage(\"optionWebDAVPassword\");\nsaveWithMCPLabel.textContent = browser.i18n.getMessage(\"optionSaveWithMCP\");\nmcpServerUrlLabel.textContent = browser.i18n.getMessage(\"optionMCPServerUrl\");\nmcpAuthTokenLabel.textContent = browser.i18n.getMessage(\"optionMCPAuthToken\");\nsaveToGitHubLabel.textContent = browser.i18n.getMessage(\"optionSaveToGitHub\");\ngithubTokenLabel.textContent = browser.i18n.getMessage(\"optionGitHubToken\");\ngithubUserLabel.textContent = browser.i18n.getMessage(\"optionGitHubUser\");\ngithubRepositoryLabel.textContent = browser.i18n.getMessage(\"optionGitHubRepository\");\ngithubBranchLabel.textContent = browser.i18n.getMessage(\"optionGitHubBranch\");\nsaveToS3Label.textContent = browser.i18n.getMessage(\"optionSaveToS3\");\nS3DomainLabel.textContent = browser.i18n.getMessage(\"optionS3Domain\");\nS3RegionLabel.textContent = browser.i18n.getMessage(\"optionS3Region\");\nS3BucketLabel.textContent = browser.i18n.getMessage(\"optionS3Bucket\");\nS3AccessKeyLabel.textContent = browser.i18n.getMessage(\"optionS3AccessKey\");\nS3SecretKeyLabel.textContent = browser.i18n.getMessage(\"optionS3SecretKey\");\nsaveWithCompanionLabel.textContent = browser.i18n.getMessage(\"optionSaveWithCompanion\");\ncompressHTMLLabel.textContent = browser.i18n.getMessage(\"optionCompressHTML\");\ninsertTextBodyLabel.textContent = browser.i18n.getMessage(\"optionInsertTextBody\");\ninsertEmbeddedImageLabel.textContent = browser.i18n.getMessage(\"optionInsertEmbeddedImage\");\ninsertEmbeddedCustomImageLabel.textContent = browser.i18n.getMessage(\"optionInsertEmbeddedCustomImage\");\ninsertEmbeddedScreenshotImageLabel.textContent = browser.i18n.getMessage(\"optionInsertEmbeddedScreenshotImage\");\ncompressCSSLabel.textContent = browser.i18n.getMessage(\"optionCompressCSS\");\ngroupDuplicateStylesheetsLabel.textContent = browser.i18n.getMessage(\"optionGroupDuplicateStylesheets\");\nmoveStylesInHeadLabel.textContent = browser.i18n.getMessage(\"optionMoveStylesInHead\");\nimageReductionFactorLabel.textContent = browser.i18n.getMessage(\"optionImageReductionFactor\");\nloadDeferredImagesLabel.textContent = browser.i18n.getMessage(\"optionLoadDeferredImages\");\nloadDeferredImagesMaxIdleTimeLabel.textContent = browser.i18n.getMessage(\"optionLoadDeferredImagesMaxIdleTime\");\nloadDeferredImagesKeepZoomLevelLabel.textContent = browser.i18n.getMessage(\"optionLoadDeferredImagesKeepZoomLevel\");\nloadDeferredImagesDispatchScrollEventLabel.textContent = browser.i18n.getMessage(\"optionLoadDeferredImagesDispatchScrollEvent\");\nloadDeferredImagesBeforeFramesLabel.textContent = browser.i18n.getMessage(\"optionLoadDeferredImagesBeforeFrames\");\naddMenuEntryLabel.textContent = browser.i18n.getMessage(\"optionAddMenuEntry\");\nfilenameTemplateLabel.textContent = browser.i18n.getMessage(\"optionFilenameTemplate\");\nfilenameMaxLengthLabel.textContent = browser.i18n.getMessage(\"optionFilenameMaxLength\");\nfilenameMaxLengthBytesUnitLabel.textContent = browser.i18n.getMessage(\"optionFilenameMaxLengthBytesUnit\");\nfilenameMaxLengthCharsUnitLabel.textContent = browser.i18n.getMessage(\"optionFilenameMaxLengthCharsUnit\");\nfilenameReplacementCharacterLabel.textContent = browser.i18n.getMessage(\"optionFilenameReplacementCharacter\");\nreplaceEmojisInFilenameLabel.textContent = browser.i18n.getMessage(\"optionReplaceEmojisInFilename\");\nsaveFilenameTemplateDataLabel.textContent = browser.i18n.getMessage(\"optionSaveFilenameTemplateData\");\nshadowEnabledLabel.textContent = browser.i18n.getMessage(\"optionDisplayShadow\");\nsetMaxResourceSizeLabel.textContent = browser.i18n.getMessage(\"optionSetMaxResourceSize\");\nmaxResourceSizeLabel.textContent = browser.i18n.getMessage(\"optionMaxResourceSize\");\nsetMaxResourceDelayLabel.textContent = browser.i18n.getMessage(\"optionSetMaxResourceDelay\");\nmaxResourceDelayLabel.textContent = browser.i18n.getMessage(\"optionMaxResourceDelay\");\nconfirmFilenameLabel.textContent = browser.i18n.getMessage(\"optionConfirmFilename\");\nfilenameConflictActionLabel.textContent = browser.i18n.getMessage(\"optionFilenameConflictAction\");\nfilenameConflictActionUniquifyLabel.textContent = browser.i18n.getMessage(\"optionFilenameConflictActionUniquify\");\nfilenameConflictActionOverwriteLabel.textContent = browser.i18n.getMessage(\"optionFilenameConflictActionOverwrite\");\nfilenameConflictActionPromptLabel.textContent = browser.i18n.getMessage(\"optionFilenameConflictActionPrompt\");\nfilenameConflictActionSkipLabel.textContent = browser.i18n.getMessage(\"optionFilenameConflictActionSkip\");\ndisplayInfobarLabel.textContent = browser.i18n.getMessage(\"optionDisplayInfobar\");\ndisplayStatsLabel.textContent = browser.i18n.getMessage(\"optionDisplayStats\");\nbackgroundSaveLabel.textContent = browser.i18n.getMessage(\"optionBackgroundSave\");\nautoSaveDelayLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveDelay\");\nautoSaveLoadLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveLoad\");\nautoSaveUnloadLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveUnload\");\nautoSaveLoadOrUnloadLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveLoadOrUnload\");\nautoSaveDiscardLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveDiscard\");\nautoSaveRemoveLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveRemove\");\nautoSaveRepeatLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveRepeat\");\nautoSaveRepeatDelayLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveRepeatDelay\");\nautoSaveExternalSaveLabel.textContent = browser.i18n.getMessage(\"optionAutoSaveExternalSave\");\nremoveAlternativeFontsLabel.textContent = browser.i18n.getMessage(\"optionRemoveAlternativeFonts\");\nremoveAlternativeImagesLabel.textContent = browser.i18n.getMessage(\"optionRemoveAlternativeImages\");\nremoveAlternativeMediasLabel.textContent = browser.i18n.getMessage(\"optionRemoveAlternativeMedias\");\nsaveCreatedBookmarksLabel.textContent = browser.i18n.getMessage(\"optionSaveCreatedBookmarks\");\npassReferrerOnErrorLabel.textContent = browser.i18n.getMessage(\"optionPassReferrerOnError\");\nreplaceBookmarkURLLabel.textContent = browser.i18n.getMessage(\"optionReplaceBookmarkURL\");\nallowedBookmarkFoldersLabel.textContent = browser.i18n.getMessage(\"optionAllowedBookmarkFolders\");\nignoredBookmarkFoldersLabel.textContent = browser.i18n.getMessage(\"optionIgnoredBookmarkFolders\");\ncreateRootDirectoryLabel.textContent = browser.i18n.getMessage(\"optionCreateRootDirectory\");\ndisableCompressionLabel.textContent = browser.i18n.getMessage(\"optionDisableCompression\");\npreventAppendedDataLabel.textContent = browser.i18n.getMessage(\"optionPreventAppendedData\");\npasswordLabel.textContent = browser.i18n.getMessage(\"optionPassword\");\ngroupDuplicateImagesLabel.textContent = browser.i18n.getMessage(\"optionGroupDuplicateImages\");\ntitleLabel.textContent = browser.i18n.getMessage(\"optionsTitle\");\nuserInterfaceLabel.textContent = browser.i18n.getMessage(\"optionsUserInterfaceSubTitle\");\nfilenameLabel.textContent = browser.i18n.getMessage(\"optionsFileNameSubTitle\");\nhtmlContentLabel.textContent = browser.i18n.getMessage(\"optionsHTMLContentSubTitle\");\nfileFormatLabel.textContent = browser.i18n.getMessage(\"optionsFileFormatSubTitle\");\nfileFormatSelectHTMLLabel.textContent = browser.i18n.getMessage(\"optionFileFormatSelectHTML\");\nfileFormatSelectSelfExtractingUniversalLabel.textContent = browser.i18n.getMessage(\"optionFileFormatSelectSelfExtractingUniversal\");\nfileFormatSelectSelfExtractingLabel.textContent = browser.i18n.getMessage(\"optionFileFormatSelectSelfExtracting\");\nfileFormatSelectZIPLabel.textContent = browser.i18n.getMessage(\"optionFileFormatSelectZIP\");\nfileFormatSelectLabel.textContent = browser.i18n.getMessage(\"optionFileFormat\");\ninfobarLabel.textContent = browser.i18n.getMessage(\"optionsInfobarSubTitle\");\nimagesLabel.textContent = browser.i18n.getMessage(\"optionsImagesSubTitle\");\nstylesheetsLabel.textContent = browser.i18n.getMessage(\"optionsStylesheetsSubTitle\");\nfontsLabel.textContent = browser.i18n.getMessage(\"optionsFontsSubTitle\");\nnetworkLabel.textContent = browser.i18n.getMessage(\"optionsNetworkSubTitle\");\nblockResourcesLabel.textContent = browser.i18n.getMessage(\"optionsBlockedResources\");\nacceptHeadersLabel.textContent = browser.i18n.getMessage(\"optionsAcceptHeaders\");\ndestinationLabel.textContent = browser.i18n.getMessage(\"optionsDestinationSubTitle\");\nbookmarksLabel.textContent = browser.i18n.getMessage(\"optionsBookmarkSubTitle\");\nautoSaveLabel.textContent = browser.i18n.getMessage(\"optionsAutoSaveSubTitle\");\nmiscLabel.textContent = browser.i18n.getMessage(\"optionsMiscSubTitle\");\nhelpLabel.textContent = browser.i18n.getMessage(\"optionsHelpLink\");\ninfobarTemplateLabel.textContent = browser.i18n.getMessage(\"optionInfobarTemplate\");\nblockMixedContentLabel.textContent = browser.i18n.getMessage(\"optionBlockMixedContent\");\nsaveOriginalURLsLabel.textContent = browser.i18n.getMessage(\"optionSaveOriginalURLs\");\nincludeInfobarLabel.textContent = browser.i18n.getMessage(\"optionIncludeInfobar\");\nopenInfobarLabel.textContent = browser.i18n.getMessage(\"optionOpenInfobar\");\nremoveInfobarSavedDateLabel.textContent = browser.i18n.getMessage(\"optionRemoveInfobarSavedDate\");\nconfirmInfobarLabel.textContent = browser.i18n.getMessage(\"optionConfirmInfobar\");\nautoCloseLabel.textContent = browser.i18n.getMessage(\"optionAutoClose\");\neditorLabel.textContent = browser.i18n.getMessage(\"optionsEditorSubTitle\");\nopenEditorLabel.textContent = browser.i18n.getMessage(\"optionOpenEditor\");\nopenSavedPageLabel.textContent = browser.i18n.getMessage(\"optionOpenSavedPage\");\nautoOpenEditorLabel.textContent = browser.i18n.getMessage(\"optionAutoOpenEditor\");\ndefaultEditorModeLabel.textContent = browser.i18n.getMessage(\"optionDefaultEditorMode\");\ndefaultEditorModeNormalLabel.textContent = browser.i18n.getMessage(\"optionDefaultEditorModeNormal\");\ndefaultEditorModeEditLabel.textContent = browser.i18n.getMessage(\"optionDefaultEditorModeEdit\");\ndefaultEditorModeFormatLabel.textContent = browser.i18n.getMessage(\"optionDefaultEditorModeFormat\");\ndefaultEditorModeCutLabel.textContent = browser.i18n.getMessage(\"optionDefaultEditorModeCut\");\ndefaultEditorModeCutExternalLabel.textContent = browser.i18n.getMessage(\"optionDefaultEditorModeCutExternal\");\napplySystemThemeLabel.textContent = browser.i18n.getMessage(\"optionApplySystemTheme\");\ncontentWidthLabel.textContent = browser.i18n.getMessage(\"optionContentWidth\");\nwarnUnsavedPageLabel.textContent = browser.i18n.getMessage(\"optionWarnUnsavedPage\");\ndisplayInfobarInEditorLabel.textContent = browser.i18n.getMessage(\"optiondisplayInfobarInEditor\");\nresetButton.textContent = browser.i18n.getMessage(\"optionsResetButton\");\nexportButton.textContent = browser.i18n.getMessage(\"optionsExportButton\");\nimportButton.textContent = browser.i18n.getMessage(\"optionsImportButton\");\nresetButton.title = browser.i18n.getMessage(\"optionsResetTooltip\");\nautoSettingsLabel.textContent = browser.i18n.getMessage(\"optionsAutoSettingsSubTitle\");\nautoSettingsUrlLabel.textContent = browser.i18n.getMessage(\"optionsAutoSettingsUrl\");\nautoSettingsProfileLabel.textContent = browser.i18n.getMessage(\"optionsAutoSettingsProfile\");\nautoSettingsAutoSaveProfileLabel.textContent = browser.i18n.getMessage(\"optionsAutoSettingsAutoSaveProfile\");\nruleAddButton.title = browser.i18n.getMessage(\"optionsAddRuleTooltip\");\nruleEditButton.title = browser.i18n.getMessage(\"optionsValidateChangesTooltip\");\nruleCancelButton.title = browser.i18n.getMessage(\"optionsCancelChangesTooltip\");\nrulesDeleteAllButton.title = browser.i18n.getMessage(\"optionsDeleteRulesTooltip\");\nshowAllProfilesLabel.textContent = browser.i18n.getMessage(\"optionsAutoSettingsShowAllProfiles\");\nshowAutoSaveProfileLabel.textContent = browser.i18n.getMessage(\"optionsAutoSettingsShowAutoSaveProfile\");\nruleUrlInput.placeholder = ruleEditUrlInput.placeholder = browser.i18n.getMessage(\"optionsAutoSettingsUrlPlaceholder\");\nsynchronizeLabel.textContent = browser.i18n.getMessage(\"optionSynchronize\");\ncustomShortcutLabel.textContent = browser.i18n.getMessage(\"optionCustomShortcut\");\ncustomShortcutDefaultLabel.textContent = browser.i18n.getMessage(\"optionCustomShortcutDefault\");\ncustomShortcut1Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut0\");\ncustomShortcut2Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut1\");\ncustomShortcut3Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut2\");\ncustomShortcut4Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut3\");\ncustomShortcut5Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut4\");\ncustomShortcut6Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut5\");\ncustomShortcut7Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut6\");\ncustomShortcut8Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut7\");\ncustomShortcut9Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut8\");\ncustomShortcut10Label.textContent = browser.i18n.getMessage(\"commandCustomShortcut9\");\nresetAllButton.textContent = browser.i18n.getMessage(\"optionsResetAllButton\");\nresetCurrentButton.textContent = browser.i18n.getMessage(\"optionsResetCurrentButton\");\nresetCancelButton.textContent = promptCancelButton.textContent = cancelButton.textContent = browser.i18n.getMessage(\"optionsCancelButton\");\nconfirmButton.textContent = promptConfirmButton.textContent = browser.i18n.getMessage(\"optionsOKButton\");\ndocument.getElementById(\"resetConfirmLabel\").textContent = browser.i18n.getMessage(\"optionsResetConfirm\");\nsaveToRestFormApiLabel.textContent = browser.i18n.getMessage(\"optionSaveToRestFormApi\");\nsaveToRestFormApiUrlLabel.textContent = browser.i18n.getMessage(\"optionRestFormApiUrl\");\nsaveToRestFormApiFileFieldNameLabel.textContent = browser.i18n.getMessage(\"optionRestFormApiFileFieldName\");\nsaveToRestFormApiUrlFieldNameLabel.textContent = browser.i18n.getMessage(\"optionRestFormApiUrlFieldName\");\nsaveToRestFormApiTokenLabel.textContent = browser.i18n.getMessage(\"optionRestFormApiToken\");\n\nif (location.href.endsWith(\"#\")) {\n\tdocument.querySelector(\".new-window-link\").remove();\n\tdocument.documentElement.classList.add(\"maximized\");\n}\nlet tabsData;\nbrowser.runtime.sendMessage({ method: \"tabsData.get\" }).then(allTabsData => {\n\ttabsData = allTabsData;\n\treturn refresh(tabsData.profileName);\n});\ngetHelpContents();\n\nfunction init() {\n\tif (!BACKGROUND_SAVE_SUPPORTED) {\n\t\tdocument.getElementById(\"backgroundSaveOptions\").hidden = true;\n\t\tdocument.getElementById(\"confirmFilenameOption\").hidden = true;\n\t\tdocument.getElementById(\"filenameConflictAction\").hidden = true;\n\t}\n\tif (!SHARE_API_SUPPORTED) {\n\t\tdocument.getElementById(\"sharePageOption\").hidden = true;\n\t}\n}\n\nasync function refresh(profileName) {\n\tconst [profiles, rules, companionState] = await Promise.all([\n\t\tbrowser.runtime.sendMessage({ method: \"config.getProfiles\" }),\n\t\tbrowser.runtime.sendMessage({ method: \"config.getRules\" }),\n\t\tbrowser.runtime.sendMessage({ method: \"companion.state\" })]);\n\tconst selectedProfileName = profileName || profileNamesInput.value || DEFAULT_PROFILE_NAME;\n\tArray.from(profileNamesInput.childNodes).forEach(node => node.remove());\n\tprofileNamesInput.options.length = 0;\n\truleProfileInput.options.length = 0;\n\truleAutoSaveProfileInput.options.length = 0;\n\truleEditProfileInput.options.length = 0;\n\truleEditAutoSaveProfileInput.options.length = 0;\n\tlet optionElement = document.createElement(\"option\");\n\toptionElement.value = DEFAULT_PROFILE_NAME;\n\toptionElement.textContent = browser.i18n.getMessage(\"profileDefaultSettings\");\n\t[CURRENT_PROFILE_NAME].concat(...Object.keys(profiles)).forEach(profileName => {\n\t\tconst optionElement = document.createElement(\"option\");\n\t\toptionElement.value = optionElement.textContent = profileName;\n\t\tif (profileName == DEFAULT_PROFILE_NAME) {\n\t\t\toptionElement.textContent = browser.i18n.getMessage(\"profileDefaultSettings\");\n\t\t}\n\t\tif (profileName != CURRENT_PROFILE_NAME) {\n\t\t\tprofileNamesInput.appendChild(optionElement);\n\t\t}\n\t\truleProfileInput.appendChild(optionElement.cloneNode(true));\n\t\truleAutoSaveProfileInput.appendChild(optionElement.cloneNode(true));\n\t\truleEditProfileInput.appendChild(optionElement.cloneNode(true));\n\t\truleEditAutoSaveProfileInput.appendChild(optionElement.cloneNode(true));\n\t});\n\tprofileNamesInput.disabled = profileNamesInput.options.length == 1;\n\toptionElement = document.createElement(\"option\");\n\toptionElement.value = DISABLED_PROFILE_NAME;\n\toptionElement.textContent = browser.i18n.getMessage(\"profileDisabled\");\n\truleEditProfileInput.appendChild(optionElement.cloneNode(true));\n\truleProfileInput.appendChild(optionElement.cloneNode(true));\n\truleAutoSaveProfileInput.appendChild(optionElement);\n\truleEditAutoSaveProfileInput.appendChild(optionElement.cloneNode(true));\n\tconst rulesDataElement = rulesElement.querySelector(\".rules-data\");\n\tArray.from(rulesDataElement.childNodes).forEach(node => (!node.className || !node.className.includes(\"rule-edit\")) && node.remove());\n\tconst editURLElement = rulesElement.querySelector(\".rule-edit\");\n\tcreateURLElement.hidden = false;\n\teditURLElement.hidden = true;\n\truleProfileInput.value = ruleAutoSaveProfileInput.value = selectedProfileName;\n\tlet rulesDisplayed;\n\trules.forEach(rule => {\n\t\tif (showAllProfilesInput.checked || selectedProfileName == rule.profile || selectedProfileName == rule.autoSaveProfile) {\n\t\t\trulesDisplayed = true;\n\t\t\tconst ruleElement = rulesElement.querySelector(\".rule-view\").cloneNode(true);\n\t\t\tconst ruleUrlElement = ruleElement.querySelector(\".rule-url\");\n\t\t\tconst ruleProfileElement = ruleElement.querySelector(\".rule-profile\");\n\t\t\tconst ruleAutoSaveProfileElement = ruleElement.querySelector(\".rule-autosave-profile\");\n\t\t\truleUrlElement.textContent = ruleUrlElement.title = rule.url;\n\t\t\truleProfileElement.textContent = ruleProfileElement.title = getProfileText(rule.profile);\n\t\t\truleAutoSaveProfileElement.textContent = ruleAutoSaveProfileElement.title = getProfileText(rule.autoSaveProfile);\n\t\t\truleElement.hidden = false;\n\t\t\truleElement.className = \"tr data\";\n\t\t\trulesDataElement.appendChild(ruleElement);\n\t\t\tconst ruleDeleteButton = ruleElement.querySelector(\".rule-delete-button\");\n\t\t\tconst ruleUpdateButton = ruleElement.querySelector(\".rule-update-button\");\n\t\t\truleDeleteButton.title = browser.i18n.getMessage(\"optionsDeleteRuleTooltip\");\n\t\t\truleDeleteButton.addEventListener(\"click\", async event => {\n\t\t\t\tif (await confirm(browser.i18n.getMessage(\"optionsDeleteRuleConfirm\"), event.clientY - 100)) {\n\t\t\t\t\tawait browser.runtime.sendMessage({ method: \"config.deleteRule\", url: rule.url });\n\t\t\t\t\tawait refresh();\n\t\t\t\t\tawait refreshExternalComponents();\n\t\t\t\t}\n\t\t\t}, false);\n\t\t\truleUpdateButton.title = browser.i18n.getMessage(\"optionsUpdateRuleTooltip\");\n\t\t\truleUpdateButton.addEventListener(\"click\", async () => {\n\t\t\t\tif (editURLElement.hidden) {\n\t\t\t\t\tcreateURLElement.hidden = true;\n\t\t\t\t\teditURLElement.hidden = false;\n\t\t\t\t\trulesDataElement.replaceChild(editURLElement, ruleElement);\n\t\t\t\t\truleEditUrlInput.value = lastURLValue = rule.url;\n\t\t\t\t\truleEditProfileInput.value = lastProfileValue = rule.profile;\n\t\t\t\t\truleEditAutoSaveProfileInput.value = lastAutoSaveProfileValue = rule.autoSaveProfile;\n\t\t\t\t\truleEditUrlInput.focus();\n\t\t\t\t\teditURLElement.onsubmit = async event => {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\trulesElement.appendChild(editURLElement);\n\t\t\t\t\t\tawait browser.runtime.sendMessage({ method: \"config.updateRule\", url: rule.url, newUrl: ruleEditUrlInput.value, profileName: ruleEditProfileInput.value, autoSaveProfileName: ruleEditAutoSaveProfileInput.value });\n\t\t\t\t\t\tawait refresh();\n\t\t\t\t\t\tawait refreshExternalComponents();\n\t\t\t\t\t\truleUrlInput.focus();\n\t\t\t\t\t};\n\t\t\t\t\teditURLElement.onkeyup = event => {\n\t\t\t\t\t\tif (event.key == \"Escape\") {\n\t\t\t\t\t\t\truleCancelButton.click();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}, false);\n\t\t}\n\t});\n\trulesDeleteAllButton.disabled = !rulesDisplayed;\n\trulesElement.appendChild(createURLElement);\n\tprofileNamesInput.value = selectedProfileName;\n\trenameProfileButton.disabled = deleteProfileButton.disabled = profileNamesInput.value == DEFAULT_PROFILE_NAME;\n\tconst profileOptions = profiles[selectedProfileName];\n\tremoveHiddenElementsInput.checked = profileOptions.removeHiddenElements;\n\tremovedElementsSelectorInput.value = profileOptions.removedElementsSelector;\n\tremoveUnusedStylesInput.checked = profileOptions.removeUnusedStyles;\n\tremoveUnusedFontsInput.checked = profileOptions.removeUnusedFonts;\n\tremoveFramesInput.checked = profileOptions.removeFrames;\n\tblockScriptsInput.checked = profileOptions.blockScripts;\n\tblockVideosInput.checked = profileOptions.blockVideos;\n\tblockAudiosInput.checked = profileOptions.blockAudios;\n\tblockFontsInput.checked = profileOptions.blockFonts;\n\tblockStylesheetsInput.checked = profileOptions.blockStylesheets;\n\tblockImagesInput.checked = profileOptions.blockImages;\n\tacceptHeaderDocumentInput.value = profileOptions.acceptHeaders.document;\n\tacceptHeaderScriptInput.value = profileOptions.acceptHeaders.script;\n\tacceptHeaderAudioInput.value = profileOptions.acceptHeaders.audio;\n\tacceptHeaderVideoInput.value = profileOptions.acceptHeaders.video;\n\tacceptHeaderFontInput.value = profileOptions.acceptHeaders.font;\n\tacceptHeaderStylesheetInput.value = profileOptions.acceptHeaders.stylesheet;\n\tacceptHeaderImageInput.value = profileOptions.acceptHeaders.image;\n\tsaveRawPageInput.checked = profileOptions.saveRawPage;\n\tinsertMetaCSPInput.checked = profileOptions.insertMetaCSP;\n\tsaveToClipboardInput.checked = profileOptions.saveToClipboard;\n\taddProofInput.checked = profileOptions.addProof;\n\twoleetKeyInput.value = profileOptions.woleetKey;\n\twoleetKeyInput.disabled = !profileOptions.addProof;\n\tsaveToGDriveInput.checked = profileOptions.saveToGDrive;\n\tsaveToDropboxInput.checked = profileOptions.saveToDropbox;\n\tsaveWithWebDAVInput.checked = profileOptions.saveWithWebDAV;\n\twebDAVURLInput.value = profileOptions.webDAVURL;\n\twebDAVURLInput.disabled = !profileOptions.saveWithWebDAV;\n\twebDAVUserInput.value = profileOptions.webDAVUser;\n\twebDAVUserInput.disabled = !profileOptions.saveWithWebDAV;\n\twebDAVPasswordInput.value = profileOptions.webDAVPassword;\n\twebDAVPasswordInput.disabled = !profileOptions.saveWithWebDAV;\n\tsaveWithMCPInput.checked = profileOptions.saveWithMCP;\n\tmcpServerUrlInput.value = profileOptions.mcpServerUrl;\n\tmcpServerUrlInput.disabled = !profileOptions.saveWithMCP;\n\tmcpAuthTokenInput.value = profileOptions.mcpAuthToken;\n\tmcpAuthTokenInput.disabled = !profileOptions.saveWithMCP;\n\tsaveToGitHubInput.checked = profileOptions.saveToGitHub;\n\tgithubTokenInput.value = profileOptions.githubToken;\n\tgithubTokenInput.disabled = !profileOptions.saveToGitHub;\n\tgithubUserInput.value = profileOptions.githubUser;\n\tgithubUserInput.disabled = !profileOptions.saveToGitHub;\n\tgithubRepositoryInput.value = profileOptions.githubRepository;\n\tgithubRepositoryInput.disabled = !profileOptions.saveToGitHub;\n\tgithubBranchInput.value = profileOptions.githubBranch;\n\tgithubBranchInput.disabled = !profileOptions.saveToGitHub;\n\tsaveWithCompanionInput.checked = profileOptions.saveWithCompanion;\n\tsaveToRestFormApiInput.checked = profileOptions.saveToRestFormApi;\n\tsaveToRestFormApiUrlInput.value = profileOptions.saveToRestFormApiUrl;\n\tsaveToRestFormApiUrlInput.disabled = !profileOptions.saveToRestFormApi;\n\tsaveToRestFormApiTokenInput.value = profileOptions.saveToRestFormApiToken;\n\tsaveToRestFormApiTokenInput.disabled = !profileOptions.saveToRestFormApi;\n\tsaveToRestFormApiFileFieldNameInput.value = profileOptions.saveToRestFormApiFileFieldName;\n\tsaveToRestFormApiFileFieldNameInput.disabled = !profileOptions.saveToRestFormApi;\n\tsaveToRestFormApiUrlFieldNameInput.value = profileOptions.saveToRestFormApiUrlFieldName;\n\tsaveToRestFormApiUrlFieldNameInput.disabled = !profileOptions.saveToRestFormApi;\n\tsaveToS3Input.checked = profileOptions.saveToS3;\n\tS3DomainInput.value = profileOptions.S3Domain;\n\tS3DomainInput.disabled = !profileOptions.saveToS3;\n\tS3RegionInput.value = profileOptions.S3Region;\n\tS3RegionInput.disabled = !profileOptions.saveToS3;\n\tS3BucketInput.value = profileOptions.S3Bucket;\n\tS3BucketInput.disabled = !profileOptions.saveToS3;\n\tS3AccessKeyInput.value = profileOptions.S3AccessKey;\n\tS3AccessKeyInput.disabled = !profileOptions.saveToS3;\n\tS3SecretKeyInput.value = profileOptions.S3SecretKey;\n\tS3SecretKeyInput.disabled = !profileOptions.saveToS3;\n\tsharePageInput.checked = profileOptions.sharePage;\n\tsaveToFilesystemInput.checked = !profileOptions.saveToGDrive && !profileOptions.saveToGitHub && !profileOptions.saveToS3 && !profileOptions.saveWithCompanion && !profileOptions.saveToClipboard && !profileOptions.saveWithWebDAV && !profileOptions.saveWithMCP && !profileOptions.saveToDropbox && !profileOptions.saveToRestFormApi && !profileOptions.sharePage;\n\tcompressHTMLInput.checked = profileOptions.compressHTML;\n\tcompressCSSInput.checked = profileOptions.compressCSS;\n\tgroupDuplicateStylesheetsInput.checked = profileOptions.groupDuplicateStylesheets;\n\tmoveStylesInHeadInput.checked = profileOptions.moveStylesInHead;\n\tloadDeferredImagesInput.checked = profileOptions.loadDeferredImages;\n\tloadDeferredImagesMaxIdleTimeInput.value = profileOptions.loadDeferredImagesMaxIdleTime;\n\tloadDeferredImagesKeepZoomLevelInput.checked = profileOptions.loadDeferredImagesKeepZoomLevel;\n\tloadDeferredImagesKeepZoomLevelInput.disabled = !profileOptions.loadDeferredImages;\n\tloadDeferredImagesMaxIdleTimeInput.disabled = !profileOptions.loadDeferredImages;\n\tloadDeferredImagesDispatchScrollEventInput.checked = profileOptions.loadDeferredImagesDispatchScrollEvent;\n\tloadDeferredImagesDispatchScrollEventInput.disabled = !profileOptions.loadDeferredImages;\n\tloadDeferredImagesBeforeFramesInput.checked = profileOptions.loadDeferredImagesBeforeFrames;\n\tloadDeferredImagesBeforeFramesInput.disabled = !profileOptions.loadDeferredImages;\n\tcontextMenuEnabledInput.checked = profileOptions.contextMenuEnabled;\n\tfilenameTemplateInput.value = profileOptions.filenameTemplate;\n\tfilenameMaxLengthInput.value = profileOptions.filenameMaxLength;\n\tfilenameMaxLengthUnitInput.value = profileOptions.filenameMaxLengthUnit;\n\tfilenameReplacementCharacterInput.value = profileOptions.filenameReplacementCharacter;\n\treplaceEmojisInFilenameInput.checked = profileOptions.replaceEmojisInFilename;\n\tsaveFilenameTemplateDataInput.checked = profileOptions.saveFilenameTemplateData;\n\tshadowEnabledInput.checked = profileOptions.shadowEnabled;\n\tmaxResourceSizeEnabledInput.checked = profileOptions.maxResourceSizeEnabled;\n\tmaxResourceSizeInput.value = profileOptions.maxResourceSizeEnabled ? profileOptions.maxResourceSize : 10;\n\tmaxResourceSizeInput.disabled = !profileOptions.maxResourceSizeEnabled;\n\tmaxResourceDelayEnabledInput.checked = Boolean(profileOptions.networkTimeout);\n\tmaxResourceDelayInput.value = profileOptions.networkTimeout ? profileOptions.networkTimeout / 1000 : 60;\n\tmaxResourceDelayInput.disabled = !profileOptions.networkTimeout;\n\tconfirmFilenameInput.checked = profileOptions.confirmFilename;\n\tfilenameConflictActionInput.value = profileOptions.filenameConflictAction;\n\tdisplayInfobarInput.checked = profileOptions.displayInfobar;\n\tdisplayStatsInput.checked = profileOptions.displayStats;\n\tbackgroundSaveInput.checked = profileOptions.backgroundSave;\n\tautoSaveDelayInput.value = profileOptions.autoSaveDelay;\n\tautoSaveLoadInput.checked = !profileOptions.autoSaveLoadOrUnload && profileOptions.autoSaveLoad;\n\tautoSaveLoadOrUnloadInput.checked = profileOptions.autoSaveLoadOrUnload;\n\tautoSaveUnloadInput.checked = !profileOptions.autoSaveLoadOrUnload && profileOptions.autoSaveUnload;\n\tautoSaveLoadInput.disabled = profileOptions.autoSaveLoadOrUnload;\n\tautoSaveUnloadInput.disabled = profileOptions.autoSaveLoadOrUnload;\n\tautoSaveDiscardInput.checked = profileOptions.autoSaveDiscard;\n\tautoSaveRemoveInput.checked = profileOptions.autoSaveRemove;\n\tautoSaveRepeatInput.checked = profileOptions.autoSaveRepeat;\n\tautoSaveRepeatDelayInput.value = profileOptions.autoSaveRepeatDelay;\n\tautoSaveRepeatDelayInput.disabled = !profileOptions.autoSaveRepeat;\n\tautoSaveExternalSaveInput.checked = profileOptions.autoSaveExternalSave;\n\tautoSaveExternalSaveInput.parentElement.hidden = !companionState.enabled;\n\tremoveAlternativeFontsInput.checked = profileOptions.removeAlternativeFonts;\n\tremoveAlternativeImagesInput.checked = profileOptions.removeAlternativeImages;\n\tgroupDuplicateImagesInput.checked = profileOptions.groupDuplicateImages;\n\timageReductionFactorInput.value = profileOptions.imageReductionFactor;\n\tcustomShortcutInput.value = profileOptions.customShortcut || \"\";\n\tremoveAlternativeMediasInput.checked = profileOptions.removeAlternativeMedias;\n\tsaveCreatedBookmarksInput.checked = profileOptions.saveCreatedBookmarks;\n\tpassReferrerOnErrorInput.checked = profileOptions.passReferrerOnError;\n\treplaceBookmarkURLInput.checked = profileOptions.replaceBookmarkURL;\n\treplaceBookmarkURLInput.disabled = !profileOptions.saveCreatedBookmarks;\n\tallowedBookmarkFoldersInput.value = profileOptions.allowedBookmarkFolders.map(folder => folder.replace(/,/g, \"\\\\,\")).join(\",\");\n\tallowedBookmarkFoldersInput.disabled = !profileOptions.saveCreatedBookmarks;\n\tignoredBookmarkFoldersInput.value = profileOptions.ignoredBookmarkFolders.map(folder => folder.replace(/,/g, \"\\\\,\")).join(\",\");\n\tignoredBookmarkFoldersInput.disabled = !profileOptions.saveCreatedBookmarks;\n\tfileFormatSelectInput.value = profileOptions.compressContent ? profileOptions.selfExtractingArchive ? profileOptions.extractDataFromPage ?\n\t\t\"self-extracting-zip-universal\" : \"self-extracting-zip\" : \"zip\" : \"html\";\n\tcreateRootDirectoryInput.checked = profileOptions.createRootDirectory;\n\tcreateRootDirectoryInput.disabled = !profileOptions.compressContent;\n\tdisableCompressionInput.checked = profileOptions.disableCompression;\n\tdisableCompressionInput.disabled = !profileOptions.compressContent;\n\tpreventAppendedDataInput.checked = profileOptions.preventAppendedData;\n\tpreventAppendedDataInput.disabled = !profileOptions.compressContent && !profileOptions.selfExtractingArchive;\n\tpasswordInput.value = profileOptions.password;\n\tpasswordInput.disabled = !profileOptions.compressContent;\n\tinsertTextBodyInput.checked = profileOptions.insertTextBody;\n\tinsertTextBodyInput.disabled = !profileOptions.compressContent || (!profileOptions.selfExtractingArchive && !profileOptions.extractDataFromPage);\n\tinsertEmbeddedCustomImageInput.checked = profileOptions.insertEmbeddedImage;\n\tinsertEmbeddedCustomImageInput.disabled = !profileOptions.compressContent || (!profileOptions.insertEmbeddedImage && !profileOptions.insertEmbeddedScreenshotImage);\n\tinsertEmbeddedScreenshotImageInput.checked = profileOptions.insertEmbeddedScreenshotImage;\n\tinsertEmbeddedScreenshotImageInput.disabled = !profileOptions.compressContent || (!profileOptions.insertEmbeddedImage && !profileOptions.insertEmbeddedScreenshotImage);\n\tinsertEmbeddedImageInput.checked = profileOptions.compressContent && (profileOptions.insertEmbeddedImage || profileOptions.insertEmbeddedScreenshotImage);\n\tinsertEmbeddedImageInput.disabled = !profileOptions.compressContent;\n\tinfobarTemplateInput.value = profileOptions.infobarTemplate;\n\tblockMixedContentInput.checked = profileOptions.blockMixedContent;\n\tsaveOriginalURLsInput.checked = profileOptions.saveOriginalURLs;\n\tincludeInfobarInput.checked = profileOptions.includeInfobar;\n\topenInfobarInput.checked = profileOptions.openInfobar;\n\tremoveInfobarSavedDateInput.checked = profileOptions.removeSavedDate;\n\tconfirmInfobarInput.checked = profileOptions.confirmInfobarContent;\n\tautoCloseInput.checked = profileOptions.autoClose;\n\topenEditorInput.checked = profileOptions.openEditor;\n\topenSavedPageInput.checked = profileOptions.openSavedPage;\n\tautoOpenEditorInput.checked = profileOptions.autoOpenEditor;\n\tdefaultEditorModeInput.value = profileOptions.defaultEditorMode;\n\tapplySystemThemeInput.checked = profileOptions.applySystemTheme;\n\tcontentWidthInput.value = profileOptions.contentWidth;\n\twarnUnsavedPageInput.checked = profileOptions.warnUnsavedPage;\n\tdisplayInfobarInEditorInput.checked = profileOptions.displayInfobarInEditor;\n}\n\nfunction getProfileText(profileName) {\n\treturn profileName == DEFAULT_PROFILE_NAME ? browser.i18n.getMessage(\"profileDefaultSettings\") : profileName == DISABLED_PROFILE_NAME ? browser.i18n.getMessage(\"profileDisabled\") : profileName;\n}\n\nasync function update() {\n\ttry {\n\t\tawait pendingSave;\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n\tconst selectedProfileName = profileNamesInput.value;\n\tconst selectedCustomShortcut = customShortcutInput.value || null;\n\tif (selectedCustomShortcut) {\n\t\ttry {\n\t\t\tconst config = await browser.runtime.sendMessage({ method: \"config.get\" });\n\t\t\tconst profiles = config.profiles || {};\n\t\t\tawait Promise.all(Object.keys(profiles).map(profileName => {\n\t\t\t\tif (profileName != selectedProfileName && profiles[profileName].customShortcut == selectedCustomShortcut) {\n\t\t\t\t\treturn browser.runtime.sendMessage({\n\t\t\t\t\t\tmethod: \"config.updateProfile\",\n\t\t\t\t\t\tprofileName,\n\t\t\t\t\t\tprofile: Object.assign({}, profiles[profileName], { customShortcut: null })\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn Promise.resolve();\n\t\t\t}));\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t}\n\tpendingSave = browser.runtime.sendMessage({\n\t\tmethod: \"config.updateProfile\",\n\t\tprofileName: selectedProfileName,\n\t\tprofile: {\n\t\t\tremoveHiddenElements: removeHiddenElementsInput.checked,\n\t\t\tremovedElementsSelector: removedElementsSelectorInput.value,\n\t\t\tremoveUnusedStyles: removeUnusedStylesInput.checked,\n\t\t\tremoveUnusedFonts: removeUnusedFontsInput.checked,\n\t\t\tremoveFrames: removeFramesInput.checked,\n\t\t\tblockScripts: blockScriptsInput.checked,\n\t\t\tblockVideos: blockVideosInput.checked,\n\t\t\tblockAudios: blockAudiosInput.checked,\n\t\t\tblockFonts: blockFontsInput.checked,\n\t\t\tblockStylesheets: blockStylesheetsInput.checked,\n\t\t\tblockImages: blockImagesInput.checked,\n\t\t\tacceptHeaders: {\n\t\t\t\tdocument: acceptHeaderDocumentInput.value,\n\t\t\t\tscript: acceptHeaderScriptInput.value,\n\t\t\t\taudio: acceptHeaderAudioInput.value,\n\t\t\t\tvideo: acceptHeaderVideoInput.value,\n\t\t\t\tfont: acceptHeaderFontInput.value,\n\t\t\t\tstylesheet: acceptHeaderStylesheetInput.value,\n\t\t\t\timage: acceptHeaderImageInput.value\n\t\t\t},\n\t\t\tsaveRawPage: saveRawPageInput.checked,\n\t\t\tinsertMetaCSP: insertMetaCSPInput.checked,\n\t\t\tsaveToClipboard: saveToClipboardInput.checked,\n\t\t\taddProof: addProofInput.checked,\n\t\t\twoleetKey: woleetKeyInput.value,\n\t\t\tsaveToGDrive: saveToGDriveInput.checked,\n\t\t\tsaveToDropbox: saveToDropboxInput.checked,\n\t\t\tsaveWithWebDAV: saveWithWebDAVInput.checked,\n\t\t\twebDAVURL: webDAVURLInput.value,\n\t\t\twebDAVUser: webDAVUserInput.value,\n\t\t\twebDAVPassword: webDAVPasswordInput.value,\n\t\t\tsaveWithMCP: saveWithMCPInput.checked,\n\t\t\tmcpServerUrl: mcpServerUrlInput.value,\n\t\t\tmcpAuthToken: mcpAuthTokenInput.value,\n\t\t\tsaveToGitHub: saveToGitHubInput.checked,\n\t\t\tgithubToken: githubTokenInput.value,\n\t\t\tgithubUser: githubUserInput.value,\n\t\t\tgithubRepository: githubRepositoryInput.value,\n\t\t\tgithubBranch: githubBranchInput.value,\n\t\t\tsaveWithCompanion: saveWithCompanionInput.checked,\n\t\t\tsharePage: sharePageInput.checked,\n\t\t\tcompressHTML: compressHTMLInput.checked,\n\t\t\tinsertTextBody: insertTextBodyInput.checked,\n\t\t\tinsertEmbeddedImage: insertEmbeddedCustomImageInput.checked,\n\t\t\tinsertEmbeddedScreenshotImage: insertEmbeddedScreenshotImageInput.checked,\n\t\t\tcompressCSS: compressCSSInput.checked,\n\t\t\tgroupDuplicateStylesheets: groupDuplicateStylesheetsInput.checked,\n\t\t\tmoveStylesInHead: moveStylesInHeadInput.checked,\n\t\t\tloadDeferredImages: loadDeferredImagesInput.checked,\n\t\t\tloadDeferredImagesMaxIdleTime: Math.max(loadDeferredImagesMaxIdleTimeInput.value, 0),\n\t\t\tloadDeferredImagesKeepZoomLevel: loadDeferredImagesKeepZoomLevelInput.checked,\n\t\t\tloadDeferredImagesDispatchScrollEvent: loadDeferredImagesDispatchScrollEventInput.checked,\n\t\t\tloadDeferredImagesBeforeFrames: loadDeferredImagesBeforeFramesInput.checked,\n\t\t\tcontextMenuEnabled: contextMenuEnabledInput.checked,\n\t\t\tfilenameTemplate: filenameTemplateInput.value,\n\t\t\tfilenameMaxLength: filenameMaxLengthInput.value,\n\t\t\tfilenameMaxLengthUnit: filenameMaxLengthUnitInput.value,\n\t\t\tfilenameReplacementCharacter: filenameReplacementCharacterInput.value,\n\t\t\treplaceEmojisInFilename: replaceEmojisInFilenameInput.checked,\n\t\t\tsaveFilenameTemplateData: saveFilenameTemplateDataInput.checked,\n\t\t\tshadowEnabled: shadowEnabledInput.checked,\n\t\t\tmaxResourceSizeEnabled: maxResourceSizeEnabledInput.checked,\n\t\t\tmaxResourceSize: maxResourceSizeEnabledInput.checked ? Math.max(maxResourceSizeInput.value, 0) : 10,\n\t\t\tnetworkTimeout: maxResourceDelayEnabledInput.checked ? Math.max(maxResourceDelayInput.value * 1000, 60) : 0,\n\t\t\tconfirmFilename: confirmFilenameInput.checked,\n\t\t\tfilenameConflictAction: filenameConflictActionInput.value,\n\t\t\tdisplayInfobar: displayInfobarInput.checked,\n\t\t\tdisplayStats: displayStatsInput.checked,\n\t\t\tbackgroundSave: backgroundSaveInput.checked,\n\t\t\tautoSaveDelay: Math.max(autoSaveDelayInput.value, 0),\n\t\t\tautoSaveLoad: autoSaveLoadInput.checked,\n\t\t\tautoSaveUnload: autoSaveUnloadInput.checked,\n\t\t\tautoSaveDiscard: autoSaveDiscardInput.checked,\n\t\t\tautoSaveRemove: autoSaveRemoveInput.checked,\n\t\t\tautoSaveLoadOrUnload: autoSaveLoadOrUnloadInput.checked,\n\t\t\tautoSaveRepeat: autoSaveRepeatInput.checked,\n\t\t\tautoSaveRepeatDelay: Math.max(autoSaveRepeatDelayInput.value, 1),\n\t\t\tautoSaveExternalSave: autoSaveExternalSaveInput.checked,\n\t\t\tremoveAlternativeFonts: removeAlternativeFontsInput.checked,\n\t\t\tremoveAlternativeImages: removeAlternativeImagesInput.checked,\n\t\t\tremoveAlternativeMedias: removeAlternativeMediasInput.checked,\n\t\t\tsaveCreatedBookmarks: saveCreatedBookmarksInput.checked,\n\t\t\tpassReferrerOnError: passReferrerOnErrorInput.checked,\n\t\t\treplaceBookmarkURL: replaceBookmarkURLInput.checked,\n\t\t\tallowedBookmarkFolders: allowedBookmarkFoldersInput.value.replace(/([^\\\\]),/g, \"$1 ,\").split(/[^\\\\],/).map(folder => folder.replace(/\\\\,/g, \",\")),\n\t\t\tignoredBookmarkFolders: ignoredBookmarkFoldersInput.value.replace(/([^\\\\]),/g, \"$1 ,\").split(/[^\\\\],/).map(folder => folder.replace(/\\\\,/g, \",\")),\n\t\t\tcompressContent: fileFormatSelectInput.value.includes(\"zip\"),\n\t\t\tcreateRootDirectory: createRootDirectoryInput.checked,\n\t\t\tdisableCompression: disableCompressionInput.checked,\n\t\t\tpreventAppendedData: preventAppendedDataInput.checked,\n\t\t\tselfExtractingArchive: fileFormatSelectInput.value.includes(\"self-extracting\"),\n\t\t\textractDataFromPage: fileFormatSelectInput.value == \"self-extracting-zip-universal\",\n\t\t\tpassword: passwordInput.value,\n\t\t\tgroupDuplicateImages: groupDuplicateImagesInput.checked,\n\t\t\timageReductionFactor: imageReductionFactorInput.value,\n\t\t\tinfobarTemplate: infobarTemplateInput.value,\n\t\t\tblockMixedContent: blockMixedContentInput.checked,\n\t\t\tsaveOriginalURLs: saveOriginalURLsInput.checked,\n\t\t\tincludeInfobar: includeInfobarInput.checked,\n\t\t\topenInfobar: openInfobarInput.checked,\n\t\t\tremoveSavedDate: removeInfobarSavedDateInput.checked,\n\t\t\tconfirmInfobarContent: confirmInfobarInput.checked,\n\t\t\tautoClose: autoCloseInput.checked,\n\t\t\topenEditor: openEditorInput.checked,\n\t\t\topenSavedPage: openSavedPageInput.checked,\n\t\t\tautoOpenEditor: autoOpenEditorInput.checked,\n\t\t\tdefaultEditorMode: defaultEditorModeInput.value,\n\t\t\tapplySystemTheme: applySystemThemeInput.checked,\n\t\t\tcontentWidth: contentWidthInput.value,\n\t\t\twarnUnsavedPage: warnUnsavedPageInput.checked,\n\t\t\tdisplayInfobarInEditor: displayInfobarInEditorInput.checked,\n\t\t\tsaveToRestFormApi: saveToRestFormApiInput.checked,\n\t\t\tsaveToRestFormApiUrl: saveToRestFormApiUrlInput.value,\n\t\t\tsaveToRestFormApiToken: saveToRestFormApiTokenInput.value,\n\t\t\tsaveToRestFormApiFileFieldName: saveToRestFormApiFileFieldNameInput.value,\n\t\t\tsaveToRestFormApiUrlFieldName: saveToRestFormApiUrlFieldNameInput.value,\n\t\t\tsaveToS3: saveToS3Input.checked,\n\t\t\tS3Domain: S3DomainInput.value,\n\t\t\tS3Region: S3RegionInput.value,\n\t\t\tS3Bucket: S3BucketInput.value,\n\t\t\tS3AccessKey: S3AccessKeyInput.value,\n\t\t\tS3SecretKey: S3SecretKeyInput.value,\n\t\t\tcustomShortcut: selectedCustomShortcut\n\t\t}\n\t});\n\ttry {\n\t\tawait pendingSave;\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nasync function refreshExternalComponents() {\n\ttry {\n\t\tawait browser.runtime.sendMessage({ method: \"ui.refreshMenu\" });\n\t\tif (sidePanelDisplay) {\n\t\t\tawait browser.runtime.sendMessage({ method: \"options.refresh\", profileName: profileNamesInput.value });\n\t\t} else {\n\t\t\tawait browser.runtime.sendMessage({ method: \"options.refreshPanel\", profileName: profileNamesInput.value });\n\t\t}\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nasync function saveCreatedBookmarks() {\n\tif (saveCreatedBookmarksInput.checked) {\n\t\tsaveCreatedBookmarksInput.checked = false;\n\t\ttry {\n\t\t\tconst permissionGranted = await browser.permissions.request({ permissions: [\"bookmarks\"] });\n\t\t\tif (permissionGranted) {\n\t\t\t\tsaveCreatedBookmarksInput.checked = true;\n\t\t\t\tawait update();\n\t\t\t\tawait refresh();\n\t\t\t\tawait browser.runtime.sendMessage({ method: \"bookmarks.saveCreatedBookmarks\" });\n\t\t\t} else {\n\t\t\t\tawait disableOption();\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\tsaveCreatedBookmarksInput.checked = false;\n\t\t\tawait disableOption();\n\t\t}\n\t} else {\n\t\ttry {\n\t\t\tawait browser.permissions.remove({ permissions: [\"bookmarks\"] });\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\t// ignored\n\t\t}\n\t\tawait disableOption();\n\t}\n\n\tasync function disableOption() {\n\t\tawait update();\n\t\tawait refresh();\n\t\tawait browser.runtime.sendMessage({ method: \"bookmarks.disable\" });\n\t}\n}\n\nasync function onClickSaveToClipboard() {\n\tif (saveToClipboardInput.checked) {\n\t\tsaveToClipboardInput.checked = false;\n\t\ttry {\n\t\t\tconst permissionGranted = await browser.permissions.request({ permissions: [\"clipboardWrite\"] });\n\t\t\tif (permissionGranted) {\n\t\t\t\tsaveToClipboardInput.checked = true;\n\t\t\t\tawait browser.runtime.sendMessage({ method: \"downloads.disableGDrive\" });\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\tsaveToClipboardInput.checked = false;\n\t\t}\n\t}\n\tawait update();\n\tawait refresh();\n}\n\nasync function onClickSaveToGDrive() {\n\tif (saveToGDriveInput.checked) {\n\t\tsaveToGDriveInput.checked = false;\n\t\ttry {\n\t\t\tif (requestPermissionIdentity) {\n\t\t\t\tconst permissionGranted = await browser.permissions.request({ permissions: [\"identity\"] });\n\t\t\t\tif (permissionGranted) {\n\t\t\t\t\tsaveToGDriveInput.checked = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsaveToGDriveInput.checked = true;\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\tsaveToGDriveInput.checked = false;\n\t\t\tawait browser.runtime.sendMessage({ method: \"downloads.disableGDrive\" });\n\t\t}\n\t}\n\tawait update();\n\tawait refresh();\n}\n\nasync function disableDestinationPermissions(permissions, disableGDrive = true, disableDropbox = true) {\n\tif (disableGDrive) {\n\t\tawait browser.runtime.sendMessage({ method: \"downloads.disableGDrive\" });\n\t}\n\tif (disableDropbox) {\n\t\tawait browser.runtime.sendMessage({ method: \"downloads.disableDropbox\" });\n\t}\n\ttry {\n\t\tawait browser.permissions.remove({ permissions });\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t//ignored\n\t}\n}\n\nasync function enableExternalSave(input) {\n\tif (input.checked) {\n\t\tinput.checked = false;\n\t\ttry {\n\t\t\tconst permissionGranted = await browser.permissions.request({ permissions: [\"nativeMessaging\"] });\n\t\t\tif (permissionGranted) {\n\t\t\t\tinput.checked = true;\n\t\t\t\tawait refreshOption();\n\t\t\t\tif (window.chrome) {\n\t\t\t\t\twindow.chrome.runtime.reload();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tawait refreshOption();\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\tinput.checked = true;\n\t\t\tawait refreshOption();\n\t\t}\n\t} else {\n\t\tawait refreshOption();\n\t}\n\n\tasync function refreshOption() {\n\t\tawait update();\n\t\tawait refresh();\n\t}\n}\n\nasync function confirm(message, positionY) {\n\tdocument.getElementById(\"confirmLabel\").textContent = message;\n\tdocument.getElementById(\"formConfirmContainer\").style.setProperty(\"display\", \"flex\");\n\tdocument.querySelector(\"#formConfirmContainer .popup-content\").style.setProperty(\"margin-top\", positionY + \"px\");\n\tconfirmButton.focus();\n\tdocument.body.style.setProperty(\"overflow-y\", \"hidden\");\n\treturn new Promise(resolve => {\n\t\tconfirmButton.onclick = event => hideAndResolve(event, true);\n\t\tcancelButton.onclick = event => hideAndResolve(event);\n\t\twindow.onkeyup = event => {\n\t\t\tif (event.key == \"Escape\") {\n\t\t\t\thideAndResolve(event);\n\t\t\t}\n\t\t};\n\n\t\tfunction hideAndResolve(event, value) {\n\t\t\tevent.preventDefault();\n\t\t\tdocument.getElementById(\"formConfirmContainer\").style.setProperty(\"display\", \"none\");\n\t\t\tdocument.body.style.setProperty(\"overflow-y\", \"\");\n\t\t\tresolve(value);\n\t\t}\n\t});\n}\n\nasync function reset(positionY) {\n\tdocument.getElementById(\"formResetContainer\").style.setProperty(\"display\", \"flex\");\n\tdocument.querySelector(\"#formResetContainer .popup-content\").style.setProperty(\"margin-top\", positionY + \"px\");\n\tresetCancelButton.focus();\n\tdocument.body.style.setProperty(\"overflow-y\", \"hidden\");\n\treturn new Promise(resolve => {\n\t\tresetAllButton.onclick = event => hideAndResolve(event, \"all\");\n\t\tresetCurrentButton.onclick = event => hideAndResolve(event, \"current\");\n\t\tresetCancelButton.onclick = event => hideAndResolve(event);\n\t\twindow.onkeyup = event => {\n\t\t\tif (event.key == \"Escape\") {\n\t\t\t\thideAndResolve(event);\n\t\t\t}\n\t\t};\n\n\t\tfunction hideAndResolve(event, value) {\n\t\t\tevent.preventDefault();\n\t\t\tdocument.getElementById(\"formResetContainer\").style.setProperty(\"display\", \"none\");\n\t\t\tdocument.body.style.setProperty(\"overflow-y\", \"\");\n\t\t\tresolve(value);\n\t\t}\n\t});\n}\n\nasync function prompt(message, positionY, defaultValue = \"\") {\n\tdocument.getElementById(\"promptLabel\").textContent = message;\n\tdocument.getElementById(\"formPromptContainer\").style.setProperty(\"display\", \"flex\");\n\tdocument.querySelector(\"#formPromptContainer .popup-content\").style.setProperty(\"margin-top\", positionY + \"px\");\n\tpromptInput.value = defaultValue;\n\tpromptInput.focus();\n\tdocument.body.style.setProperty(\"overflow-y\", \"hidden\");\n\treturn new Promise(resolve => {\n\t\tpromptConfirmButton.onclick = event => hideAndResolve(event, promptInput.value);\n\t\tpromptCancelButton.onclick = event => hideAndResolve(event);\n\t\twindow.onkeyup = event => {\n\t\t\tif (event.key == \"Escape\") {\n\t\t\t\thideAndResolve(event);\n\t\t\t}\n\t\t};\n\n\t\tfunction hideAndResolve(event, value) {\n\t\t\tevent.preventDefault();\n\t\t\tdocument.getElementById(\"formPromptContainer\").style.setProperty(\"display\", \"none\");\n\t\t\tdocument.body.style.setProperty(\"overflow-y\", \"\");\n\t\t\tresolve(value);\n\t\t}\n\t});\n}\n\nasync function getHelpContents() {\n\tconst helpPageURL = await getHelpPageURL();\n\thelpLabel.href = helpPageURL;\n\tconst helpPage = await fetch(helpPageURL);\n\tconst content = new TextDecoder().decode(await helpPage.arrayBuffer());\n\tconst doc = (new DOMParser()).parseFromString(content, \"text/html\");\n\tconst items = doc.querySelectorAll(\"[data-options-label]\");\n\titems.forEach(itemElement => {\n\t\tconst optionLabel = document.getElementById(itemElement.dataset.optionsLabel);\n\t\tif (optionLabel) {\n\t\t\tconst helpIconWrapper = document.createElement(\"span\");\n\t\t\tconst helpIconContainer = document.createElement(\"span\");\n\t\t\tconst helpIcon = document.createElement(\"img\");\n\t\t\thelpIcon.src = HELP_ICON_URL;\n\t\t\thelpIconWrapper.className = \"help-icon-wrapper\";\n\t\t\tconst labelWords = optionLabel.textContent.split(/\\s+/);\n\t\t\tif (labelWords.length > 1) {\n\t\t\t\thelpIconWrapper.textContent = labelWords.pop();\n\t\t\t\toptionLabel.textContent = labelWords.join(\" \") + \" \";\n\t\t\t}\n\t\t\thelpIconContainer.className = \"help-icon\";\n\t\t\thelpIconContainer.onclick = () => {\n\t\t\t\thelpContent.hidden = !helpContent.hidden;\n\t\t\t\treturn false;\n\t\t\t};\n\t\t\thelpIcon.tabIndex = 0;\n\t\t\thelpIconContainer.onkeyup = event => {\n\t\t\t\tif (event.code == \"Enter\") {\n\t\t\t\t\thelpContent.hidden = !helpContent.hidden;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\thelpIconContainer.appendChild(helpIcon);\n\t\t\thelpIconWrapper.appendChild(helpIconContainer);\n\t\t\toptionLabel.appendChild(helpIconWrapper);\n\t\t\tconst helpContent = document.createElement(\"div\");\n\t\t\thelpContent.hidden = true;\n\t\t\thelpContent.className = \"help-content\";\n\t\t\titemElement.childNodes.forEach(node => {\n\t\t\t\tif (node instanceof HTMLElement && node.className != \"option\") {\n\t\t\t\t\thelpContent.appendChild(document.importNode(node, true));\n\t\t\t\t}\n\t\t\t});\n\t\t\thelpContent.querySelectorAll(\"a[href]\").forEach(linkElement => {\n\t\t\t\tconst hrefValue = linkElement.getAttribute(\"href\");\n\t\t\t\tif (hrefValue.startsWith(\"#\")) {\n\t\t\t\t\tlinkElement.href = helpPageURL + hrefValue;\n\t\t\t\t\tlinkElement.target = \"_blank\";\n\t\t\t\t}\n\t\t\t});\n\t\t\toptionLabel.parentElement.insertAdjacentElement(\"afterEnd\", helpContent);\n\t\t}\n\t});\n}\n\nasync function getHelpPageURL() {\n\tconst language = browser.i18n.getUILanguage().replace(/-/g, \"_\");\n\ttry {\n\t\tconst url = browser.runtime.getURL(HELP_PAGE_PATH_PREFIX + \"_\" + language + \".html\");\n\t\tawait (await fetch(url)).arrayBuffer();\n\t\treturn url;\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\ttry {\n\t\t\tconst url = browser.runtime.getURL(HELP_PAGE_PATH_PREFIX + \"_\" + language.split(\"_\")[0] + \".html\");\n\t\t\tawait (await fetch(url)).arrayBuffer();\n\t\t\treturn url;\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tconst url = browser.runtime.getURL(HELP_PAGE_PATH_PREFIX + \"_\" + language.split(\"_\")[1] + \".html\");\n\t\t\t\tawait (await fetch(url)).arrayBuffer();\n\t\t\t\treturn url;\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tcatch (error) {\n\t\t\t\treturn browser.runtime.getURL(HELP_PAGE_PATH_DEFAULT);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction getLocalStorageItem(key) {\n\ttry {\n\t\treturn localStorage.getItem(key);\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nfunction setLocalStorageItem(key, value) {\n\ttry {\n\t\treturn localStorage.setItem(key, value);\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nfunction removeLocalStorageItem(key) {\n\ttry {\n\t\treturn localStorage.removeItem(key);\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n"
  },
  {
    "path": "src/ui/bg/ui-panel.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, document */\n\nimport \"./../../core/bg/page-orphan-hack.js\";\n\nconst optionsTab = document.getElementById(\"tab-options\");\nconst pendingsTab = document.getElementById(\"tab-pendings\");\nconst batchSaveUrlsTab = document.getElementById(\"tab-batch-save-urls\");\nconst viewPanel = document.getElementById(\"view-panel\");\n\noptionsTab.textContent = optionsTab.title = browser.i18n.getMessage(\"optionsTitle\");\npendingsTab.textContent = pendingsTab.title = browser.i18n.getMessage(\"pendingsTitle\");\nbatchSaveUrlsTab.textContent = batchSaveUrlsTab.title = browser.i18n.getMessage(\"batchSaveUrlsTitle\");\n\noptionsTab.onclick = () => {\n\toptionsTab.classList.add(\"tab-selected\");\n\tpendingsTab.classList.remove(\"tab-selected\");\n\tbatchSaveUrlsTab.classList.remove(\"tab-selected\");\n\tviewPanel.src = \"options.html#side-panel\";\n};\npendingsTab.onclick = () => {\n\toptionsTab.classList.remove(\"tab-selected\");\n\tpendingsTab.classList.add(\"tab-selected\");\n\tbatchSaveUrlsTab.classList.remove(\"tab-selected\");\n\tviewPanel.src = \"pendings.html#side-panel\";\n};\nbatchSaveUrlsTab.onclick = () => {\n\toptionsTab.classList.remove(\"tab-selected\");\n\tpendingsTab.classList.remove(\"tab-selected\");\n\tbatchSaveUrlsTab.classList.add(\"tab-selected\");\n\tviewPanel.src = \"batch-save-urls.html#side-panel\";\n};"
  },
  {
    "path": "src/ui/bg/ui-pendings.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, window, document, setInterval, location */\n\nconst URLLabel = document.getElementById(\"URLLabel\");\nconst titleLabel = document.getElementById(\"titleLabel\");\nconst resultsTable = document.getElementById(\"resultsTable\");\nconst cancelAllButton = document.getElementById(\"cancelAllButton\");\nconst addUrlsButton = document.getElementById(\"addUrlsButton\");\ndocument.title = browser.i18n.getMessage(\"pendingsTitle\");\ncancelAllButton.textContent = browser.i18n.getMessage(\"pendingsCancelAllButton\");\naddUrlsButton.textContent = browser.i18n.getMessage(\"pendingsAddUrlsButton\");\nURLLabel.textContent = browser.i18n.getMessage(\"pendingsURLTitle\");\ntitleLabel.textContent = browser.i18n.getMessage(\"pendingsTitleTitle\");\ndocument.getElementById(\"statusLabel\").textContent = browser.i18n.getMessage(\"pendingsStatusTitle\");\nconst statusText = {\n\tpending: browser.i18n.getMessage(\"pendingsPendingStatus\"),\n\tprocessing: browser.i18n.getMessage(\"pendingsProcessingStatus\"),\n\tcancelling: browser.i18n.getMessage(\"pendingsCancellingStatus\")\n};\nconst noPendingsText = browser.i18n.getMessage(\"pendingsNoPendings\");\ncancelAllButton.onclick = async () => {\n\tawait browser.runtime.sendMessage({ method: \"downloads.cancelAll\" });\n\tawait refresh();\n};\naddUrlsButton.onclick = () => window.open(\"batch-save-urls.html\", \"sf-add-urls\");\nif (location.href.endsWith(\"#side-panel\")) {\n\tdocument.documentElement.classList.add(\"side-panel\");\n}\nlet URLDisplayed = true;\ndocument.getElementById(\"URLTitleLabel\").onclick = () => {\n\tURLDisplayed = !URLDisplayed;\n\trefresh(true);\n};\nlet previousState;\nsetInterval(refresh, 1000);\nrefresh();\n\nfunction resetTable() {\n\tresultsTable.innerHTML = \"\";\n}\n\nfunction updateTable(results) {\n\tif (results.length) {\n\t\tresults.sort((taskInfo1, taskInfo2) => taskInfo1.index - taskInfo2.index);\n\t\tresults.forEach((taskInfo) => {\n\t\t\tconst row = document.createElement(\"div\");\n\t\t\tconst cellURL = document.createElement(\"span\");\n\t\t\tconst cellStatus = document.createElement(\"span\");\n\t\t\tconst cellCancel = document.createElement(\"span\");\n\t\t\tconst buttonCancel = document.createElement(\"button\");\n\t\t\trow.className = \"result-row\";\n\t\t\tif (URLDisplayed) {\n\t\t\t\tcellURL.textContent = taskInfo.url;\n\t\t\t} else {\n\t\t\t\tcellURL.textContent = taskInfo.title;\n\t\t\t}\n\t\t\tcellURL.className = \"result-url-title\";\n\t\t\tcellURL.onclick = () => selectTab(taskInfo.tabId);\n\t\t\tif (taskInfo.cancelled) {\n\t\t\t\tcellStatus.textContent = statusText.cancelling;\n\t\t\t} else {\n\t\t\t\tcellStatus.textContent = statusText[taskInfo.status];\n\t\t\t\tbuttonCancel.textContent = \"×\";\n\t\t\t\tbuttonCancel.onclick = () => cancel(taskInfo.id);\n\t\t\t\tcellCancel.appendChild(buttonCancel);\n\t\t\t}\n\t\t\tcellStatus.className = \"result-status\";\n\t\t\tcellCancel.className = \"result-cancel\";\n\t\t\trow.appendChild(cellURL);\n\t\t\trow.appendChild(cellStatus);\n\t\t\trow.appendChild(cellCancel);\n\t\t\tresultsTable.appendChild(row);\n\t\t});\n\t}\n}\n\nasync function cancel(taskId) {\n\tawait browser.runtime.sendMessage({ method: \"downloads.cancel\", taskId });\n\tawait refresh();\n}\n\nasync function selectTab(tabId) {\n\tawait browser.runtime.sendMessage({ method: \"tabs.activate\", tabId });\n\tawait refresh();\n}\n\nasync function refresh(force) {\n\tconst results = await browser.runtime.sendMessage({ method: \"downloads.getInfo\" });\n\tconst currentState = JSON.stringify(results);\n\tif (previousState != currentState || force) {\n\t\tpreviousState = currentState;\n\t\tresetTable();\n\t\tif (URLDisplayed) {\n\t\t\tURLLabel.className = \"\";\n\t\t\ttitleLabel.className = \"unselected\";\n\t\t} else {\n\t\t\tURLLabel.className = \"unselected\";\n\t\t\ttitleLabel.className = \"\";\n\t\t}\n\t\tupdateTable(results);\n\t\tif (!results.length) {\n\t\t\tconst row = document.createElement(\"div\");\n\t\t\trow.className = \"result-row\";\n\t\t\tconst cell = document.createElement(\"span\");\n\t\t\tcell.colSpan = 3;\n\t\t\tcell.className = \"no-result\";\n\t\t\tcell.textContent = noPendingsText;\n\t\t\trow.appendChild(cell);\n\t\t\tresultsTable.appendChild(row);\n\t\t}\n\t}\n\tcancelAllButton.disabled = !results.length;\n}"
  },
  {
    "path": "src/ui/bg/ui-viewer.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global document, location, singlefile, fetch, URLSearchParams, prompt */\n\nimport * as zip from \"../../../lib/single-file-zip.js\";\n\nglobalThis.zip = zip;\nglobalThis.onload = async () => {\n\tconst params = new URLSearchParams(location.search);\n\tconst blobURI = params.get(\"blobURI\");\n\tif (blobURI.startsWith(\"blob:\")) {\n\t\tconst compressed = params.has(\"compressed\");\n\t\tconst response = await fetch(blobURI);\n\t\tif (compressed) {\n\t\t\tconst blob = await response.blob();\n\t\t\tconst { docContent } = await singlefile.helper.extract(blob, { prompt });\n\t\t\tawait singlefile.helper.display(document, docContent);\n\t\t} else {\n\t\t\tconst text = await response.text();\n\t\t\tdocument.write(text);\n\t\t\tdocument.close();\n\t\t}\n\t}\n};"
  },
  {
    "path": "src/ui/common/common-content-ui.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global document, getComputedStyle, FileReader, Image, OffscreenCanvas, createImageBitmap */\n\nconst singlefile = globalThis.singlefile;\n\nconst CLOSE_ICON = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSlUqHewg4hChOogFURFHqWIRLJS2QqsOJpf+CE0akhQXR8G14ODPYtXBxVlXB1dBEPwBcXNzUnSREr9LCi1ivOO4h/e+9+XuO0Col5lqdowDqmYZqXhMzOZWxMAruhGiOYohiZl6Ir2Qgef4uoeP73dRnuVd9+foVfImA3wi8SzTDYt4nXh609I57xOHWUlSiM+Jxwy6IPEj12WX3zgXHRZ4ZtjIpOaIw8RisY3lNmYlQyWeIo4oqkb5QtZlhfMWZ7VcZc178hcG89pymuu0BhHHIhJIQoSMKjZQhoUo7RopJlJ0HvPwDzj+JLlkcm2AkWMeFaiQHD/4H/zurVmYnHCTgjGg88W2P4aBwC7QqNn297FtN04A/zNwpbX8lTow80l6raVFjoDQNnBx3dLkPeByB+h/0iVDciQ/LaFQAN7P6JtyQN8t0LPq9q15jtMHIEO9WroBDg6BkSJlr3m8u6u9b//WNPv3A6mTcr3f/E/sAAAABmJLR0QAigCKAIrj2uckAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QkPDysvCdPVuwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAELSURBVHja7ZpLFsIwDAPj3v/OsGHDe1BIa8tKO7Mnlkw+dpoxAAAAAGCfx4ur6Yx/B337UUS4mp/VuWUEcjSfOgO+BXCZCWe0hSqQo/npBLglIUNLdAV2MH84Ad1JyIwdLkK6YoabIHWscBWmihHuAqvHtv+XqmdXOK9TxdKy3axUm2vZkXXGgPJksTuz1bVFeeU2Y6ijsLIpXbtKa1kDs2ews69o7+A+ihJ2lvI+/lcS1G21zUVG18XKNm4OS4BNkGOQQohSmGaIdpgLESvzyiRwKepsXjE2H0ZWMF8Zi4+jK5mviM0DiRXNZ2rhkdTK5jO0xermz2o8dCnq+FS2XNNVH0sDAAAA3JYnre9cH8BZmhEAAAAASUVORK5CYII=\";\n\nconst SINGLE_FILE_UI_ELEMENT_CLASS = singlefile.helper.SINGLE_FILE_UI_ELEMENT_CLASS;\nconst ERROR_BAR_TAGNAME = \"singlefile-error-bar\";\nconst OPEN_FILE_BAR_TAGNAME = \"singlefile-open-file-bar\";\nconst SHARE_PAGE_BAR_TAGNAME = \"singlefile-share-page-bar\";\nlet EMBEDDED_IMAGE_BUTTON_MESSAGE, SHARE_PAGE_BUTTON_MESSAGE, SHARE_SELECTION_BUTTON_MESSAGE, ERROR_TITLE_MESSAGE;\n\nconst CSS_PROPERTIES = new Set(Array.from(getComputedStyle(document.documentElement)));\n\nexport {\n\tsetLabels,\n\topenFile,\n\tgetOpenFileBar,\n\tgetSharePageBar,\n\tonError\n};\n\nfunction setLabels(labels) {\n\t({ EMBEDDED_IMAGE_BUTTON_MESSAGE, SHARE_PAGE_BUTTON_MESSAGE, SHARE_SELECTION_BUTTON_MESSAGE, ERROR_TITLE_MESSAGE } = labels);\n}\n\nfunction onError(message, link) {\n\tconsole.error(\"SingleFile\", message, link); // eslint-disable-line no-console\n\tdisplayBar(ERROR_BAR_TAGNAME, ERROR_TITLE_MESSAGE + message, { link });\n}\n\nfunction getOpenFileBar() {\n\tlet resolvePromise;\n\treturn {\n\t\tdisplay: async function () {\n\t\t\treturn new Promise(resolve => {\n\t\t\t\tresolvePromise = resolve;\n\t\t\t\tdisplayBar(OPEN_FILE_BAR_TAGNAME, \"\", { buttonLabel: EMBEDDED_IMAGE_BUTTON_MESSAGE, buttonOnclick: resolve });\n\t\t\t});\n\t\t},\n\t\thide: function () {\n\t\t\tconst barElement = document.querySelector(OPEN_FILE_BAR_TAGNAME);\n\t\t\tif (barElement) {\n\t\t\t\tbarElement.remove();\n\t\t\t}\n\t\t},\n\t\tcancel: function () {\n\t\t\tthis.hide();\n\t\t\tif (resolvePromise) {\n\t\t\t\tresolvePromise(true);\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction getSharePageBar() {\n\tlet resolvePromise;\n\treturn {\n\t\tdisplay: async function (selectedContent) {\n\t\t\treturn new Promise(resolve => {\n\t\t\t\tresolvePromise = resolve;\n\t\t\t\tdisplayBar(SHARE_PAGE_BAR_TAGNAME, \"\", {\n\t\t\t\t\tbuttonLabel: selectedContent ? SHARE_SELECTION_BUTTON_MESSAGE : SHARE_PAGE_BUTTON_MESSAGE,\n\t\t\t\t\tbuttonOnclick: resolve\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\t\thide: function () {\n\t\t\tconst barElement = document.querySelector(SHARE_PAGE_BAR_TAGNAME);\n\t\t\tif (barElement) {\n\t\t\t\tbarElement.remove();\n\t\t\t}\n\t\t},\n\t\tcancel: function () {\n\t\t\tthis.hide();\n\t\t\tif (resolvePromise) {\n\t\t\t\tresolvePromise(true);\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction openFile({ accept } = { accept: \"image/*\" }) {\n\tconst inputElement = document.createElement(\"input\");\n\tinputElement.type = \"file\";\n\tinputElement.accept = accept;\n\tinputElement.click();\n\treturn new Promise(resolve => {\n\t\tinputElement.addEventListener(\"change\", async event => {\n\t\t\tif (event.target.files.length) {\n\t\t\t\tconst file = event.target.files[0];\n\t\t\t\tlet mimeType = file.type;\n\t\t\t\tif (mimeType == \"image/png\") {\n\t\t\t\t\tconst fileReader = new FileReader();\n\t\t\t\t\tfileReader.addEventListener(\"load\", async () => resolve(new Uint8Array(fileReader.result)));\n\t\t\t\t\tfileReader.addEventListener(\"error\", () => resolve());\n\t\t\t\t\tfileReader.readAsArrayBuffer(file);\n\t\t\t\t} else {\n\t\t\t\t\tconst dataURI = await new Promise(resolve => {\n\t\t\t\t\t\tconst fileReader = new FileReader();\n\t\t\t\t\t\tfileReader.addEventListener(\"load\", () => resolve(fileReader.result));\n\t\t\t\t\t\tfileReader.addEventListener(\"error\", () => resolve());\n\t\t\t\t\t\tfileReader.readAsDataURL(file);\n\t\t\t\t\t});\n\t\t\t\t\tif (dataURI) {\n\t\t\t\t\t\tconst imageBitmap = await createImageBitmap(file);\n\t\t\t\t\t\tconst image = new Image();\n\t\t\t\t\t\timage.src = dataURI;\n\t\t\t\t\t\timage.addEventListener(\"error\", () => resolve());\n\t\t\t\t\t\tawait new Promise(resolve => image.addEventListener(\"load\", resolve));\n\t\t\t\t\t\tconst canvas = new OffscreenCanvas(image.width, image.height);\n\t\t\t\t\t\tconst context = canvas.getContext(\"2d\");\n\t\t\t\t\t\tcontext.drawImage(imageBitmap, 0, 0);\n\t\t\t\t\t\tconst blob = await canvas.convertToBlob({ type: \"image/png\" });\n\t\t\t\t\t\tconst fileReader = new FileReader();\n\t\t\t\t\t\tfileReader.addEventListener(\"load\", () => resolve(new Uint8Array(fileReader.result)));\n\t\t\t\t\t\tfileReader.addEventListener(\"error\", () => resolve());\n\t\t\t\t\t\tfileReader.readAsArrayBuffer(blob);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t\tinputElement.addEventListener(\"cancel\", () => resolve());\n\t});\n}\n\nfunction displayBar(tagName, message, { link, buttonLabel, buttonOnclick } = {}) {\n\ttry {\n\t\tconst barElement = document.querySelector(tagName);\n\t\tif (!barElement) {\n\t\t\tconst barElement = createElement(tagName);\n\t\t\tconst shadowRoot = barElement.attachShadow({ mode: \"open\" });\n\t\t\tconst styleElement = document.createElement(\"style\");\n\t\t\tstyleElement.textContent = `\n\t\t\t\t.container {\n\t\t\t\t\tbackground-color: #ff6c00;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\ttop: 0px;\n\t\t\t\t\tleft: 0px;\n\t\t\t\t\tright: 0px;\n\t\t\t\t\theight: auto;\n\t\t\t\t\twidth: auto;\n\t\t\t\t\tmin-height: 24px;\n\t\t\t\t\tmin-width: 24px;\t\t\t\t\t\n\t\t\t\t\tz-index: 2147483647;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\tpadding: 2px;\n\t\t\t\t\tfont-family: Arial;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar.container, .singlefile-share-page-bar.container {\n\t\t\t\t\tbackground-color: gainsboro;\n\t\t\t\t\tborder-block-end: gray 1px solid;\n\t\t\t\t}\n\t\t\t\t.text {\n\t\t\t\t\tflex: 1;\n\t\t\t\t\tpadding-top: 4px;\n\t\t\t\t\tpadding-bottom: 4px;\n\t\t\t\t\tpadding-left: 8px;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tbutton {\n\t\t\t\t\tbackground-color: grey;\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tborder: 1px solid darkgrey;\n\t\t\t\t\tpadding: 3px;\n\t\t\t\t\tpadding-left: 8px;\n\t\t\t\t\tpadding-right: 8px;\n\t\t\t\t\tborder-radius: 4px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t}\n\t\t\t\t.close-button {\n\t\t\t\t\topacity: .7;\n\t\t\t\t\tpadding-left: 8px;\n\t\t\t\t\tpadding-right: 8px;\n\t\t\t\t\tcursor: pointer;\n\t\t\t\t\ttransition: opacity 250ms;\n\t\t\t\t\theight: 16px;\n\t\t\t\t\tfont-size: .8rem;\n\t\t\t\t\talign-self: center;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar button, .singlefile-share-page-bar button{\n\t\t\t\t\tbackground-color: dimgrey;\n\t\t\t\t}\n\t\t\t\t.singlefile-open-file-bar .close-button, .singlefile-share-page-bar .close-button{\n\t\t\t\t\tfilter: invert(1);\n\t\t\t\t}\n\t\t\t\ta {\n\t\t\t\t\tcolor: #303036;\n\t\t\t\t}\n\t\t\t\t.close-button:hover {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t`;\n\t\t\tshadowRoot.appendChild(styleElement);\n\t\t\tconst containerElement = document.createElement(\"div\");\n\t\t\tcontainerElement.classList.add(tagName);\n\t\t\tcontainerElement.classList.add(\"container\");\n\t\t\tconst textElement = document.createElement(\"span\");\n\t\t\ttextElement.classList.add(\"text\");\n\t\t\tconst content = message.split(\"__DOC_LINK__\");\n\t\t\ttextElement.textContent = content[0];\n\t\t\tif (link && content.length == 2) {\n\t\t\t\tconst linkElement = document.createElement(\"a\");\n\t\t\t\tlinkElement.textContent = link;\n\t\t\t\tlinkElement.href = link;\n\t\t\t\tlinkElement.target = \"_blank\";\n\t\t\t\ttextElement.appendChild(linkElement);\n\t\t\t\ttextElement.appendChild(document.createTextNode(content[1]));\n\t\t\t}\n\t\t\tif (buttonLabel && buttonOnclick) {\n\t\t\t\tconst buttonElement = document.createElement(\"button\");\n\t\t\t\tbuttonElement.textContent = buttonLabel;\n\t\t\t\tbuttonElement.onclick = () => buttonOnclick();\n\t\t\t\ttextElement.appendChild(buttonElement);\n\t\t\t}\n\t\t\tcontainerElement.appendChild(textElement);\n\t\t\tconst closeElement = document.createElement(\"img\");\n\t\t\tcloseElement.classList.add(\"close-button\");\n\t\t\tcontainerElement.appendChild(closeElement);\n\t\t\tshadowRoot.appendChild(containerElement);\n\t\t\tcloseElement.src = CLOSE_ICON;\n\t\t\tcloseElement.onclick = event => {\n\t\t\t\tif (event.button === 0) {\n\t\t\t\t\tif (buttonOnclick) {\n\t\t\t\t\t\tbuttonOnclick(true);\n\t\t\t\t\t}\n\t\t\t\t\tbarElement.remove();\n\t\t\t\t}\n\t\t\t};\n\t\t\tdocument.documentElement.appendChild(barElement);\n\t\t}\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// iignored\n\t}\n}\n\nfunction createElement(tagName, parentElement) {\n\tconst element = document.createElement(tagName);\n\telement.className = SINGLE_FILE_UI_ELEMENT_CLASS;\n\tif (parentElement) {\n\t\tparentElement.appendChild(element);\n\t}\n\tCSS_PROPERTIES.forEach(property => element.style.setProperty(property, \"initial\", \"important\"));\n\treturn element;\n}"
  },
  {
    "path": "src/ui/content/content-ui-editor-web.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global window, document, fetch, DOMParser, getComputedStyle, setTimeout, clearTimeout, NodeFilter, Readability, isProbablyReaderable, matchMedia, TextDecoder, Node, prompt, MutationObserver, FileReader */\n\nimport { setLabels } from \"./../../ui/common/common-content-ui.js\";\nimport { downloadPageForeground } from \"../../core/common/download.js\";\nimport { convert } from \"../../lib/mhtml-to-html/mod.js\";\n\n(globalThis => {\n\n\tconst singlefile = globalThis.singlefile;\n\n\tconst FORBIDDEN_TAG_NAMES = [\"a\", \"area\", \"audio\", \"base\", \"br\", \"col\", \"command\", \"embed\", \"hr\", \"img\", \"iframe\", \"input\", \"keygen\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"video\", \"wbr\"];\n\tconst BUTTON_ANCHOR_URL = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TtaIVETuIOASsThZERRylikWwUNoKrTqYXPohNGlIUlwcBdeCgx+LVQcXZ10dXAVB8APEydFJ0UVK/F9SaBHjwXE/3t173L0DhFqJqWbbOKBqlpGMRcVMdkUMvKIbfQCG0SExU4+nFtLwHF/38PH1LsKzvM/9OXqUnMkAn0g8y3TDIl4nnt60dM77xCFWlBTic+Ixgy5I/Mh12eU3zgWHBZ4ZMtLJOeIQsVhoYbmFWdFQiaeIw4qqUb6QcVnhvMVZLVVY4578hcGctpziOs0hxLCIOBIQIaOCDZRgIUKrRoqJJO1HPfyDjj9BLplcG2DkmEcZKiTHD/4Hv7s185MTblIwCrS/2PbHCBDYBepV2/4+tu36CeB/Bq60pr9cA2Y+Sa82tfAR0LsNXFw3NXkPuNwBBp50yZAcyU9TyOeB9zP6pizQfwt0rbq9NfZx+gCkqaulG+DgEBgtUPaax7s7W3v790yjvx825XKP2aKCdAAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+QLEQA4M3Y7LzIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAACVBMVEUAAAAAAACKioqjwG1pAAAAAXRSTlMAQObYZgAAAAFiS0dEAmYLfGQAAABkSURBVBjThc47CsNADIThWfD0bnSfbdIroP/+V0mhsN5gTNToK0YPaSvnF9B9wGykG54j/2GF1/hauE4E1AOuNxrBdA5KUXIqdiCnqC1zIZ2mFJQzKJ3wesOhcwDM4+fo7cOuD9C4HTQ9HAAQAAAAAElFTkSuQmCC\";\n\tconst BUTTON_CLOSE_URL = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAgMAAAAOFJJnAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TtaIVETuIOASsThZERRylikWwUNoKrTqYXPohNGlIUlwcBdeCgx+LVQcXZ10dXAVB8APEydFJ0UVK/F9SaBHjwXE/3t173L0DhFqJqWbbOKBqlpGMRcVMdkUMvKIbfQCG0SExU4+nFtLwHF/38PH1LsKzvM/9OXqUnMkAn0g8y3TDIl4nnt60dM77xCFWlBTic+Ixgy5I/Mh12eU3zgWHBZ4ZMtLJOeIQsVhoYbmFWdFQiaeIw4qqUb6QcVnhvMVZLVVY4578hcGctpziOs0hxLCIOBIQIaOCDZRgIUKrRoqJJO1HPfyDjj9BLplcG2DkmEcZKiTHD/4Hv7s185MTblIwCrS/2PbHCBDYBepV2/4+tu36CeB/Bq60pr9cA2Y+Sa82tfAR0LsNXFw3NXkPuNwBBp50yZAcyU9TyOeB9zP6pizQfwt0rbq9NfZx+gCkqaulG+DgEBgtUPaax7s7W3v790yjvx825XKP2aKCdAAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+QLEQA6Na1u6IUAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAACVBMVEUAAAAAAACKioqjwG1pAAAAAXRSTlMAQObYZgAAAAFiS0dEAmYLfGQAAABlSURBVBhXTc/BEUQhCAPQ58ES6McSPED/rfwDI7vOMCoJIeGd6CvFgZXiwk47Ia5VUKdrVXcb39kfqxqmTg+I2xJ2tqhVTaGaQjTl7/GgIc/4CL4Vs3RsjLFndcxPnAn4iww8A3yQjRZjti1t6AAAAABJRU5ErkJggg==\";\n\tconst SHADOWROOT_ATTRIBUTE_NAME = \"shadowrootmode\";\n\tconst SCRIPT_TEMPLATE_SHADOW_ROOT = \"data-template-shadow-root\";\n\tconst SCRIPT_OPTIONS = \"data-single-file-options\";\n\tconst NOTE_TAGNAME = \"single-file-note\";\n\tconst NOTE_CLASS = \"note\";\n\tconst NOTE_MASK_CLASS = \"note-mask\";\n\tconst NOTE_HIDDEN_CLASS = \"note-hidden\";\n\tconst NOTE_ANCHORED_CLASS = \"note-anchored\";\n\tconst NOTE_SELECTED_CLASS = \"note-selected\";\n\tconst NOTE_MOVING_CLASS = \"note-moving\";\n\tconst NOTE_MASK_MOVING_CLASS = \"note-mask-moving\";\n\tconst PAGE_MASK_CLASS = \"page-mask\";\n\tconst MASK_CLASS = \"single-file-mask\";\n\tconst PAGE_MASK_CONTAINER_CLASS = \"single-file-page-mask\";\n\tconst HIGHLIGHT_CLASS = \"single-file-highlight\";\n\tconst HIGHLIGHTS_STYLESHEET_CLASS = \"single-file-highlights-stylesheet\";\n\tconst REMOVED_CONTENT_CLASS = \"single-file-removed\";\n\tconst HIGHLIGHT_HIDDEN_CLASS = \"single-file-highlight-hidden\";\n\tconst PAGE_MASK_ACTIVE_CLASS = \"page-mask-active\";\n\tconst CUT_HOVER_CLASS = \"single-file-cut-hover\";\n\tconst CUT_OUTER_HOVER_CLASS = \"single-file-cut-outer-hover\";\n\tconst CUT_SELECTED_CLASS = \"single-file-cut-selected\";\n\tconst CUT_OUTER_SELECTED_CLASS = \"single-file-cut-outer-selected\";\n\tconst CUT_MODE_CLASS = \"single-file-cut-mode\";\n\tconst NOTE_INITIAL_POSITION_X = 20;\n\tconst NOTE_INITIAL_POSITION_Y = 20;\n\tconst NOTE_INITIAL_WIDTH = 150;\n\tconst NOTE_INITIAL_HEIGHT = 150;\n\tconst NOTE_HEADER_HEIGHT = 25;\n\tconst DISABLED_NOSCRIPT_ATTRIBUTE_NAME = \"data-single-file-disabled-noscript\";\n\tconst COMMENT_HEADER = \"Page saved with SingleFile\";\n\tconst COMMENT_HEADER_LEGACY = \"Archive processed by SingleFile\";\n\n\tlet NOTES_WEB_STYLESHEET, MASK_WEB_STYLESHEET, HIGHLIGHTS_WEB_STYLESHEET;\n\tlet selectedNote, anchorElement, maskNoteElement, maskPageElement, highlightSelectionMode, removeHighlightMode, resizingNoteMode, movingNoteMode, highlightColor, collapseNoteTimeout, cuttingOuterMode, cuttingMode, cuttingTouchTarget, cuttingPath, cuttingPathIndex, previousContent;\n\tlet removedElements = [], removedElementIndex = 0, pageResources, pageUrl, pageCompressContent, includeInfobar, openInfobar, infobarPositionAbsolute, infobarPositionTop, infobarPositionBottom, infobarPositionLeft, infobarPositionRight;\n\n\tglobalThis.zip = singlefile.helper.zip;\n\tinitEventListeners();\n\tnew MutationObserver(initEventListeners).observe(document, { childList: true });\n\n\tfunction initEventListeners() {\n\t\twindow.onmessage = async event => {\n\t\t\tconst message = JSON.parse(event.data);\n\t\t\tif (message.method == \"init\") {\n\t\t\t\tawait init(message);\n\t\t\t}\n\t\t\tif (message.method == \"addNote\") {\n\t\t\t\taddNote(message);\n\t\t\t}\n\t\t\tif (message.method == \"displayNotes\") {\n\t\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(noteElement => noteElement.shadowRoot.querySelector(\".\" + NOTE_CLASS).classList.remove(NOTE_HIDDEN_CLASS));\n\t\t\t}\n\t\t\tif (message.method == \"hideNotes\") {\n\t\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(noteElement => noteElement.shadowRoot.querySelector(\".\" + NOTE_CLASS).classList.add(NOTE_HIDDEN_CLASS));\n\t\t\t}\n\t\t\tif (message.method == \"enableHighlight\") {\n\t\t\t\tif (highlightColor) {\n\t\t\t\t\tdocument.documentElement.classList.remove(highlightColor + \"-mode\");\n\t\t\t\t}\n\t\t\t\thighlightColor = message.color;\n\t\t\t\thighlightSelectionMode = true;\n\t\t\t\tdocument.documentElement.classList.add(message.color + \"-mode\");\n\t\t\t}\n\t\t\tif (message.method == \"disableHighlight\") {\n\t\t\t\tdisableHighlight();\n\t\t\t\thighlightSelectionMode = false;\n\t\t\t}\n\t\t\tif (message.method == \"displayHighlights\") {\n\t\t\t\tdocument.querySelectorAll(\".\" + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.remove(HIGHLIGHT_HIDDEN_CLASS));\n\t\t\t}\n\t\t\tif (message.method == \"hideHighlights\") {\n\t\t\t\tdocument.querySelectorAll(\".\" + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.add(HIGHLIGHT_HIDDEN_CLASS));\n\t\t\t}\n\t\t\tif (message.method == \"enableRemoveHighlights\") {\n\t\t\t\tremoveHighlightMode = true;\n\t\t\t\tdocument.documentElement.classList.add(\"single-file-remove-highlights-mode\");\n\t\t\t}\n\t\t\tif (message.method == \"disableRemoveHighlights\") {\n\t\t\t\tremoveHighlightMode = false;\n\t\t\t\tdocument.documentElement.classList.remove(\"single-file-remove-highlights-mode\");\n\t\t\t}\n\t\t\tif (message.method == \"enableEditPage\") {\n\t\t\t\tdocument.body.contentEditable = true;\n\t\t\t\tonUpdate(false);\n\t\t\t}\n\t\t\tif (message.method == \"formatPage\") {\n\t\t\t\tformatPage(!message.applySystemTheme, message.contentWidth);\n\t\t\t}\n\t\t\tif (message.method == \"cancelFormatPage\") {\n\t\t\t\tcancelFormatPage();\n\t\t\t}\n\t\t\tif (message.method == \"disableEditPage\") {\n\t\t\t\tdocument.body.contentEditable = false;\n\t\t\t}\n\t\t\tif (message.method == \"enableCutInnerPage\") {\n\t\t\t\tcuttingMode = true;\n\t\t\t\tdocument.documentElement.classList.add(CUT_MODE_CLASS);\n\t\t\t}\n\t\t\tif (message.method == \"enableCutOuterPage\") {\n\t\t\t\tcuttingOuterMode = true;\n\t\t\t\tdocument.documentElement.classList.add(CUT_MODE_CLASS);\n\t\t\t}\n\t\t\tif (message.method == \"disableCutInnerPage\" || message.method == \"disableCutOuterPage\") {\n\t\t\t\tif (message.method == \"disableCutInnerPage\") {\n\t\t\t\t\tcuttingMode = false;\n\t\t\t\t} else {\n\t\t\t\t\tcuttingOuterMode = false;\n\t\t\t\t}\n\t\t\t\tdocument.documentElement.classList.remove(CUT_MODE_CLASS);\n\t\t\t\tresetSelectedElements();\n\t\t\t\tif (cuttingPath) {\n\t\t\t\t\tunhighlightCutElement();\n\t\t\t\t\tcuttingPath = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (message.method == \"undoCutPage\") {\n\t\t\t\tundoCutPage();\n\t\t\t}\n\t\t\tif (message.method == \"undoAllCutPage\") {\n\t\t\t\twhile (removedElementIndex) {\n\t\t\t\t\tremovedElements[removedElementIndex - 1].forEach(element => element.classList.remove(REMOVED_CONTENT_CLASS));\n\t\t\t\t\tremovedElementIndex--;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (message.method == \"redoCutPage\") {\n\t\t\t\tredoCutPage();\n\t\t\t}\n\t\t\tif (message.method == \"getContent\") {\n\t\t\t\tonUpdate(true);\n\t\t\t\tincludeInfobar = message.includeInfobar;\n\t\t\t\topenInfobar = message.openInfobar;\n\t\t\t\tinfobarPositionAbsolute = message.infobarPositionAbsolute;\n\t\t\t\tinfobarPositionTop = message.infobarPositionTop;\n\t\t\t\tinfobarPositionBottom = message.infobarPositionBottom;\n\t\t\t\tinfobarPositionLeft = message.infobarPositionLeft;\n\t\t\t\tinfobarPositionRight = message.infobarPositionRight;\n\t\t\t\tlet content = getContent(message.compressHTML, message.updatedResources);\n\t\t\t\tlet filename;\n\t\t\t\tconst pageOptions = loadOptionsFromPage(document);\n\t\t\t\tif (pageOptions) {\n\t\t\t\t\tpageOptions.backgroundSave = message.backgroundSave;\n\t\t\t\t\tpageOptions.saveDate = new Date(pageOptions.saveDate);\n\t\t\t\t\tpageOptions.visitDate = new Date(pageOptions.visitDate);\n\t\t\t\t\tfilename = await singlefile.helper.formatFilename(content, document, pageOptions);\n\t\t\t\t}\n\t\t\t\tif (message.sharePage) {\n\t\t\t\t\tsetLabels(message.labels);\n\t\t\t\t}\n\t\t\t\tif (pageCompressContent) {\n\t\t\t\t\tconst viewport = document.head.querySelector(\"meta[name=viewport]\");\n\t\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\t\tmethod: \"setContent\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\tfilename,\n\t\t\t\t\t\ttitle: document.title,\n\t\t\t\t\t\tdoctype: singlefile.helper.getDoctypeString(document),\n\t\t\t\t\t\turl: pageUrl,\n\t\t\t\t\t\tviewport: viewport ? viewport.content : null,\n\t\t\t\t\t\tcompressContent: true,\n\t\t\t\t\t\tforegroundSave: message.foregroundSave,\n\t\t\t\t\t\tsharePage: message.sharePage,\n\t\t\t\t\t\tdocumentHeight: document.documentElement.offsetHeight\n\t\t\t\t\t}), \"*\");\n\t\t\t\t} else {\n\t\t\t\t\tif (message.foregroundSave || message.sharePage) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait downloadPageForeground({\n\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\tfilename: filename || message.filename,\n\t\t\t\t\t\t\t\tmimeType: \"text/html\"\n\t\t\t\t\t\t\t}, { sharePage: message.sharePage });\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.log(error); // eslint-disable-line no-console\n\t\t\t\t\t\t\twindow.parent.postMessage(JSON.stringify({ method: \"onError\", error: error.message }), \"*\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\t\t\tmethod: \"setContent\",\n\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\tfilename,\n\t\t\t\t\t\t\ttitle: document.title,\n\t\t\t\t\t\t\turl: pageUrl\n\t\t\t\t\t\t}), \"*\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (message.method == \"printPage\") {\n\t\t\t\tprintPage();\n\t\t\t}\n\t\t\tif (message.method == \"importMht\") {\n\t\t\t\tlet { content, filename } = message;\n\t\t\t\tconst { data } = await convert(content, { DOMParser: globalThis.DOMParser });\n\t\t\t\tcontent = data;\n\t\t\t\tawait init({ content }, { filename, reset: true, isMHTML: true });\n\t\t\t}\n\t\t\tif (message.method == \"displayInfobar\") {\n\t\t\t\tsinglefile.helper.displayIcon(document, true, {\n\t\t\t\t\topenInfobar: message.openInfobar,\n\t\t\t\t\tinfobarPositionAbsolute: message.infobarPositionAbsolute,\n\t\t\t\t\tinfobarPositionTop: message.infobarPositionTop,\n\t\t\t\t\tinfobarPositionBottom: message.infobarPositionBottom,\n\t\t\t\t\tinfobarPositionLeft: message.infobarPositionLeft,\n\t\t\t\t\tinfobarPositionRight: message.infobarPositionRight\n\t\t\t\t});\n\t\t\t\tconst infobarDoc = document.implementation.createHTMLDocument();\n\t\t\t\tinfobarDoc.body.appendChild(document.querySelector(singlefile.helper.INFOBAR_TAGNAME));\n\t\t\t\tserializeShadowRoots(infobarDoc.body);\n\t\t\t\tconst content = singlefile.helper.serialize(infobarDoc, true);\n\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\tmethod: \"displayInfobar\",\n\t\t\t\t\tcontent\n\t\t\t\t}), \"*\");\n\t\t\t}\n\t\t\tif (message.method == \"download\") {\n\t\t\t\ttry {\n\t\t\t\t\tawait downloadPageForeground({\n\t\t\t\t\t\tcontent: message.content,\n\t\t\t\t\t\tfilename: message.filename,\n\t\t\t\t\t\tmimeType: message.mimeType\n\t\t\t\t\t}, { sharePage: message.sharePage });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.log(error); // eslint-disable-line no-console\n\t\t\t\t\twindow.parent.postMessage(JSON.stringify({ method: \"onError\", error: error.message }), \"*\");\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\twindow.onresize = reflowNotes;\n\t\tdocument.ondragover = event => event.preventDefault();\n\t\tdocument.ondrop = async event => {\n\t\t\tif (event.dataTransfer.files && event.dataTransfer.files[0]) {\n\t\t\t\tconst file = event.dataTransfer.files[0];\n\t\t\t\tevent.preventDefault();\n\t\t\t\tlet content = new TextDecoder().decode(await file.arrayBuffer());\n\t\t\t\tconst compressContent = /<html[^>]* data-sfz[^>]*>/i.test(content);\n\t\t\t\tif (compressContent) {\n\t\t\t\t\tawait init({ content: file, compressContent }, { filename: file.name });\n\t\t\t\t} else {\n\t\t\t\t\tconst isMHTML = /\\.mhtml?$|\\.mht$/i.test(file.name);\n\t\t\t\t\tlet filename = file.name || \"Untitled.html\";\n\t\t\t\t\tfilename = filename.replace(/(\\.mhtml|\\.mht)$/i, \".html\");\n\t\t\t\t\tif (!filename.endsWith(\".html\")) {\n\t\t\t\t\t\tfilename += \".html\";\n\t\t\t\t\t}\n\t\t\t\t\tif (isMHTML) {\n\t\t\t\t\t\tconst { data } = await convert(content, { DOMParser: globalThis.DOMParser });\n\t\t\t\t\t\tcontent = data;\n\t\t\t\t\t}\n\t\t\t\t\tawait init({ content }, { filename, isMHTML });\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tasync function init({ content, password, compressContent }, { filename, reset, isMHTML } = {}) {\n\t\tawait initConstants();\n\t\tif (compressContent) {\n\t\t\tconst zipOptions = {\n\t\t\t\tuseWebWorkers: false\n\t\t\t};\n\t\t\tconst { docContent, origDocContent, resources, url } = await singlefile.helper.extract(content, {\n\t\t\t\tpassword,\n\t\t\t\tprompt,\n\t\t\t\tzipOptions\n\t\t\t});\n\t\t\tpageResources = resources;\n\t\t\tpageUrl = url;\n\t\t\tpageCompressContent = true;\n\t\t\tconst contentDocument = (new DOMParser()).parseFromString(docContent, \"text/html\");\n\t\t\tif (detectSavedPage(contentDocument)) {\n\t\t\t\tconst { saveUrl } = singlefile.helper.extractInfobarData(contentDocument);\n\t\t\t\tpageUrl = saveUrl;\n\t\t\t\tawait singlefile.helper.display(document, docContent, { disableFramePointerEvents: true });\n\t\t\t\tsinglefile.helper.fixInvalidNesting(document);\n\t\t\t\tconst infobarElement = document.querySelector(singlefile.helper.INFOBAR_TAGNAME);\n\t\t\t\tif (infobarElement) {\n\t\t\t\t\tinfobarElement.remove();\n\t\t\t\t}\n\t\t\t\tawait initPage();\n\t\t\t\tlet icon;\n\t\t\t\tconst origContentDocument = (new DOMParser()).parseFromString(origDocContent, \"text/html\");\n\t\t\t\tconst iconElement = origContentDocument.querySelector(\"link[rel*=icon]\");\n\t\t\t\tif (iconElement) {\n\t\t\t\t\tconst iconResource = resources.find(resource => resource.filename == iconElement.getAttribute(\"href\"));\n\t\t\t\t\tif (iconResource && iconResource.content) {\n\t\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\t\treader.readAsDataURL(await (await fetch(iconResource.content)).blob());\n\t\t\t\t\t\ticon = await new Promise((resolve, reject) => {\n\t\t\t\t\t\t\treader.addEventListener(\"load\", () => resolve(reader.result), false);\n\t\t\t\t\t\t\treader.addEventListener(\"error\", reject, false);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\ticon = iconElement.href;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\tmethod: \"onInit\",\n\t\t\t\t\ttitle: document.title,\n\t\t\t\t\ticon,\n\t\t\t\t\tfilename,\n\t\t\t\t\treset,\n\t\t\t\t\tformatPageEnabled: isProbablyReaderable(document)\n\t\t\t\t}), \"*\");\n\t\t\t}\n\t\t} else {\n\t\t\tconst contentDocument = (new DOMParser()).parseFromString(content, \"text/html\");\n\t\t\tif (detectSavedPage(contentDocument) || isMHTML) {\n\t\t\t\tif (!isMHTML) {\n\t\t\t\t\tconst { saveUrl } = singlefile.helper.extractInfobarData(contentDocument);\n\t\t\t\t\tpageUrl = saveUrl;\n\t\t\t\t}\n\t\t\t\tif (contentDocument.doctype) {\n\t\t\t\t\tif (document.doctype) {\n\t\t\t\t\t\tdocument.replaceChild(contentDocument.doctype, document.doctype);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdocument.insertBefore(contentDocument.doctype, document.documentElement);\n\t\t\t\t\t}\n\t\t\t\t} else if (document.doctype) {\n\t\t\t\t\tdocument.doctype.remove();\n\t\t\t\t}\n\t\t\t\tconst infobarElement = contentDocument.querySelector(singlefile.helper.INFOBAR_TAGNAME);\n\t\t\t\tif (infobarElement) {\n\t\t\t\t\tinfobarElement.remove();\n\t\t\t\t}\n\t\t\t\tcontentDocument.querySelectorAll(\"noscript\").forEach(element => {\n\t\t\t\t\telement.setAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME, element.innerHTML);\n\t\t\t\t\telement.textContent = \"\";\n\t\t\t\t});\n\t\t\t\tcontentDocument.querySelectorAll(\"iframe\").forEach(element => {\n\t\t\t\t\tconst pointerEvents = \"pointer-events\";\n\t\t\t\t\telement.style.setProperty(\"-sf-\" + pointerEvents, element.style.getPropertyValue(pointerEvents), element.style.getPropertyPriority(pointerEvents));\n\t\t\t\t\telement.style.setProperty(pointerEvents, \"none\", \"important\");\n\t\t\t\t});\n\t\t\t\tdocument.replaceChild(contentDocument.documentElement, document.documentElement);\n\t\t\t\tsinglefile.helper.fixInvalidNesting(document);\n\t\t\t\tdocument.querySelectorAll(\"[data-single-file-note-refs]\").forEach(noteRefElement => noteRefElement.dataset.singleFileNoteRefs = noteRefElement.dataset.singleFileNoteRefs.replace(/,/g, \" \"));\n\t\t\t\tdeserializeShadowRoots(document);\n\t\t\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => attachNoteListeners(containerElement, true));\n\t\t\t\tinsertHighlightStylesheet(document);\n\t\t\t\tmaskPageElement = getMaskElement(PAGE_MASK_CLASS, PAGE_MASK_CONTAINER_CLASS);\n\t\t\t\tmaskNoteElement = getMaskElement(NOTE_MASK_CLASS);\n\t\t\t\tdocument.documentElement.onmousedown = onMouseDown;\n\t\t\t\tdocument.documentElement.onmouseup = document.documentElement.ontouchend = onMouseUp;\n\t\t\t\tdocument.documentElement.onmouseover = onMouseOver;\n\t\t\t\tdocument.documentElement.onmouseout = onMouseOut;\n\t\t\t\tdocument.documentElement.onkeydown = onKeyDown;\n\t\t\t\tdocument.documentElement.ontouchstart = document.documentElement.ontouchmove = onTouchMove;\n\t\t\t\twindow.onclick = event => event.preventDefault();\n\t\t\t\tconst iconElement = document.querySelector(\"link[rel*=icon]\");\n\t\t\t\twindow.parent.postMessage(JSON.stringify({\n\t\t\t\t\tmethod: \"onInit\",\n\t\t\t\t\ttitle: document.title,\n\t\t\t\t\ticon: iconElement && iconElement.href,\n\t\t\t\t\tfilename,\n\t\t\t\t\treset,\n\t\t\t\t\tformatPageEnabled: isProbablyReaderable(document)\n\t\t\t\t}), \"*\");\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction loadOptionsFromPage(doc) {\n\t\tconst optionsElement = doc.body.querySelector(\"script[type=\\\"application/json\\\"][\" + SCRIPT_OPTIONS + \"]\");\n\t\tif (optionsElement) {\n\t\t\treturn JSON.parse(optionsElement.textContent);\n\t\t}\n\t}\n\n\tasync function initPage() {\n\t\tdocument.querySelectorAll(\"iframe\").forEach(element => {\n\t\t\tconst pointerEvents = \"pointer-events\";\n\t\t\telement.style.setProperty(\"-sf-\" + pointerEvents, element.style.getPropertyValue(pointerEvents), element.style.getPropertyPriority(pointerEvents));\n\t\t\telement.style.setProperty(pointerEvents, \"none\", \"important\");\n\t\t});\n\t\tdocument.querySelectorAll(\"[data-single-file-note-refs]\").forEach(noteRefElement => noteRefElement.dataset.singleFileNoteRefs = noteRefElement.dataset.singleFileNoteRefs.replace(/,/g, \" \"));\n\t\tdeserializeShadowRoots(document);\n\t\treflowNotes();\n\t\tawait waitResourcesLoad();\n\t\treflowNotes();\n\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => attachNoteListeners(containerElement, true));\n\t\tinsertHighlightStylesheet(document);\n\t\tmaskPageElement = getMaskElement(PAGE_MASK_CLASS, PAGE_MASK_CONTAINER_CLASS);\n\t\tmaskNoteElement = getMaskElement(NOTE_MASK_CLASS);\n\t\tdocument.documentElement.onmousedown = onMouseDown;\n\t\tdocument.documentElement.onmouseup = document.documentElement.ontouchend = onMouseUp;\n\t\tdocument.documentElement.onmouseover = onMouseOver;\n\t\tdocument.documentElement.onmouseout = onMouseOut;\n\t\tdocument.documentElement.onkeydown = onKeyDown;\n\t\tdocument.documentElement.ontouchstart = document.documentElement.ontouchmove = onTouchMove;\n\t\twindow.onclick = event => event.preventDefault();\n\t}\n\n\tasync function initConstants() {\n\t\t[NOTES_WEB_STYLESHEET, MASK_WEB_STYLESHEET, HIGHLIGHTS_WEB_STYLESHEET] = await Promise.all([\n\t\t\tminifyText(await ((await fetch(\"../pages/editor-note-web.css\")).text())),\n\t\t\tminifyText(await ((await fetch(\"../pages/editor-mask-web.css\")).text())),\n\t\t\tminifyText(await ((await fetch(\"../pages/editor-frame-web.css\")).text()))\n\t\t]);\n\t}\n\n\tfunction addNote({ color }) {\n\t\tconst containerElement = document.createElement(NOTE_TAGNAME);\n\t\tconst noteElement = document.createElement(\"div\");\n\t\tconst headerElement = document.createElement(\"header\");\n\t\tconst blockquoteElement = document.createElement(\"blockquote\");\n\t\tconst mainElement = document.createElement(\"textarea\");\n\t\tconst resizeElement = document.createElement(\"div\");\n\t\tconst removeNoteElement = document.createElement(\"img\");\n\t\tconst anchorIconElement = document.createElement(\"img\");\n\t\tconst noteShadow = containerElement.attachShadow({ mode: \"open\" });\n\t\theaderElement.appendChild(anchorIconElement);\n\t\theaderElement.appendChild(removeNoteElement);\n\t\tblockquoteElement.appendChild(mainElement);\n\t\tnoteElement.appendChild(headerElement);\n\t\tnoteElement.appendChild(blockquoteElement);\n\t\tnoteElement.appendChild(resizeElement);\n\t\tnoteShadow.appendChild(getStyleElement(NOTES_WEB_STYLESHEET));\n\t\tnoteShadow.appendChild(noteElement);\n\t\tconst notesElements = Array.from(document.querySelectorAll(NOTE_TAGNAME));\n\t\tconst noteId = Math.max.call(Math, 0, ...notesElements.map(noteElement => Number(noteElement.dataset.noteId))) + 1;\n\t\tblockquoteElement.cite = \"https://www.w3.org/TR/annotation-model/#selector(type=CssSelector,value=[data-single-file-note-refs~=\\\"\" + noteId + \"\\\"])\";\n\t\tnoteElement.classList.add(NOTE_CLASS);\n\t\tnoteElement.classList.add(NOTE_ANCHORED_CLASS);\n\t\tnoteElement.classList.add(color);\n\t\tnoteElement.dataset.color = color;\n\t\tmainElement.dir = \"auto\";\n\t\tconst boundingRectDocument = document.documentElement.getBoundingClientRect();\n\t\tlet positionX = NOTE_INITIAL_WIDTH + NOTE_INITIAL_POSITION_X - 1 - boundingRectDocument.x;\n\t\tlet positionY = NOTE_INITIAL_HEIGHT + NOTE_INITIAL_POSITION_Y - 1 - boundingRectDocument.y;\n\t\twhile (Array.from(document.elementsFromPoint(positionX - window.scrollX, positionY - window.scrollY)).find(element => element.tagName.toLowerCase() == NOTE_TAGNAME)) {\n\t\t\tpositionX += NOTE_INITIAL_POSITION_X;\n\t\t\tpositionY += NOTE_INITIAL_POSITION_Y;\n\t\t}\n\t\tnoteElement.style.setProperty(\"left\", (positionX - NOTE_INITIAL_WIDTH - 1) + \"px\");\n\t\tnoteElement.style.setProperty(\"top\", (positionY - NOTE_INITIAL_HEIGHT - 1) + \"px\");\n\t\tresizeElement.className = \"note-resize\";\n\t\tresizeElement.ondragstart = event => event.preventDefault();\n\t\tremoveNoteElement.className = \"note-remove\";\n\t\tremoveNoteElement.src = BUTTON_CLOSE_URL;\n\t\tremoveNoteElement.ondragstart = event => event.preventDefault();\n\t\tanchorIconElement.className = \"note-anchor\";\n\t\tanchorIconElement.src = BUTTON_ANCHOR_URL;\n\t\tanchorIconElement.ondragstart = event => event.preventDefault();\n\t\tcontainerElement.dataset.noteId = noteId;\n\t\taddNoteRef(document.documentElement, noteId);\n\t\tattachNoteListeners(containerElement, true);\n\t\tdocument.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);\n\t\tnoteElement.classList.add(NOTE_SELECTED_CLASS);\n\t\tselectedNote = noteElement;\n\t\tonUpdate(false);\n\t}\n\n\tfunction attachNoteListeners(containerElement, editable = false) {\n\t\tconst SELECT_PX_THRESHOLD = 4;\n\t\tconst COLLAPSING_NOTE_DELAY = 750;\n\t\tconst noteShadow = containerElement.shadowRoot;\n\t\tconst noteElement = noteShadow.childNodes[1];\n\t\tconst headerElement = noteShadow.querySelector(\"header\");\n\t\tconst mainElement = noteShadow.querySelector(\"textarea\");\n\t\tconst noteId = containerElement.dataset.noteId;\n\t\tconst resizeElement = noteShadow.querySelector(\".note-resize\");\n\t\tconst anchorIconElement = noteShadow.querySelector(\".note-anchor\");\n\t\tconst removeNoteElement = noteShadow.querySelector(\".note-remove\");\n\t\tmainElement.readOnly = !editable;\n\t\tif (!editable) {\n\t\t\tanchorIconElement.style.setProperty(\"display\", \"none\", \"important\");\n\t\t} else {\n\t\t\tanchorIconElement.style.removeProperty(\"display\");\n\t\t}\n\t\theaderElement.ontouchstart = headerElement.onmousedown = event => {\n\t\t\tif (event.target == headerElement) {\n\t\t\t\tcollapseNoteTimeout = setTimeout(() => {\n\t\t\t\t\tnoteElement.classList.toggle(\"note-collapsed\");\n\t\t\t\t\thideMaskNote();\n\t\t\t\t}, COLLAPSING_NOTE_DELAY);\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst position = getPosition(event);\n\t\t\t\tconst clientX = position.clientX;\n\t\t\t\tconst clientY = position.clientY;\n\t\t\t\tconst boundingRect = noteElement.getBoundingClientRect();\n\t\t\t\tconst deltaX = clientX - boundingRect.left;\n\t\t\t\tconst deltaY = clientY - boundingRect.top;\n\t\t\t\tmaskPageElement.classList.add(PAGE_MASK_ACTIVE_CLASS);\n\t\t\t\tdocument.documentElement.style.setProperty(\"user-select\", \"none\", \"important\");\n\t\t\t\tanchorElement = getAnchorElement(containerElement);\n\t\t\t\tdisplayMaskNote();\n\t\t\t\tselectNote(noteElement);\n\t\t\t\tmoveNote(event, deltaX, deltaY);\n\t\t\t\tmovingNoteMode = { event, deltaX, deltaY };\n\t\t\t\tdocument.documentElement.ontouchmove = document.documentElement.onmousemove = event => {\n\t\t\t\t\tclearTimeout(collapseNoteTimeout);\n\t\t\t\t\tif (!movingNoteMode) {\n\t\t\t\t\t\tmovingNoteMode = { deltaX, deltaY };\n\t\t\t\t\t}\n\t\t\t\t\tmovingNoteMode.event = event;\n\t\t\t\t\tmoveNote(event, deltaX, deltaY);\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tresizeElement.ontouchstart = resizeElement.onmousedown = event => {\n\t\t\tevent.preventDefault();\n\t\t\tresizingNoteMode = true;\n\t\t\tselectNote(noteElement);\n\t\t\tmaskPageElement.classList.add(PAGE_MASK_ACTIVE_CLASS);\n\t\t\tdocument.documentElement.style.setProperty(\"user-select\", \"none\", \"important\");\n\t\t\tdocument.documentElement.ontouchmove = document.documentElement.onmousemove = event => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst { clientX, clientY } = getPosition(event);\n\t\t\t\tconst boundingRectNote = noteElement.getBoundingClientRect();\n\t\t\t\tnoteElement.style.width = clientX - boundingRectNote.left + \"px\";\n\t\t\t\tnoteElement.style.height = clientY - boundingRectNote.top + \"px\";\n\t\t\t};\n\t\t};\n\t\tanchorIconElement.ontouchend = anchorIconElement.onclick = event => {\n\t\t\tevent.preventDefault();\n\t\t\tnoteElement.classList.toggle(NOTE_ANCHORED_CLASS);\n\t\t\tif (!noteElement.classList.contains(NOTE_ANCHORED_CLASS)) {\n\t\t\t\tdeleteNoteRef(containerElement, noteId);\n\t\t\t\taddNoteRef(document.documentElement, noteId);\n\t\t\t}\n\t\t\tonUpdate(false);\n\t\t};\n\t\tremoveNoteElement.ontouchend = removeNoteElement.onclick = event => {\n\t\t\tevent.preventDefault();\n\t\t\tdeleteNoteRef(containerElement, noteId);\n\t\t\tcontainerElement.remove();\n\t\t};\n\t\tnoteElement.onmousedown = () => {\n\t\t\tselectNote(noteElement);\n\t\t};\n\n\t\tfunction moveNote(event, deltaX, deltaY) {\n\t\t\tevent.preventDefault();\n\t\t\tconst { clientX, clientY } = getPosition(event);\n\t\t\tnoteElement.classList.add(NOTE_MOVING_CLASS);\n\t\t\tif (editable) {\n\t\t\t\tif (noteElement.classList.contains(NOTE_ANCHORED_CLASS)) {\n\t\t\t\t\tdeleteNoteRef(containerElement, noteId);\n\t\t\t\t\tanchorElement = getTarget(clientX, clientY) || document.documentElement;\n\t\t\t\t\taddNoteRef(anchorElement, noteId);\n\t\t\t\t} else {\n\t\t\t\t\tanchorElement = document.documentElement;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdocument.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);\n\t\t\tnoteElement.style.setProperty(\"left\", (clientX - deltaX) + \"px\");\n\t\t\tnoteElement.style.setProperty(\"top\", (clientY - deltaY) + \"px\");\n\t\t\tnoteElement.style.setProperty(\"position\", \"fixed\");\n\t\t\tdisplayMaskNote();\n\t\t}\n\n\t\tfunction displayMaskNote() {\n\t\t\tif (anchorElement == document.documentElement || anchorElement == document.documentElement) {\n\t\t\t\thideMaskNote();\n\t\t\t} else {\n\t\t\t\tconst boundingRectAnchor = anchorElement.getBoundingClientRect();\n\t\t\t\tmaskNoteElement.classList.add(NOTE_MASK_MOVING_CLASS);\n\t\t\t\tif (selectedNote) {\n\t\t\t\t\tmaskNoteElement.classList.add(selectedNote.dataset.color);\n\t\t\t\t}\n\t\t\t\tmaskNoteElement.style.setProperty(\"top\", (boundingRectAnchor.y - 3) + \"px\");\n\t\t\t\tmaskNoteElement.style.setProperty(\"left\", (boundingRectAnchor.x - 3) + \"px\");\n\t\t\t\tmaskNoteElement.style.setProperty(\"width\", (boundingRectAnchor.width + 3) + \"px\");\n\t\t\t\tmaskNoteElement.style.setProperty(\"height\", (boundingRectAnchor.height + 3) + \"px\");\n\t\t\t}\n\t\t}\n\n\t\tfunction hideMaskNote() {\n\t\t\tmaskNoteElement.classList.remove(NOTE_MASK_MOVING_CLASS);\n\t\t\tif (selectedNote) {\n\t\t\t\tmaskNoteElement.classList.remove(selectedNote.dataset.color);\n\t\t\t}\n\t\t}\n\n\t\tfunction selectNote(noteElement) {\n\t\t\tif (selectedNote) {\n\t\t\t\tselectedNote.classList.remove(NOTE_SELECTED_CLASS);\n\t\t\t\tmaskNoteElement.classList.remove(selectedNote.dataset.color);\n\t\t\t}\n\t\t\tnoteElement.classList.add(NOTE_SELECTED_CLASS);\n\t\t\tnoteElement.classList.add(noteElement.dataset.color);\n\t\t\tselectedNote = noteElement;\n\t\t}\n\n\t\tfunction getTarget(clientX, clientY) {\n\t\t\tconst targets = Array.from(document.elementsFromPoint(clientX, clientY)).filter(element => element.matches(\"html *:not(\" + NOTE_TAGNAME + \"):not(.\" + MASK_CLASS + \")\"));\n\t\t\tif (!targets.includes(document.documentElement)) {\n\t\t\t\ttargets.push(document.documentElement);\n\t\t\t}\n\t\t\tlet newTarget, target = targets[0], boundingRect = target.getBoundingClientRect();\n\t\t\tnewTarget = determineTargetElement(\"floor\", target, clientX - boundingRect.left, getMatchedParents(target, \"left\"));\n\t\t\tif (newTarget == target) {\n\t\t\t\tnewTarget = determineTargetElement(\"ceil\", target, boundingRect.left + boundingRect.width - clientX, getMatchedParents(target, \"right\"));\n\t\t\t}\n\t\t\tif (newTarget == target) {\n\t\t\t\tnewTarget = determineTargetElement(\"floor\", target, clientY - boundingRect.top, getMatchedParents(target, \"top\"));\n\t\t\t}\n\t\t\tif (newTarget == target) {\n\t\t\t\tnewTarget = determineTargetElement(\"ceil\", target, boundingRect.top + boundingRect.height - clientY, getMatchedParents(target, \"bottom\"));\n\t\t\t}\n\t\t\ttarget = newTarget;\n\t\t\twhile (boundingRect = target && target.getBoundingClientRect(), boundingRect && boundingRect.width <= SELECT_PX_THRESHOLD && boundingRect.height <= SELECT_PX_THRESHOLD) {\n\t\t\t\ttarget = target.parentElement;\n\t\t\t}\n\t\t\treturn target;\n\t\t}\n\n\t\tfunction getMatchedParents(target, property) {\n\t\t\tlet element = target, matchedParent, parents = [];\n\t\t\tdo {\n\t\t\t\tconst boundingRect = element.getBoundingClientRect();\n\t\t\t\tif (element.parentElement && !element.parentElement.tagName.toLowerCase() != NOTE_TAGNAME && !element.classList.contains(MASK_CLASS)) {\n\t\t\t\t\tconst parentBoundingRect = element.parentElement.getBoundingClientRect();\n\t\t\t\t\tmatchedParent = Math.abs(parentBoundingRect[property] - boundingRect[property]) <= SELECT_PX_THRESHOLD;\n\t\t\t\t\tif (matchedParent) {\n\t\t\t\t\t\tif (element.parentElement.clientWidth > SELECT_PX_THRESHOLD && element.parentElement.clientHeight > SELECT_PX_THRESHOLD &&\n\t\t\t\t\t\t\t((element.parentElement.clientWidth - element.clientWidth > SELECT_PX_THRESHOLD) || (element.parentElement.clientHeight - element.clientHeight > SELECT_PX_THRESHOLD))) {\n\t\t\t\t\t\t\tparents.push(element.parentElement);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telement = element.parentElement;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmatchedParent = false;\n\t\t\t\t}\n\t\t\t} while (matchedParent && element);\n\t\t\treturn parents;\n\t\t}\n\n\t\tfunction determineTargetElement(roundingMethod, target, widthDistance, parents) {\n\t\t\tif (Math[roundingMethod](widthDistance / SELECT_PX_THRESHOLD) <= parents.length) {\n\t\t\t\ttarget = parents[parents.length - Math[roundingMethod](widthDistance / SELECT_PX_THRESHOLD) - 1];\n\t\t\t}\n\t\t\treturn target;\n\t\t}\n\t}\n\n\tfunction onMouseDown(event) {\n\t\tif ((cuttingMode || cuttingOuterMode) && cuttingPath) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n\tfunction onMouseUp(event) {\n\t\tif (highlightSelectionMode) {\n\t\t\tevent.preventDefault();\n\t\t\thighlightSelection();\n\t\t\tonUpdate(false);\n\t\t}\n\t\tif (removeHighlightMode) {\n\t\t\tevent.preventDefault();\n\t\t\tlet element = event.target, done;\n\t\t\twhile (element && !done) {\n\t\t\t\tif (element.classList.contains(HIGHLIGHT_CLASS)) {\n\t\t\t\t\tdocument.querySelectorAll(\".\" + HIGHLIGHT_CLASS + \"[data-singlefile-highlight-id=\" + JSON.stringify(element.dataset.singlefileHighlightId) + \"]\").forEach(highlightedElement => {\n\t\t\t\t\t\tresetHighlightedElement(highlightedElement);\n\t\t\t\t\t\tonUpdate(false);\n\t\t\t\t\t});\n\t\t\t\t\tdone = true;\n\t\t\t\t}\n\t\t\t\telement = element.parentElement;\n\t\t\t}\n\t\t}\n\t\tif (resizingNoteMode) {\n\t\t\tevent.preventDefault();\n\t\t\tresizingNoteMode = false;\n\t\t\tdocument.documentElement.style.removeProperty(\"user-select\");\n\t\t\tmaskPageElement.classList.remove(PAGE_MASK_ACTIVE_CLASS);\n\t\t\tdocument.documentElement.ontouchmove = onTouchMove;\n\t\t\tdocument.documentElement.onmousemove = null;\n\t\t\tonUpdate(false);\n\t\t}\n\t\tif (movingNoteMode) {\n\t\t\tevent.preventDefault();\n\t\t\tanchorNote(movingNoteMode.event || event, selectedNote, movingNoteMode.deltaX, movingNoteMode.deltaY);\n\t\t\tmovingNoteMode = null;\n\t\t\tdocument.documentElement.ontouchmove = onTouchMove;\n\t\t\tdocument.documentElement.onmousemove = null;\n\t\t\tonUpdate(false);\n\t\t}\n\t\tif ((cuttingMode || cuttingOuterMode) && cuttingPath) {\n\t\t\tevent.preventDefault();\n\t\t\tif (event.ctrlKey) {\n\t\t\t\tconst element = cuttingPath[cuttingPathIndex];\n\t\t\t\telement.classList.toggle(cuttingMode ? CUT_SELECTED_CLASS : CUT_OUTER_SELECTED_CLASS);\n\t\t\t} else {\n\t\t\t\tvalidateCutElement(event.shiftKey);\n\t\t\t}\n\t\t}\n\t\tif (collapseNoteTimeout) {\n\t\t\tclearTimeout(collapseNoteTimeout);\n\t\t\tcollapseNoteTimeout = null;\n\t\t}\n\t}\n\n\tfunction onMouseOver(event) {\n\t\tif (cuttingMode || cuttingOuterMode) {\n\t\t\tconst target = event.target;\n\t\t\tif (target.classList) {\n\t\t\t\tlet ancestorFound;\n\t\t\t\tdocument.querySelectorAll(\".\" + (cuttingMode ? CUT_SELECTED_CLASS : CUT_OUTER_SELECTED_CLASS)).forEach(element => {\n\t\t\t\t\tif (element == target || isAncestor(element, target) || isAncestor(target, element)) {\n\t\t\t\t\t\tancestorFound = element;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (ancestorFound) {\n\t\t\t\t\tcuttingPath = [ancestorFound];\n\t\t\t\t} else {\n\t\t\t\t\tcuttingPath = getParents(event.target);\n\t\t\t\t}\n\t\t\t\tcuttingPathIndex = 0;\n\t\t\t\thighlightCutElement();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onMouseOut() {\n\t\tif (cuttingMode || cuttingOuterMode) {\n\t\t\tif (cuttingPath) {\n\t\t\t\tunhighlightCutElement();\n\t\t\t\tcuttingPath = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onTouchMove(event) {\n\t\tif (cuttingMode || cuttingOuterMode) {\n\t\t\tevent.preventDefault();\n\t\t\tconst { clientX, clientY } = getPosition(event);\n\t\t\tconst target = document.elementFromPoint(clientX, clientY);\n\t\t\tif (cuttingTouchTarget != target) {\n\t\t\t\tonMouseOut();\n\t\t\t\tif (target) {\n\t\t\t\t\tcuttingTouchTarget = target;\n\t\t\t\t\tonMouseOver({ target });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction onKeyDown(event) {\n\t\tif (cuttingMode || cuttingOuterMode) {\n\t\t\tif (event.code == \"Tab\") {\n\t\t\t\tif (cuttingPath) {\n\t\t\t\t\tconst delta = event.shiftKey ? -1 : 1;\n\t\t\t\t\tlet element = cuttingPath[cuttingPathIndex];\n\t\t\t\t\tlet nextElement = cuttingPath[cuttingPathIndex + delta];\n\t\t\t\t\tif (nextElement) {\n\t\t\t\t\t\tlet pathIndex = cuttingPathIndex + delta;\n\t\t\t\t\t\twhile (\n\t\t\t\t\t\t\tnextElement &&\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t(delta == 1 &&\n\t\t\t\t\t\t\t\t\telement.getBoundingClientRect().width >= nextElement.getBoundingClientRect().width &&\n\t\t\t\t\t\t\t\t\telement.getBoundingClientRect().height >= nextElement.getBoundingClientRect().height) ||\n\t\t\t\t\t\t\t\t(delta == -1 &&\n\t\t\t\t\t\t\t\t\telement.getBoundingClientRect().width <= nextElement.getBoundingClientRect().width &&\n\t\t\t\t\t\t\t\t\telement.getBoundingClientRect().height <= nextElement.getBoundingClientRect().height))) {\n\t\t\t\t\t\t\tpathIndex += delta;\n\t\t\t\t\t\t\tnextElement = cuttingPath[pathIndex];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (nextElement && nextElement.classList && nextElement != document.body && nextElement != document.documentElement) {\n\t\t\t\t\t\t\tunhighlightCutElement();\n\t\t\t\t\t\t\tcuttingPathIndex = pathIndex;\n\t\t\t\t\t\t\thighlightCutElement();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\tif (event.code == \"Space\") {\n\t\t\t\tif (cuttingPath) {\n\t\t\t\t\tif (event.ctrlKey) {\n\t\t\t\t\t\tconst element = cuttingPath[cuttingPathIndex];\n\t\t\t\t\t\telement.classList.add(cuttingMode ? CUT_SELECTED_CLASS : CUT_OUTER_SELECTED_CLASS);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalidateCutElement(event.shiftKey);\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (event.code == \"Escape\") {\n\t\t\t\tresetSelectedElements();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t\tif (event.key.toLowerCase() == \"z\" && event.ctrlKey) {\n\t\t\t\tif (event.shiftKey) {\n\t\t\t\t\tredoCutPage();\n\t\t\t\t} else {\n\t\t\t\t\tundoCutPage();\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tif (event.key.toLowerCase() == \"s\" && event.ctrlKey) {\n\t\t\twindow.parent.postMessage(JSON.stringify({ \"method\": \"savePage\" }), \"*\");\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tif (event.key.toLowerCase() == \"p\" && event.ctrlKey) {\n\t\t\tprintPage();\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n\n\tfunction printPage() {\n\t\tunhighlightCutElement();\n\t\tresetSelectedElements();\n\t\twindow.print();\n\t}\n\n\tfunction highlightCutElement() {\n\t\tconst element = cuttingPath[cuttingPathIndex];\n\t\telement.classList.add(cuttingMode ? CUT_HOVER_CLASS : CUT_OUTER_HOVER_CLASS);\n\t}\n\n\tfunction unhighlightCutElement() {\n\t\tif (cuttingPath) {\n\t\t\tconst element = cuttingPath[cuttingPathIndex];\n\t\t\telement.classList.remove(CUT_HOVER_CLASS);\n\t\t\telement.classList.remove(CUT_OUTER_HOVER_CLASS);\n\t\t}\n\t}\n\n\tfunction disableHighlight(doc = document) {\n\t\tif (highlightColor) {\n\t\t\tdoc.documentElement.classList.remove(highlightColor + \"-mode\");\n\t\t}\n\t}\n\n\tfunction undoCutPage() {\n\t\tif (removedElementIndex) {\n\t\t\tremovedElements[removedElementIndex - 1].forEach(element => element.classList.remove(REMOVED_CONTENT_CLASS));\n\t\t\tremovedElementIndex--;\n\t\t}\n\t}\n\n\tfunction redoCutPage() {\n\t\tif (removedElementIndex < removedElements.length) {\n\t\t\tremovedElements[removedElementIndex].forEach(element => element.classList.add(REMOVED_CONTENT_CLASS));\n\t\t\tremovedElementIndex++;\n\t\t}\n\t}\n\n\tfunction validateCutElement(invert) {\n\t\tconst selectedElement = cuttingPath[cuttingPathIndex];\n\t\tif ((cuttingMode && !invert) || (cuttingOuterMode && invert)) {\n\t\t\tif (document.documentElement != selectedElement && selectedElement.tagName.toLowerCase() != NOTE_TAGNAME) {\n\t\t\t\tconst elementsRemoved = [selectedElement].concat(...document.querySelectorAll(\".\" + CUT_SELECTED_CLASS + \",.\" + CUT_SELECTED_CLASS + \" *,.\" + CUT_HOVER_CLASS + \" *\"));\n\t\t\t\tresetSelectedElements();\n\t\t\t\tif (elementsRemoved.length) {\n\t\t\t\t\telementsRemoved.forEach(element => {\n\t\t\t\t\t\tunhighlightCutElement(element);\n\t\t\t\t\t\tif (element.tagName.toLowerCase() == NOTE_TAGNAME) {\n\t\t\t\t\t\t\tresetAnchorNote(element);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telement.classList.add(REMOVED_CONTENT_CLASS);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tremovedElements[removedElementIndex] = elementsRemoved;\n\t\t\t\t\tremovedElementIndex++;\n\t\t\t\t\tremovedElements.length = removedElementIndex;\n\t\t\t\t\tonUpdate(false);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (document.documentElement != selectedElement && selectedElement.tagName.toLowerCase() != NOTE_TAGNAME) {\n\t\t\t\tconst elements = [];\n\t\t\t\tconst searchSelector = \"*:not(style):not(meta):not(.\" + REMOVED_CONTENT_CLASS + \")\";\n\t\t\t\tconst elementsKept = [selectedElement].concat(...document.querySelectorAll(\".\" + CUT_OUTER_SELECTED_CLASS));\n\t\t\t\tdocument.body.querySelectorAll(searchSelector).forEach(element => {\n\t\t\t\t\tlet removed = true;\n\t\t\t\t\telementsKept.forEach(elementKept => removed = removed && (elementKept != element && !isAncestor(elementKept, element) && !isAncestor(element, elementKept)));\n\t\t\t\t\tif (removed) {\n\t\t\t\t\t\tif (element.tagName.toLowerCase() == NOTE_TAGNAME) {\n\t\t\t\t\t\t\tresetAnchorNote(element);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\telementsKept.forEach(elementKept => {\n\t\t\t\t\tunhighlightCutElement(elementKept);\n\t\t\t\t\tconst elementKeptRect = elementKept.getBoundingClientRect();\n\t\t\t\t\telementKept.querySelectorAll(searchSelector).forEach(descendant => {\n\t\t\t\t\t\tconst descendantRect = descendant.getBoundingClientRect();\n\t\t\t\t\t\tif (descendantRect.width && descendantRect.height && (\n\t\t\t\t\t\t\tdescendantRect.left + descendantRect.width < elementKeptRect.left ||\n\t\t\t\t\t\t\tdescendantRect.right > elementKeptRect.right + elementKeptRect.width ||\n\t\t\t\t\t\t\tdescendantRect.top + descendantRect.height < elementKeptRect.top ||\n\t\t\t\t\t\t\tdescendantRect.bottom > elementKeptRect.bottom + elementKeptRect.height\n\t\t\t\t\t\t)) {\n\t\t\t\t\t\t\telements.push(descendant);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tresetSelectedElements();\n\t\t\t\tif (elements.length) {\n\t\t\t\t\telements.forEach(element => element.classList.add(REMOVED_CONTENT_CLASS));\n\t\t\t\t\tremovedElements[removedElementIndex] = elements;\n\t\t\t\t\tremovedElementIndex++;\n\t\t\t\t\tremovedElements.length = removedElementIndex;\n\t\t\t\t\tonUpdate(false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction resetSelectedElements(doc = document) {\n\t\tdoc.querySelectorAll(\".\" + CUT_OUTER_SELECTED_CLASS + \",.\" + CUT_SELECTED_CLASS).forEach(element => {\n\t\t\telement.classList.remove(CUT_OUTER_SELECTED_CLASS);\n\t\t\telement.classList.remove(CUT_SELECTED_CLASS);\n\t\t});\n\t}\n\n\tfunction anchorNote(event, noteElement, deltaX, deltaY) {\n\t\tevent.preventDefault();\n\t\tconst { clientX, clientY } = getPosition(event);\n\t\tdocument.documentElement.style.removeProperty(\"user-select\");\n\t\tnoteElement.classList.remove(NOTE_MOVING_CLASS);\n\t\tmaskNoteElement.classList.remove(NOTE_MASK_MOVING_CLASS);\n\t\tmaskPageElement.classList.remove(PAGE_MASK_ACTIVE_CLASS);\n\t\tmaskNoteElement.classList.remove(noteElement.dataset.color);\n\t\tconst headerElement = noteElement.querySelector(\"header\");\n\t\theaderElement.ontouchmove = document.documentElement.onmousemove = null;\n\t\tlet currentElement = anchorElement;\n\t\tlet positionedElement;\n\t\twhile (currentElement.parentElement && !positionedElement) {\n\t\t\tif (!FORBIDDEN_TAG_NAMES.includes(currentElement.tagName.toLowerCase())) {\n\t\t\t\tconst currentElementStyle = getComputedStyle(currentElement);\n\t\t\t\tif (currentElementStyle.position != \"static\") {\n\t\t\t\t\tpositionedElement = currentElement;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrentElement = currentElement.parentElement;\n\t\t}\n\t\tif (!positionedElement) {\n\t\t\tpositionedElement = document.documentElement;\n\t\t}\n\t\tconst containerElement = noteElement.getRootNode().host;\n\t\tif (positionedElement == document.documentElement) {\n\t\t\tconst firstMaskElement = document.querySelector(\".\" + MASK_CLASS);\n\t\t\tfirstMaskElement.parentElement.insertBefore(containerElement, firstMaskElement);\n\t\t} else {\n\t\t\tpositionedElement.appendChild(containerElement);\n\t\t}\n\t\tconst boundingRectPositionedElement = positionedElement.getBoundingClientRect();\n\t\tconst stylePositionedElement = window.getComputedStyle(positionedElement);\n\t\tconst borderX = parseInt(stylePositionedElement.getPropertyValue(\"border-left-width\"));\n\t\tconst borderY = parseInt(stylePositionedElement.getPropertyValue(\"border-top-width\"));\n\t\tnoteElement.style.setProperty(\"position\", \"absolute\");\n\t\tnoteElement.style.setProperty(\"left\", (clientX - boundingRectPositionedElement.x - deltaX - borderX) + \"px\");\n\t\tnoteElement.style.setProperty(\"top\", (clientY - boundingRectPositionedElement.y - deltaY - borderY) + \"px\");\n\t}\n\n\tfunction resetAnchorNote(containerElement) {\n\t\tconst noteId = containerElement.dataset.noteId;\n\t\tconst noteElement = containerElement.shadowRoot.childNodes[1];\n\t\tnoteElement.classList.remove(NOTE_ANCHORED_CLASS);\n\t\tdeleteNoteRef(containerElement, noteId);\n\t\taddNoteRef(document.documentElement, noteId);\n\t\tdocument.documentElement.insertBefore(containerElement, maskPageElement.getRootNode().host);\n\t}\n\n\tfunction getPosition(event) {\n\t\tif (event.touches && event.touches.length) {\n\t\t\tconst touch = event.touches[0];\n\t\t\treturn touch;\n\t\t} else {\n\t\t\treturn event;\n\t\t}\n\t}\n\n\tfunction highlightSelection() {\n\t\tlet highlightId = 0;\n\t\tdocument.querySelectorAll(\".\" + HIGHLIGHT_CLASS).forEach(highlightedElement => highlightId = Math.max(highlightId, highlightedElement.dataset.singlefileHighlightId));\n\t\thighlightId++;\n\t\tconst selection = window.getSelection();\n\t\tconst highlightedNodes = new Set();\n\t\tfor (let indexRange = 0; indexRange < selection.rangeCount; indexRange++) {\n\t\t\tconst range = selection.getRangeAt(indexRange);\n\t\t\tif (!range.collapsed) {\n\t\t\t\tif (range.commonAncestorContainer.nodeType == range.commonAncestorContainer.TEXT_NODE) {\n\t\t\t\t\tlet contentText = range.startContainer.splitText(range.startOffset);\n\t\t\t\t\tcontentText = contentText.splitText(range.endOffset);\n\t\t\t\t\taddHighLightedNode(contentText.previousSibling);\n\t\t\t\t} else {\n\t\t\t\t\tconst treeWalker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT);\n\t\t\t\t\tlet highlightNodes;\n\t\t\t\t\twhile (treeWalker.nextNode()) {\n\t\t\t\t\t\tif (highlightNodes && !treeWalker.currentNode.contains(range.endContainer)) {\n\t\t\t\t\t\t\taddHighLightedNode(treeWalker.currentNode);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (treeWalker.currentNode == range.startContainer) {\n\t\t\t\t\t\t\tif (range.startContainer.nodeType == range.startContainer.TEXT_NODE) {\n\t\t\t\t\t\t\t\tconst contentText = range.startContainer.splitText(range.startOffset);\n\t\t\t\t\t\t\t\ttreeWalker.nextNode();\n\t\t\t\t\t\t\t\taddHighLightedNode(contentText);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\taddHighLightedNode(range.startContainer.childNodes[range.startOffset]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thighlightNodes = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (treeWalker.currentNode == range.endContainer) {\n\t\t\t\t\t\t\tif (range.endContainer.nodeType == range.endContainer.TEXT_NODE) {\n\t\t\t\t\t\t\t\tconst contentText = range.endContainer.splitText(range.endOffset);\n\t\t\t\t\t\t\t\ttreeWalker.nextNode();\n\t\t\t\t\t\t\t\taddHighLightedNode(contentText.previousSibling);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\taddHighLightedNode(range.endContainer.childNodes[range.endOffset]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thighlightNodes = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trange.collapse();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\thighlightedNodes.forEach(node => highlightNode(node));\n\n\t\tfunction addHighLightedNode(node) {\n\t\t\tif (node && node.textContent.trim()) {\n\t\t\t\tif (node.nodeType == node.TEXT_NODE && node.parentElement.childNodes.length == 1 && node.parentElement.classList.contains(HIGHLIGHT_CLASS)) {\n\t\t\t\t\thighlightedNodes.add(node.parentElement);\n\t\t\t\t} else {\n\t\t\t\t\thighlightedNodes.add(node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction highlightNode(node) {\n\t\t\tif (node.nodeType == node.ELEMENT_NODE) {\n\t\t\t\tresetHighlightedElement(node);\n\t\t\t\tnode.classList.add(HIGHLIGHT_CLASS);\n\t\t\t\tnode.classList.add(highlightColor);\n\t\t\t\tnode.dataset.singlefileHighlightId = highlightId;\n\t\t\t} else if (node.parentElement) {\n\t\t\t\thighlightTextNode(node);\n\t\t\t}\n\t\t}\n\n\t\tfunction highlightTextNode(node) {\n\t\t\tconst spanElement = document.createElement(\"span\");\n\t\t\tspanElement.classList.add(HIGHLIGHT_CLASS);\n\t\t\tspanElement.classList.add(highlightColor);\n\t\t\tspanElement.textContent = node.textContent;\n\t\t\tspanElement.dataset.singlefileHighlightId = highlightId;\n\t\t\tnode.parentNode.replaceChild(spanElement, node);\n\t\t\treturn spanElement;\n\t\t}\n\t}\n\n\tfunction getParents(element) {\n\t\tconst path = [];\n\t\twhile (element) {\n\t\t\tpath.push(element);\n\t\t\telement = element.parentElement;\n\t\t}\n\t\treturn path;\n\t}\n\n\tfunction formatPage(applySystemTheme, contentWidth) {\n\t\tif (pageCompressContent) {\n\t\t\tserializeShadowRoots(document);\n\t\t\tpreviousContent = document.documentElement.cloneNode(true);\n\t\t\tdeserializeShadowRoots(document);\n\t\t} else {\n\t\t\tpreviousContent = getContent(false, []);\n\t\t}\n\t\tconst shadowRoots = {};\n\t\tconst classesToPreserve = [\"single-file-highlight\", \"single-file-highlight-yellow\", \"single-file-highlight-green\", \"single-file-highlight-pink\", \"single-file-highlight-blue\"];\n\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => {\n\t\t\tshadowRoots[containerElement.dataset.noteId] = containerElement.shadowRoot;\n\t\t\tconst className = \"singlefile-note-id-\" + containerElement.dataset.noteId;\n\t\t\tcontainerElement.classList.add(className);\n\t\t\tclassesToPreserve.push(className);\n\t\t});\n\t\tconst optionsElement = document.querySelector(\"script[type=\\\"application/json\\\"][\" + SCRIPT_OPTIONS + \"]\");\n\t\tconst article = new Readability(document, { classesToPreserve }).parse();\n\t\tconst articleMetadata = Object.assign({}, article);\n\t\tdelete articleMetadata.content;\n\t\tdelete articleMetadata.textContent;\n\t\tfor (const key in articleMetadata) {\n\t\t\tif (articleMetadata[key] == null) {\n\t\t\t\tdelete articleMetadata[key];\n\t\t\t}\n\t\t}\n\t\tremovedElements = [];\n\t\tremovedElementIndex = 0;\n\t\tdocument.body.innerHTML = \"\";\n\t\tconst domParser = new DOMParser();\n\t\tconst doc = domParser.parseFromString(article.content, \"text/html\");\n\t\tconst contentEditable = document.body.contentEditable;\n\t\tdocument.documentElement.replaceChild(doc.body, document.body);\n\t\tif (optionsElement) {\n\t\t\tdocument.body.appendChild(optionsElement);\n\t\t}\n\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => {\n\t\t\tconst noteId = (Array.from(containerElement.classList).find(className => /singlefile-note-id-\\d+/.test(className))).split(\"singlefile-note-id-\")[1];\n\t\t\tcontainerElement.classList.remove(\"singlefile-note-id-\" + noteId);\n\t\t\tcontainerElement.dataset.noteId = noteId;\n\t\t\tif (!containerElement.shadowRoot) {\n\t\t\t\tcontainerElement.attachShadow({ mode: \"open\" });\n\t\t\t\tcontainerElement.shadowRoot.appendChild(shadowRoots[noteId]);\n\t\t\t}\n\t\t});\n\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => shadowRoots[containerElement.dataset.noteId].childNodes.forEach(node => containerElement.shadowRoot.appendChild(node)));\n\t\tdocument.body.contentEditable = contentEditable;\n\t\tdocument.head.querySelectorAll(\"style\").forEach(styleElement => styleElement.remove());\n\t\tconst styleElement = document.createElement(\"style\");\n\t\tstyleElement.textContent = getStyleFormattedPage(contentWidth);\n\t\tdocument.head.appendChild(styleElement);\n\t\tdocument.body.classList.add(\"moz-reader-content\");\n\t\tdocument.body.classList.add(\"content-width6\");\n\t\tdocument.body.classList.add(\"reader-show-element\");\n\t\tdocument.body.classList.add(\"sans-serif\");\n\t\tdocument.body.classList.add(\"container\");\n\t\tdocument.body.classList.add(\"line-height4\");\n\t\tconst prefersColorSchemeDark = matchMedia(\"(prefers-color-scheme: dark)\");\n\t\tif (applySystemTheme && prefersColorSchemeDark && prefersColorSchemeDark.matches) {\n\t\t\tdocument.body.classList.add(\"dark\");\n\t\t}\n\t\tdocument.body.style.setProperty(\"display\", \"block\");\n\t\tdocument.body.style.setProperty(\"padding\", \"24px\");\n\t\tconst titleElement = document.createElement(\"h1\");\n\t\ttitleElement.classList.add(\"reader-title\");\n\t\ttitleElement.textContent = article.title;\n\t\tdocument.body.insertBefore(titleElement, document.body.firstChild);\n\t\tconst existingMetaDataElement = document.querySelector(\"script[id=singlefile-readability-metadata]\");\n\t\tif (existingMetaDataElement) {\n\t\t\texistingMetaDataElement.remove();\n\t\t}\n\t\tconst metaDataElement = document.createElement(\"script\");\n\t\tmetaDataElement.type = \"application/json\";\n\t\tmetaDataElement.id = \"singlefile-readability-metadata\";\n\t\tmetaDataElement.textContent = JSON.stringify(articleMetadata, null, 2);\n\t\tdocument.head.appendChild(metaDataElement);\n\t\tdocument.querySelectorAll(\"a[href]\").forEach(element => {\n\t\t\tconst href = element.getAttribute(\"href\").trim();\n\t\t\tif (href.startsWith(document.baseURI + \"#\")) {\n\t\t\t\telement.setAttribute(\"href\", href.substring(document.baseURI.length));\n\t\t\t}\n\t\t});\n\t\tinsertHighlightStylesheet(document);\n\t\tmaskPageElement = getMaskElement(PAGE_MASK_CLASS, PAGE_MASK_CONTAINER_CLASS);\n\t\tmaskNoteElement = getMaskElement(NOTE_MASK_CLASS);\n\t\treflowNotes();\n\t\tonUpdate(false);\n\t}\n\n\tasync function cancelFormatPage() {\n\t\tif (previousContent) {\n\t\t\tconst contentEditable = document.body.contentEditable;\n\t\t\tif (pageCompressContent) {\n\t\t\t\tdocument.replaceChild(previousContent, document.documentElement);\n\t\t\t\tdeserializeShadowRoots(document);\n\t\t\t\tawait initPage();\n\t\t\t} else {\n\t\t\t\tawait init({ content: previousContent }, { reset: true });\n\t\t\t}\n\t\t\tdocument.body.contentEditable = contentEditable;\n\t\t\tonUpdate(false);\n\t\t\tpreviousContent = null;\n\t\t}\n\t}\n\n\tfunction insertHighlightStylesheet(doc) {\n\t\tif (!doc.querySelector(\".\" + HIGHLIGHTS_STYLESHEET_CLASS)) {\n\t\t\tconst styleheetHighlights = getStyleElement(HIGHLIGHTS_WEB_STYLESHEET);\n\t\t\tstyleheetHighlights.classList.add(HIGHLIGHTS_STYLESHEET_CLASS);\n\t\t\tdoc.documentElement.appendChild(styleheetHighlights);\n\t\t}\n\t}\n\n\tfunction getContent(compressHTML, updatedResources) {\n\t\tunhighlightCutElement();\n\t\tserializeShadowRoots(document);\n\t\tsinglefile.helper.markInvalidNesting(document);\n\t\tconst doc = document.cloneNode(true);\n\t\tdisableHighlight(doc);\n\t\tresetSelectedElements(doc);\n\t\tdeserializeShadowRoots(doc);\n\t\tdeserializeShadowRoots(document);\n\t\tdoc.documentElement.classList.remove(CUT_MODE_CLASS);\n\t\tdoc.querySelectorAll(\"[\" + DISABLED_NOSCRIPT_ATTRIBUTE_NAME + \"]\").forEach(element => {\n\t\t\telement.textContent = element.getAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME);\n\t\t\telement.removeAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME);\n\t\t});\n\t\tdoc.querySelectorAll(\".\" + MASK_CLASS + \", \" + singlefile.helper.INFOBAR_TAGNAME + \", .\" + REMOVED_CONTENT_CLASS).forEach(element => element.remove());\n\t\tif (includeInfobar) {\n\t\t\tconst options = singlefile.helper.extractInfobarData(doc);\n\t\t\toptions.openInfobar = openInfobar;\n\t\t\toptions.infobarPositionAbsolute = infobarPositionAbsolute;\n\t\t\toptions.infobarPositionTop = infobarPositionTop;\n\t\t\toptions.infobarPositionRight = infobarPositionRight;\n\t\t\toptions.infobarPositionBottom = infobarPositionBottom;\n\t\t\toptions.infobarPositionLeft = infobarPositionLeft;\n\t\t\tsinglefile.helper.appendInfobar(doc, options);\n\t\t}\n\t\tdoc.querySelectorAll(\".\" + HIGHLIGHT_CLASS).forEach(noteElement => noteElement.classList.remove(HIGHLIGHT_HIDDEN_CLASS));\n\t\tdoc.querySelectorAll(`template[${SHADOWROOT_ATTRIBUTE_NAME}]`).forEach(templateElement => {\n\t\t\tconst noteElement = templateElement.querySelector(\".\" + NOTE_CLASS);\n\t\t\tif (noteElement) {\n\t\t\t\tnoteElement.classList.remove(NOTE_HIDDEN_CLASS);\n\t\t\t}\n\t\t\tconst mainElement = templateElement.querySelector(\"textarea\");\n\t\t\tif (mainElement) {\n\t\t\t\tmainElement.textContent = mainElement.value;\n\t\t\t}\n\t\t});\n\t\tdoc.querySelectorAll(\"iframe\").forEach(element => {\n\t\t\tconst pointerEvents = \"pointer-events\";\n\t\t\telement.style.setProperty(pointerEvents, element.style.getPropertyValue(\"-sf-\" + pointerEvents), element.style.getPropertyPriority(\"-sf-\" + pointerEvents));\n\t\t\telement.style.removeProperty(\"-sf-\" + pointerEvents);\n\t\t});\n\t\tdoc.body.removeAttribute(\"contentEditable\");\n\t\tconst newResources = Object.keys(updatedResources).filter(url => updatedResources[url].type == \"stylesheet\").map(url => updatedResources[url]);\n\t\tnewResources.forEach(resource => {\n\t\t\tconst element = doc.createElement(\"style\");\n\t\t\tdoc.body.appendChild(element);\n\t\t\telement.textContent = resource.content;\n\t\t});\n\t\tif (pageCompressContent) {\n\t\t\tconst pageFilename = pageResources\n\t\t\t\t.filter(resource => resource.filename.endsWith(\"index.html\"))\n\t\t\t\t.sort((resourceLeft, resourceRight) => resourceLeft.filename.length - resourceRight.filename.length)[0].filename;\n\t\t\tconst resources = pageResources.filter(resource => resource.parentResources.includes(pageFilename));\n\t\t\tdoc.querySelectorAll(\"[src]\").forEach(element => resources.forEach(resource => {\n\t\t\t\tif (element.src == resource.content) {\n\t\t\t\t\telement.src = resource.name;\n\t\t\t\t}\n\t\t\t}));\n\t\t\tlet content = singlefile.helper.serialize(doc, compressHTML);\n\t\t\tresources.sort((resourceLeft, resourceRight) => resourceRight.content.length - resourceLeft.content.length);\n\t\t\tresources.forEach(resource => content = content.replaceAll(resource.content, resource.name));\n\t\t\treturn content + \"<script \" + SCRIPT_TEMPLATE_SHADOW_ROOT + \">\" + getEmbedScript() + \"</script>\";\n\t\t} else {\n\t\t\treturn singlefile.helper.serialize(doc, compressHTML) + \"<script \" + SCRIPT_TEMPLATE_SHADOW_ROOT + \">\" + getEmbedScript() + \"</script>\";\n\t\t}\n\t}\n\n\tfunction onUpdate(saved) {\n\t\twindow.parent.postMessage(JSON.stringify({ \"method\": \"onUpdate\", saved }), \"*\");\n\t}\n\n\tfunction waitResourcesLoad() {\n\t\treturn new Promise(resolve => {\n\t\t\tlet counterMutations = 0;\n\t\t\tconst done = () => {\n\t\t\t\tobserver.disconnect();\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tlet timeoutInit = setTimeout(done, 100);\n\t\t\tconst observer = new MutationObserver(() => {\n\t\t\t\tif (counterMutations < 20) {\n\t\t\t\t\tcounterMutations++;\n\t\t\t\t\tclearTimeout(timeoutInit);\n\t\t\t\t\ttimeoutInit = setTimeout(done, 100);\n\t\t\t\t} else {\n\t\t\t\t\tdone();\n\t\t\t\t}\n\t\t\t});\n\t\t\tobserver.observe(document, { subtree: true, childList: true, attributes: true });\n\t\t});\n\t}\n\n\tfunction reflowNotes() {\n\t\tdocument.querySelectorAll(NOTE_TAGNAME).forEach(containerElement => {\n\t\t\tconst noteElement = containerElement.shadowRoot.querySelector(\".\" + NOTE_CLASS);\n\t\t\tconst noteBoundingRect = noteElement.getBoundingClientRect();\n\t\t\tconst anchorElement = getAnchorElement(containerElement);\n\t\t\tconst anchorBoundingRect = anchorElement.getBoundingClientRect();\n\t\t\tconst maxX = anchorBoundingRect.x + Math.max(0, anchorBoundingRect.width - noteBoundingRect.width);\n\t\t\tconst minX = anchorBoundingRect.x;\n\t\t\tconst maxY = anchorBoundingRect.y + Math.max(0, anchorBoundingRect.height - NOTE_HEADER_HEIGHT);\n\t\t\tconst minY = anchorBoundingRect.y;\n\t\t\tlet left = parseInt(noteElement.style.getPropertyValue(\"left\"));\n\t\t\tlet top = parseInt(noteElement.style.getPropertyValue(\"top\"));\n\t\t\tif (noteBoundingRect.x > maxX) {\n\t\t\t\tleft -= noteBoundingRect.x - maxX;\n\t\t\t}\n\t\t\tif (noteBoundingRect.x < minX) {\n\t\t\t\tleft += minX - noteBoundingRect.x;\n\t\t\t}\n\t\t\tif (noteBoundingRect.y > maxY) {\n\t\t\t\ttop -= noteBoundingRect.y - maxY;\n\t\t\t}\n\t\t\tif (noteBoundingRect.y < minY) {\n\t\t\t\ttop += minY - noteBoundingRect.y;\n\t\t\t}\n\t\t\tnoteElement.style.setProperty(\"position\", \"absolute\");\n\t\t\tnoteElement.style.setProperty(\"left\", left + \"px\");\n\t\t\tnoteElement.style.setProperty(\"top\", top + \"px\");\n\t\t});\n\t}\n\n\tfunction resetHighlightedElement(element) {\n\t\telement.classList.remove(HIGHLIGHT_CLASS);\n\t\telement.classList.remove(\"single-file-highlight-yellow\");\n\t\telement.classList.remove(\"single-file-highlight-pink\");\n\t\telement.classList.remove(\"single-file-highlight-blue\");\n\t\telement.classList.remove(\"single-file-highlight-green\");\n\t\tdelete element.dataset.singlefileHighlightId;\n\t}\n\n\tfunction serializeShadowRoots(node) {\n\t\tnode.querySelectorAll(\"*\").forEach(element => {\n\t\t\tconst shadowRoot = getShadowRoot(element);\n\t\t\tif (shadowRoot) {\n\t\t\t\tserializeShadowRoots(shadowRoot);\n\t\t\t\tconst templateElement = document.createElement(\"template\");\n\t\t\t\ttemplateElement.setAttribute(SHADOWROOT_ATTRIBUTE_NAME, \"open\");\n\t\t\t\tArray.from(shadowRoot.childNodes).forEach(childNode => templateElement.appendChild(childNode));\n\t\t\t\telement.appendChild(templateElement);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction deserializeShadowRoots(node) {\n\t\tnode.querySelectorAll(`template[${SHADOWROOT_ATTRIBUTE_NAME}]`).forEach(element => {\n\t\t\tif (element.parentElement) {\n\t\t\t\tlet shadowRoot = getShadowRoot(element.parentElement);\n\t\t\t\tif (shadowRoot) {\n\t\t\t\t\tArray.from(element.childNodes).forEach(node => shadowRoot.appendChild(node));\n\t\t\t\t\telement.remove();\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tshadowRoot = element.parentElement.attachShadow({ mode: \"open\" });\n\t\t\t\t\t\tconst contentDocument = (new DOMParser()).parseFromString(element.innerHTML, \"text/html\");\n\t\t\t\t\t\tArray.from(contentDocument.head.childNodes).forEach(node => shadowRoot.appendChild(node));\n\t\t\t\t\t\tArray.from(contentDocument.body.childNodes).forEach(node => shadowRoot.appendChild(node));\n\t\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t// ignored\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (shadowRoot) {\n\t\t\t\t\tdeserializeShadowRoots(shadowRoot);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction getMaskElement(className, containerClassName) {\n\t\tlet maskElement = document.documentElement.querySelector(\".\" + className);\n\t\tif (!maskElement) {\n\t\t\tmaskElement = document.createElement(\"div\");\n\t\t\tconst maskContainerElement = document.createElement(\"div\");\n\t\t\tif (containerClassName) {\n\t\t\t\tmaskContainerElement.classList.add(containerClassName);\n\t\t\t}\n\t\t\tmaskContainerElement.classList.add(MASK_CLASS);\n\t\t\tconst firstNote = document.querySelector(NOTE_TAGNAME);\n\t\t\tif (firstNote && firstNote.parentElement == document.documentElement) {\n\t\t\t\tdocument.documentElement.insertBefore(maskContainerElement, firstNote);\n\t\t\t} else {\n\t\t\t\tdocument.documentElement.appendChild(maskContainerElement);\n\t\t\t}\n\t\t\tmaskElement.classList.add(className);\n\t\t\tconst maskShadow = maskContainerElement.attachShadow({ mode: \"open\" });\n\t\t\tmaskShadow.appendChild(getStyleElement(MASK_WEB_STYLESHEET));\n\t\t\tmaskShadow.appendChild(maskElement);\n\t\t\treturn maskElement;\n\t\t}\n\t}\n\n\tfunction getStyleFormattedPage(contentWidth) {\n\t\treturn `\n\t/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this file,\n * You can obtain one at http://mozilla.org/MPL/2.0/. */\n\n/* Avoid adding ID selector rules in this style sheet, since they could\n * inadvertently match elements in the article content. */\n\n:root {\n  --grey-90-a10: rgba(12, 12, 13, 0.1);\n  --grey-90-a20: rgba(12, 12, 13, 0.2);\n  --grey-90-a30: rgba(12, 12, 13, 0.3);\n  --grey-90-a80: rgba(12, 12, 13, 0.8);\n  --grey-30: #d7d7db;\n  --blue-40: #45a1ff;\n  --blue-40-a30: rgba(69, 161, 255, 0.3);\n  --blue-60: #0060df;\n  --body-padding: 64px;\n  --font-size: 12;\n  --content-width: ${contentWidth}em;\n  --line-height: 1.6em;\n}\n\nbody {\n  --main-background: #fff;\n  --main-foreground: #333;\n  --font-color: #000000;\n  --primary-color: #0B83FF;\n  --toolbar-border: var(--grey-90-a20);\n  --toolbar-transparent-border: transparent;\n  --toolbar-box-shadow: var(--grey-90-a10);\n  --toolbar-button-background: transparent;\n  --toolbar-button-background-hover: var(--grey-90-a10);\n  --toolbar-button-foreground-hover: var(--font-color);\n  --toolbar-button-background-active: var(--grey-90-a20);\n  --toolbar-button-foreground-active: var(--primary-color);\n  --toolbar-button-border: transparent;\n  --toolbar-button-border-hover: transparent;\n  --toolbar-button-border-active: transparent;\n  --tooltip-background: var(--grey-90-a80);\n  --tooltip-foreground: white;\n  --tooltip-border: transparent;\n  --popup-background: white;\n  --popup-border: rgba(0, 0, 0, 0.12);\n  --opaque-popup-border: #e0e0e0;\n  --popup-line: var(--grey-30);\n  --popup-shadow: rgba(49, 49, 49, 0.3);\n  --popup-button-background: #edecf0;\n  --popup-button-background-hover: hsla(0,0%,70%,.4);\n  --popup-button-foreground-hover: var(--font-color);\n  --popup-button-background-active: hsla(240,5%,5%,.15);\n  --selected-background: var(--blue-40-a30);\n  --selected-border: var(--blue-40);\n  --font-value-border: var(--grey-30);\n  --icon-fill: #3b3b3c;\n  --icon-disabled-fill: #8080807F;\n  --link-foreground: var(--blue-60);\n  --link-selected-foreground: #333;\n  --visited-link-foreground: #b5007f;\n  /* light colours */\n}\n\nbody.sepia {\n  --main-background: #f4ecd8;\n  --main-foreground: #5b4636;\n  --toolbar-border: #5b4636;\n}\n\nbody.dark {\n  --main-background: rgb(28, 27, 34);\n  --main-foreground: #eee;\n  --font-color: #fff;\n  --toolbar-border: #4a4a4b;\n  --toolbar-box-shadow: black;\n  --toolbar-button-background-hover: var(--grey-90-a30);\n  --toolbar-button-background-active: var(--grey-90-a80);\n  --tooltip-background: black;\n  --tooltip-foreground: white;\n  --popup-background: rgb(66,65,77);\n  --opaque-popup-border: #434146;\n  --popup-line: rgb(82, 82, 94);\n  --popup-button-background: #5c5c61;\n  --popup-button-background-active: hsla(0,0%,70%,.6);\n  --selected-background: #3E6D9A;\n  --font-value-border: #656468;\n  --icon-fill: #fff;\n  --icon-disabled-fill: #ffffff66;\n  --link-foreground: #45a1ff;\n  --link-selected-foreground: #fff;\n  --visited-link-foreground: #e675fd;\n  /* dark colours */\n}\n\nbody.hcm {\n  --main-background: Canvas;\n  --main-foreground: CanvasText;\n  --font-color: CanvasText;\n  --primary-color: SelectedItem;\n  --toolbar-border: CanvasText;\n   /* We need a true transparent but in HCM this would compute to an actual color,\n      so select the page's background color instead: */\n  --toolbar-transparent-border: Canvas;\n  --toolbar-box-shadow: Canvas;\n  --toolbar-button-background: ButtonFace;\n  --toolbar-button-background-hover: ButtonText;\n  --toolbar-button-foreground-hover: ButtonFace;\n  --toolbar-button-background-active: SelectedItem;\n  --toolbar-button-foreground-active: SelectedItemText;\n  --toolbar-button-border: ButtonText;\n  --toolbar-button-border-hover: ButtonText;\n  --toolbar-button-border-active: ButtonText;\n  --tooltip-background: Canvas;\n  --tooltip-foreground: CanvasText;\n  --tooltip-border: CanvasText;\n  --popup-background: Canvas;\n  --popup-border: CanvasText;\n  --opaque-popup-border: CanvasText;\n  --popup-line: CanvasText;\n  --popup-button-background: ButtonFace;\n  --popup-button-background-hover: ButtonText;\n  --popup-button-foreground-hover: ButtonFace;\n  --popup-button-background-active: ButtonText;\n  --selected-background: Canvas;\n  --selected-border: SelectedItem;\n  --font-value-border: CanvasText;\n  --icon-fill: ButtonText;\n  --icon-disabled-fill: GrayText;\n  --link-foreground: LinkText;\n  --link-selected-foreground: ActiveText;\n  --visited-link-foreground: VisitedText;\n}\n\nbody {\n  margin: 0;\n  padding: var(--body-padding);\n  background-color: var(--main-background);\n  color: var(--main-foreground);\n}\n\nbody.loaded {\n  transition: color 0.4s, background-color 0.4s;\n}\n\nbody.dark *::-moz-selection {\n  background-color: var(--selected-background);\n}\n\na::-moz-selection {\n  color: var(--link-selected-foreground);\n}\n\nbody.sans-serif,\nbody.sans-serif .remove-button {\n  font-family: Helvetica, Arial, sans-serif;\n}\n\nbody.serif,\nbody.serif .remove-button {\n  font-family: Georgia, \"Times New Roman\", serif;\n}\n\n/* Override some controls and content styles based on color scheme */\n\nbody.light > .container > .header > .domain {\n  border-bottom-color: #333333 !important;\n}\n\nbody.sepia > .container > .header > .domain {\n  border-bottom-color: #5b4636 !important;\n}\n\nbody.dark > .container > .header > .domain {\n  border-bottom-color: #eeeeee !important;\n}\n\nbody.light blockquote {\n  border-inline-start: 2px solid #333333 !important;\n}\n\nbody.sepia blockquote {\n  border-inline-start: 2px solid #5b4636 !important;\n}\n\nbody.dark blockquote {\n  border-inline-start: 2px solid #eeeeee !important;\n}\n\n.light-button {\n  color: #333333;\n  background-color: #ffffff;\n}\n\n.dark-button {\n  color: #eeeeee;\n  background-color: #1c1b22;\n}\n\n.sepia-button {\n  color: #5b4636;\n  background-color: #f4ecd8;\n}\n\n.auto-button {\n  text-align: center;\n}\n\n@media (prefers-color-scheme: dark) {\n  .auto-button {\n    background-color: #1c1b22;\n    color: #eeeeee;\n  }\n}\n\n@media not (prefers-color-scheme: dark) {\n  .auto-button {\n    background-color: #ffffff;\n    color: #333333;\n  }\n}\n\n/* Loading/error message */\n\n.reader-message {\n  margin-top: 40px;\n  display: none;\n  text-align: center;\n  width: 100%;\n  font-size: 0.9em;\n}\n\n/* Detector element to see if we're at the top of the doc or not. */\n.top-anchor {\n  position: absolute;\n  top: 0;\n  width: 0;\n  height: 5px;\n  pointer-events: none;\n}\n\n/* Header */\n\n.header {\n  text-align: start;\n  display: none;\n}\n\n.domain {\n  font-size: 0.9em;\n  line-height: 1.48em;\n  padding-bottom: 4px;\n  font-family: Helvetica, Arial, sans-serif;\n  text-decoration: none;\n  border-bottom: 1px solid;\n  color: var(--link-foreground);\n}\n\n.header > h1 {\n  font-size: 1.6em;\n  line-height: 1.25em;\n  width: 100%;\n  margin: 30px 0;\n  padding: 0;\n}\n\n.header > .credits {\n  font-size: 0.9em;\n  line-height: 1.48em;\n  margin: 0 0 10px;\n  padding: 0;\n  font-style: italic;\n}\n\n.header > .meta-data {\n  font-size: 0.65em;\n  margin: 0 0 15px;\n}\n\n.reader-estimated-time {\n  text-align: match-parent;\n}\n\n/* Controls toolbar */\n\n.toolbar-container {\n  position: sticky;\n  z-index: 2;\n  top: 32px;\n  height: 0; /* take up no space, so body is at the top. */\n\n  /* As a stick container, we're positioned relative to the body. Move us to\n   * the edge of the viewport using margins, and take the width of\n   * the body padding into account for calculating our width.\n   */\n  margin-inline-start: calc(-1 * var(--body-padding));\n  width: max(var(--body-padding), calc((100% - var(--content-width)) / 2 + var(--body-padding)));\n  font-size: var(--font-size); /* Needed to ensure 'em' units match, is reset for .reader-controls */\n}\n\n.toolbar {\n  padding-block: 16px;\n  border: 1px solid var(--toolbar-border);\n  border-radius: 6px;\n  box-shadow: 0 2px 8px var(--toolbar-box-shadow);\n\n  width: 32px; /* basic width, without padding/border */\n\n  /* padding should be 16px, except if there's not enough space for that, in\n   * which case use half the available space for padding (=25% on each side).\n   * The 34px here is the width + borders. We use a variable because we need\n   * to know this size for the margin calculation.\n   */\n  --inline-padding: min(16px, calc(25% - 0.25 * 34px));\n  padding-inline: var(--inline-padding);\n\n  /* Keep a maximum of 96px distance to the body, but center once the margin\n   * gets too small. We need to set the start margin, however...\n   * To center, we'd want 50% of the container, but we'd subtract half our\n   * own width (16px) and half the border (1px) and the inline padding.\n   * When the other margin would be 96px, we want 100% - 96px - the complete\n   * width of the actual toolbar (34px + 2 * padding)\n   */\n  margin-inline-start: max(calc(50% - 17px - var(--inline-padding)), calc(100% - 96px - 34px - 2 * var(--inline-padding)));\n\n  font-family: Helvetica, Arial, sans-serif;\n  list-style: none;\n  user-select: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  .toolbar {\n    transition-property: border-color, box-shadow;\n    transition-duration: 250ms;\n  }\n\n  .toolbar .toolbar-button {\n    transition-property: opacity;\n    transition-duration: 250ms;\n  }\n\n  .toolbar-container.scrolled .toolbar:not(:hover, :focus-within) {\n    border-color: var(--toolbar-transparent-border);\n    box-shadow: 0 2px 8px transparent;\n  }\n\n  .toolbar-container.scrolled .toolbar:not(:hover, :focus-within) .toolbar-button {\n    opacity: 0.6;\n  }\n\n  .toolbar-container.transition-location {\n    transition-duration: 250ms;\n    transition-property: width;\n  }\n}\n\n.toolbar-container.overlaps .toolbar-button {\n  opacity: 0.1;\n}\n\n.dropdown-open .toolbar {\n  border-color: var(--toolbar-transparent-border);\n  box-shadow: 0 2px 8px transparent;\n}\n\n.reader-controls {\n  /* We use 'em's above this node to get it to the right size. However,\n   * the UI inside the toolbar should use a fixed, smaller size. */\n  font-size: 11px;\n}\n\nbutton {\n  -moz-context-properties: fill;\n  color: var(--font-color);\n  fill: var(--icon-fill);\n}\n\nbutton:disabled {\n  fill: var(--icon-disabled-fill);\n}\n\n.toolbar button::-moz-focus-inner {\n  border: 0;\n}\n\n.toolbar-button {\n  position: relative;\n  width: 32px;\n  height: 32px;\n  padding: 0;\n  border: 1px solid var(--toolbar-button-border);\n  border-radius: 4px;\n  margin: 4px 0;\n  background-color: var(--toolbar-button-background);\n  background-size: 16px 16px;\n  background-position: center;\n  background-repeat: no-repeat;\n}\n\n.toolbar-button:hover,\n.toolbar-button:focus-visible {\n  background-color: var(--toolbar-button-background-hover);\n  border-color: var(--toolbar-button-border-hover);\n  fill: var(--toolbar-button-foreground-hover);\n}\n\n.open .toolbar-button,\n.toolbar-button:hover:active {\n  background-color: var(--toolbar-button-background-active);\n  border-color: var(--toolbar-button-border-active);\n  color: var(--toolbar-button-foreground-active);\n  fill: var(--toolbar-button-foreground-active);\n}\n\n.hover-label {\n  position: absolute;\n  top: 4px;\n  inset-inline-start: 36px;\n  line-height: 16px;\n  white-space: pre; /* make sure we don't wrap */\n  background-color: var(--tooltip-background);\n  color: var(--tooltip-foreground);\n  padding: 4px 8px;\n  border: 1px solid var(--tooltip-border);\n  border-radius: 2px;\n  visibility: hidden;\n  pointer-events: none;\n  /* Put above .dropdown .dropdown-popup, which has z-index: 1000. */\n  z-index: 1001;\n}\n\n/* Show the hover tooltip on non-dropdown buttons. */\n.toolbar-button:not(.dropdown-toggle):hover > .hover-label,\n.toolbar-button:not(.dropdown-toggle):focus-visible > .hover-label,\n/* Show the hover tooltip for dropdown buttons unless its dropdown is open. */\n:not(.open) > li > .dropdown-toggle:hover > .hover-label,\n:not(.open) > li > .dropdown-toggle:focus-visible > .hover-label {\n  visibility: visible;\n}\n\n.dropdown {\n  text-align: center;\n  list-style: none;\n  margin: 0;\n  padding: 0;\n  position: relative;\n}\n\n.dropdown li {\n  margin: 0;\n  padding: 0;\n}\n\n/* Popup */\n\n.dropdown .dropdown-popup {\n  text-align: start;\n  position: absolute;\n  inset-inline-start: 40px;\n  z-index: 1000;\n  background-color: var(--popup-background);\n  visibility: hidden;\n  border-radius: 4px;\n  border: 1px solid var(--popup-border);\n  box-shadow: 0 0 10px 0 var(--popup-shadow);\n  top: 0;\n}\n\n.open > .dropdown-popup {\n  visibility: visible;\n}\n\n.dropdown-arrow {\n  position: absolute;\n  height: 24px;\n  width: 16px;\n  inset-inline-start: -16px;\n  background-image: url(\"chrome://global/skin/reader/RM-Type-Controls-Arrow.svg\");\n  display: block;\n  -moz-context-properties: fill, stroke;\n  fill: var(--popup-background);\n  stroke: var(--opaque-popup-border);\n  pointer-events: none;\n}\n\n.dropdown-arrow:dir(rtl) {\n  transform: scaleX(-1);\n}\n\n/* Align the style dropdown arrow (narrate does its own) */\n.style-dropdown .dropdown-arrow {\n  top: 7px;\n}\n\n/* Font style popup */\n\n.radio-button {\n  /* We visually hide these, but we keep them around so they can be focused\n   * and changed by interacting with them via the label, or the keyboard, or\n   * assistive technology.\n   */\n  opacity: 0;\n  pointer-events: none;\n  position: absolute;\n}\n\n.radiorow,\n.buttonrow {\n  display: flex;\n  align-content: center;\n  justify-content: center;\n}\n\n.content-width-value,\n.font-size-value,\n.line-height-value {\n  box-sizing: border-box;\n  width: 36px;\n  height: 20px;\n  line-height: 20px;\n  display: flex;\n  justify-content: center;\n  align-content: center;\n  margin: auto;\n  border-radius: 10px;\n  border: 1px solid var(--font-value-border);\n  background-color: var(--popup-button-background);\n}\n\n.buttonrow > button {\n  border: 0;\n  height: 60px;\n  width: 90px;\n  background-color: transparent;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n\n.buttonrow > button:enabled:hover,\n.buttonrow > button:enabled:focus-visible {\n  background-color: var(--popup-button-background-hover);\n  color: var(--popup-button-foreground-hover);\n  fill: var(--popup-button-foreground-hover);\n}\n\n.buttonrow > button:enabled:hover:active {\n  background-color: var(--popup-button-background-active);\n}\n\n.radiorow:not(:last-child),\n.buttonrow:not(:last-child) {\n  border-bottom: 1px solid var(--popup-line);\n}\n\nbody.hcm .buttonrow.line-height-buttons {\n  /* On HCM the .color-scheme-buttons row is hidden, so remove the border from the row above it */\n  border-bottom: none;\n}\n\n.radiorow > label {\n  position: relative;\n  box-sizing: border-box;\n  border-radius: 2px;\n  border: 2px solid var(--popup-border);\n}\n\n.radiorow > label[checked] {\n  border-color: var(--selected-border);\n}\n\n/* For the hover style, we draw a line under the item by means of a\n * pseudo-element. Because these items are variable height, and\n * because their contents are variable height, position it absolutely,\n * and give it a width of 100% (the content width) + 4px for the 2 * 2px\n * border width.\n */\n.radiorow > input[type=radio]:focus-visible + label::after,\n.radiorow > label:hover::after {\n  content: \"\";\n  display: block;\n  border-bottom: 2px solid var(--selected-border);\n  width: calc(100% + 4px);\n  position: absolute;\n  /* to skip the 2 * 2px border + 2px spacing. */\n  bottom: -6px;\n  /* Match the start of the 2px border of the element: */\n  inset-inline-start: -2px;\n}\n\n.font-type-buttons > label {\n  height: 64px;\n  width: 105px;\n  /* Slightly more space between these items. */\n  margin: 10px;\n  /* Center the Sans-serif / Serif labels */\n  text-align: center;\n  background-size: 63px 39px;\n  background-repeat: no-repeat;\n  background-position: center 18px;\n  background-color: var(--popup-button-background);\n  fill: currentColor;\n  -moz-context-properties: fill;\n  /* This mostly matches baselines, but because of differences in font\n   * baselines between serif and sans-serif, this isn't always enough. */\n  line-height: 1;\n  padding-top: 2px;\n}\n\n.font-type-buttons > label[checked] {\n  background-color: var(--selected-background);\n}\n\n.sans-serif-button {\n  font-family: Helvetica, Arial, sans-serif;\n  background-image: url(\"chrome://global/skin/reader/RM-Sans-Serif.svg\");\n}\n\n/* Tweak padding to match the baseline on mac */\n:root[platform=macosx] .sans-serif-button {\n  padding-top: 3px;\n}\n\n.serif-button {\n  font-family: Georgia, \"Times New Roman\", serif;\n  background-image: url(\"chrome://global/skin/reader/RM-Serif.svg\");\n}\n\nbody.hcm .color-scheme-buttons {\n  /* Disallow selecting themes when HCM is on. */\n  display: none;\n}\n\n.color-scheme-buttons > label {\n  padding: 12px;\n  height: 34px;\n  font-size: 12px;\n  /* Center the labels horizontally as well as vertically */\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  /* We want 10px between items, but there's no margin collapsing in flexbox. */\n  margin: 10px 5px;\n}\n\n.color-scheme-buttons > input:first-child + label {\n  margin-inline-start: 10px;\n}\n\n.color-scheme-buttons > label:last-child {\n  margin-inline-end: 10px;\n}\n\n/* Toolbar icons */\n\n.close-button {\n  background-image: url(\"chrome://global/skin/icons/close.svg\");\n}\n\n.style-button {\n  background-image: url(\"chrome://global/skin/reader/RM-Type-Controls-24x24.svg\");\n}\n\n.minus-button {\n  background-size: 18px 18px;\n  background-image: url(\"chrome://global/skin/reader/RM-Minus-24x24.svg\");\n}\n\n.plus-button {\n  background-size: 18px 18px;\n  background-image: url(\"chrome://global/skin/reader/RM-Plus-24x24.svg\");\n}\n\n.content-width-minus-button {\n  background-size: 42px 16px;\n  background-image: url(\"chrome://global/skin/reader/RM-Content-Width-Minus-42x16.svg\");\n}\n\n.content-width-plus-button {\n  background-size: 44px 16px;\n  background-image: url(\"chrome://global/skin/reader/RM-Content-Width-Plus-44x16.svg\");\n}\n\n.line-height-minus-button {\n  background-size: 34px 14px;\n  background-image: url(\"chrome://global/skin/reader/RM-Line-Height-Minus-38x14.svg\");\n}\n\n.line-height-plus-button {\n  background-size: 34px 24px;\n  background-image: url(\"chrome://global/skin/reader/RM-Line-Height-Plus-38x24.svg\");\n}\n\n/* Mirror the line height buttons if the article is RTL. */\n.reader-controls[articledir=\"rtl\"] .line-height-minus-button,\n.reader-controls[articledir=\"rtl\"] .line-height-plus-button {\n  transform: scaleX(-1);\n}\n\n@media print {\n  .toolbar {\n    display: none !important;\n  }\n}\n\n/* Article content */\n\n/* Note that any class names from the original article that we want to match on\n * must be added to CLASSES_TO_PRESERVE in ReaderMode.jsm, so that\n * Readability.js doesn't strip them out */\n\n.container {\n  margin: 0 auto;\n  font-size: var(--font-size);\n  max-width: var(--content-width);\n  line-height: var(--line-height);\n}\n\npre {\n  font-family: inherit;\n}\n\n.moz-reader-content {\n  display: none;\n  font-size: 1em;\n}\n\n@media print {\n  .moz-reader-content p,\n  .moz-reader-content code,\n  .moz-reader-content pre,\n  .moz-reader-content blockquote,\n  .moz-reader-content ul,\n  .moz-reader-content ol,\n  .moz-reader-content li,\n  .moz-reader-content figure,\n  .moz-reader-content .wp-caption {\n    margin: 0 0 10px !important;\n    padding: 0 !important;\n  }\n}\n\n.moz-reader-content h1,\n.moz-reader-content h2,\n.moz-reader-content h3 {\n  font-weight: bold;\n}\n\n.moz-reader-content h1 {\n  font-size: 1.6em;\n  line-height: 1.25em;\n}\n\n.moz-reader-content h2 {\n  font-size: 1.2em;\n  line-height: 1.51em;\n}\n\n.moz-reader-content h3 {\n  font-size: 1em;\n  line-height: 1.66em;\n}\n\n.moz-reader-content a:link {\n  text-decoration: underline;\n  font-weight: normal;\n}\n\n.moz-reader-content a:link,\n.moz-reader-content a:link:hover,\n.moz-reader-content a:link:active {\n  color: var(--link-foreground);\n}\n\n.moz-reader-content a:visited {\n  color: var(--visited-link-foreground);\n}\n\n.moz-reader-content * {\n  max-width: 100%;\n  height: auto;\n}\n\n.moz-reader-content p,\n.moz-reader-content p,\n.moz-reader-content code,\n.moz-reader-content pre,\n.moz-reader-content blockquote,\n.moz-reader-content ul,\n.moz-reader-content ol,\n.moz-reader-content li,\n.moz-reader-content figure,\n.moz-reader-content .wp-caption {\n  margin: -10px -10px 20px;\n  padding: 10px;\n  border-radius: 5px;\n}\n\n.moz-reader-content li {\n  margin-bottom: 0;\n}\n\n.moz-reader-content li > ul,\n.moz-reader-content li > ol {\n  margin-bottom: -10px;\n}\n\n.moz-reader-content p > img:only-child,\n.moz-reader-content p > a:only-child > img:only-child,\n.moz-reader-content .wp-caption img,\n.moz-reader-content figure img {\n  display: block;\n}\n\n.moz-reader-content img[moz-reader-center] {\n  margin-inline: auto;\n}\n\n.moz-reader-content .caption,\n.moz-reader-content .wp-caption-text\n.moz-reader-content figcaption {\n  font-size: 0.9em;\n  line-height: 1.48em;\n  font-style: italic;\n}\n\n.moz-reader-content pre {\n  white-space: pre-wrap;\n}\n\n.moz-reader-content blockquote {\n  padding: 0;\n  padding-inline-start: 16px;\n}\n\n.moz-reader-content ul,\n.moz-reader-content ol {\n  padding: 0;\n}\n\n.moz-reader-content ul {\n  padding-inline-start: 30px;\n  list-style: disc;\n}\n\n.moz-reader-content ol {\n  padding-inline-start: 30px;\n}\n\ntable,\nth,\ntd {\n  border: 1px solid currentColor;\n  border-collapse: collapse;\n  padding: 6px;\n  vertical-align: top;\n}\n\ntable {\n  margin: 5px;\n}\n\n/* Visually hide (but don't display: none) screen reader elements */\n.moz-reader-content .visually-hidden,\n.moz-reader-content .visuallyhidden,\n.moz-reader-content .sr-only {\n  display: inline-block;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  border-width: 0;\n}\n\n/* Hide elements with common \"hidden\" class names */\n.moz-reader-content .hidden,\n.moz-reader-content .invisible {\n  display: none;\n}\n\n/* Enforce wordpress and similar emoji/smileys aren't sized to be full-width,\n * see bug 1399616 for context. */\n.moz-reader-content img.wp-smiley,\n.moz-reader-content img.emoji {\n  display: inline-block;\n  border-width: 0;\n  /* height: auto is implied from '.moz-reader-content *' rule. */\n  width: 1em;\n  margin: 0 .07em;\n  padding: 0;\n}\n\n.reader-show-element {\n  display: initial;\n}\n\n/* Provide extra spacing for images that may be aided with accompanying element such as <figcaption> */\n.moz-reader-block-img:not(:last-child) {\n  margin-block-end: 12px;\n}\n\n.moz-reader-wide-table {\n  overflow-x: auto;\n  display: block;\n}\n\npre code {\n  background-color: var(--main-background);\n  border: 1px solid var(--font-color);\n  display: block;\n  overflow: auto;\n}`;\n\t}\n\n\tfunction getEmbedScript() {\n\t\treturn minifyText(`(() => {\n\t\t\tdocument.currentScript.remove();\n\t\t\tconst processNode = node => {\n\t\t\t\tnode.querySelectorAll(\"template[${SHADOWROOT_ATTRIBUTE_NAME}]\").forEach(element=>{\n\t\t\t\t\tlet shadowRoot = getShadowRoot(element.parentElement);\n\t\t\t\t\tif (!shadowRoot) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tshadowRoot = element.parentElement.attachShadow({mode:element.getAttribute(\"${SHADOWROOT_ATTRIBUTE_NAME}\")});\n\t\t\t\t\t\t\tshadowRoot.innerHTML = element.innerHTML;\n\t\t\t\t\t\t\telement.remove();\n\t\t\t\t\t\t} catch (error) {}\t\t\t\t\t\t\n\t\t\t\t\t\tif (shadowRoot) {\n\t\t\t\t\t\t\tprocessNode(shadowRoot);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t})\n\t\t\t};\n\t\t\tconst FORBIDDEN_TAG_NAMES = ${JSON.stringify(FORBIDDEN_TAG_NAMES)};\n\t\t\tconst NOTE_TAGNAME = ${JSON.stringify(NOTE_TAGNAME)};\n\t\t\tconst NOTE_CLASS = ${JSON.stringify(NOTE_CLASS)};\n\t\t\tconst NOTE_ANCHORED_CLASS = ${JSON.stringify(NOTE_ANCHORED_CLASS)};\n\t\t\tconst NOTE_SELECTED_CLASS = ${JSON.stringify(NOTE_SELECTED_CLASS)};\n\t\t\tconst NOTE_MOVING_CLASS = ${JSON.stringify(NOTE_MOVING_CLASS)};\n\t\t\tconst NOTE_MASK_MOVING_CLASS = ${JSON.stringify(NOTE_MASK_MOVING_CLASS)};\n\t\t\tconst MASK_CLASS = ${JSON.stringify(MASK_CLASS)};\n\t\t\tconst HIGHLIGHT_CLASS = ${JSON.stringify(HIGHLIGHT_CLASS)};\n\t\t\tconst NOTES_WEB_STYLESHEET = ${JSON.stringify(NOTES_WEB_STYLESHEET)};\n\t\t\tconst MASK_WEB_STYLESHEET = ${JSON.stringify(MASK_WEB_STYLESHEET)};\n\t\t\tconst NOTE_HEADER_HEIGHT = ${JSON.stringify(NOTE_HEADER_HEIGHT)};\n\t\t\tconst PAGE_MASK_ACTIVE_CLASS = ${JSON.stringify(PAGE_MASK_ACTIVE_CLASS)};\n\t\t\tconst REMOVED_CONTENT_CLASS = ${JSON.stringify(REMOVED_CONTENT_CLASS)};\n\t\t\tconst NESTING_TRACK_ID_ATTRIBUTE_NAME = ${JSON.stringify(singlefile.helper.NESTING_TRACK_ID_ATTRIBUTE_NAME)};\n\t\t\tconst reflowNotes = ${minifyText(reflowNotes.toString())};\t\t\t\n\t\t\tconst addNoteRef = ${minifyText(addNoteRef.toString())};\n\t\t\tconst deleteNoteRef = ${minifyText(deleteNoteRef.toString())};\n\t\t\tconst getNoteRefs = ${minifyText(getNoteRefs.toString())};\n\t\t\tconst setNoteRefs = ${minifyText(setNoteRefs.toString())};\n\t\t\tconst getAnchorElement = ${minifyText(getAnchorElement.toString())};\n\t\t\tconst getMaskElement = ${minifyText(getMaskElement.toString())};\n\t\t\tconst getStyleElement = ${minifyText(getStyleElement.toString())};\n\t\t\tconst attachNoteListeners = ${minifyText(attachNoteListeners.toString())};\n\t\t\tconst anchorNote = ${minifyText(anchorNote.toString())};\n\t\t\tconst getPosition = ${minifyText(getPosition.toString())};\n\t\t\tconst onMouseUp = ${minifyText(onMouseUp.toString())};\n\t\t\tconst getShadowRoot = ${minifyText(getShadowRoot.toString())};\n\t\t\tconst waitResourcesLoad = ${minifyText(waitResourcesLoad.toString())};\n\t\t\tconst maskNoteElement = getMaskElement(${JSON.stringify(NOTE_MASK_CLASS)});\n\t\t\tconst maskPageElement = getMaskElement(${JSON.stringify(PAGE_MASK_CLASS)}, ${JSON.stringify(PAGE_MASK_CONTAINER_CLASS)});\n\t\t\tlet selectedNote, highlightSelectionMode, removeHighlightMode, resizingNoteMode, movingNoteMode, collapseNoteTimeout, cuttingMode, cuttingOuterMode;\n\t\t\twindow.onresize = reflowNotes;\n\t\t\twindow.onUpdate = () => {};\n\t\t\tdocument.documentElement.onmouseup = document.documentElement.ontouchend = onMouseUp;\n\t\t\tprocessNode(document);\n\t\t\treflowNotes();\n\t\t\tdocument.querySelectorAll(${JSON.stringify(NOTE_TAGNAME)}).forEach(noteElement => attachNoteListeners(noteElement));\n\t\t\tif (document.documentElement.dataset && document.documentElement.dataset.sfz !== undefined) {\n\t\t\t\twaitResourcesLoad().then(reflowNotes);\n\t\t\t}\n\t\t\tconst trackIds = {};\n\t\t\tdocument.querySelectorAll(\"[\" + NESTING_TRACK_ID_ATTRIBUTE_NAME + \"]\").forEach(element => trackIds[element.getAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME)] = element);\n\t\t\tObject.keys(trackIds).forEach(id => {\n\t\t\t\tconst element = trackIds[id];\n\t\t\t\tconst idParts = id.split(\".\");\n\t\t\t\tif (idParts.length > 1) {\n\t\t\t\t\tconst parentId = idParts.slice(0, -1).join(\".\");\n\t\t\t\t\tconst expectedParent = trackIds[parentId];\n\t\t\t\t\tif (expectedParent && element.parentElement !== expectedParent) {\n\t\t\t\t\t\texpectedParent.appendChild(element);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"[\" + NESTING_TRACK_ID_ATTRIBUTE_NAME + \"]\").forEach(element => element.removeAttribute(NESTING_TRACK_ID_ATTRIBUTE_NAME));\n\t\t})()`);\n\t}\n\n\tfunction getStyleElement(stylesheet) {\n\t\tconst linkElement = document.createElement(\"style\");\n\t\tlinkElement.textContent = stylesheet;\n\t\treturn linkElement;\n\t}\n\n\tfunction getAnchorElement(containerElement) {\n\t\treturn document.querySelector(\"[data-single-file-note-refs~=\\\"\" + containerElement.dataset.noteId + \"\\\"]\") || document.documentElement;\n\t}\n\n\tfunction addNoteRef(anchorElement, noteId) {\n\t\tconst noteRefs = getNoteRefs(anchorElement);\n\t\tnoteRefs.push(noteId);\n\t\tsetNoteRefs(anchorElement, noteRefs);\n\t}\n\n\tfunction deleteNoteRef(containerElement, noteId) {\n\t\tconst anchorElement = getAnchorElement(containerElement);\n\t\tconst noteRefs = getNoteRefs(anchorElement).filter(noteRefs => noteRefs != noteId);\n\t\tif (noteRefs.length) {\n\t\t\tsetNoteRefs(anchorElement, noteRefs);\n\t\t} else {\n\t\t\tdelete anchorElement.dataset.singleFileNoteRefs;\n\t\t}\n\t}\n\n\tfunction getNoteRefs(anchorElement) {\n\t\treturn anchorElement.dataset.singleFileNoteRefs ? anchorElement.dataset.singleFileNoteRefs.split(\" \") : [];\n\t}\n\n\tfunction setNoteRefs(anchorElement, noteRefs) {\n\t\tanchorElement.dataset.singleFileNoteRefs = noteRefs.join(\" \");\n\t}\n\n\tfunction minifyText(text) {\n\t\treturn text.replace(/[\\n\\t\\s]+/g, \" \");\n\t}\n\n\tfunction isAncestor(element, otherElement) {\n\t\treturn otherElement.parentElement && (element == otherElement.parentElement || isAncestor(element, otherElement.parentElement));\n\t}\n\n\tfunction getShadowRoot(element) {\n\t\tconst chrome = window.chrome;\n\t\tif (element.openOrClosedShadowRoot) {\n\t\t\treturn element.openOrClosedShadowRoot;\n\t\t} else if (chrome && chrome.dom && chrome.dom.openOrClosedShadowRoot) {\n\t\t\ttry {\n\t\t\t\treturn chrome.dom.openOrClosedShadowRoot(element);\n\t\t\t\t/* eslint-disable-next-line no-unused-vars */\n\t\t\t} catch (error) {\n\t\t\t\treturn element.shadowRoot;\n\t\t\t}\n\t\t} else {\n\t\t\treturn element.shadowRoot;\n\t\t}\n\t}\n\n\tfunction detectSavedPage(document) {\n\t\tconst firstDocumentChild = document.documentElement.firstChild;\n\t\treturn firstDocumentChild.nodeType == Node.COMMENT_NODE &&\n\t\t\t(firstDocumentChild.textContent.includes(COMMENT_HEADER) || firstDocumentChild.textContent.includes(COMMENT_HEADER_LEGACY));\n\t}\n\n})(typeof globalThis == \"object\" ? globalThis : window);"
  },
  {
    "path": "src/ui/content/content-ui.js",
    "content": "/*\n * Copyright 2010-2020 Gildas Lormeau\n * contact : gildas.lormeau <at> gmail.com\n * \n * This file is part of SingleFile.\n *\n *   The code in this file is free software: you can redistribute it and/or \n *   modify it under the terms of the GNU Affero General Public License \n *   (GNU AGPL) as published by the Free Software Foundation, either version 3\n *   of the License, or (at your option) any later version.\n * \n *   The code in this file is distributed in the hope that it will be useful, \n *   but WITHOUT ANY WARRANTY; without even the implied warranty of \n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero \n *   General Public License for more details.\n *\n *   As additional permission under GNU AGPL version 3 section 7, you may \n *   distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU \n *   AGPL normally required by section 4, provided you include this license \n *   notice and a URL through which recipients can access the Corresponding \n *   Source.\n */\n\n/* global browser, document, prompt, getComputedStyle, addEventListener, removeEventListener, requestAnimationFrame, setTimeout, getSelection, Node, URL */\n\nconst singlefile = globalThis.singlefile;\n\nconst SELECTED_CONTENT_ATTRIBUTE_NAME = singlefile.helper.SELECTED_CONTENT_ATTRIBUTE_NAME;\n\nconst MASK_TAGNAME = \"singlefile-mask\";\nconst MASK_CONTENT_CLASSNAME = \"singlefile-mask-content\";\nconst PROGRESSBAR_CLASSNAME = \"singlefile-progress-bar\";\nconst PROGRESSBAR_CONTENT_CLASSNAME = \"singlefile-progress-bar-content\";\nconst SELECTION_ZONE_TAGNAME = \"single-file-selection-zone\";\nconst LOGS_WINDOW_TAGNAME = \"singlefile-logs-window\";\nconst LOGS_CLASSNAME = \"singlefile-logs\";\nconst LOGS_LINE_CLASSNAME = \"singlefile-logs-line\";\nconst LOGS_LINE_TEXT_ELEMENT_CLASSNAME = \"singlefile-logs-line-text\";\nconst LOGS_LINE_STATUS_ELEMENT_CLASSNAME = \"singlefile-logs-line-icon\";\nconst SINGLE_FILE_UI_ELEMENT_CLASS = singlefile.helper.SINGLE_FILE_UI_ELEMENT_CLASS;\nconst SELECT_PX_THRESHOLD = 8;\nconst CSS_PROPERTIES = new Set(Array.from(getComputedStyle(document.documentElement)));\nlet LOG_PANEL_WIDTH, LOG_PANEL_DEFERRED_IMAGES_MESSAGE, LOG_PANEL_FRAME_CONTENTS_MESSAGE, LOG_PANEL_EMBEDDED_IMAGE_MESSAGE, LOG_PANEL_STEP_MESSAGE;\ntry {\n\tLOG_PANEL_WIDTH = browser.i18n.getMessage(\"logPanelWidth\");\n\tLOG_PANEL_DEFERRED_IMAGES_MESSAGE = browser.i18n.getMessage(\"logPanelDeferredImages\");\n\tLOG_PANEL_FRAME_CONTENTS_MESSAGE = browser.i18n.getMessage(\"logPanelFrameContents\");\n\tLOG_PANEL_EMBEDDED_IMAGE_MESSAGE = browser.i18n.getMessage(\"logPanelEmbeddedImage\");\n\tLOG_PANEL_STEP_MESSAGE = browser.i18n.getMessage(\"logPanelStep\");\n\t// eslint-disable-next-line no-unused-vars\n} catch (error) {\n\t// ignored\n}\n\nlet selectedAreaElement, logsWindowElement;\ncreateLogsWindowElement();\n\nexport {\n\tgetSelectedLinks,\n\tmarkSelection,\n\tunmarkSelection,\n\tpromptMessage as prompt,\n\tsetVisible,\n\tonStartPage,\n\tonEndPage,\n\tonLoadResource,\n\tonInsertingEmbeddedImage,\n\tonInsertEmbeddedImage,\n\tonLoadingDeferResources,\n\tonLoadDeferResources,\n\tonLoadingFrames,\n\tonLoadFrames,\n\tonStartStage,\n\tonEndStage,\n\tonPageLoading,\n\tonLoadPage\n};\n\nfunction promptMessage(message, defaultValue) {\n\treturn prompt(message, defaultValue);\n}\n\nfunction setVisible(visible) {\n\tconst maskElement = document.querySelector(MASK_TAGNAME);\n\tif (maskElement) {\n\t\tmaskElement.style.setProperty(\"display\", visible ? \"block\" : \"none\");\n\t}\n\tif (logsWindowElement) {\n\t\tlogsWindowElement.style.setProperty(\"display\", visible ? \"block\" : \"none\");\n\t}\n}\n\nfunction onStartPage(options) {\n\tlet maskElement = document.querySelector(MASK_TAGNAME);\n\tif (!maskElement) {\n\t\tif (options.logsEnabled) {\n\t\t\tdocument.documentElement.appendChild(logsWindowElement);\n\t\t}\n\t\tif (options.shadowEnabled) {\n\t\t\tconst maskElement = createMaskElement();\n\t\t\tif (options.progressBarEnabled) {\n\t\t\t\tcreateProgressBarElement(maskElement);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction onEndPage() {\n\tconst maskElement = document.querySelector(MASK_TAGNAME);\n\tif (maskElement) {\n\t\tmaskElement.remove();\n\t}\n\tlogsWindowElement.remove();\n\tclearLogs();\n}\n\nfunction onLoadResource(index, maxIndex, options) {\n\tif (options.shadowEnabled && options.progressBarEnabled) {\n\t\tupdateProgressBar(index, maxIndex);\n\t}\n}\n\nfunction onLoadingDeferResources(options) {\n\tupdateLog(\"load-deferred-images\", LOG_PANEL_DEFERRED_IMAGES_MESSAGE, \"…\", options);\n}\n\nfunction onLoadDeferResources(options) {\n\tupdateLog(\"load-deferred-images\", LOG_PANEL_DEFERRED_IMAGES_MESSAGE, \"✓\", options);\n}\n\nfunction onInsertingEmbeddedImage(options) {\n\tupdateLog(\"insert-embedded-image\", LOG_PANEL_EMBEDDED_IMAGE_MESSAGE, \"…\", options);\n}\n\nfunction onInsertEmbeddedImage(options) {\n\tupdateLog(\"insert-embedded-image\", LOG_PANEL_EMBEDDED_IMAGE_MESSAGE, \"✓\", options);\n}\n\nfunction onLoadingFrames(options) {\n\tupdateLog(\"load-frames\", LOG_PANEL_FRAME_CONTENTS_MESSAGE, \"…\", options);\n}\n\nfunction onLoadFrames(options) {\n\tupdateLog(\"load-frames\", LOG_PANEL_FRAME_CONTENTS_MESSAGE, \"✓\", options);\n}\n\nfunction onStartStage(step, options) {\n\tupdateLog(\"step-\" + step, `${LOG_PANEL_STEP_MESSAGE} ${step + 1} / 3`, \"…\", options);\n}\n\nfunction onEndStage(step, options) {\n\tupdateLog(\"step-\" + step, `${LOG_PANEL_STEP_MESSAGE} ${step + 1} / 3`, \"✓\", options);\n}\n\nfunction onPageLoading() { }\n\nfunction onLoadPage() { }\n\nfunction getSelectedLinks() {\n\tlet selectionFound;\n\tconst links = [];\n\tconst selection = getSelection();\n\tfor (let indexRange = 0; indexRange < selection.rangeCount; indexRange++) {\n\t\tlet range = selection.getRangeAt(indexRange);\n\t\tif (range && range.commonAncestorContainer) {\n\t\t\tconst treeWalker = document.createTreeWalker(range.commonAncestorContainer);\n\t\t\tlet rangeSelectionFound = false;\n\t\t\tlet finished = false;\n\t\t\twhile (!finished) {\n\t\t\t\tif (rangeSelectionFound || treeWalker.currentNode == range.startContainer || treeWalker.currentNode == range.endContainer) {\n\t\t\t\t\trangeSelectionFound = true;\n\t\t\t\t\tif (range.startContainer != range.endContainer || range.startOffset != range.endOffset) {\n\t\t\t\t\t\tselectionFound = true;\n\t\t\t\t\t\tif (treeWalker.currentNode.tagName == \"A\" && treeWalker.currentNode.href) {\n\t\t\t\t\t\t\tconst url = new URL(treeWalker.currentNode.href);\n\t\t\t\t\t\t\turl.hash = \"\";\n\t\t\t\t\t\t\tlinks.push(url.href);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (treeWalker.currentNode == range.endContainer) {\n\t\t\t\t\tfinished = true;\n\t\t\t\t} else {\n\t\t\t\t\ttreeWalker.nextNode();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (selectionFound && treeWalker.currentNode == range.endContainer && treeWalker.currentNode.querySelectorAll) {\n\t\t\t\ttreeWalker.currentNode.querySelectorAll(\"*\").forEach(descendantElement => {\n\t\t\t\t\tif (descendantElement.tagName == \"A\" && descendantElement.href) {\n\t\t\t\t\t\tconst url = new URL(descendantElement.href);\n\t\t\t\t\t\turl.hash = \"\";\n\t\t\t\t\t\tlinks.push(url.href);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn Array.from(new Set(links));\n}\n\nasync function markSelection(optionallySelected) {\n\tlet selectionFound = markSelectedContent();\n\tif (selectionFound || optionallySelected) {\n\t\treturn selectionFound;\n\t} else {\n\t\tselectionFound = await selectArea();\n\t\tif (selectionFound) {\n\t\t\treturn markSelectedContent();\n\t\t}\n\t}\n}\n\nfunction markSelectedContent() {\n\tconst selection = getSelection();\n\tlet selectionFound;\n\tfor (let indexRange = 0; indexRange < selection.rangeCount; indexRange++) {\n\t\tlet range = selection.getRangeAt(indexRange);\n\t\tif (range && range.commonAncestorContainer) {\n\t\t\tconst treeWalker = document.createTreeWalker(range.commonAncestorContainer);\n\t\t\tlet rangeSelectionFound = false;\n\t\t\tlet finished = false;\n\t\t\twhile (!finished) {\n\t\t\t\tif (rangeSelectionFound || treeWalker.currentNode == range.startContainer || treeWalker.currentNode == range.endContainer) {\n\t\t\t\t\trangeSelectionFound = true;\n\t\t\t\t\tif (range.startContainer != range.endContainer || range.startOffset != range.endOffset) {\n\t\t\t\t\t\tselectionFound = true;\n\t\t\t\t\t\tmarkSelectedNode(treeWalker.currentNode);\n\t\t\t\t\t}\n\t\t\t\t\tif (range.startContainer === range.endContainer && selection.rangeCount == 1 && range.startOffset == 0 && range.endOffset == 0) {\n\t\t\t\t\t\tif (range.startContainer.tagName === \"IMG\" || range.startContainer.tagName === \"VIDEO\") {\n\t\t\t\t\t\t\tselectionFound = true;\n\t\t\t\t\t\t\tmarkSelectedNode(treeWalker.currentNode);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (selectionFound && treeWalker.currentNode == range.startContainer) {\n\t\t\t\t\tmarkSelectedParents(treeWalker.currentNode);\n\t\t\t\t}\n\t\t\t\tif (treeWalker.currentNode == range.endContainer) {\n\t\t\t\t\tfinished = true;\n\t\t\t\t} else {\n\t\t\t\t\ttreeWalker.nextNode();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (selectionFound && treeWalker.currentNode == range.endContainer && treeWalker.currentNode.querySelectorAll) {\n\t\t\t\tfor (\n\t\t\t\t\tlet offset = range.startContainer === range.endContainer ? range.startOffset : 0;\n\t\t\t\t\toffset < range.endOffset;\n\t\t\t\t\toffset++\n\t\t\t\t) {\n\t\t\t\t\tconst node = range.endContainer.childNodes[offset];\n\t\t\t\t\tif (node) {\n\t\t\t\t\t\tmarkSelectedNode(node);\n\t\t\t\t\t\tif (node.querySelectorAll) {\n\t\t\t\t\t\t\tnode.querySelectorAll(\"*\").forEach(markSelectedNode);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn selectionFound;\n}\n\nfunction markSelectedNode(node) {\n\tconst element = node.nodeType == Node.ELEMENT_NODE ? node : node.parentElement;\n\telement.setAttribute(SELECTED_CONTENT_ATTRIBUTE_NAME, \"\");\n}\n\nfunction markSelectedParents(node) {\n\tif (node.parentElement) {\n\t\tmarkSelectedNode(node);\n\t\tmarkSelectedParents(node.parentElement);\n\t}\n}\n\nfunction unmarkSelection() {\n\tdocument.querySelectorAll(\"[\" + SELECTED_CONTENT_ATTRIBUTE_NAME + \"]\").forEach(selectedContent => selectedContent.removeAttribute(SELECTED_CONTENT_ATTRIBUTE_NAME));\n}\n\nfunction selectArea() {\n\treturn new Promise(resolve => {\n\t\tlet selectedRanges = [];\n\t\taddEventListener(\"mousemove\", mousemoveListener, true);\n\t\taddEventListener(\"click\", clickListener, true);\n\t\taddEventListener(\"keyup\", keypressListener, true);\n\t\tdocument.addEventListener(\"contextmenu\", contextmenuListener, true);\n\t\tgetSelection().removeAllRanges();\n\n\t\tfunction contextmenuListener(event) {\n\t\t\tselectedRanges = [];\n\t\t\tselect();\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tfunction mousemoveListener(event) {\n\t\t\tconst targetElement = getTarget(event);\n\t\t\tif (targetElement) {\n\t\t\t\tselectedAreaElement = targetElement;\n\t\t\t\tmoveAreaSelector(targetElement);\n\t\t\t}\n\t\t}\n\n\t\tfunction clickListener(event) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tif (event.button == 0) {\n\t\t\t\tselect(selectedAreaElement, event.ctrlKey);\n\t\t\t} else {\n\t\t\t\tcancel();\n\t\t\t}\n\t\t}\n\n\t\tfunction keypressListener(event) {\n\t\t\tif (event.key == \"Escape\") {\n\t\t\t\tcancel();\n\t\t\t}\n\t\t}\n\n\t\tfunction cancel() {\n\t\t\tif (selectedRanges.length) {\n\t\t\t\tgetSelection().removeAllRanges();\n\t\t\t}\n\t\t\tselectedRanges = [];\n\t\t\tcleanupAndResolve();\n\t\t}\n\n\t\tfunction select(selectedElement, multiSelect) {\n\t\t\tif (selectedElement) {\n\t\t\t\tif (!multiSelect) {\n\t\t\t\t\trestoreSelectedRanges();\n\t\t\t\t}\n\t\t\t\tconst range = document.createRange();\n\t\t\t\trange.selectNodeContents(selectedElement);\n\t\t\t\tcleanupSelectionRanges();\n\t\t\t\tgetSelection().addRange(range);\n\t\t\t\tsaveSelectedRanges();\n\t\t\t\tif (!multiSelect) {\n\t\t\t\t\tcleanupAndResolve();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcleanupAndResolve();\n\t\t\t}\n\t\t}\n\n\t\tfunction cleanupSelectionRanges() {\n\t\t\tconst selection = getSelection();\n\t\t\tfor (let indexRange = selection.rangeCount - 1; indexRange >= 0; indexRange--) {\n\t\t\t\tconst range = selection.getRangeAt(indexRange);\n\t\t\t\tif (range.startOffset == range.endOffset) {\n\t\t\t\t\tselection.removeRange(range);\n\t\t\t\t\tindexRange--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction cleanupAndResolve() {\n\t\t\tgetAreaSelector().remove();\n\t\t\tremoveEventListener(\"mousemove\", mousemoveListener, true);\n\t\t\tremoveEventListener(\"click\", clickListener, true);\n\t\t\tremoveEventListener(\"keyup\", keypressListener, true);\n\t\t\tselectedAreaElement = null;\n\t\t\tresolve(Boolean(selectedRanges.length));\n\t\t\tsetTimeout(() => document.removeEventListener(\"contextmenu\", contextmenuListener, true), 0);\n\t\t}\n\n\t\tfunction restoreSelectedRanges() {\n\t\t\tgetSelection().removeAllRanges();\n\t\t\tselectedRanges.forEach(range => getSelection().addRange(range));\n\t\t}\n\n\t\tfunction saveSelectedRanges() {\n\t\t\tselectedRanges = [];\n\t\t\tfor (let indexRange = 0; indexRange < getSelection().rangeCount; indexRange++) {\n\t\t\t\tconst range = getSelection().getRangeAt(indexRange);\n\t\t\t\tselectedRanges.push(range);\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction getTarget(event) {\n\tlet newTarget, target = event.target, boundingRect = target.getBoundingClientRect();\n\tnewTarget = determineTargetElement(\"floor\", target, event.clientX - boundingRect.left, getMatchedParents(target, \"left\"));\n\tif (newTarget == target) {\n\t\tnewTarget = determineTargetElement(\"ceil\", target, boundingRect.left + boundingRect.width - event.clientX, getMatchedParents(target, \"right\"));\n\t}\n\tif (newTarget == target) {\n\t\tnewTarget = determineTargetElement(\"floor\", target, event.clientY - boundingRect.top, getMatchedParents(target, \"top\"));\n\t}\n\tif (newTarget == target) {\n\t\tnewTarget = determineTargetElement(\"ceil\", target, boundingRect.top + boundingRect.height - event.clientY, getMatchedParents(target, \"bottom\"));\n\t}\n\ttarget = newTarget;\n\twhile (target && target.clientWidth <= SELECT_PX_THRESHOLD && target.clientHeight <= SELECT_PX_THRESHOLD) {\n\t\ttarget = target.parentElement;\n\t}\n\treturn target;\n}\n\nfunction moveAreaSelector(target) {\n\trequestAnimationFrame(() => {\n\t\tconst selectorElement = getAreaSelector();\n\t\tconst boundingRect = target.getBoundingClientRect();\n\t\tconst scrollingElement = document.scrollingElement || document.documentElement;\n\t\tselectorElement.style.setProperty(\"top\", (scrollingElement.scrollTop + boundingRect.top - 10) + \"px\");\n\t\tselectorElement.style.setProperty(\"left\", (scrollingElement.scrollLeft + boundingRect.left - 10) + \"px\");\n\t\tselectorElement.style.setProperty(\"width\", (boundingRect.width + 20) + \"px\");\n\t\tselectorElement.style.setProperty(\"height\", (boundingRect.height + 20) + \"px\");\n\t});\n}\n\nfunction getAreaSelector() {\n\tlet selectorElement = document.querySelector(SELECTION_ZONE_TAGNAME);\n\tif (!selectorElement) {\n\t\tselectorElement = createElement(SELECTION_ZONE_TAGNAME, document.body);\n\t\tselectorElement.style.setProperty(\"box-sizing\", \"border-box\", \"important\");\n\t\tselectorElement.style.setProperty(\"background-color\", \"#3ea9d7\", \"important\");\n\t\tselectorElement.style.setProperty(\"border\", \"10px solid #0b4892\", \"important\");\n\t\tselectorElement.style.setProperty(\"border-radius\", \"2px\", \"important\");\n\t\tselectorElement.style.setProperty(\"opacity\", \".25\", \"important\");\n\t\tselectorElement.style.setProperty(\"pointer-events\", \"none\", \"important\");\n\t\tselectorElement.style.setProperty(\"position\", \"absolute\", \"important\");\n\t\tselectorElement.style.setProperty(\"transition\", \"all 100ms\", \"important\");\n\t\tselectorElement.style.setProperty(\"cursor\", \"pointer\", \"important\");\n\t\tselectorElement.style.setProperty(\"z-index\", \"2147483647\", \"important\");\n\t\tselectorElement.style.removeProperty(\"border-inline-end\");\n\t\tselectorElement.style.removeProperty(\"border-inline-start\");\n\t\tselectorElement.style.removeProperty(\"inline-size\");\n\t\tselectorElement.style.removeProperty(\"block-size\");\n\t\tselectorElement.style.removeProperty(\"inset-block-start\");\n\t\tselectorElement.style.removeProperty(\"inset-inline-end\");\n\t\tselectorElement.style.removeProperty(\"inset-block-end\");\n\t\tselectorElement.style.removeProperty(\"inset-inline-start\");\n\t}\n\treturn selectorElement;\n}\n\nfunction createMaskElement() {\n\ttry {\n\t\tlet maskElement = document.querySelector(MASK_TAGNAME);\n\t\tif (!maskElement) {\n\t\t\tmaskElement = createElement(MASK_TAGNAME, document.documentElement);\n\t\t\tconst shadowRoot = maskElement.attachShadow({ mode: \"open\" });\n\t\t\tconst styleElement = document.createElement(\"style\");\n\t\t\tstyleElement.textContent = `\n\t\t\t\t@keyframes single-file-progress { \n\t\t\t\t\t0% { \n\t\t\t\t\t\tleft: -50px;\n\t\t\t\t\t} \n\t\t\t\t\t100% { \n\t\t\t\t\t\tleft: 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t.${PROGRESSBAR_CLASSNAME} {\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\ttop: 0;\n\t\t\t\t\tleft: 0;\n\t\t\t\t\twidth: 0;\n\t\t\t\t\theight: 8px;\n\t\t\t\t\tz-index: 2147483646;\n\t\t\t\t\topacity: .5;\n\t\t\t\t\toverflow: hidden;\t\t\t\t\t\n\t\t\t\t\ttransition: width 200ms ease-in-out;\n\t\t\t\t}\n\t\t\t\t.${PROGRESSBAR_CONTENT_CLASSNAME} {\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\tleft: 0;\n\t\t\t\t\tanimation: single-file-progress 3s linear infinite reverse;\n\t\t\t\t\tbackground: \n\t\t\t\t\t\twhite \n\t\t\t\t\t\tlinear-gradient(-45deg, rgba(0, 0, 0, 0.075) 25%, \n\t\t\t\t\t\t\ttransparent 25%, \n\t\t\t\t\t\t\ttransparent 50%, \n\t\t\t\t\t\t\trgba(0, 0, 0, 0.075) 50%, \n\t\t\t\t\t\t\trgba(0, 0, 0, 0.075) 75%, \n\t\t\t\t\t\t\ttransparent 75%, transparent)\n\t\t\t\t\t\trepeat scroll 0% 0% / 50px 50px padding-box border-box;\n\t\t\t\t\twidth: calc(100% + 50px);\n\t\t\t\t\theight: 100%;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t.${MASK_CONTENT_CLASSNAME} {\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\ttop: 0;\n\t\t\t\t\tleft: 0;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 100%;\n\t\t\t\t\tz-index: 2147483646;\n\t\t\t\t\topacity: 0;\n\t\t\t\t\tbackground-color: black;\n\t\t\t\t\ttransition: opacity 250ms;\n\t\t\t\t}\n\t\t\t`;\n\t\t\tshadowRoot.appendChild(styleElement);\n\t\t\tlet maskElementContent = document.createElement(\"div\");\n\t\t\tmaskElementContent.classList.add(MASK_CONTENT_CLASSNAME);\n\t\t\tshadowRoot.appendChild(maskElementContent);\n\t\t\tmaskElement.offsetWidth;\n\t\t\tmaskElementContent.style.setProperty(\"opacity\", .3);\n\t\t\tmaskElement.offsetWidth;\n\t\t}\n\t\treturn maskElement;\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nfunction createProgressBarElement(maskElement) {\n\ttry {\n\t\tlet progressBarElement = maskElement.shadowRoot.querySelector(\".\" + PROGRESSBAR_CLASSNAME);\n\t\tif (!progressBarElement) {\n\t\t\tlet progressBarContent = document.createElement(\"div\");\n\t\t\tprogressBarContent.classList.add(PROGRESSBAR_CLASSNAME);\n\t\t\tmaskElement.shadowRoot.appendChild(progressBarContent);\n\t\t\tconst progressBarContentElement = document.createElement(\"div\");\n\t\t\tprogressBarContentElement.classList.add(PROGRESSBAR_CONTENT_CLASSNAME);\n\t\t\tprogressBarContent.appendChild(progressBarContentElement);\n\t\t}\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nfunction createLogsWindowElement() {\n\ttry {\n\t\tlogsWindowElement = document.querySelector(LOGS_WINDOW_TAGNAME);\n\t\tif (!logsWindowElement) {\n\t\t\tlogsWindowElement = createElement(LOGS_WINDOW_TAGNAME);\n\t\t\tconst shadowRoot = logsWindowElement.attachShadow({ mode: \"open\" });\n\t\t\tconst styleElement = document.createElement(\"style\");\n\t\t\tstyleElement.textContent = `\n\t\t\t\t@keyframes single-file-pulse { \n\t\t\t\t\t0% { \n\t\t\t\t\t\topacity: .25;\n\t\t\t\t\t} \n\t\t\t\t\t100% { \n\t\t\t\t\t\topacity: 1;\n\t\t\t\t\t} \n\t\t\t\t}\n\t\t\t\t.${LOGS_CLASSNAME} {\n\t\t\t\t\tposition: fixed;\n\t\t\t\t\tbottom: 24px;\n\t\t\t\t\tleft: 8px;\n\t\t\t\t\tz-index: 2147483647;\n\t\t\t\t\topacity: 0.9;\n\t\t\t\t\tpadding: 4px;\n\t\t\t\t\tbackground-color: white;\n\t\t\t\t\tmin-width: ${LOG_PANEL_WIDTH}px;\n\t\t\t\t\tmin-height: 16px;\n\t\t\t\t\ttransition: height 100ms;\n\t\t\t\t}\n\t\t\t\t.${LOGS_LINE_CLASSNAME} {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: space-between;\n\t\t\t\t\tpadding: 2px;\n\t\t\t\t\tfont-family: arial, sans-serif;\n\t\t\t\t\tcolor: black;\n\t\t\t\t\tbackground-color: white;\n\t\t\t\t}\n\t\t\t\t.${LOGS_LINE_TEXT_ELEMENT_CLASSNAME} {\n\t\t\t\t\tfont-size: 13px;\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransition: opacity 200ms;\n\t\t\t\t}\n\t\t\t\t.${LOGS_LINE_STATUS_ELEMENT_CLASSNAME} {\n\t\t\t\t\tfont-size: 11px;\n\t\t\t\t\tmin-width: 15px;\n\t\t\t\t\ttext-align: center;\n\t\t\t\t\tposition: relative;\n\t\t\t\t\ttop: 1px;\n\t\t\t\t}\n\t\t\t`;\n\t\t\tshadowRoot.appendChild(styleElement);\n\t\t\tconst logsContentElement = document.createElement(\"div\");\n\t\t\tlogsContentElement.classList.add(LOGS_CLASSNAME);\n\t\t\tshadowRoot.appendChild(logsContentElement);\n\t\t}\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nfunction updateLog(id, textContent, textStatus, options) {\n\ttry {\n\t\tif (options.logsEnabled) {\n\t\t\tconst logsContentElement = logsWindowElement.shadowRoot.querySelector(\".\" + LOGS_CLASSNAME);\n\t\t\tlet lineElement = logsContentElement.querySelector(\"[data-id='\" + id + \"']\");\n\t\t\tif (!lineElement) {\n\t\t\t\tlineElement = document.createElement(\"div\");\n\t\t\t\tlineElement.classList.add(LOGS_LINE_CLASSNAME);\n\t\t\t\tlogsContentElement.appendChild(lineElement);\n\t\t\t\tlineElement.setAttribute(\"data-id\", id);\n\t\t\t\tconst textElement = document.createElement(\"div\");\n\t\t\t\ttextElement.classList.add(LOGS_LINE_TEXT_ELEMENT_CLASSNAME);\n\t\t\t\tlineElement.appendChild(textElement);\n\t\t\t\ttextElement.textContent = textContent;\n\t\t\t\tconst statusElement = document.createElement(\"div\");\n\t\t\t\tstatusElement.classList.add(LOGS_LINE_STATUS_ELEMENT_CLASSNAME);\n\t\t\t\tlineElement.appendChild(statusElement);\n\t\t\t}\n\t\t\tupdateLogLine(lineElement, textContent, textStatus);\n\t\t}\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nfunction updateLogLine(lineElement, textContent, textStatus) {\n\tconst textElement = lineElement.childNodes[0];\n\tconst statusElement = lineElement.childNodes[1];\n\ttextElement.textContent = textContent;\n\tstatusElement.style.setProperty(\"color\", textStatus == \"✓\" ? \"#055000\" : \"black\");\n\tif (textStatus == \"✓\") {\n\t\ttextElement.style.setProperty(\"opacity\", \".5\");\n\t\tstatusElement.style.setProperty(\"opacity\", \".5\");\n\t\tstatusElement.style.setProperty(\"animation\", \"none\");\n\t} else {\n\t\tstatusElement.style.setProperty(\"animation\", \"1s ease-in-out 0s infinite alternate none running single-file-pulse\");\n\t}\n\tstatusElement.textContent = textStatus;\n}\n\nfunction updateProgressBar(index, maxIndex) {\n\ttry {\n\t\tconst maskElement = document.querySelector(MASK_TAGNAME);\n\t\tif (maskElement) {\n\t\t\tconst progressBarElement = maskElement.shadowRoot.querySelector(\".\" + PROGRESSBAR_CLASSNAME);\n\t\t\tif (progressBarElement && maxIndex) {\n\t\t\t\tconst width = Math.floor((index / maxIndex) * 100) + \"%\";\n\t\t\t\tif (progressBarElement.style.getPropertyValue(\"width\") != width) {\n\t\t\t\t\tprogressBarElement.style.setProperty(\"width\", width);\n\t\t\t\t\tprogressBarElement.offsetWidth;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// eslint-disable-next-line no-unused-vars\n\t} catch (error) {\n\t\t// ignored\n\t}\n}\n\nfunction clearLogs() {\n\tcreateLogsWindowElement();\n}\n\nfunction getMatchedParents(target, property) {\n\tlet element = target, matchedParent, parents = [];\n\tdo {\n\t\tconst boundingRect = element.getBoundingClientRect();\n\t\tif (element.parentElement) {\n\t\t\tconst parentBoundingRect = element.parentElement.getBoundingClientRect();\n\t\t\tmatchedParent = Math.abs(parentBoundingRect[property] - boundingRect[property]) <= SELECT_PX_THRESHOLD;\n\t\t\tif (matchedParent) {\n\t\t\t\tif (element.parentElement.clientWidth > SELECT_PX_THRESHOLD && element.parentElement.clientHeight > SELECT_PX_THRESHOLD &&\n\t\t\t\t\t((element.parentElement.clientWidth - element.clientWidth > SELECT_PX_THRESHOLD) || (element.parentElement.clientHeight - element.clientHeight > SELECT_PX_THRESHOLD))) {\n\t\t\t\t\tparents.push(element.parentElement);\n\t\t\t\t}\n\t\t\t\telement = element.parentElement;\n\t\t\t}\n\t\t} else {\n\t\t\tmatchedParent = false;\n\t\t}\n\t} while (matchedParent && element);\n\treturn parents;\n}\n\nfunction determineTargetElement(roundingMethod, target, widthDistance, parents) {\n\tif (Math[roundingMethod](widthDistance / SELECT_PX_THRESHOLD) <= parents.length) {\n\t\ttarget = parents[parents.length - Math[roundingMethod](widthDistance / SELECT_PX_THRESHOLD) - 1];\n\t}\n\treturn target;\n}\n\nfunction createElement(tagName, parentElement) {\n\tconst element = document.createElement(tagName);\n\telement.className = SINGLE_FILE_UI_ELEMENT_CLASS;\n\tif (parentElement) {\n\t\tparentElement.appendChild(element);\n\t}\n\tCSS_PROPERTIES.forEach(property => element.style.setProperty(property, \"initial\", \"important\"));\n\treturn element;\n}"
  },
  {
    "path": "src/ui/pages/batch-save-urls.css",
    "content": "html {\r\n    background-color: #f0f0f0;\r\n    color: black;\r\n}\r\n\r\nbody {\r\n    margin: 0;\r\n    margin-left: 5px;\r\n    margin-right: 5px;\r\n}\r\n\r\nmain,\r\nheader {\r\n    font-family: sans-serif;\r\n}\r\n\r\nbody>main {\r\n    background-color: #fff;\r\n    border: solid 1px rgb(191, 191, 191);\r\n    position: relative;\r\n}\r\n\r\nbody>main,\r\nbody>header,\r\nbody>footer {\r\n    font-size: 12px;\r\n    font-family: sans-serif;\r\n    margin: 0;\r\n    margin-left: auto;\r\n    margin-right: auto;\r\n    max-width: 1024px;\r\n}\r\n\r\nbody>header,\r\nbody>footer {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: flex-end;\r\n}\r\n\r\n#filterPanel {\r\n    position: absolute;\r\n    top: 38px;\r\n    left: 8px;\r\n    width: calc(100% - 24px);\r\n}\r\n\r\n#filterPanel input {\r\n    width: 100%;\r\n    border: dotted 1px #3e3e3e;\r\n    font-size: 12px;\r\n}\r\n\r\n#filterButton {\r\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAwCAYAAABnjuimAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV/TakUqIu0g4pChOlkoKuIoVSyChdJWaNXB5NIvaNKQpLg4Cq4FBz8Wqw4uzro6uAqC4AeIo5OToouU+L+k0CLWg+N+vLv3uHsHCI0KU01fFFA1y0jFY2I2tyr6X+FDL4KIYkhipp5IL2bQdXzdw8PXuwjP6n7uzzGg5E0GeETiOaYbFvEG8cympXPeJw6xkqQQnxNPGHRB4keuyy6/cS46LPDMkJFJzROHiMViB8sdzEqGSjxNHFZUjfKFrMsK5y3OaqXGWvfkLwzktZU012mOIo4lJJCECBk1lFGBhQitGikmUrQf6+IfcfxJcsnkKoORYwFVqJAcP/gf/O7WLExNukmBGNDzYtsfY4B/F2jWbfv72LabJ4D3GbjS2v5qA5j9JL3e1sJHwOA2cHHd1uQ94HIHGH7SJUNyJC9NoVAA3s/om3JA8BboX3N7a+3j9AHIUFfLN8DBITBepOz1Lu/u6+zt3zOt/n4AehRyqjxXv90AAAAGYktHRACKAIoAiuPa5yQAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfmBAYUEAJjwdPyAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAJFJREFUWMPt1zkOwCAMRFEPyv2vTJrUWQAvKH8aJDDihUCBGSHkX9HV9urGtsuONg4V2eTWW8HbrztoFaweOwpg9bozEavPAwlYDQ8GYjVdEIDVsiJHrJYXOmDlVrwQK/cJC7AKmzSBVejXDWJl0b9hADu9Dk8RoECBAgUKFGiJHNmvy2yoqu+oKh+fboSQfXIC3YMQPCS0R+8AAAAASUVORK5CYII=\");\r\n    filter: opacity(.25);\r\n    margin: 0px;\r\n    padding: 2px;\r\n    margin-bottom: 2px;\r\n    cursor: pointer;\r\n    transition: filter 200ms;\r\n    user-select: none;\r\n    width: 11px;\r\n    height: 13px;\r\n    margin-right: 10px;\r\n    background-size: contain;\r\n    background-repeat: no-repeat;\r\n}\r\n\r\n#filterButton:hover {\r\n    filter: opacity(.5);\r\n}\r\n\r\n#filterButton.filter-displayed {\r\n    filter: opacity(1);\r\n}\r\n\r\n.header-buttons {\r\n    display: flex;\r\n    width: 100%;\r\n}\r\n\r\n.header-buttons-group {\r\n    display: flex;\r\n    align-self: end;\r\n}\r\n\r\n.header-buttons>form {\r\n    flex: 1;\r\n    display: flex;\r\n    align-items: center;\r\n}\r\n\r\n.header-buttons>form>input {\r\n    background-color: white;\r\n    color: black;\r\n    min-height: 18px;\r\n    width: 100%;\r\n    flex: 1;\r\n    margin-top: 5px;\r\n    margin-bottom: 5px;\r\n    margin-left: 2px;\r\n    padding: 2px;\r\n    border: solid 1px rgb(191, 191, 191);\r\n}\r\n\r\nbutton {\r\n    background-color: #fbfbfb;\r\n    border-color: rgb(191, 191, 191);\r\n    border-style: solid;\r\n    border-radius: 2px;\r\n    border-width: 1px;\r\n    color: black;\r\n    white-space: nowrap;\r\n    cursor: pointer;\r\n}\r\n\r\nbutton:not(:disabled):hover {\r\n    background-color: #ededed;\r\n}\r\n\r\nbutton:disabled {\r\n    opacity: .25;\r\n    cursor: default;\r\n}\r\n\r\nbody>header button,\r\nbody>footer button {\r\n    margin-top: 5px;\r\n    margin-bottom: 5px;\r\n    align-self: flex-end;\r\n    padding: 5px;\r\n    padding-left: 10px;\r\n    padding-right: 10px;\r\n    margin-left: 8px;\r\n}\r\n\r\n.urls-row {\r\n    display: flex;\r\n    flex-direction: row;\r\n    padding-top: 5px;\r\n    padding-bottom: 5px;\r\n    min-height: 40px;\r\n    padding-left: 0px;\r\n}\r\n\r\n.urls-row:not(:first-child) {\r\n    border-top: #bfbfbf 1px dashed;\r\n}\r\n\r\n.urls-head {\r\n    background-color: #ececec;\r\n    padding-left: 5px;\r\n    display: flex;\r\n    flex-direction: row;\r\n}\r\n\r\n#URLLabel {\r\n    flex: 1;\r\n}\r\n\r\n.urls-row>span {\r\n    padding: 10px;\r\n    align-self: center;\r\n}\r\n\r\n.urls-head .unselected {\r\n    opacity: .5;\r\n}\r\n\r\n.result-url-title {\r\n    flex: 1;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    display: inline-block;\r\n    white-space: nowrap;\r\n    user-select: none;\r\n}\r\n\r\n.result-cancel {\r\n    text-align: right;\r\n    width: 19px;\r\n}\r\n\r\n.result-cancel button {\r\n    background-color: #fbfbfb;\r\n    width: 19px;\r\n    padding: 0;\r\n}\r\n\r\n.no-result {\r\n    color: #888;\r\n}\r\n\r\nhtml.side-panel body {\r\n    margin: 0;\r\n}\r\n\r\nhtml.side-panel,\r\n.side-panel .urls-head,\r\n.side-panel body>main {\r\n    background-color: #fbfbfb;\r\n}\r\n\r\n.side-panel .header-buttons {\r\n    display: flex;\r\n}\r\n\r\n.side-panel body>header,\r\n.side-panel body>main,\r\n.side-panel body>footer {\r\n    border: 0;\r\n    margin-left: 8px;\r\n    margin-right: 12px;\r\n}\r\n\r\n.side-panel .urls-head {\r\n    min-height: 0;\r\n    padding-top: 3px;\r\n}\r\n\r\n.side-panel #URLLabel, .side-panel #filterButton {\r\n    display: none;\r\n}\r\n\r\n.side-panel .urls-row>span,\r\n.side-panel .urls-row>span>span {\r\n    padding: 0px;\r\n}\r\n\r\n.side-panel .urls-head {\r\n    border-bottom: dashed 1px rgb(191, 191, 191);\r\n}\r\n\r\n.popup {\r\n    width: 100%;\r\n    height: 100%;\r\n    position: fixed;\r\n    top: 0;\r\n    left: 0;\r\n    background-color: rgba(191, 191, 191, .75);\r\n    display: none;\r\n}\r\n\r\n.popup-content {\r\n    align-self: center;\r\n    min-width: min(calc(100% - 16px), 480px);\r\n    max-width: calc(100% - 16px);\r\n    margin-top: 100px;\r\n    margin-bottom: 100px;\r\n    margin-left: auto;\r\n    margin-right: auto;\r\n    background-color: white;\r\n    box-shadow: 5px 5px #ababab;\r\n}\r\n\r\n.popup-content header {\r\n    padding-top: 10px;\r\n    padding-left: 10px;\r\n    padding-right: 10px;\r\n    padding-bottom: 20px;\r\n    font-size: 14px;\r\n    line-height: 20px;\r\n}\r\n\r\n.popup-content main {\r\n    padding-top: 10px;\r\n    padding-left: 10px;\r\n    padding-bottom: 10px;\r\n}\r\n\r\n.popup-content main textarea {\r\n    background-color: white;\r\n    color: black;\r\n    margin-bottom: 10px;\r\n    padding: 2px;\r\n    font-size: 13px;\r\n    margin-left: 0px;\r\n    width: calc(100% - 16px);\r\n    min-width: calc(100% - 16px);\r\n    max-width: calc(100% - 16px);\r\n    height: 60px;\r\n    min-height: 30px;\r\n}\r\n\r\n.popup-content footer {\r\n    text-align: right;\r\n    padding-left: 10px;\r\n    padding-right: 10px;\r\n}\r\n\r\n.popup-content footer button {\r\n    margin-bottom: 10px;\r\n    margin-left: 4px;\r\n}\r\n\r\n@media (max-width:450px) {\r\n\r\n    .header-buttons {\r\n        flex-direction: column;\r\n    }\r\n}\r\n\r\n@media (max-width:400px) {\r\n\r\n    body>main,\r\n    body>header,\r\n    .header-buttons button,\r\n    .footer-buttons button {\r\n        font-size: 11px;\r\n    }\r\n\r\n    #filterPanel {\r\n        top: 32px;\r\n    }\r\n\r\n    #filterPanel input {\r\n        height: 14px;\r\n    }\r\n\r\n    #filterButton {\r\n        height: 8px;\r\n        margin-bottom: 0px;\r\n        margin-right: 7px;\r\n    }\r\n\r\n    .header-buttons>form>input {\r\n        padding: 1px;\r\n    }\r\n\r\n    .urls-row {\r\n        padding-top: 3px;\r\n        padding-bottom: 3px;\r\n        min-height: 30px;\r\n    }\r\n\r\n    .side-panel .header-buttons {\r\n        top: 0px;\r\n    }\r\n}\r\n\r\n@media (max-width:300px) {\r\n    .side-panel :not(.result-cancel)>button {\r\n        display: flex;\r\n    }\r\n\r\n    .side-panel .header-buttons {\r\n        flex-direction: column;\r\n    }\r\n}\r\n\r\n@media (max-width:250px) {\r\n    .header-buttons>form {\r\n        flex-direction: column;\r\n    }\r\n}\r\n\r\n@media (max-width:200px) {\r\n    .header-buttons-group {\r\n        flex-direction: column;\r\n    }\r\n}\r\n\r\n@media (prefers-color-scheme: dark) {\r\n    html {\r\n        background-color: #373737;\r\n        color: #fdfdfd;\r\n    }\r\n\r\n    body>main {\r\n        border-color: rgb(81, 81, 81);\r\n    }\r\n\r\n    body>main,\r\n    button,\r\n    .popup-content {\r\n        background-color: #202023;\r\n        color: #fdfdfd;\r\n    }\r\n\r\n    #filterButton {\r\n        background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAwCAYAAABnjuimAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV/TakUqIu0g4pChOlkoKuIoVSyChdJWaNXB5NIvaNKQpLg4Cq4FBz8Wqw4uzro6uAqC4AeIo5OToouU+L+k0CLWg+N+vLv3uHsHCI0KU01fFFA1y0jFY2I2tyr6X+FDL4KIYkhipp5IL2bQdXzdw8PXuwjP6n7uzzGg5E0GeETiOaYbFvEG8cympXPeJw6xkqQQnxNPGHRB4keuyy6/cS46LPDMkJFJzROHiMViB8sdzEqGSjxNHFZUjfKFrMsK5y3OaqXGWvfkLwzktZU012mOIo4lJJCECBk1lFGBhQitGikmUrQf6+IfcfxJcsnkKoORYwFVqJAcP/gf/O7WLExNukmBGNDzYtsfY4B/F2jWbfv72LabJ4D3GbjS2v5qA5j9JL3e1sJHwOA2cHHd1uQ94HIHGH7SJUNyJC9NoVAA3s/om3JA8BboX3N7a+3j9AHIUFfLN8DBITBepOz1Lu/u6+zt3zOt/n4AehRyqjxXv90AAAAGYktHRACKAIoAiuPa5yQAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfmBAYUGgvg8oPcAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAKZJREFUWMPt2DkOwCAMRNEB5f5XJhVNRMALi6PMP8ETsgsDMMb+VQKAUkoJC0wpAUD+yotmDhX7wtbXIm1/3fYmNAr2iWxCT2NbyFfoKewbsgvdje0hh9Bd2BFSBF2NlSDF0FVYKVIFnY3VINXQWVgt0gT1Yi1IM9SKtSJdUC3Wg3RDpVgvkqcIoYQSSiihhBIapuv0dXkUOhO4BLoCOK3I//+MsUY3urtAQnBIEzkAAAAASUVORK5CYII=\");\r\n    }\r\n\r\n    .urls-row {\r\n        color: #dedede;\r\n    }\r\n\r\n    .urls-head {\r\n        background-color: #191919;\r\n        color: #fdfdfd;\r\n    }\r\n\r\n    .header-buttons>form>input {\r\n        background-color: white;\r\n        color: black;\r\n    }\r\n\r\n    .no-result {\r\n        color: #888;\r\n    }\r\n\r\n    .result-cancel button {\r\n        color: #202023;\r\n    }\r\n\r\n    .result-cancel button:hover {\r\n        background-color: #ccc;\r\n    }\r\n\r\n    button:not(:disabled):hover {\r\n        color: #2A2A2E;\r\n    }\r\n\r\n    textarea {\r\n        background-color: #fff;\r\n    }\r\n\r\n    button:focus {\r\n        color: gray;\r\n        border-color: gray;\r\n        background-color: #d2d2d2;\r\n    }\r\n\r\n    .popup {\r\n        background-color: rgba(59, 59, 59, 0.95);\r\n    }\r\n\r\n    .popup-content {\r\n        box-shadow: 5px 5px #000000;\r\n    }\r\n\r\n    html.side-panel,\r\n    .side-panel .urls-head,\r\n    .side-panel body>main,\r\n    .side-panel button,\r\n    .side-panel .popup-content {\r\n        background-color: #38383d;\r\n    }\r\n\r\n    .side-panel .urls-head {\r\n        border-bottom: dashed 1px rgb(191, 191, 191);\r\n    }\r\n\r\n    .side-panel .result-cancel button {\r\n        color: #fdfdfd;\r\n    }\r\n\r\n    .popup-content main textarea {\r\n        color: black;\r\n    }\r\n}"
  },
  {
    "path": "src/ui/pages/batch-save-urls.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>&nbsp;</title>\n\t<link rel=\"stylesheet\" href=\"batch-save-urls.css\">\n\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n\t<meta name=\"color-scheme\" content=\"light dark\">\n\t<link rel=\"icon\" href=\"/src/ui/resources/icon_128.png\">\n</head>\n\n<body>\n\t<header>\n\t\t<div class=\"header-buttons\">\n\t\t\t<form id=\"addUrlForm\">\n\t\t\t\t<input id=\"addUrlInput\" type=\"url\" required>\n\t\t\t\t<button id=\"addUrlButton\"></button>\n\t\t\t</form>\n\t\t\t<div class=\"header-buttons-group\">\n\t\t\t\t<button id=\"addUrlsButton\"></button>\n\t\t\t\t<button id=\"removeAllButton\"></button>\n\t\t\t</div>\n\t\t</div>\n\t</header>\n\t<main>\n\t\t<div class=\"urls-row urls-head\">\n\t\t\t<span id=\"URLLabel\"></span>\n\t\t\t<span id=\"filterButton\" tabindex=\"0\"></span>\n\t\t</div>\n\t\t<div id=\"filterPanel\" hidden>\n\t\t\t<input id=\"filterInput\" type=\"text\">\n\t\t</div>\n\t\t<div id=\"urlsTable\">\n\t\t</div>\n\t</main>\n\t<footer>\n\t\t<div class=\"footer-buttons\">\n\t\t\t<button id=\"saveUrlsButton\"></button>\n\t\t</div>\n\t</footer>\n\t<div id=\"formAddUrls\" class=\"popup\">\n\t\t<form class=\"popup-content\">\n\t\t\t<header>\n\t\t\t\t<span id=\"addUrlsLabel\"></span>\n\t\t\t</header>\n\t\t\t<main><textarea id=\"addUrlsInput\" type=\"text\"></textarea></main>\n\t\t\t<footer>\n\t\t\t\t<button type=\"submit\" id=\"addUrlsOKButton\"></button>\n\t\t\t\t<button id=\"addUrlsCancelButton\"></button>\n\t\t\t</footer>\n\t\t</form>\n\t</div>\n\t<script src=\"/lib/chrome-browser-polyfill.js\"></script>\n\t<script type=\"module\" src=\"../bg/ui-batch-save-urls.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/ui/pages/editor-frame-web.css",
    "content": ".single-file-highlight-yellow, .single-file-highlight-yellow-mode ::selection {\n    background-color: #ffff7c !important;\n    color: black !important;\n}\n\n.single-file-highlight-pink, .single-file-highlight-pink-mode ::selection {\n    background-color: #ffbbb6 !important;\n    color: black !important;\n}\n\n.single-file-highlight-blue, .single-file-highlight-blue-mode ::selection {\n    background-color: #95d0ff !important;\n    color: black !important;\n}\n\n.single-file-highlight-green, .single-file-highlight-green-mode ::selection {\n    background-color: #93ef8d !important;\n    color: black !important;\n}\n\nspan.single-file-highlight-yellow, span.single-file-highlight-pink, span.single-file-highlight-blue, span.single-file-highlight-green {\n    display: inline !important;\n}\n\n.single-file-highlight-hidden {\n    background-color: inherit !important;\n    color: inherit !important;\n}\n\n.single-file-mask {\n    all: initial;\n    display: contents !important;\n}\n\n.single-file-mask.single-file-page-mask {\n    opacity: .99 !important;\n}\n\nsingle-file-note {\n    all: initial !important;\n    display: contents !important;\n}\n\n.single-file-cut-hover, .single-file-cut-outer-hover, .single-file-cut-selected, .single-file-cut-outer-selected {\n    transition: outline-width 125ms !important;\n    outline-offset: -4px !important;\n    outline-width: 4px !important;\n}\n\n.single-file-cut-hover, .single-file-cut-outer-hover {\n    outline-style: dotted !important;\n}\n\n.single-file-cut-selected, .single-file-cut-outer-selected {\n    outline-style: dashed !important;\n}\n\n.single-file-cut-hover, .single-file-cut-selected {\n    outline-color: red !important;\n}\n\n.single-file-cut-outer-hover, .single-file-cut-outer-selected {\n    outline-color: green !important;\n}\n\n.single-file-cut-mode, .single-file-cut-mode * {\n    pointer-events: auto !important;\n    touch-action: none !important;\n}\n\n.single-file-cut-hover, .single-file-cut-outer-hover, .single-file-remove-highlights-mode .single-file-highlight:hover {\n    cursor: crosshair !important;\n}\n\n.single-file-removed {\n    display: none !important;\n    float: none !important;\n    position: static !important;\n    visibility: collapse !important;\n}\n\na[href], img {\n    -webkit-touch-callout: none;\n}"
  },
  {
    "path": "src/ui/pages/editor-mask-web.css",
    "content": ".note-mask {\n    all: initial;\n    position: fixed;\n    z-index: 2147483645;\n    pointer-events: none;\n    background-color: transparent;\n    transition: background-color 125ms;\n}\n\n.note-mask-moving.note-yellow {\n    background-color: rgba(255, 255, 124, .3);\n}\n\n.note-mask-moving.note-pink {\n    background-color: rgba(255, 187, 182, .3);\n}\n\n.note-mask-moving.note-blue {\n    background-color: rgba(149, 208, 255, .3);\n}\n\n.note-mask-moving.note-green {\n    background-color: rgba(156, 255, 149, .3);\n}\n\n.page-mask {\n    all: initial;\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 0;\n    height: 0;\n    z-index: 2147483646;\n}\n\n.page-mask-active {\n    width: 100vw;\n    height: 100vh;\n}"
  },
  {
    "path": "src/ui/pages/editor-note-web.css",
    "content": ".note {\n    all: initial;\n    display: flex;\n    flex-direction: column;\n    height: 150px;\n    width: 150px;\n    position: absolute;\n    top: 10px;\n    left: 10px;\n    border: 1px solid rgb(191, 191, 191);\n    z-index: 2147483646;\n    box-shadow: 3px 3px 3px rgba(33, 33, 33, .7);\n    min-height: 100px;\n    min-width: 100px;\n}\n\n.note-selected {\n    z-index: 2147483647;\n}\n\n.note-hidden {\n    display: none;\n}\n\n.note-collapsed {\n    min-height: 30px;\n    max-height: 30px;\n    overflow: hidden;\n}\n\n.note blockquote {\n    all: initial;\n    padding: 1px;\n    height: 100%;\n}\n\n.note textarea {\n    all: initial;\n    white-space: break-spaces;\n    font-family: Arial, Helvetica, sans-serif;\n    font-size: 14px;\n    height: 100%;\n    width: 100%;\n    padding: 2px;\n    border: 1px solid transparent;\n    resize: none;\n    color: black;\n}\n\n.note textarea:focus {\n    border: 1px dotted rgb(160, 160, 160);\n}\n\n.note header {\n    all: initial;\n    min-height: 30px;\n    cursor: grab;\n    user-select: none;\n}\n\n.note .note-remove {\n    all: initial;\n    position: absolute;\n    right: 0px;\n    top: 2px;\n    padding: 5px;\n    opacity: .5;\n    cursor: pointer;\n    user-select: none;\n    width: 16px;\n    height: 16px;\n}\n\n.note .note-anchor {\n    all: initial;\n    position: absolute;\n    left: 0px;\n    top: 2px;\n    padding: 5px;\n    opacity: .25;\n    cursor: pointer;\n    width: 16px;\n    height: 16px;\n}\n\n.note .note-resize {\n    all: initial;\n    position: absolute;\n    bottom: -5px;\n    right: -5px;\n    height: 15px;\n    width: 15px;\n    cursor: nwse-resize;\n    user-select: none;\n}\n\n.note .note-remove:hover {\n    opacity: 1;\n}\n\n.note .note-anchor:hover {\n    opacity: .5;\n}\n\n.note-anchored .note-anchor {\n    opacity: .5;\n}\n\n.note-anchored .note-anchor:hover {\n    opacity: 1;\n}\n\n.note-moving {\n    opacity: .75;\n    box-shadow: 6px 6px 3px rgba(33, 33, 33, .7);\n}\n\n.note-moving * {\n    cursor: grabbing;\n}\n\n.note-yellow header {\n    background-color: #f5f545;\n}\n\n.note-yellow blockquote {\n    background-color: #ffff7c;\n}\n\n.note-pink header {\n    background-color: #ffa59f;\n}\n\n.note-pink blockquote {\n    background-color: #ffbbb6;\n}\n\n.note-blue header {\n    background-color: #84c8ff;\n}\n\n.note-blue blockquote {\n    background-color: #95d0ff;\n}\n\n.note-green header {\n    background-color: #93ef8d;\n}\n\n.note-green blockquote {\n    background-color: #9cff95;\n}"
  },
  {
    "path": "src/ui/pages/editor.css",
    "content": "html,\nbody {\n    height: 100%;\n    overflow: hidden;\n}\n\nbody {\n    margin: 0;\n    display: flex;\n    flex-direction: column;\n    user-select: none;\n    background-color: #efefef;\n}\n\n.toolbar {\n    display: flex;\n    background-color: transparent;\n}\n\n.buttons {\n    display: flex;\n    flex-direction: row;\n    margin: 1px;\n    flex: none;\n}\n\nimg[type=button] {\n    cursor: pointer;\n    background-color: #404040;\n    padding: 4px;\n    margin-right: 2px;\n    border-radius: 4px;\n    max-width: 24px;\n    max-height: 24px;\n}\n\n@media (hover: hover) {\n    img[type=button]:hover {\n        filter: brightness(0.75);\n    }\n}\n\nimg[type=button].edit-disabled,\nimg[type=button].format-disabled,\nimg[type=button].cut-disabled,\nimg[type=button].highlight-disabled,\nimg[type=button].remove-highlight-disabled {\n    background-color: #7b7b7b;\n    filter: brightness(1.25);\n}\n\n@media (hover: hover) {\n    img[type=button].edit-disabled:hover,\n    img[type=button].cut-disabled:hover,\n    .toolbar:not(.cut-inner-mode):not(.remove-highlight-mode) img[type=button].highlight-disabled:hover,\n    .toolbar:not(.cut-inner-mode) img[type=button].remove-highlight-disabled:hover {\n        filter: brightness(0.875);\n    }\n}\n\n.separator {\n    display: inline-block;\n    width: 2px;\n    height: 22px;\n    background-color: #404040;\n    margin-left: 2px;\n    margin-right: 2px;\n    margin-top: 6px;\n}\n\n.editor-container {\n    position: relative;\n    display: flex;\n    flex: auto;\n}\n\n.editor {\n    background-color: white;\n    flex: auto;\n    border: none;\n    border-top-width: 1px;\n    border-top-style: solid;\n    border-top-color: #cccccc;\n}\n\n@media (orientation: portrait) {\n    body {\n        flex-direction: row;\n    }\n\n    .toolbar {\n        flex-direction: column;\n        min-width: 34px;\n        max-width: 34px;\n    }\n\n    .buttons {\n        flex-direction: column;\n    }\n\n    .separator {\n        margin-top: 2px;\n        margin-bottom: 2px;\n        margin-left: 6px;\n        width: 22px;\n        height: 2px;\n    }\n\n    img[type=\"button\"] {\n        margin-right: 0;\n        margin-bottom: 2px;\n    }\n\n    @media (max-height: 495px) {\n        .separator {\n            display: none;\n        }\n    }\n}\n\n@media (prefers-color-scheme: dark) {\n    body {\n        background-color: #3a3a3a;\n    }\n\n    .editor {\n        border-top-color: #4a4a4a;\n    }\n\n    img[type=button] {\n        background-color: #1f1f1f;\n    }\n\n    img[type=button].edit-disabled,\n    img[type=button].format-disabled,\n    img[type=button].cut-disabled,\n    img[type=button].highlight-disabled,\n    img[type=button].remove-highlight-disabled {\n        background-color: #4a4a4a;\n    }\n\n    .separator {\n        background-color: #b3b3b3;\n    }\n}"
  },
  {
    "path": "src/ui/pages/editor.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<link rel=\"stylesheet\" href=\"editor.css\">\n\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1.0,user-scalable=no\">\n\t<meta name=\"color-scheme\" content=\"light dark\">\n\t<link rel=\"icon\" href=\"/src/ui/resources/icon_128.png\">\n\t<title>Please wait...</title>\n</head>\n\n<body>\n\t<div class=\"toolbar\">\n\t\t<div class=\"buttons\">\n\t\t\t<img type=\"button\" class=\"add-note-yellow-button\" src=\"/src/ui/resources/button_note_yellow.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<img type=\"button\" class=\"add-note-pink-button\" src=\"/src/ui/resources/button_note_pink.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<img type=\"button\" class=\"add-note-blue-button\" src=\"/src/ui/resources/button_note_blue.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<img type=\"button\" class=\"add-note-green-button\" src=\"/src/ui/resources/button_note_green.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<img type=\"button\" class=\"toggle-notes-button\" src=\"/src/ui/resources/button_note_visible.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<div class=\"separator\"></div>\n\t\t</div>\n\t\t<div class=\"buttons\">\n\t\t\t<img type=\"button\" class=\"highlight-button highlight-yellow-button highlight-disabled\" data-color=\"yellow\"\n\t\t\t\tsrc=\"/src/ui/resources/button_highlighter_yellow.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"highlight-button highlight-pink-button highlight-disabled\" data-color=\"pink\"\n\t\t\t\tsrc=\"/src/ui/resources/button_highlighter_pink.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"highlight-button highlight-blue-button highlight-disabled\" data-color=\"blue\"\n\t\t\t\tsrc=\"/src/ui/resources/button_highlighter_blue.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"highlight-button highlight-green-button highlight-disabled\" data-color=\"green\"\n\t\t\t\tsrc=\"/src/ui/resources/button_highlighter_green.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"toggle-highlights-button\"\n\t\t\t\tsrc=\"/src/ui/resources/button_highlighter_visible.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"remove-highlight-button remove-highlight-disabled\"\n\t\t\t\tsrc=\"/src/ui/resources/button_highlighter_delete.png\" draggable=\"false\">\n\t\t\t<div class=\"separator\"></div>\n\t\t</div>\n\t\t<div class=\"buttons\">\n\t\t\t<img type=\"button\" class=\"edit-page-button edit-disabled\"\n\t\t\t\tsrc=\"/src/ui/resources/button_note_edit.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"format-page-button format-disabled\"\n\t\t\t\tsrc=\"/src/ui/resources/button_note_format.png\" draggable=\"false\">\n\t\t\t<div class=\"separator\"></div>\n\t\t</div>\n\t\t<div class=\"buttons\">\n\t\t\t<img type=\"button\" class=\"cut-inner-page-button cut-disabled\"\n\t\t\t\tsrc=\"/src/ui/resources/button_cut_inner.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"cut-outer-page-button cut-disabled\"\n\t\t\t\tsrc=\"/src/ui/resources/button_cut_outer.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"undo-cut-page-button\" src=\"/src/ui/resources/button_undo_cut.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<img type=\"button\" class=\"undo-all-cut-page-button\"\n\t\t\t\tsrc=\"/src/ui/resources/button_undo_all_cut.png\" draggable=\"false\">\n\t\t\t<img type=\"button\" class=\"redo-cut-page-button\" src=\"/src/ui/resources/button_redo_cut.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<div class=\"separator\"></div>\n\t\t</div>\n\t\t<div class=\"buttons\">\n\t\t\t<img type=\"button\" class=\"import-mht-button\" src=\"/src/ui/resources/button_import_mht.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<img type=\"button\" class=\"print-page-button\" src=\"/src/ui/resources/button_print.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t\t<img type=\"button\" class=\"save-page-button\" src=\"/src/ui/resources/button_download.png\"\n\t\t\t\tdraggable=\"false\">\n\t\t</div>\n\t</div>\n\t<div class=\"editor-container\">\n\t\t<iframe class=\"editor\"\n\t\t\tsrcdoc=\"&lt;!DOCTYPE html&gt;&lt;body&gt;&lt;script src=/lib/single-file-extension-editor-helper.js&gt;&lt;/script&gt;&lt;script src=/lib/single-file-extension-editor.js&gt;&lt;/script&gt;&lt;script src=/src/lib/readability/Readability.js&gt;&lt;/script&gt;&lt;script src=/src/lib/readability/Readability-readerable.js&gt;&lt;/script&gt;&lt;/body&gt;\"\n\t\t\tsandbox=\"allow-scripts allow-modals allow-downloads\"></iframe>\n\t</div>\n\t<script src=\"/lib/chrome-browser-polyfill.js\"></script>\n\t<script src=\"/lib/single-file.js\"></script>\n\t<script type=\"module\" src=\"/src/ui/bg/ui-editor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/ui/pages/help.css",
    "content": "body {\n    background-color: #eee;\n    font-size: 12pt;\n}\n\nbody>div {\n    position: relative;\n    background-color: #fff;\n    font-family: sans-serif;\n    max-width: 1024px;\n    margin-left: auto;\n    margin-right: auto;\n    border: 1px #bfbfbf solid;\n    border-radius: 4px;\n    padding-left: 10px;\n    padding-right: 10px;\n    padding-bottom: 20px;\n}\n\ndiv>iframe {\n    margin-top: 30px;\n    margin-left: auto;\n    margin-right: auto;\n    display: block;\n    margin-left: auto;\n}\n\n.option {\n    font-size: 1.1em;\n    font-style: normal;\n    font-family: sans-serif;\n    color: graytext;\n}\n\n.notice {\n    font-style: italic;\n    font-family: serif;\n    font-size: 1.1em;\n}\n\nol {\n    -webkit-padding-start: 30px;\n    margin: 0px;\n    padding-right: 10px;\n}\n\nol>li {\n    padding-top: 2em;\n}\n\na[id] {\n    font-weight: bold;\n}\n\nol>li>ul {\n    padding-left: 25px;\n}\n\nol>li>ul>li {\n    padding-top: .5em;\n}\n\nol>li>ul>li>ul {\n    padding-left: 25px;\n}\n\n.icon {\n    height: 1em;\n}\n\n.button {\n    height: .9em;\n    background-color: #8e8e8e;\n    padding: 3px;\n    border-radius: 4px;\n}\n\n#titleIcon {\n    width: 1.2em;\n    height: 1.2em;\n}\n\n#title {\n    padding-left: .3em;\n    vertical-align: top;\n}\n\n#titleBorder {\n    margin-top: 10px;\n    padding-left: 10px;\n    padding-bottom: 10px;\n    margin-bottom: 20px;\n}\n\n#index {\n    padding-left: 10px;\n    font-size: .9em;\n    display: inline-block;\n    line-height: 150%;\n}\n\n#index a {\n    white-space: nowrap;\n}\n\nh2, h4 {\n    margin-bottom: 0px;\n}\n\nli {\n    line-height: 1.5em;\n}\n\n#logo-html5 {\n    position: absolute;\n    right: 0px;\n    bottom: 20px;\n}\n\n.availability {\n    font-size: 11pt;\n}\n\ncode {\n    font-size: 1.1em;\n}\n\nkbd, .key {\n    display: inline;\n    display: inline-block;\n    min-width: 1em;\n    padding: .2em .3em;\n    font: normal .85em/1 \"Lucida Grande\", Lucida, Arial, sans-serif;\n    text-align: center;\n    text-decoration: none;\n    -moz-border-radius: .3em;\n    -webkit-border-radius: .3em;\n    border-radius: .3em;\n    border: none;\n    cursor: default;\n    -moz-user-select: none;\n    -webkit-user-select: none;\n    user-select: none;\n}\n\nkbd[title], .key[title] {\n    cursor: help;\n}\n\nkbd, kbd.dark, .dark-keys kbd, .key, .key.dark, .dark-keys .key {\n    background: rgb(80, 80, 80);\n    background: -moz-linear-gradient(top, rgb(60, 60, 60), rgb(80, 80, 80));\n    background: -webkit-gradient(linear, left top, left bottom, from(rgb(60, 60, 60)), to(rgb(80, 80, 80)));\n    color: rgb(250, 250, 250);\n    text-shadow: -1px -1px 0 rgb(70, 70, 70);\n    -moz-box-shadow: inset 0 0 1px rgb(150, 150, 150), inset 0 -.05em .4em rgb(80, 80, 80), 0 .1em 0 rgb(30, 30, 30), 0 .1em .1em rgba(0, 0, 0, .3);\n    -webkit-box-shadow: inset 0 0 1px rgb(150, 150, 150), inset 0 -.05em .4em rgb(80, 80, 80), 0 .1em 0 rgb(30, 30, 30), 0 .1em .1em rgba(0, 0, 0, .3);\n    box-shadow: inset 0 0 1px rgb(150, 150, 150), inset 0 -.05em .4em rgb(80, 80, 80), 0 .1em 0 rgb(30, 30, 30), 0 .1em .1em rgba(0, 0, 0, .3);\n}\n\nkbd.light, .light-keys kbd, .key.light, .light-keys .key {\n    background: rgb(250, 250, 250);\n    background: -moz-linear-gradient(top, rgb(210, 210, 210), rgb(255, 255, 255));\n    background: -webkit-gradient(linear, left top, left bottom, from(rgb(210, 210, 210)), to(rgb(255, 255, 255)));\n    color: rgb(50, 50, 50);\n    text-shadow: 0 0 2px rgb(255, 255, 255);\n    -moz-box-shadow: inset 0 0 1px rgb(255, 255, 255), inset 0 0 .4em rgb(200, 200, 200), 0 .1em 0 rgb(130, 130, 130), 0 .11em 0 rgba(0, 0, 0, .4), 0 .1em .11em rgba(0, 0, 0, .9);\n    -webkit-box-shadow: inset 0 0 1px rgb(255, 255, 255), inset 0 0 .4em rgb(200, 200, 200), 0 .1em 0 rgb(130, 130, 130), 0 .11em 0 rgba(0, 0, 0, .4), 0 .1em .11em rgba(0, 0, 0, .9);\n    box-shadow: inset 0 0 1px rgb(255, 255, 255), inset 0 0 .4em rgb(200, 200, 200), 0 .1em 0 rgb(130, 130, 130), 0 .11em 0 rgba(0, 0, 0, .4), 0 .1em .11em rgba(0, 0, 0, .9);\n}\n\n@media (max-width:800px) {\n    body {\n        background-color: white;\n        margin: 0px;\n    }\n    body>div {\n        border-width: 0px;\n    }\n    ol {\n        padding-left: 20px;\n    }\n    ul {\n        padding-left: 10px;\n    }\n}\n\n@media (prefers-color-scheme: dark) {\n    body {\n        background-color: #373737;\n    }\n    @media (max-width:800px) {\n        body {\n            background-color: #202023;\n        }\n    }\n    body>div {\n        background-color: #202023;\n        border-color: rgb(81, 81, 81);\n    }\n    body>div, a {\n        color: #fdfdfd;\n    }\n    .option {\n        color: #afafaf;\n    }\n    .button {\n        height: .9em;\n        background-color: #484848;\n    }\n}"
  },
  {
    "path": "src/ui/pages/help.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>SingleFile help</title>\n\t<link rel=\"stylesheet\" href=\"help.css\">\n\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n\t<meta name=\"color-scheme\" content=\"light dark\">\n\t<link rel=\"icon\" href=\"/src/ui/resources/icon_128.png\">\n</head>\n\n<body>\n\t<div>\n\t\t<div id=\"titleBorder\">\n\t\t\t<h2>SingleFile</h2>\n\t\t\t<h4>Save a complete page into a single HTML file</h4>\n\t\t</div>\n\t\t<span id=\"index\">\n\t\t\t<a href=\"#getting-started\">Getting started</a> -\n\t\t\t<a href=\"#general-notes\">Additional notes</a> -\n\t\t\t<a href=\"#options\">Options description</a> -\n\t\t\t<a href=\"#annotation-editor\">Annotation editor</a> -\n\t\t\t<a href=\"#notes\">Technical notes</a> -\n\t\t\t<a href=\"#template-variables\">Template variables</a> -\n\t\t\t<a href=\"#template-functions\">Template functions</a> -\n\t\t\t<a href=\"#external-messages\">Integration with other extensions</a> -\n\t\t\t<a href=\"#known-issues\">Known issues</a> -\n\t\t\t<a href=\"#unknown-issues\">Troubleshooting unknown issues</a> -\n\t\t\t<a href=\"#contributors\">Contributors</a> </span>\n\t\t<hr>\n\t\t<ol>\n\t\t\t<li><a id=\"getting-started\">Getting started</a>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>Wait until the page is fully loaded.</li>\n\t\t\t\t\t<li>Click on the SingleFile button <img src=\"../resources/icon_16.png\" class=\"icon\"> in the\n\t\t\t\t\t\textension toolbar to process and save the page.</li>\n\t\t\t\t\t<li>You can click again on the button to cancel the action when processing a page.</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li><a id=\"general-notes\">Additional notes</a>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>To save multiple tabs, select them first and click on the SingleFile button <img\n\t\t\t\t\t\t\tsrc=\"../resources/icon_16.png\" class=\"icon\">.</li>\n\t\t\t\t\t<li>Open the context menu by right-clicking the SingleFile button <img\n\t\t\t\t\t\t\tsrc=\"../resources/icon_16.png\" class=\"icon\"> in the extension toolbar or on the webpage. It\n\t\t\t\t\t\tallows you to save: <ul>\n\t\t\t\t\t\t\t<li>the current tab,</li>\n\t\t\t\t\t\t\t<li>or the selected content,</li>\n\t\t\t\t\t\t\t<li>or the selected frame.</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>You can also process multiple tabs in one click and save: <ul>\n\t\t\t\t\t\t\t<li id=\"selectableTabsMenu\">the selected tabs,</li>\n\t\t\t\t\t\t\t<li>or the unpinned tabs,</li>\n\t\t\t\t\t\t\t<li>or all the tabs.</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li id=\"autoSaveMenu\">The context menu also allows you to activate the auto-save of: <ul>\n\t\t\t\t\t\t\t<li>the current tab,</li>\n\t\t\t\t\t\t\t<li>or the unpinned tabs,</li>\n\t\t\t\t\t\t\t<li>or all the tabs.</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>You can highlight text, add notes, format and remove content before saving the page with the <a\n\t\t\t\t\t\t\thref=\"#annotation-editor\">Annotation editor</a> by selecting \"Annotate and save the page...\"\n\t\t\t\t\t\tin the context menu</li>\n\t\t\t\t\t<li id=\"autoSaveHint\">With auto-save active, pages are automatically saved every time after being\n\t\t\t\t\t\tloaded (or before\n\t\t\t\t\t\tbeing unloaded if not). </li>\n\t\t\t\t\t<li>Select \"Save Selection\" from the context menu without selecting any content first to display a\n\t\t\t\t\t\tselector that will help you choose content by hovering over it with the mouse.</li>\n\t\t\t\t\t<li>Right-click on the SingleFile button and select \"Options\" to open the options page.</li>\n\t\t\t\t\t<li id=\"saveToGDriveHint\">Enable the option \"Destination &gt; upload to Google Drive\" to upload\n\t\t\t\t\t\tpages to Google Drive</li>\n\t\t\t\t\t<li id=\"shortcutsSection\">You can use the customizable shortcut Ctrl+Shift+Y to save the current tab\n\t\t\t\t\t\tor the selected tabs.\n\t\t\t\t\t\tGo to about:addons and select \"Manage extension shortcuts\" in the cogwheel menu to change it in\n\t\t\t\t\t\tFirefox. Go to chrome://extensions/shortcuts to change it in Chrome..</li>\n\t\t\t\t\t<li>The default save folder is the download folder configured in your browser, cf. about:preferences\n\t\t\t\t\t\tin Firefox, chrome://settings in Chrome, and Settings > General > File download location in\n\t\t\t\t\t\tSafari.</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li><a id=\"options\">Options description</a>\n\t\t\t\t<p>You can customize SingleFile through the options page. Right-click on SingleFile button <img\n\t\t\t\t\t\tsrc=\"../resources/icon_16.png\" class=\"icon\"> in the browser toolbar and select \"Options\"/\"Manage\n\t\t\t\t\textension\" in the context menu to open the options page.</p>\n\t\t\t\t<p>Profiles</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<p>A profile is a set of user-defined options associated to a unique name.</p>\n\t\t\t\t\t\t<p>The drop-down list in the upper right of the options page allows you to select a profile and\n\t\t\t\t\t\t\tmodify the associated options. The buttons next to the drop-down list allows you\n\t\t\t\t\t\t\trespectively to create, delete and rename a profile. </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<p>You can select the default profile through the context menu of SingleFile. The selection is\n\t\t\t\t\t\t\tpersistent and applied to all tabs. </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<p>You can also override the default profile by associating a profile to a complete or partial\n\t\t\t\t\t\t\tURL. See the description of the <a href=\"#auto-settings-rules\">Auto-settings rules</a>\n\t\t\t\t\t\t\tfeature for more info. </p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>User interface</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"addMenuEntryLabel\"> <span class=\"option\">Option: add entry in the context\n\t\t\t\t\t\t\tmenu of the webpage</span>\n\t\t\t\t\t\t<p>Check this option to display an entry for SingleFile in the context menu of the webpage. The\n\t\t\t\t\t\t\tcontext menu of the SingleFile button <img src=\"../resources/icon_16.png\" class=\"icon\"> in\n\t\t\t\t\t\t\tthe extension toolbar is displayed whether this option is checked or not. </p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"shadowEnabledLabel\"> <span class=\"option\">Option: overlay a shadow on the\n\t\t\t\t\t\t\tpage during processing</span>\n\t\t\t\t\t\t<p>Check this option to overlay a shadow on the page when SingleFile is retrieving page\n\t\t\t\t\t\t\tresources. This reminds you that you should not close the tab. </p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"openSavedPageLabel\" id=\"openSavedPageOption\"> <span class=\"option\">Option:\n\t\t\t\t\t\t\topen saved pages in a new tab</span>\n\t\t\t\t\t\t<p>Check this option to display the saved page in a new tab. This option can be useful, for\n\t\t\t\t\t\t\texample, in order to check the page is properly saved.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoCloseLabel\"> <span class=\"option\">Option: auto-close the tab after the\n\t\t\t\t\t\t\tpage is saved</span>\n\t\t\t\t\t\t<p>Check this option to automatically close the tab after saving the page displayed inside. </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"customShortcutLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: keyboard shortcut command</span>\n\t\t\t\t\t\t<p>Use this option to select which custom keyboard shortcut command (defined in the extension\n\t\t\t\t\t\t\tshortcuts page of your browser) will trigger the current profile. When a shortcut is\n\t\t\t\t\t\t\tassigned here, using it will save the page with the settings of this profile.</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>File name</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"filenameTemplateLabel\"> <span class=\"option\">Option: template</span>\n\t\t\t\t\t\t<p>The template allows you to customize the file name of saved pages. You can use any valid\n\t\t\t\t\t\t\tcharacter and \"/\" to create sub-folders (with the option \"save pages in background\" active).\n\t\t\t\t\t\t\tYou can also use any variables from <a href=\"#template-variables\">this list</a> and\n\t\t\t\t\t\t\tfunctions from <a href=\"#template-functions\">this list</a> anywhere in the template.</p>\n\t\t\t\t\t\t<p>Invalid characters are automatically transformed and collapsed to underscores. File names\n\t\t\t\t\t\t\tcannot exceed 192 characters and are truncated if longer. The invalid characters are:\n\t\t\t\t\t\t\t<code>[</code> <code>~</code> <code>+</code> <code>\\</code> <code>?</code> <code>%</code>\n\t\t\t\t\t\t\t<code>*</code> <code>:</code> <code>|</code> <code>\"</code> <code>&lt;</code>\n\t\t\t\t\t\t\t<code>&gt;</code> and control characters from 0 to 31 in the ASCII table. When you want\n\t\t\t\t\t\t\tto customize the infobar, you can prefix the special characters <code>%</code>,\n\t\t\t\t\t\t\t<code>&lt;</code>, <code>&gt;</code>, <code>{</code>, <code>}</code> and <code>|</code> with\n\t\t\t\t\t\t\t<code>\\</code> (e.g. <code>\\&gt;</code>) to keep them in the infobar content.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>Template examples:</p>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li><code>{page-title} ({date-iso} {time-locale}).html</code> will produce filenames like\n\t\t\t\t\t\t\t\t\"Introduction to SingleFile (2018-09-15 11_06_03 PM).html\" for a page having\n\t\t\t\t\t\t\t\t\"Introduction to SingleFile\" as title.</li>\n\t\t\t\t\t\t\t<li><code>archives/{url-last-segment} - {date-iso}</code> will produce filenames like\n\t\t\t\t\t\t\t\t\"welcome - 2018-09-15\" for a page hosted on https://example.com/welcome.html. The saved\n\t\t\t\t\t\t\t\tfiles will be saved in the sub-directory \"archives\".</li>\n\t\t\t\t\t\t\t<li><code>archives/{year-locale}/{month-locale}/{day-locale}/{page-title}.html</code> will\n\t\t\t\t\t\t\t\tproduce filenames like \"Introduction to SingleFile.html\" stored into 3 sub-directories\n\t\t\t\t\t\t\t\tin the \"archives\" folder, one for each part of the save date (e.g.\n\t\t\t\t\t\t\t\t\"2018/9/15/Introduction to SingleFile.html\").</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"filenameMaxLengthLabel\"> <span class=\"option\">Option: max length</span>\n\t\t\t\t\t\t<p>Enter the maximum length of the filename (without the extension) and its unit (bytes or\n\t\t\t\t\t\t\tcharacters).</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"filenameReplacementCharacterLabel\"> <span class=\"option\">Option: replacement\n\t\t\t\t\t\t\tcharacter</span>\n\t\t\t\t\t\t<p>Enter the character used to replace invalid characters in the filename.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"replaceEmojisInFilenameLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: replace emojis with text</span>\n\t\t\t\t\t\t<p>Check this option to replace emojis in the file name with their unicode text representation.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveFilenameTemplateDataLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: save the filename template data into the page</span>\n\t\t\t\t\t\t<p>Check this option to save the template file data to the page. This allows you to recover\n\t\t\t\t\t\t\ttemplate data previously used when saving the page and, for example, to ensure that the file\n\t\t\t\t\t\t\tis saved in the same directory as the original file when saving the page again.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"confirmFilenameLabel\" id=\"confirmFilenameOption\"> <span\n\t\t\t\t\t\t\tclass=\"option\">Option: open the \"Save as\"\n\t\t\t\t\t\t\tdialog to confirm the file name</span>\n\t\t\t\t\t\t<p>Check this option to display the \"Save as\" dialog in order to confirm the file name before\n\t\t\t\t\t\t\tsaving the page. If the option \"save pages in background\" is unchecked then a prompt dialog\n\t\t\t\t\t\t\twill be displayed instead of the \"Save as\" dialog. </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"filenameConflictActionLabel\" id=\"filenameConflictActionOption\"> <span\n\t\t\t\t\t\t\tclass=\"option\">Option: file name\n\t\t\t\t\t\t\tconflict resolution</span>\n\t\t\t\t\t\t<p>Choose the most appropriate action when the filename of the saved page is conflicting with\n\t\t\t\t\t\t\texisting ones on the filesystem. The \"skip duplicate files\" action only detects duplicates\n\t\t\t\t\t\t\tamong files downloaded during the current browsing session.</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>File format</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"fileFormatSelectLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: format</span>\n\t\t\t\t\t\t<p>Select the output format of the saved file:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li><code>\"HTML\"</code>: HTML file (default format). This format produces HTML files that do\n\t\t\t\t\t\t\t\tnot depend on JavaScript to be opened.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li><code>\"self-extracting ZIP (universal)\"</code>: self-extracting ZIP file that can be\n\t\t\t\t\t\t\t\topened on any platform. This format produces files smaller than the \"HTML\" format but\n\t\t\t\t\t\t\t\trequires JavaScript to be enabled to open the file.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li><code>\"self-extracting ZIP\"</code>: self-extracting ZIP file that can be\n\t\t\t\t\t\t\t\topened on any platform from HTTP but not from the filesystem in some browsers (e.g.\n\t\t\t\t\t\t\t\tin browsers based on Chromium or WebKit) without SingleFile to be installed. This format\n\t\t\t\t\t\t\t\tproduces files smaller (approx. 1%) than the \"self-extracting ZIP (universal)\" format.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li><code>\"ZIP\"</code>: ZIP file. This format produces ZIP files that cannot be opened in a\n\t\t\t\t\t\t\t\tbrowser but can be opened in the annotation editor.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"passwordLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: password</span>\n\t\t\t\t\t\t<p>Type a password to encrypt the ZIP file with AES-256 (compatible with Winzip). Be careful, if\n\t\t\t\t\t\t\tyou lose the password, it will be impossible to open the file. Enabling this option\n\t\t\t\t\t\t\tincreases the CPU consumption and the time needed to save or read a page.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"insertEmbeddedImageLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: embed image</span>\n\t\t\t\t\t\t<p>Check one of the options to embed an image when saving the page as a ZIP file\n\t\t\t\t\t\t\t(self-extracting or not). This allows you to display the saved page as a PNG image when\n\t\t\t\t\t\t\tthe filename extension is changed to \".png\".\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"createRootDirectoryLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: create a root directory</span>\n\t\t\t\t\t\t<p>Check this option to create a root directory in the ZIP file. The directory name consists of\n\t\t\t\t\t\t\ta timestamp and the identifier of the tab where the saved page is displayed.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"disableCompressionLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: disable compression</span>\n\t\t\t\t\t\t<p>Check this option to disable the compression of the ZIP file. This can help to reduce the\n\t\t\t\t\t\t\tCPU consumption and the time needed to save a page but it will increase the size of the\n\t\t\t\t\t\t\tresulting file.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"preventAppendedDataLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: do not append data after the ZIP data</span>\n\t\t\t\t\t\t<p>Check this option to remove the data appended after the ZIP data. The resulting file may be\n\t\t\t\t\t\t\teasier to open with some archive managers that do not support ZIP files with appended data.\n\t\t\t\t\t\t\tEnabling this option increases the time needed to save a page.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"insertTextBodyLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: make text searchable</span>\n\t\t\t\t\t\t<p>Check this option to insert the text content of the saved page into the self-extracting ZIP\n\t\t\t\t\t\t\tfile. This makes it possible, for example, to search for pages from the text. Note that if\n\t\t\t\t\t\t\tthe selected format is \"self-extracting ZIP (universal)\", the text content is\n\t\t\t\t\t\t\tencoded in UTF-8 but the page is declared in ISO-8859-1.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>HTML content</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"compressHTMLLabel\"> <span class=\"option\">Option: compress HTML\n\t\t\t\t\t\t\tcontent</span>\n\t\t\t\t\t\t<p>Check this option to remove all HTML comments and unneeded tags, spaces, quotes and\n\t\t\t\t\t\t\twhitespace characters. Checking this option helps to reduce the size of the file without\n\t\t\t\t\t\t\taltering the document.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"removeHiddenElementsLabel\"> <span class=\"option\">Option: remove hidden\n\t\t\t\t\t\t\telements</span>\n\t\t\t\t\t\t<p>Check this option to remove all hidden elements. Checking this option can help to reduce the\n\t\t\t\t\t\t\tsize of the file without altering the document. It may also increase the CPU consumption and\n\t\t\t\t\t\t\tthe time needed to save a page.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"removedElementsSelectorLabel\"> <span class=\"option\">Option: remove specific\n\t\t\t\t\t\t\telements</span>\n\t\t\t\t\t\t<p>Use this option to remove elements from the page by providing a list of CSS selectors\n\t\t\t\t\t\t\tseparated by commas.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"insertMetaCSPLabel\"> <span class=\"option\">Option: set content security\n\t\t\t\t\t\t\tpolicy</span>\n\t\t\t\t\t\t<p>Check this option to add a meta tag with a policy to block any external resources from being\n\t\t\t\t\t\t\tloaded.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"removeFramesLabel\"> <span class=\"option\">Option: remove frames</span>\n\t\t\t\t\t\t<p>Check this option to remove all frame and iframe elements. Checking this option can\n\t\t\t\t\t\t\tconsiderably reduce the size of the file without altering the document most of the time. It\n\t\t\t\t\t\t\tmay also decrease the time needed to save a page.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveOriginalURLsLabel\"> <span class=\"option\">: save original\n\t\t\t\t\t\t\tURLs of embedded resources</span>\n\t\t\t\t\t\t<p>Check this option to save the URLs of the resources embedded into the saved page. URLs\n\t\t\t\t\t\t\tare stored in attributes with a name prefixed with \"data-sf-original-\" and suffixed with the\n\t\t\t\t\t\t\toriginal attribute name (e.g. \"data-sf-original-src\", \"data-sf-original-href\") for HTML\n\t\t\t\t\t\t\tcontents. For CSS contents, URLs are stored as comments beginning with \"original URL:\".</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"removeInfobarSavedDateLabel\">\n\t\t\t\t\t\t<span class=\"option\">Option: do not include the saved date</span>\n\t\t\t\t\t\t<p>Check this option to remove the saved date included in the saved page and displayed in the\n\t\t\t\t\t\t\tinfobar.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveRawPageLabel\"> <span class=\"option\">Option: save raw page</span>\n\t\t\t\t\t\t<p>Check this option to save the raw HTML file that the browser received. When this option is\n\t\t\t\t\t\t\tchecked, the page will be saved as if JavaScript was disabled. Checking this option may\n\t\t\t\t\t\t\talter the document.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Infobar</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"displayInfobarLabel\" id=\"displayInfobarOption\"> <span class=\"option\">Option:\n\t\t\t\t\t\t\tdisplay an infobar when\n\t\t\t\t\t\t\tviewing a saved page</span>\n\t\t\t\t\t\t<p>Check this option to display the ℹ button at the top right of the page when viewing a saved\n\t\t\t\t\t\t\tpage. By clicking this button, you can get more information about the saved date and open\n\t\t\t\t\t\t\tthe original URL.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"infobarTemplateLabel\"> <span class=\"option\">Option: template of the infobar\n\t\t\t\t\t\t\tcontent</span>\n\t\t\t\t\t\t<p>The template allows you to customize the content displayed in the infobar. You can use any\n\t\t\t\t\t\t\tvalid character, <code>\\n</code> for new lines or <code>\\t</code> for tabs. You can also use\n\t\t\t\t\t\t\tany variables from <a href=\"#template-variables\">this list</a> anywhere in the template. If\n\t\t\t\t\t\t\tthe template or the resulting content is empty, the infobar will display the saved date by\n\t\t\t\t\t\t\tdefault. </p>\n\t\t\t\t\t\t<p>Template examples:</p>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li><code>{url-href} ({date-iso})</code> will produce contents like \"https://www.example.com\n\t\t\t\t\t\t\t\t(2018-09-15 11 06 03 PM)\".</li>\n\t\t\t\t\t\t\t<li><code>Title: {page-title}</code> will produce contents like \"Title: Example Domain\" for\n\t\t\t\t\t\t\t\ta page having \"Example Domain\" as title.</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"confirmInfobarLabel\"> <span class=\"option\">Option: open a prompt dialog to\n\t\t\t\t\t\t\tedit the infobar content</span>\n\t\t\t\t\t\t<p>Check this option to display a prompt dialog in order to confirm the infobar content before\n\t\t\t\t\t\t\tsaving the page. </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"includeInfobarLabel\"> <span class=\"option\">Option: include infobar in\n\t\t\t\t\t\t\tthe saved page</span>\n\t\t\t\t\t\t<p>Check this option to display the ℹ button at the top right of the page when viewing a saved\n\t\t\t\t\t\t\tpage in a browser where SingleFile is not installed.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"openInfobarLabel\"> <span class=\"option\">Option: keep infobar\n\t\t\t\t\t\t\topen</span>\n\t\t\t\t\t\t<p>Check this option to keep the infobar open when viewing a saved page.</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Stylesheets</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"removeUnusedStylesLabel\"> <span class=\"option\">Option: remove unused\n\t\t\t\t\t\t\tstyles</span>\n\t\t\t\t\t\t<p>Check this option to remove all the CSS rules and styles that do not match any element in the\n\t\t\t\t\t\t\tsaved page. Checking this option will not alter the document and can considerably reduce the\n\t\t\t\t\t\t\tsize of the file. It will also increase the CPU consumption and the time needed to save a\n\t\t\t\t\t\t\tpage.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"removeAlternativeMediasLabel\"> <span class=\"option\">Option: remove\n\t\t\t\t\t\t\tstylesheets for alternative devices to screens</span>\n\t\t\t\t\t\t<p>Check this option to remove stylesheets that are not used for the screen display like\n\t\t\t\t\t\t\tstylesheets for print preview and speech synthesizers. Checking this option can help to\n\t\t\t\t\t\t\treduce the size of the file.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"compressCSSLabel\"> <span class=\"option\">Option: compress CSS content</span>\n\t\t\t\t\t\t<p>Check this option to minify CSS stylesheets. Checking this option can reduce size of the file\n\t\t\t\t\t\t\twithout altering the document. It may also increase the CPU consumption and the time needed\n\t\t\t\t\t\t\tto save a page.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"groupDuplicateStylesheetsLabel\"> <span class=\"option\">Option: group\n\t\t\t\t\t\t\tduplicate stylesheets together</span>\n\t\t\t\t\t\t<p>Check this option to group together all the duplicate inline stylesheets. Checking this\n\t\t\t\t\t\t\toption should not alter the document and can considerably reduce the size of the file. This\n\t\t\t\t\t\t\toption is ignored with archive formats based on ZIP files. Please note that this option\n\t\t\t\t\t\t\trequires JavaScript to be enabled in order to function properly.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"moveStylesInHeadLabel\"> <span class=\"option\">Option: move in the head\n\t\t\t\t\t\t\telement the styles found outside of it</span>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tCheck this option to move all the style elements found outside the head element into the\n\t\t\t\t\t\t\thead element. This can be useful to avoid a FOUC (\"flash of unstyled content\") when\n\t\t\t\t\t\t\tdisplaying a saved page.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Images</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"groupDuplicateImagesLabel\"> <span class=\"option\">Option: group duplicate\n\t\t\t\t\t\t\timages together</span>\n\t\t\t\t\t\t<p>Check this option to avoid saving multiple times duplicate images. Checking this option\n\t\t\t\t\t\t\tshould not alter the document in modern browsers and can considerably reduce the size of the\n\t\t\t\t\t\t\tfile. This option is ignored with archive formats based on ZIP files.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"loadDeferredImagesLabel\"> <span class=\"option\">Option: save deferred\n\t\t\t\t\t\t\timages</span>\n\t\t\t\t\t\t<p>Check this option to save all the deferred images (or frames) that are not yet displayed.\n\t\t\t\t\t\t\tThis may help to save all the images without scrolling the page. This feature does its best\n\t\t\t\t\t\t\teffort and is not guaranteed to work on all sites. It will also increase the time needed to\n\t\t\t\t\t\t\tsave a page.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"loadDeferredImagesMaxIdleTimeLabel\"> <span class=\"option\">Option: maximum\n\t\t\t\t\t\t\tidle time (ms)</span>\n\t\t\t\t\t\t<p>Enter the maximum delay of time to wait for deferred images. You can increase this value if\n\t\t\t\t\t\t\tfor example the network or system conditions are degraded. You can also decrease this value\n\t\t\t\t\t\t\totherwise.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"loadDeferredImagesDispatchScrollEventLabel\"> <span class=\"option\">Option:\n\t\t\t\t\t\t\tdispatch \"scroll\" event</span>\n\t\t\t\t\t\t<p>Check this option to dispatch the <a\n\t\t\t\t\t\t\t\thref=\"https://developer.mozilla.org/docs/Web/API/Document/scroll_event\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">\"scroll\"\n\t\t\t\t\t\t\t\tevent</a> when waiting for deferred images. This can improve the loading of images\n\t\t\t\t\t\t\ton some sites but it can also cause unexpected scrolling problems on some other sites.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"loadDeferredImagesKeepZoomLevelLabel\"> <span class=\"option\">Option: zoom out\n\t\t\t\t\t\t\tthe page</span>\n\t\t\t\t\t\t<p>Check this option to save the entire content of a page by zooming out the page. This can help\n\t\t\t\t\t\t\tsaving pages using infinite virtual lists for example. </p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"loadDeferredImagesBeforeFramesLabel\"> <span class=\"option\">Option: load\n\t\t\t\t\t\t\tdeferred frames</span>\n\t\t\t\t\t\t<p>Check this option to load deferred frames and images before saving frame contents. It will\n\t\t\t\t\t\t\tincrease the time needed to save a page.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"imageReductionFactorLabel\"> <span class=\"option\">size reduction\n\t\t\t\t\t\t\tfactor</span>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tReduce the size of images embedded in the saved page. The value corresponds to a divisor.\n\t\t\t\t\t\t\tFor example, if you set this value to 2, the dimensions of the images will be halved; if you\n\t\t\t\t\t\t\tset it to 4, they will be quartered, and so on. This only applies to PNG, JPEG, and WEBP\n\t\t\t\t\t\t\timages. This can help reduce the final file size, but may also reduce the image quality. The\n\t\t\t\t\t\t\tdefault value is 1 (no reduction).\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"removeAlternativeImagesLabel\"> <span class=\"option\">Option: remove images\n\t\t\t\t\t\t\tfor alternative screen resolutions</span>\n\t\t\t\t\t\t<p>Check this option to remove images that are alternatives in lower and/or higher resolutions\n\t\t\t\t\t\t\tto the ones displayed by default. Checking this option can considerably reduce the size of\n\t\t\t\t\t\t\tthe file.</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Fonts</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"removeUnusedFontsLabel\"> <span class=\"option\">Option: remove unused\n\t\t\t\t\t\t\tfonts</span>\n\t\t\t\t\t\t<p>Check this option to remove all font CSS rules that do not match any content. Checking this\n\t\t\t\t\t\t\toption should not alter the document and can considerably reduce the size of the file.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"removeAlternativeFontsLabel\"> <span class=\"option\">Option: remove\n\t\t\t\t\t\t\talternative fonts</span>\n\t\t\t\t\t\t<p>Check this option to remove fonts that are alternatives to the ones used. Checking this\n\t\t\t\t\t\t\toption should not alter the document and can considerably reduce the size of the file.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Destination</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"saveToFilesystemLabel\"> <span class=\"option\">Option: save to\n\t\t\t\t\t\t\tfilesystem</span>\n\t\t\t\t\t\t<p>Check this option to save the downloaded page on the filesystem of your computer.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"sharePageLabel\" id=\"sharePageInput\"> <span class=\"option\">Option: share\n\t\t\t\t\t\t\tpage</span>\n\t\t\t\t\t\t<p>Check this option to share the page with other applications. This option is only available in\n\t\t\t\t\t\t\tbrowsers supporting the <a href=\"https://web.dev/web-share/\" target=\"_blank\">Web Share\n\t\t\t\t\t\t\t\tAPI</a>.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToClipboardLabel\" id=\"saveToClipboardOption\"> <span\n\t\t\t\t\t\t\tclass=\"option\">Option: copy to clipboard</span>\n\t\t\t\t\t\t<p>Check this option to copy the page to the clipboard. This option does not work with\n\t\t\t\t\t\t\tarchive formats based on ZIP files.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToGitHubLabel\"> <span class=\"option\">Option: upload to GitHub</span>\n\t\t\t\t\t\t<p>Check this option to save the page on GitHub. See the <a\n\t\t\t\t\t\t\t\thref=\"https://github.com/gildas-lormeau/SingleFile/wiki/How-to-publish-saved-pages-with-SingleFile-on-GitHub\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">documentation page</a> to learn how to configure SingleFile to save\n\t\t\t\t\t\t\tpages on GitHub. Warning: once a page saved on GitHub, it is complicated to delete it, see\n\t\t\t\t\t\t\tthe <a\n\t\t\t\t\t\t\t\thref=\"https://docs.github.com/github/authenticating-to-github/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">documentation page</a> on GitHub for more information.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"githubTokenLabel\"> <span class=\"option\">Option: access token</span>\n\t\t\t\t\t\t<p>Enter your personal access token on GitHub, see the <a\n\t\t\t\t\t\t\t\thref=\"https://docs.github.com/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">documentation page</a> on GitHub for more information.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"githubUserLabel\"> <span class=\"option\">Option: user name</span>\n\t\t\t\t\t\t<p>Enter your user name on GitHub.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"githubRepositoryLabel\"> <span class=\"option\">Option: repository name</span>\n\t\t\t\t\t\t<p>Enter the name of the repository on GitHub where the saved pages will be archived, see\n\t\t\t\t\t\t\tthe <a\n\t\t\t\t\t\t\t\thref=\"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/creating-a-new-repository\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">documentation page</a> on GitHub for more information on how to create a\n\t\t\t\t\t\t\trepository.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"githubBranchLabel\"> <span class=\"option\">Option: branch name</span>\n\t\t\t\t\t\t<p>Enter the repository branch name where pages will be archived. The branch\n\t\t\t\t\t\t\t<strong>must</strong> exist on GitHub, see the <a\n\t\t\t\t\t\t\t\thref=\"https://docs.github.com/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">documentation page</a> on GitHub for more information on how to publish\n\t\t\t\t\t\t\tthe branch on github.io.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveWithWebDAVLabel\"> <span class=\"option\">Option: upload to a WebDAV\n\t\t\t\t\t\t\tserver</span>\n\t\t\t\t\t\t<p>Check this option to save the page on a WebDAV server.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"webDAVURLLabel\"> <span class=\"option\">Option: URL</span>\n\t\t\t\t\t\t<p>Enter the URL of the WebDAV server.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"webDAVUserLabel\"> <span class=\"option\">Option: user identifier</span>\n\t\t\t\t\t\t<p>Enter your user identifier on the WebDAV server.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"webDAVPasswordLabel\"> <span class=\"option\">Option: password</span>\n\t\t\t\t\t\t<p>Enter your password.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveWithMCPLabel\"> <span class=\"option\">Option: save with MCP server</span>\n\t\t\t\t\t\t<p>Check this option to save the page via a Model Context Protocol (MCP) server.</p>\n\t\t\t\t\t\t<p>MCP is an open protocol that standardizes how applications provide context to AI models.\n\t\t\t\t\t\t\tWhen enabled, SingleFile will send saved pages to an MCP server that implements the\n\t\t\t\t\t\t\tfilesystem tools (write_file, get_file_info).</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option unless you have an MCP server\n\t\t\t\t\t\t\trunning</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"mcpServerUrlLabel\"> <span class=\"option\">Option: server URL</span>\n\t\t\t\t\t\t<p>Enter the URL of your MCP server (e.g. <code>http://localhost:3000/mcp</code>).</p>\n\t\t\t\t\t\t<p>The server must implement the HTTP transport as specified in the MCP protocol and provide\n\t\t\t\t\t\t\tthe <code>write_file</code> and <code>get_file_info</code> tools.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"mcpAuthTokenLabel\"> <span class=\"option\">Option: authentication token</span>\n\t\t\t\t\t\t<p>Enter the Bearer authentication token for your MCP server (optional).</p>\n\t\t\t\t\t\t<p>If your MCP server requires authentication, the token will be sent in the\n\t\t\t\t\t\t\t<code>Authorization: Bearer &lt;token&gt;</code> header with each request.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToGDriveLabel\" id=\"saveToGDriveOption\"> <span class=\"option\">Option:\n\t\t\t\t\t\t\tupload to Google Drive</span>\n\t\t\t\t\t\t<p>Check this option to save the page on Google Drive.</p>\n\t\t\t\t\t\t<p>The permissions requested by SingleFile allow it to access only to the files and folders it\n\t\t\t\t\t\t\thas created. When you uncheck this option, SingleFile revokes automatically its access to\n\t\t\t\t\t\t\tyour Google Drive account.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToS3Label\" id=\"saveToS3Option\"> <span class=\"option\">Option: upload to\n\t\t\t\t\t\t\tAmazon S3</span>\n\t\t\t\t\t\t<p>Check this option to save the page on Amazon S3. You must configure the bucket policy to\n\t\t\t\t\t\t\tinclude the permission <code>s3:PutObject</code>, and <code>s3:HeadObject</code> or\n\t\t\t\t\t\t\t<code>s3:ListObjects</code>, or <code>s3:GetObject</code> if you do not want to overwrite or\n\t\t\t\t\t\t\tskip existing files in the event of a filename conflict.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"S3DomainLabel\"> <span class=\"option\">Option: domain</span>\n\t\t\t\t\t\t<p>Enter the domain of the Amazon S3 server (e.g. <code>s3.amazonaws.com</code>).</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"S3RegionLabel\"> <span class=\"option\">Option: region</span>\n\t\t\t\t\t\t<p>Enter the region of the Amazon S3 server (e.g. <code>us-east-1</code>).</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"S3BucketLabel\"> <span class=\"option\">Option: bucket name</span>\n\t\t\t\t\t\t<p>Enter the name of the bucket on Amazon S3 where the saved pages will be archived. Pages will\n\t\t\t\t\t\t\tbe uploaded to <code>&lt;bucket name&gt;.&lt;domain&gt;</code></p>.\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"S3AccessKeyLabel\"> <span class=\"option\">Option: access key</span>\n\t\t\t\t\t\t<p>Enter your access key on Amazon S3 (e.g. <code>AKDO525K84LJTH4SFAKE</code>).</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"S3SecretKeyLabel\"> <span class=\"option\">Option: secret key</span>\n\t\t\t\t\t\t<p>Enter your secret key on Amazon S3.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToDropboxLabel\" id=\"saveToDropboxOption\"> <span class=\"option\">Option:\n\t\t\t\t\t\t\tupload to Dropbox</span>\n\t\t\t\t\t\t<p>Check this option to save the page on Dropbox.</p>\n\t\t\t\t\t\t<p>The permissions requested by SingleFile allow it to access only to the files and folders it\n\t\t\t\t\t\t\thas created.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveWithCompanionLabel\" id=\"saveWithCompanionOption\"> <span\n\t\t\t\t\t\t\tclass=\"option\">Option: save with\n\t\t\t\t\t\t\tSingleFile Companion</span>\n\t\t\t\t\t\t<p>Check this option to delegate the saving process to SingleFile Companion. It is a program\n\t\t\t\t\t\t\tthat runs outside the browser and can help to make the saving process more transparent. It\n\t\t\t\t\t\t\talso allows the pages to be saved in another directory than the download directory. You can\n\t\t\t\t\t\t\tfind more info <a href=\"https://github.com/gildas-lormeau/single-file-companion\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">here</a></p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToRestFormApiLabel\"> <span class=\"option\">Option: upload to a REST Form\n\t\t\t\t\t\t\tAPI</span>\n\t\t\t\t\t\t<p>Check this option to save the page on an API endpoint accepting form data.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToRestFormApiUrlLabel\"> <span class=\"option\">Option: URL</span>\n\t\t\t\t\t\t<p>Enter the URL of the API endpoint.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToRestFormApiTokenLabel\"> <span class=\"option\">Option: authorization\n\t\t\t\t\t\t\ttoken</span>\n\t\t\t\t\t\t<p>Provide the the value of the \"Bearer\" token to authenticate the request.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToRestFormApiFileFieldNameLabel\"> <span class=\"option\">Option: archive\n\t\t\t\t\t\t\tdata field name</span>\n\t\t\t\t\t\t<p>Enter the name of the field that will contain the data of the saved page.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"saveToRestFormApiUrlFieldNameLabel\"> <span class=\"option\">Option: archive\n\t\t\t\t\t\t\tURL field name</span>\n\t\t\t\t\t\t<p>Enter the name of the field that will contain the URL of the saved page.</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Network</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"blockResourcesLabel\"> <span class=\"option\">Option: blocked resources</span>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tCheck the options below to block the download of the corresponding resource types.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"blockMixedContentLabel\"> <span class=\"option\">Option: block mixed\n\t\t\t\t\t\t\tcontents</span>\n\t\t\t\t\t\t<p>Check this option to block active content served from HTTP when viewing a page in HTTPS. You\n\t\t\t\t\t\t\tcan find more information about mixed content pages <a\n\t\t\t\t\t\t\t\thref=\"https://developer.mozilla.org/docs/Web/Security/Mixed_content\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">here</a>.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"acceptHeadersLabel\"> <span class=\"option\">Option: \"Accept\" headers</span>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tEnter the <a href=\"https://developer.mozilla.org/docs/Web/HTTP/Headers/Accept\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">\"Accept\" HTTP\n\t\t\t\t\t\t\t\theader</a> values below to adjust support for the corresponding resource types.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to leave these values <u>as they are</u></p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"setMaxResourceSizeLabel\"> <span class=\"option\">Option: set maximum size\n\t\t\t\t\t\t\t(MB)</span>\n\t\t\t\t\t\t<p>Check this option to remove from the saved page embedded resources (i.e. images, stylesheets,\n\t\t\t\t\t\t\tscripts and iframes) that exceeds a given size.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"maxResourceSizeLabel\"> <span class=\"option\">Option: maximum size (MB)</span>\n\t\t\t\t\t\t<p>Enter the maximum size in megabytes.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"setMaxResourceDelayLabel\"> <span class=\"option\">Option: set maximum\n\t\t\t\t\t\t\tdownload delay (s)</span>\n\t\t\t\t\t\t<p>Check this option to remove from the saved page embedded resources (i.e. images, stylesheets,\n\t\t\t\t\t\t\tscripts and iframes) that exceeds a given download time.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"maxResourceDelayLabel\"> <span class=\"option\">Option: maximum download delay\n\t\t\t\t\t\t\t(s)</span>\n\t\t\t\t\t\t<p>Enter the maximum download delay in seconds.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"passReferrerOnErrorLabel\" id=\"passReferrerOnErrorOption\"> <span\n\t\t\t\t\t\t\tclass=\"option\">Option: pass \\\"Referer\\\"\n\t\t\t\t\t\t\theader on\n\t\t\t\t\t\t\tcross-origin errors</span>\n\t\t\t\t\t\t<p>Check this option to pass the HTTP header \"Referer\" with the \"origin\" policy after an 401,\n\t\t\t\t\t\t\t403, or 404 HTTP error when downloading a cross-origin resource. You should enable this\n\t\t\t\t\t\t\toption if you cannot download resources blocked by a hotlink protection.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Annotation editor</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"defaultEditorModeLabel\"> <span class=\"option\">Option: default mode</span>\n\t\t\t\t\t\t<p>Select the default mode when opening the annotation editor. The available choices are:\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li><code>normal</code>: default value</li>\n\t\t\t\t\t\t\t<li><code>edit the page</code>: enable the button <img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_note_edit.png\" class=\"icon button\"></li>\n\t\t\t\t\t\t\t<li><code>format the page</code>: enable the button <img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_note_format.png\" class=\"icon button\"> if the page can be\n\t\t\t\t\t\t\t\tformatted</li>\n\t\t\t\t\t\t\t<li><code>remove elements</code>: enable the button <img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_cut_inner.png\" class=\"icon button\"></li>\n\t\t\t\t\t\t\t<li><code>remove external elements</code>: enable the button <img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_cut_outer.png\" class=\"icon button\"></li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"applySystemThemeLabel\"> <span class=\"option\">Option: apply the system theme\n\t\t\t\t\t\t\twhen formatting a page in the annotation editor</span>\n\t\t\t\t\t\t<p>Uncheck this option if you do not want to apply the theme of the operating system or the\n\t\t\t\t\t\t\tbrowser (e.g. dark or light) when you click on the button \"Format the page for better\n\t\t\t\t\t\t\treadability\" in the annotation editor.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"contentWidthLabel\"> <span class=\"option\">Option: content width when\n\t\t\t\t\t\t\tformatting a page (em)</span>\n\t\t\t\t\t\t<p>Enter the content width in em to use when you click on the button \"Format the page for better\n\t\t\t\t\t\t\treadability\" in the annotation editor.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"warnUnsavedPageLabel\"> <span class=\"option\">Option: warn if leaving page\n\t\t\t\t\t\t\twith unsaved changes</span>\n\t\t\t\t\t\t<p>Check this option to display a blocking popup when you leave the annotation editor (e.g.\n\t\t\t\t\t\t\tclose the tab) without saving the changes.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"openEditorLabel\"> <span class=\"option\">Option: edit page before\n\t\t\t\t\t\t\tsaving</span>\n\t\t\t\t\t\t<p>Check this option to open the annotation editor before saving any page. Checking this option\n\t\t\t\t\t\t\tremoves the entry \"Annotate and save the page...\" from the context menu.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoOpenEditorLabel\" id=\"autoOpenEditorOption\"> <span class=\"option\">Option:\n\t\t\t\t\t\t\topen the annotation editor when viewing a page saved with SingleFile</span>\n\t\t\t\t\t\t<p>Check this option to open the annotation editor when displaying a page saved by SingleFile.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"displayInfobarInEditorLabel\"> <span class=\"option\">Option:\n\t\t\t\t\t\t\tdisplay the infobar</span>\n\t\t\t\t\t\t<p>Check this option to display the infobar when displaying a page in the annotation editor.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p id=\"bookmarksSection\">Bookmarks</p>\n\t\t\t\t<ul id=\"bookmarksOptions\">\n\t\t\t\t\t<li data-options-label=\"saveCreatedBookmarksLabel\"> <span class=\"option\">Option: save the page of a\n\t\t\t\t\t\t\tnewly created bookmark</span>\n\t\t\t\t\t\t<p>Check this option to save pages that you add into your bookmarks. Note that if the page is to\n\t\t\t\t\t\t\tbe saved is not already displayed in a tab, SingleFile will open temporarily a new tab to\n\t\t\t\t\t\t\tsave the page. </p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"replaceBookmarkURLLabel\"> <span class=\"option\">Option: link the new bookmark\n\t\t\t\t\t\t\tto the saved page</span>\n\t\t\t\t\t\t<p>Check this option to replace the URL of the page added into your bookmark with the file URI\n\t\t\t\t\t\t\tof the saved page on your disk. </p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"ignoredBookmarkFoldersLabel\"> <span class=\"option\">Option: ignored\n\t\t\t\t\t\t\tfolders</span>\n\t\t\t\t\t\t<p>Enter a list of bookmark folder names to ignore. The folder names must be separated with a\n\t\t\t\t\t\t\tcomma. SingleFile will ignore bookmarks added in folders that contains these names.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"allowedBookmarkFoldersLabel\"> <span class=\"option\">Option: allowed\n\t\t\t\t\t\t\tfolders</span>\n\t\t\t\t\t\t<p>Enter a list of bookmark folder names to allow. The folder names must be separated with a\n\t\t\t\t\t\t\tcomma. SingleFile will only save pages added in folders that contains these names.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p id=\"autoSaveSection\">Auto-save</p>\n\t\t\t\t<ul id=\"autoSaveOptions\">\n\t\t\t\t\t<li data-options-label=\"autoSaveLoadOrUnloadLabel\"> <span class=\"option\">Option: auto-save after\n\t\t\t\t\t\t\tpage load or on page unload</span>\n\t\t\t\t\t\t<p>Check this option to auto-save pages after being loaded. If you browse to another page before\n\t\t\t\t\t\t\tthe page is fully loaded then the page will be saved just before being unloaded. With this\n\t\t\t\t\t\t\toption active, you are guaranteed pages will always be saved. Some frame contents may be\n\t\t\t\t\t\t\tmissing (if you checked \"remove frames\") when pages are saved before being unloaded. </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoSaveLoadLabel\"> <span class=\"option\">Option: auto-save after page\n\t\t\t\t\t\t\tload</span>\n\t\t\t\t\t\t<p>Check this option to auto-save pages after being loaded.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoSaveUnloadLabel\"> <span class=\"option\">Option: auto-save on page\n\t\t\t\t\t\t\tunload</span>\n\t\t\t\t\t\t<p>Check this option to auto-save pages before being unloaded instead of saving pages after\n\t\t\t\t\t\t\tbeing loaded. With this option active, you are guaranteed pages will always be saved but\n\t\t\t\t\t\t\tsome frame contents may be missing (if you checked \"remove frames\"). </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoSaveDiscardLabel\"> <span class=\"option\">Option: auto-save on tab\n\t\t\t\t\t\t\tdiscard</span>\n\t\t\t\t\t\t<p>Check this option to auto-save pages when discarding a tab. Some frame contents may be\n\t\t\t\t\t\t\tmissing (if you checked \"remove frames\"). </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoSaveRemoveLabel\"> <span class=\"option\">Option: auto-save on tab\n\t\t\t\t\t\t\tremoval</span>\n\t\t\t\t\t\t<p>Check this option to auto-save pages when closing a tab. Some frame contents may be missing\n\t\t\t\t\t\t\t(if you checked \"remove frames\"). </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoSaveDelayLabel\"> <span class=\"option\">Option: auto-save waiting delay\n\t\t\t\t\t\t\tafter load (s)</span>\n\t\t\t\t\t\t<p>Enter the delay in seconds to wait before saving a page when the \"auto-save on page load or\n\t\t\t\t\t\t\ton page unload\" or \"auto-save on page load\" is checked. </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoSaveRepeatLabel\"> <span class=\"option\">Option: auto-save\n\t\t\t\t\t\t\tperiodically</span>\n\t\t\t\t\t\t<p>Check this option to auto-save pages periodically after load.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoSaveRepeatDelayLabel\"> <span class=\"option\">Option: period (s)</span>\n\t\t\t\t\t\t<p>Enter the delay in seconds to wait before each page saving when the \"auto-save\n\t\t\t\t\t\t\tperiodically\" option is checked. </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"autoSaveExternalSaveLabel\"> <span class=\"option\">Option: save the page with\n\t\t\t\t\t\t\tSingleFile Companion</span>\n\t\t\t\t\t\t<p>Check this option to delegate the capturing and saving process to SingleFile Companion. It is\n\t\t\t\t\t\t\ta program that runs outside the browser and can help to make the saving process more\n\t\t\t\t\t\t\ttransparent. It also allows the pages to be saved in another directory than the download\n\t\t\t\t\t\t\tdirectory. You can find more info <a\n\t\t\t\t\t\t\t\thref=\"https://github.com/gildas-lormeau/single-file-companion\" target=\"_blank\">here</a>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Misc.</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li data-options-label=\"addProofLabel\"> <span class=\"option\">Option: add proof of existence</span>\n\t\t\t\t\t\t<p>Check this option to create a worldwide proof of the existence of the page you want to save.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li> <strong>What is a proof of existence (data anchoring)?</strong><br> Data anchoring\n\t\t\t\t\t\t\t\tconsists in building a time-stamped proof of existence for a data by linking it to a\n\t\t\t\t\t\t\t\ttamper resistant and time-stamped blockchain. Data anchoring implementation relies on\n\t\t\t\t\t\t\t\tthe resilience and immutability of the Bitcoin blockchain to provide the best possible\n\t\t\t\t\t\t\t\tsecurity level </li>\n\t\t\t\t\t\t\t<li> <strong>How does this protect my data?</strong><br> The anchoring mechanism only\n\t\t\t\t\t\t\t\thandles data impressions. Your data remains where you calculate the fingerprints, i.e.\n\t\t\t\t\t\t\t\tin the browser. Their confidentiality is totally preserved. </li>\n\t\t\t\t\t\t\t<li> <strong> The day after your backup you can get freely the proof receipt here: <a\n\t\t\t\t\t\t\t\t\t\thref=\"https://gildas-lormeau.github.io/singlefile-woleet/index.html\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\">gildas-lormeau.github.io/singlefile-woleet/index.html</a>.\n\t\t\t\t\t\t\t\t\tA proof receipt will be used to verify the validity of the evidence </strong> </li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<p> More information <a href=\"https://doc.woleet.io\" target=\"_blank\">doc.woleet.io</a> </p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"woleetKeyLabel\" hidden> <span class=\"option\">Option: access token</span>\n\t\t\t\t\t\t<p>Enter your personal access token on Woleet, see the <a href=\"http://app.woleet.io/\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\">registration page</a> on Woleet for more information.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"backgroundSaveLabel\" id=\"backgroundSaveOption\"> <span class=\"option\">Option:\n\t\t\t\t\t\t\tsave pages in\n\t\t\t\t\t\t\tbackground</span>\n\t\t\t\t\t\t<p>Uncheck this option if you get invalid file names like\n\t\t\t\t\t\t\t\"37bec68b-446a-46a5-8642-19a89c231b46.html\" or interrupted downloads when saving pages. You\n\t\t\t\t\t\t\tcan also uncheck this option if you want the \"Save as\" dialog to remember the last saved\n\t\t\t\t\t\t\tpath. Unchecking this option prevent using sub-directories in filename templates.</p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>check</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li data-options-label=\"displayStatsLabel\"> <span class=\"option\">Option: display stats in the\n\t\t\t\t\t\t\tconsole after processing</span>\n\t\t\t\t\t\t<p>Check this option to display stats about processing in the JavaScript developer tools of your\n\t\t\t\t\t\t\tbrowser. Checking this option may increase the CPU consumption and the time needed to save a\n\t\t\t\t\t\t\tpage. </p>\n\t\t\t\t\t\t<p class=\"notice\">It is recommended to <u>uncheck</u> this option</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<p id=\"auto-settings-rules\">Auto-settings rules</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>The auto-settings rules let you associate a complete or partial URL with a profile. It also\n\t\t\t\t\t\tallows to associate a specific profile for the auto-save, or to disable it (check \"display\n\t\t\t\t\t\t'Auto-save profile' column\"). When two or more rules match a URL of a page to save, the rule\n\t\t\t\t\t\twith the longest URL will be chosen. The special profile \"-\" means the current profile. </li>\n\t\t\t\t\t<li>You can use the special value \"*\" as URL to create a rule that applies to all URLs</li>\n\t\t\t\t\t<li>You can use regular expressions by prefixing the URL with \"regexp:\" (e.g. \"regexp:.*\\.com\" to\n\t\t\t\t\t\tmatch all URLs containing \".com\"). When zero or more rules based on URLs and one or more rules\n\t\t\t\t\t\tbased on regular expressions match a URL, the longest rule based on regular expression will be\n\t\t\t\t\t\tchosen. </li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Form buttons</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li><span class=\"option\">synchronize options</span>\n\t\t\t\t\t\t<p>Check this option to synchronize your options and make them available in all instances of the\n\t\t\t\t\t\t\tbrowser you are logged into, on different devices.</p>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><span class=\"option\">Reset</span>\n\t\t\t\t\t\t<p>Reset all options to their default values.</p>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li><a id=\"annotation-editor\">Annotation editor</a>\n\t\t\t\t<p>The annotation editor can be opened by selecting \"Annotate and save the page\" in the context menu or\n\t\t\t\t\tby enabling the option \"Annotation editor &gt; edit page before saving\". It allows you to:\n\t\t\t\t<ul>\n\t\t\t\t\t<li>add notes by clicking one of these buttons: <img src=\"../resources/button_note_yellow.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"> <img src=\"../resources/button_note_pink.png\" class=\"icon button\"> <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_note_blue.png\" class=\"icon button\"> <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_note_green.png\" class=\"icon button\"></li>\n\t\t\t\t\t<li>hide or show notes by clicking the button <img src=\"../resources/button_note_visible.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"></li>\n\t\t\t\t\t<li>highlight text by clicking one of these buttons: <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_highlighter_yellow.png\" class=\"icon button\"> <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_highlighter_pink.png\" class=\"icon button\"> <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_highlighter_blue.png\" class=\"icon button\"> <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_highlighter_green.png\" class=\"icon button\"></li>\n\t\t\t\t\t<li>hide or show highlighted text by clicking the button <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_highlighter_visible.png\" class=\"icon button\"></li>\n\t\t\t\t\t<li>remove text highlighting by clicking the button <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_highlighter_delete.png\" class=\"icon button\"></li>\n\t\t\t\t\t<li>edit the page by clicking the button <img src=\"../resources/button_note_edit.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"> </li>\n\t\t\t\t\t<li>format the page to improve readability (when possible) by clicking the button <img\n\t\t\t\t\t\t\tsrc=\"../resources/button_note_format.png\" class=\"icon button\"> </li>\n\t\t\t\t\t<li>remove contents by clicking the button <img src=\"../resources/button_cut_inner.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"> (inner elements) or <img src=\"../resources/button_cut_outer.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"> (outer elements)</li>\n\t\t\t\t\t<li>undo removes by clicking the button <img src=\"../resources/button_undo_cut.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"> or the button <img src=\"../resources/button_undo_all_cut.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"> (undo all)</li>\n\t\t\t\t\t<li>redo removes by clicking the button <img src=\"../resources/button_redo_cut.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"></li>\n\t\t\t\t\t<li>print the page by clicking the button <img src=\"../resources/button_print.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"> or by pressing <code>Ctrl-P</code></li>\n\t\t\t\t\t<li>save the page by clicking the button <img src=\"../resources/button_download.png\"\n\t\t\t\t\t\t\tclass=\"icon button\"> or by pressing <code>Ctrl-S</code></li>\n\t\t\t\t</ul>\n\t\t\t\t</p>\n\t\t\t\t<br>\n\t\t\t\t<p>\n\t\t\t\t\tYou can use the following keyboard shortcuts when removing contents with <img\n\t\t\t\t\t\tsrc=\"../resources/button_cut_inner.png\" class=\"icon button\"> or <img\n\t\t\t\t\t\tsrc=\"../resources/button_cut_outer.png\" class=\"icon button\">:\n\t\t\t\t<ul>\n\t\t\t\t\t<li><code>Tab</code>: expand the selection</li>\n\t\t\t\t\t<li><code>Shift-Tab</code>: reduce the selection</li>\n\t\t\t\t\t<li><code>Space</code>: remove the selected element</li>\n\t\t\t\t\t<li><code>Ctrl-Z</code>: undo the last removal</li>\n\t\t\t\t\t<li><code>Ctrl-Shift-Z</code>: redo the last removal</li>\n\t\t\t\t\t<li><code>Ctrl</code>: select/unselect multiple elements, releasing the <code>Ctrl</code> key\n\t\t\t\t\t\tvalidates the selection</li>\n\t\t\t\t\t<li><code>Shift</code>: temporarily reverse the type of removal (i.e. removal of inner elements or\n\t\t\t\t\t\tremoval of outer elements) on the last selected element and reset the other selected elements if\n\t\t\t\t\t\tany</li>\n\t\t\t\t\t<li><code>Escape</code>: reset selected elements</li>\n\t\t\t\t</ul>\n\t\t\t\t</p>\n\t\t\t</li>\n\t\t\t<li><a id=\"template-variables\">Template variables</a>\n\t\t\t\t<p>The template variables are used to customize the infobar content or the file name of a saved page.\n\t\t\t\t\tThey help to insert dynamic values like the save date or the page title.</p>\n\t\t\t\t<p> You can limit the length of a dynamic value by adding <code>[<em>maxByteSize</em>]</code> or\n\t\t\t\t\t<code>[<em>maxCharSize</em>ch]</code> just after the variable name. The <code>maxByteSize</code>\n\t\t\t\t\tvalue is the maximum length of the value in bytes (e.g. `{page-title}[20]` to limit the title to 20\n\t\t\t\t\tbytes). The <code>maxCharSize</code> value is the maximum length in characters (e.g.\n\t\t\t\t\t`{page-title}[10ch]` to limit the title to 10 characters).\n\t\t\t\t</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li><code>{navigator-language}</code>: the language of the browser</li>\n\t\t\t\t\t<li><code>{page-title}</code>: the title of the page</li>\n\t\t\t\t\t<li><code>{page-heading}</code>: the content of the H1 tag in the page</li>\n\t\t\t\t\t<li><code>{page-language}</code>: the language of the page</li>\n\t\t\t\t\t<li><code>{page-description}</code>: the description of the page</li>\n\t\t\t\t\t<li><code>{page-author}</code>: the author of the page</li>\n\t\t\t\t\t<li><code>{page-creator}</code>: the creator of the page</li>\n\t\t\t\t\t<li><code>{page-publisher}</code>: the publisher of the page</li>\n\t\t\t\t\t<li><code>{datetime-iso}</code>: the save date and time in the ISO format (e.g.\n\t\t\t\t\t\t\"2018-09-15T22_38_26_317Z\")</li>\n\t\t\t\t\t<li><code>{datetime-utc}</code>: the save date and time in UTC format (e.g. \"Sat, 15 Sep 2018\n\t\t\t\t\t\t22_38_26 GMT\")</li>\n\t\t\t\t\t<li><code>{datetime-locale}</code>: the localized value of the date and time (e.g. \"9_16_2018,\n\t\t\t\t\t\t12_54_31 AM\")</li>\n\t\t\t\t\t<li><code>{date-iso}</code>: the save date in the ISO format (e.g. \"2018-09-15\")</li>\n\t\t\t\t\t<li><code>{date-locale}</code>: the localized value of the save date (e.g. \"16_09_2018\")</li>\n\t\t\t\t\t<li><code>{time-iso}</code>: the save time in the ISO format (e.g. \"22_38_26_317\")</li>\n\t\t\t\t\t<li><code>{time-locale}</code>: the localized value of the save time (e.g. \"00_38_26\")</li>\n\t\t\t\t\t<li><code>{time-ms}</code>: the save time is ms since the Unix Epoch (e.g. 1563582018000)</li>\n\t\t\t\t\t<li><code>{day-utc}</code>: the day of the save date in UTC format (e.g. \"15\")</li>\n\t\t\t\t\t<li><code>{day-locale}</code>: the localized value of the day (e.g. \"15\")</li>\n\t\t\t\t\t<li><code>{month-utc}</code>: the month of the save date in UTC format (e.g. \"09\")</li>\n\t\t\t\t\t<li><code>{month-locale}</code>: the localized value of the month (e.g. \"09\")</li>\n\t\t\t\t\t<li><code>{year-utc}</code>: the year of the save date in UTC format (e.g. \"2018\")</li>\n\t\t\t\t\t<li><code>{year-locale}</code>: the localized value of the year (e.g. \"2018\")</li>\n\t\t\t\t\t<li><code>{hours-utc}</code>: the hour of the save date in UTC format (e.g. \"20\")</li>\n\t\t\t\t\t<li><code>{hours-locale}</code>: the localized value of the hour (e.g. \"22\")</li>\n\t\t\t\t\t<li><code>{minutes-utc}</code>: the minutes of the save date in UTC format (e.g. \"38\")</li>\n\t\t\t\t\t<li><code>{minutes-locale}</code>: the localized value of the minutes (e.g. \"38\")</li>\n\t\t\t\t\t<li><code>{seconds-utc}</code>: the seconds of the save date in UTC format (e.g. \"31\")</li>\n\t\t\t\t\t<li><code>{seconds-locale}</code>: the localized value of the seconds (e.g. \"31\")</li>\n\t\t\t\t\t<li><code>{visit-datetime-iso}</code>: the visit date and time in the ISO format (e.g.\n\t\t\t\t\t\t\"2018-09-15T22_38_26_317Z\")</li>\n\t\t\t\t\t<li><code>{visit-datetime-utc}</code>: the visit date and time in UTC format (e.g. \"Sat, 15 Sep 2018\n\t\t\t\t\t\t22_38_26 GMT\")</li>\n\t\t\t\t\t<li><code>{visit-datetime-locale}</code>: the localized value of the date and time (e.g. \"9_16_2018,\n\t\t\t\t\t\t12_54_31 AM\")</li>\n\t\t\t\t\t<li><code>{visit-date-iso}</code>: the visit date in the ISO format (e.g. \"2018-09-15\")</li>\n\t\t\t\t\t<li><code>{visit-date-locale}</code>: the localized value of the visit date (e.g. \"16_09_2018\")</li>\n\t\t\t\t\t<li><code>{visit-time-iso}</code>: the visit time in the ISO format (e.g. \"22_38_26_317\")</li>\n\t\t\t\t\t<li><code>{visit-time-locale}</code>: the localized value of the visit time (e.g. \"00_38_26\")</li>\n\t\t\t\t\t<li><code>{visit-time-ms}</code>: the visit time is ms since the Unix Epoch (e.g. 1563582018000)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>{visit-day-utc}</code>: the day of the visit date in UTC format (e.g. \"15\")</li>\n\t\t\t\t\t<li><code>{visit-day-locale}</code>: the localized value of the day (e.g. \"15\")</li>\n\t\t\t\t\t<li><code>{visit-month-utc}</code>: the month of the visit date in UTC format (e.g. \"09\")</li>\n\t\t\t\t\t<li><code>{visit-month-locale}</code>: the localized value of the month (e.g. \"09\")</li>\n\t\t\t\t\t<li><code>{visit-year-utc}</code>: the year of the visit date in UTC format (e.g. \"2018\")</li>\n\t\t\t\t\t<li><code>{visit-year-locale}</code>: the localized value of the year (e.g. \"2018\")</li>\n\t\t\t\t\t<li><code>{visit-hours-utc}</code>: the hour of the visit date in UTC format (e.g. \"20\")</li>\n\t\t\t\t\t<li><code>{visit-hours-locale}</code>: the localized value of the hour (e.g. \"22\")</li>\n\t\t\t\t\t<li><code>{visit-minutes-utc}</code>: the minutes of the visit date in UTC format (e.g. \"38\")</li>\n\t\t\t\t\t<li><code>{visit-minutes-locale}</code>: the localized value of the minutes (e.g. \"38\")</li>\n\t\t\t\t\t<li><code>{visit-seconds-utc}</code>: the seconds of the visit date in UTC format (e.g. \"31\")</li>\n\t\t\t\t\t<li><code>{visit-seconds-locale}</code>: the localized value of the seconds (e.g. \"31\")</li>\n\t\t\t\t\t<li><code>{url-href}</code>: the URL of the page (e.g. \"http://example.com/category/index.html\")\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>{url-href-digest-sha-1}</code>: the SHA-1 hash value of the URL of the page (e.g.\n\t\t\t\t\t\t4b826844d9f5c128533e4ff14d746334f3ac9e00) <strong>(note: only supported in filename, not\n\t\t\t\t\t\t\tinfobar)</strong></li>\n\t\t\t\t\t<li><code>{url-href-flat}</code>: the URL of the page with replaced slashes (e.g.\n\t\t\t\t\t\t\"http__example.com_category_index.html\")</li>\n\t\t\t\t\t<li><code>{url-pathname}</code>: the path name of the URL (e.g. \"category/index.html\")</li>\n\t\t\t\t\t<li><code>{url-pathname-flat}</code>: the path name of the URL with replaced slashes (e.g.\n\t\t\t\t\t\t\"category_index.html\")</li>\n\t\t\t\t\t<li><code>{url-last-segment}</code>: the last part of the pathname (without the extension) or the\n\t\t\t\t\t\thost if not found (e.g. \"index\")</li>\n\t\t\t\t\t<li><code>{url-filename}</code>: the file name of the URL (e.g. \"index.html\")</li>\n\t\t\t\t\t<li><code>{url-protocol}</code>: the protocol of the URL (e.g. \"https\")</li>\n\t\t\t\t\t<li><code>{url-host}</code>: the host name + the port of the URL (e.g. \"example.com_8080\")</li>\n\t\t\t\t\t<li><code>{url-hostname}</code>: the host name of the URL (e.g. \"example.com\")</li>\n\t\t\t\t\t<li><code>{url-hostname-suffix}</code>: the suffix of the host name of the URL (e.g. \"com\")</li>\n\t\t\t\t\t<li><code>{url-hostname-domain}</code>: the domain of the host name of the URL (e.g. \"example\")</li>\n\t\t\t\t\t<li><code>{url-hostname-root}</code>: the root of the host name of the URL (e.g. \"example.com\")</li>\n\t\t\t\t\t<li><code>{url-hostname-subdomains}</code>: the sub-domains of the host name of the URL (e.g.\n\t\t\t\t\t\t\"sub\" for \"sub.example.com\"), \"www\" is ignored</li>\n\t\t\t\t\t<li><code>{url-port}</code>: the port of the URL (e.g. \"8080\")</li>\n\t\t\t\t\t<li><code>{url-username}</code>: the user name of the URL (e.g. \"john_doe\")</li>\n\t\t\t\t\t<li><code>{url-password}</code>: the password of the URL (e.g. \"qwerty123\")</li>\n\t\t\t\t\t<li><code>{url-search}</code>: the search string of the URL (e.g. \"order=ascending\")</li>\n\t\t\t\t\t<li><code>{url-hash}</code>: the hash of the URL (e.g. \"chapter-2\")</li>\n\t\t\t\t\t<li><code>{url-referrer}</code>: the URI of the page that \"linked\" to the page (e.g.\n\t\t\t\t\t\t\"http://example.com\")</li>\n\t\t\t\t\t<li><code>{url-referrer-flat}</code>: the URI of the page that \"linked\" to the page with slashed\n\t\t\t\t\t\treplaced (e.g. \"http_example.com\")</li>\n\t\t\t\t\t<li><code>{url-original}</code>: the original URL of the page (e.g.\n\t\t\t\t\t\t\"http://example.com/index.html\")</li>\n\t\t\t\t\t<li><code>{bookmark-pathname}</code>: the path name of the newly created bookmark (e.g. \"My\n\t\t\t\t\t\tBookmarks/Last Month\") when the option \"Bookmarks &gt; save the page of a\n\t\t\t\t\t\tnewly created bookmark\" is enabled</li>\n\t\t\t\t\t<li><code>{bookmark-pathname-flat}</code>: the path name of the newly created bookmark with replaced\n\t\t\t\t\t\tslashes (e.g. \"My Bookmarks_Last Month\") when the option \"Bookmarks &gt; save the page of a\n\t\t\t\t\t\tnewly created bookmark\" is enabled</li>\n\t\t\t\t\t<li><code>{tab-id}</code>: the unique identifier of the tab (e.g. \"326\")</li>\n\t\t\t\t\t<li><code>{tab-index}</code>: the index of the tab in the window (e.g. \"1\")</li>\n\t\t\t\t\t<li><code>{digest-sha-256}</code>: the SHA-256 hash value of the entire page content (e.g.\n\t\t\t\t\t\te3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) <strong>(note: only supported\n\t\t\t\t\t\t\tin filename, not infobar)</strong></li>\n\t\t\t\t\t<li><code>{digest-sha-384}</code>: the SHA-384 hash value of the entire page content <strong>(note:\n\t\t\t\t\t\t\tonly supported in filename, not infobar)</strong></li>\n\t\t\t\t\t<li><code>{digest-sha-512}</code>: the SHA-512 hash value of the entire page content <strong>(note:\n\t\t\t\t\t\t\tonly supported in filename, not infobar)</strong></li>\n\t\t\t\t\t<li><code>{profile-name}</code>: the name of the profile used to save the page</li>\n\t\t\t\t\t<li><code>{filename-extension}</code>: the extension of the filename depending on the file format\n\t\t\t\t\t\t(i.e. \"html\", \"u.zip.html\", \"zip.html\", \"zip\")</li>\n\t\t\t\t\t<li><code>{save-action}</code>: the action used to save the page (i.e. \"page\", \"selection\")</li>\n\t\t\t\t\t<li><code>{options-json}</code>: the JSON representation of the options used to save the page. Each\n\t\t\t\t\t\tproperty name is written in camel case (e.g. \"blockScripts\")</li>\n\t\t\t\t\t<li><code>{options-text}</code>: the text representation of the options used to save the page. The\n\t\t\t\t\t\ttext representation is formatted with a list of options and their values separated by a line\n\t\t\t\t\t\tbreak (e.g. \"saveRawPage: false\\includeInfobar: true...\")</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li><a id=\"template-functions\" href=\"#template-functions\">Template functions</a>\n\t\t\t\t<p>The template functions are used to format values in the template or to insert values depending on\n\t\t\t\t\tparameters.</p>\n\t\t\t\t<p>The syntax of a function call is <code>%<em>function-name</em>&lt;<em>parameter</em>&gt;</code>.\n\t\t\t\t\tYou can pass multiple parameters separated with a pipe character (e.g.\n\t\t\t\t\t\"%<em>function-name</em>&lt;<em>parameter1</em>|<em>parameter2</em>&gt;\"). Like the template\n\t\t\t\t\tvariables, you can limit the length of a dynamic value by adding <code>[<em>maxByteSize</em>]</code>\n\t\t\t\t\tor <code>[<em>maxCharSize</em>ch]</code> just after the function name.\n\t\t\t\t</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li><code>%if-empty&lt;value|default&gt;</code>: returns the <code>default</code> value if\n\t\t\t\t\t\t<code>value</code> is empty (e.g. \"%if-empty&lt;{page-title}|Untitled&gt;\" to return \"Untitled\"\n\t\t\t\t\t\tif the page title is empty).\n\t\t\t\t\t\tYou also can pass multiple values separated with a pipe character (e.g.\n\t\t\t\t\t\t\"%if-empty&lt;{page-title}|{page-heading}|Untitled&gt;\" to return the page heading if not empty,\n\t\t\t\t\t\tthe page title if not empty or \"Untitled\" if both are empty).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%if-not-empty&lt;value|default&gt;</code>: returns the <code>default</code> value if\n\t\t\t\t\t\t<code>value</code> is not empty (e.g. \"%if-not-empty&lt;{page-title}({page-title})&gt; to return\n\t\t\t\t\t\tthe page title surrounded by parentheses if the page title is not empty).\n\t\t\t\t\t\tYou also can pass multiple values separated like with the function <code>%if-empty</code>.\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%if-equals&lt;value|expected|trueValue|falseValue&gt;</code>: returns the\n\t\t\t\t\t\t<code>trueValue</code> if <code>value</code> equals <code>expected</code> or the\n\t\t\t\t\t\t<code>falseValue</code> otherwise (e.g.\n\t\t\t\t\t\t\"%if-equals&lt;{page-title}|Untitled|{page-heading}|{page-title}&gt;\"\n\t\t\t\t\t\tto return the page heading if the page title equals \"Untitled\" or the page title otherwise).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%if-not-equals&lt;value|expected|trueValue|falseValue&gt;</code>: returns the\n\t\t\t\t\t\t<code>trueValue</code> if <code>value</code> does not equal <code>expected</code> or the\n\t\t\t\t\t\t<code>falseValue</code> otherwise (e.g.\n\t\t\t\t\t\t\"%if-not-equals&lt;{page-title}|Untitled|{page-title}|{page-heading}&gt;\"\n\t\t\t\t\t\tto return the page title if the page title does not equal \"Untitled\" or the page heading\n\t\t\t\t\t\totherwise).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%if-contains&lt;value|expected|trueValue|falseValue&gt;</code>: returns the\n\t\t\t\t\t\t<code>trueValue</code> if <code>value</code> contains <code>expected</code> or the\n\t\t\t\t\t\t<code>falseValue</code> otherwise (e.g.\n\t\t\t\t\t\t\"%if-contains&lt;{page-title}|Untitled|{page-heading}|{page-title}&gt;\"\n\t\t\t\t\t\tto return the page heading if the page title contains \"Untitled\" or the page title otherwise).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%if-not-contains&lt;value|expected|trueValue|falseValue&gt;</code>: returns the\n\t\t\t\t\t\t<code>trueValue</code> if <code>value</code> does not contain <code>expected</code> or the\n\t\t\t\t\t\t<code>falseValue</code> otherwise (e.g.\n\t\t\t\t\t\t\"%if-not-contains&lt;{page-title}|Untitled|{page-title}|{page-heading}&gt;\"\n\t\t\t\t\t\tto return the page title if the page title does not contain \"Untitled\" or the page heading\n\t\t\t\t\t\totherwise).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%substring&lt;value|start|end&gt;</code>: returns a substring of the <code>value</code>\n\t\t\t\t\t\t(e.g. \"%substring&lt;{page-title}|0|20&gt;\" to return the first 20 characters of the page\n\t\t\t\t\t\ttitle, \"%substring&lt;{page-title}|5&gt;\" to return the page title without the first 5\n\t\t\t\t\t\tcharacters).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%lowercase&lt;value&gt;</code>: returns the <code>value</code> in lowercase (e.g.\n\t\t\t\t\t\t\"%lowercase&lt;{page-title}&gt;\" to return the page title in lowercase).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%uppercase&lt;value&gt;</code>: returns the <code>value</code> in uppercase (e.g.\n\t\t\t\t\t\t\"%uppercase&lt;{page-title}&gt;\" to return the page title in uppercase).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%capitalize&lt;value&gt;</code>: returns the <code>value</code> with the first letter in\n\t\t\t\t\t\tuppercase (e.g. \"%capitalize&lt;{page-title}&gt;\" to return the page title with the first letter\n\t\t\t\t\t\tin uppercase).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%replace&lt;value|search|replacement&gt;</code>: returns the <code>value</code> with\n\t\t\t\t\t\tall <code>search</code> values replaced by <code>replacement</code> (e.g.\n\t\t\t\t\t\t\"%replace&lt;{page-title}| |_&gt;\" to replace all spaces by underscores in the page title).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%repeat&lt;value|count&gt;</code>: returns the <code>value</code> repeated\n\t\t\t\t\t\t<code>count</code> times (e.g. \"%repeat&lt;{page-title}|3&gt;\" to repeat the page title 3\n\t\t\t\t\t\ttimes).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%index-of&lt;value|search|fromIndex&gt;</code>: returns the index of the first occurrence\n\t\t\t\t\t\tof <code>search</code> in <code>value</code> (e.g. \"%index-of&lt;{page-title}|\"Title\"&gt;\" to\n\t\t\t\t\t\treturn the index of the first occurrence of the string \"Title\" in <code>page-title</code>).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%last-index-of&lt;value|search|fromIndex&gt;</code>: returns the index of the last\n\t\t\t\t\t\toccurrence of <code>search</code> in <code>value</code> (e.g.\n\t\t\t\t\t\t\"%last-index-of&lt;{page-title}|\"Title\"&gt;\" to return the index of the last occurrence of the\n\t\t\t\t\t\tstring \"Title\" in <code>page-title</code>).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%length&lt;value&gt;</code>: returns the length of the <code>value</code> (e.g.\n\t\t\t\t\t\t\"%length&lt;{page-title}&gt;\" to return the length of the page title).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%trim&lt;value&gt;</code>: returns the <code>value</code> with all leading and trailing\n\t\t\t\t\t\twhitespace removed (e.g. \"%trim&lt;{page-title}&gt;\" to remove all leading and trailing\n\t\t\t\t\t\twhitespace in the page title).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%trim-left&lt;value&gt;</code>: returns the <code>value</code> with all leading\n\t\t\t\t\t\twhitespace removed (e.g. \"%trim-left&lt;{page-title}&gt;\" to remove all leading whitespace in\n\t\t\t\t\t\tthe page title).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%trim-right&lt;value&gt;</code>: returns the <code>value</code> with all trailing\n\t\t\t\t\t\twhitespace removed (e.g. \"%trim-right&lt;{page-title}&gt;\" to remove all trailing whitespace in\n\t\t\t\t\t\tthe page title).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%pad-left&lt;value|length|pad&gt;</code>: returns the <code>value</code> with\n\t\t\t\t\t\t<code>pad</code> added to the left side so as to make the length of the <code>value</code> equal\n\t\t\t\t\t\tto <code>length</code> (e.g. \"%pad-left&lt;{page-title}|20|_&gt;\" to add underscores to the left\n\t\t\t\t\t\tside of the page title so as to make its length equal to 20).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%pad-right&lt;value|length|pad&gt;</code>: returns the <code>value</code> with\n\t\t\t\t\t\t<code>pad</code> added to the right side so as to make the length of the <code>value</code>\n\t\t\t\t\t\tequal to <code>length</code> (e.g. \"%pad-right&lt;{page-title}|20|_&gt;\" to add underscores to\n\t\t\t\t\t\tthe right side of the page title so as to make its length equal to 20).\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%url-search-name&lt;index&gt;</code>: the name of the search parameter at the specified\n\t\t\t\t\t\tindex (e.g. \"%url-search-name&lt;0&gt;\" for the name of the first search parameter)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%url-search-value&lt;index&gt;</code>: the value of the search parameter at the specified\n\t\t\t\t\t\tindex (e.g. \"%url-search-value&lt;0&gt;\" for the value of the first search parameter)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%url-search-named-value&lt;name&gt;</code>: the value of the search parameter with the\n\t\t\t\t\t\tspecified name (e.g. \"%url-search-named-value&lt;id&gt;\" for the value of the search parameter\n\t\t\t\t\t\t\"id\")\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%url-segment&lt;index&gt;</code>: the segment of the pathname at the specified index (e.g.\n\t\t\t\t\t\t\"%url-segment&lt;0&gt;\" for the first segment of the pathname)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%url-hostname-subdomain&lt;index&gt;</code>: the subdomain of the hostname at the\n\t\t\t\t\t\tspecified index (e.g. \"%url-hostname-subdomain&lt;0&gt;\" for the first subdomain of the\n\t\t\t\t\t\thostname)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%stringify&lt;value&gt;</code>: the string representation of the specified value (e.g.\n\t\t\t\t\t\t\"%stringify&lt;{page-title}&gt;\" for the string representation of the page title)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%encode-uri&lt;value&gt;</code>: the URI-encoded representation of the specified value\n\t\t\t\t\t\t(e.g. \"%encode-uri&lt;{page-title}&gt;\" for the URI-encoded representation of the page title)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%decode-uri&lt;value&gt;</code>: the URI-decoded representation of the specified value\n\t\t\t\t\t\t(e.g. \"%decode-uri&lt;{page-title}&gt;\" for the URI-decoded representation of the page title)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%encode-uri-component&lt;value&gt;</code>: the URI-encoded representation of the\n\t\t\t\t\t\tspecified value (e.g. \"%encode-uri-component&lt;{page-title}&gt;\" for the URI-encoded\n\t\t\t\t\t\trepresentation of the page title)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%decode-uri-component&lt;value&gt;</code>: the URI-decoded representation of the\n\t\t\t\t\t\tspecified value (e.g. \"%decode-uri-component&lt;{page-title}&gt;\" for the URI-decoded\n\t\t\t\t\t\trepresentation of the page title)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%encode-base64&lt;value&gt;</code>: the base64-encoded representation of the specified\n\t\t\t\t\t\tvalue (e.g. \"%encode-base64&lt;{page-title}&gt;\" for the base64-encoded representation of the\n\t\t\t\t\t\tpage title)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%decode-base64&lt;value&gt;</code>: the base64-decoded representation of the specified\n\t\t\t\t\t\tvalue (e.g. \"%decode-base64&lt;{page-title}&gt;\" for the base64-decoded representation of the\n\t\t\t\t\t\tpage title)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%page-element-text&lt;selector&gt;</code>: the text content of the first element matching\n\t\t\t\t\t\tthe specified selector (e.g. \"%page-element-text&lt;h1&gt;\" for the text content of the first H1\n\t\t\t\t\t\telement)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%page-element-attribute&lt;selector|attribute&gt;</code>: the value of the specified\n\t\t\t\t\t\tattribute of the first element matching the specified selector (e.g.\n\t\t\t\t\t\t\"%page-element-attribute&lt;h1|class&gt;\" for the class attribute of the first H1 element)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%date-locale&lt;locales&gt;</code>: the localized value of the date and time (e.g.\n\t\t\t\t\t\t\"%date-locale&lt;en-US&gt;\" for the date and time in the US English format)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%time-locale&lt;locales&gt;</code>: the localized value of the time (e.g.\n\t\t\t\t\t\t\"%time-locale&lt;en-US&gt;\" for the time in the US English format)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%datetime-locale&lt;locales&gt;</code>: the localized value of the date and time (e.g.\n\t\t\t\t\t\t\"%datetime-locale&lt;en-US&gt;\" for the date and time in the US English format)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%datetime-custom&lt;locale|year|month|day|weekday|hour|minute|second|hour12|time-zone|fractional-seconds-digits|time-zone-name|era|locale-matcher&gt;</code>:\n\t\t\t\t\t\tthe date and time formatted according to the specified locale and options. See below for the\n\t\t\t\t\t\tlist of options. You can pass <code> </code> (space character) as a value to use the default\n\t\t\t\t\t\tvalue for an option. You can also omit options at the end of the list. For example, to format\n\t\t\t\t\t\tthe date and time in the US English format with the year, day, and weekday, you can use\n\t\t\t\t\t\t\"%datetime-custom&lt;en-US|numeric| |numeric| |numeric&gt;\".\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li><code>locale</code>: the locale to use as a BCP 47 language tag (e.g. \"en-US\")</li>\n\t\t\t\t\t\t\t<li><code>year</code>: the year format (i.e. \"numeric\", \"2-digit\")</li>\n\t\t\t\t\t\t\t<li><code>month</code>: the month format (i.e. \"numeric\", \"2-digit\", \"narrow\", \"short\",\n\t\t\t\t\t\t\t\t\"long\")\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li><code>day</code>: the day format (i.e. \"numeric\", \"2-digit\")</li>\n\t\t\t\t\t\t\t<li><code>weekday</code>: the weekday format (i.e. \"narrow\", \"short\", \"long\")</li>\n\t\t\t\t\t\t\t<li><code>hour</code>: the hour format (i.e. \"numeric\", \"2-digit\")</li>\n\t\t\t\t\t\t\t<li><code>minute</code>: the minute format (i.e. \"numeric\", \"2-digit\")</li>\n\t\t\t\t\t\t\t<li><code>second</code>: the second format (i.e. \"numeric\", \"2-digit\")</li>\n\t\t\t\t\t\t\t<li><code>hour12</code>: whether to use 12-hour time (i.e. \"true\", \"false\")</li>\n\t\t\t\t\t\t\t<li><code>time-zone</code>: the time zone of the IANA Time Zone Database (e.g. \"UTC\", \"GMT\",\n\t\t\t\t\t\t\t\t\"EST\", \"PST\", \"America/New_York\")</li>\n\t\t\t\t\t\t\t<li><code>fractional-seconds-digits</code>: the number of fractional second digits (i.e.\n\t\t\t\t\t\t\t\t\"1\" to \"3\")</li>\n\t\t\t\t\t\t\t<li><code>time-zone-name</code>: the time zone name format (i.e. \"short\", \"long\",\n\t\t\t\t\t\t\t\t\"shortOffset\", \"longOffset\", \"shortGeneric\", \"longGeneric\")</li>\n\t\t\t\t\t\t\t<li><code>day-period</code>: the day period (i.e. \"narrow\", \"short\", \"long\")</li>\n\t\t\t\t\t\t\t<li><code>era</code>: the era (i.e. \"narrow\", \"short\", \"long\")</li>\n\t\t\t\t\t\t\t<li><code>locale-matcher</code>: the locale matcher (e.g. \"lookup\", \"best fit\")</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\tYou can find more information about the options in the <a\n\t\t\t\t\t\t\thref=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#parameters\"\n\t\t\t\t\t\t\ttarget=\"_blank\">DateTimeFormat constructor</a> documentation.\n\t\t\t\t\t</li>\n\t\t\t\t\t<li><code>%option-value&lt;key&gt;</code>: the value of the specified option (e.g.\n\t\t\t\t\t\t\"%option-value&lt;displayInfobar&gt;\" for the value of the \"displayInfobar\" option)\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a id=\"external-messages\">Integration with other extensions</a>\n\t\t\t\t<p>SingleFile can receive messages from other extensions. The messages must be sent to the extension ID\n\t\t\t\t\tof SingleFile and must be a string containing one of the following values:\n\t\t\t\t<ul>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<code>\"save-page\"</code>: save the current page\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<code>\"edit-and-save-page\"</code>: edit the current page in the annotation editor and save it\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<code>\"save-selected-links\"</code>: save all the links in the selected content\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<code>\"save-selected-content\"</code>: save the selected content\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<code>\"save-selected-tabs\"</code>: save the selected tabs\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<code>\"save-unpinned-tabs\"</code>: save the unpinned tabs\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<code>\"save-all-tabs\"</code>: save all the tabs\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t</p>\n\t\t\t</li>\n\t\t\t<li><a id=\"notes\">Technical notes</a>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>All images are converted into <a href=\"http://en.wikipedia.org/wiki/Base64\"\n\t\t\t\t\t\t\ttarget=\"_blank\">base64</a>. </li>\n\t\t\t\t\t<li>All resources except frame contents are injected in the document using <a\n\t\t\t\t\t\t\thref=\"http://en.wikipedia.org/wiki/Data_URI_scheme\" target=\"_blank\">data URI scheme</a>.\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>Frame contents are injected as text in the document by using the srcdoc attribute. </li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li><a id=\"known-issues\">Known issues</a>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>All browsers\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li>For security reasons, you cannot save pages hosted on https://chrome.google.com,\n\t\t\t\t\t\t\t\thttps://addons.mozilla.org and some other Mozilla domains. When this happens, 🚫 is\n\t\t\t\t\t\t\t\tdisplayed on top of the SingleFile icon.</li>\n\t\t\t\t\t\t\t<li>For security reasons, SingleFile is sometimes unable to save the image representation of\n\t\t\t\t\t\t\t\tcanvas and snapshots of video elements.</li>\n\t\t\t\t\t\t\t<li>The last saved path cannot be remembered by default. To circumvent this limitation,\n\t\t\t\t\t\t\t\tdisable the option \"Misc. &gt; Save pages in background\".</li>\n\t\t\t\t\t\t\t<li>The following characters are replaced by their full-width equivalent symbols in file\n\t\t\t\t\t\t\t\tnames: ~, +, ?, %, *, :, |, \", &lt;, &gt;, \\. The replacement characters are\n\t\t\t\t\t\t\t\trespectively: ～, ＋, ？, ％, ＊, ：, ｜, ＂, ＜, ＞, ＼. Other invalid charcaters are replaced by\n\t\t\t\t\t\t\t\t_. This is done to maintain compatibility with various OSs and file systems. If you\n\t\t\t\t\t\t\t\tdon't need that level of compatibility and know what you are doing, you can change the\n\t\t\t\t\t\t\t\tlist of forbidden characters and the replacement characters in the <a\n\t\t\t\t\t\t\t\t\thref=\"https://github.com/gildas-lormeau/SingleFile/wiki/Hidden-options\">hidden\n\t\t\t\t\t\t\t\t\toptions</a>.\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>Chromium-based browsers\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li>You must enable the option \"Allow access to file URLs\" in the extension page to display\n\t\t\t\t\t\t\t\tthe infobar when viewing a saved page, to save or to annotate a page stored on the\n\t\t\t\t\t\t\t\tfilesystem.</li>\n\t\t\t\t\t\t\t<li>If the filename of a saved page looks like \"56833935-156b-4d8c-a00f-19599c6513d3\",\n\t\t\t\t\t\t\t\tdisable the option \"Misc. &gt; Save pages in background\". Reinstalling the browser may\n\t\t\t\t\t\t\t\talso fix this issue.</li>\n\t\t\t\t\t\t\t<li>Disabling the option 'File name &gt; open the \"Save as\" dialog to confirm the file name'\n\t\t\t\t\t\t\t\twill work if and only if \"Ask where to save each file before downloading\" is disabled in\n\t\t\t\t\t\t\t\tchrome://settings/downloads</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>Firefox\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t<li>The \"File name &gt; file name conflict resolution\" option does not work if set to\n\t\t\t\t\t\t\t\t\"prompt for a name\".\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>Sometimes, SingleFile is unable to save the contents of sandboxed iframes.</li>\n\t\t\t\t\t\t\t<li>When processing a page from the filesystem, external resources (e.g. images,\n\t\t\t\t\t\t\t\tstylesheets, fonts etc.) will not be embedded into the saved page.</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li><a id=\"unknown-issues\">Troubleshooting unknown issues</a>\n\t\t\t\t<p>Please follow these steps if you find an unknown issue:</p>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>Save the page in incognito.</li>\n\t\t\t\t\t<li>If saving page in incognito did not fix the issue, reset SingleFile options.</li>\n\t\t\t\t\t<li>If resetting options did not fix the issue, restart the browser.</li>\n\t\t\t\t\t<li>If restarting the browser did not fix the issue, try to disable all other extensions to see if\n\t\t\t\t\t\tthere is a conflict.</li>\n\t\t\t\t\t<li>If there is a conflict then try to determine against which extension(s).</li>\n\t\t\t\t\t<li>Please report the issue <a href=\"https://github.com/gildas-lormeau/SingleFile/issues\"\n\t\t\t\t\t\t\ttarget=\"_blank\">here</a>\n\t\t\t\t\t\twith a short description on how to reproduce it.</li>\n\t\t\t\t</ul>\n\t\t\t\t<p>Suggestions are welcome :)</p>\n\t\t\t</li>\n\t\t\t<li><a id=\"contributors\">Contributors</a>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>Azerbaijani translation done by Hajiagha_Sadikhov (<a\n\t\t\t\t\t\t\thref=\"https://github.com/Hajiagha-Sadikhov\" target=\"_blank\">GitHub profile</a>)</li>\n\t\t\t\t\t<li>Chinese translation done by yfdyh000 (<a href=\"https://github.com/yfdyh000\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>), KrasnayaPloshchad (<a\n\t\t\t\t\t\t\thref=\"https://github.com/KrasnayaPloshchad\" target=\"_blank\">GitHub\n\t\t\t\t\t\t\tprofile</a>), frostblazergit (<a href=\"https://github.com/frostblazergit\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>), NightSharp (<a href=\"https://github.com/NightSharp\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>), lqzhgood (<a href=\"https://github.com/lqzhgood\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>) </li>\n\t\t\t\t\t<li>Traditional Chinese translation done by frostblazergit (<a\n\t\t\t\t\t\t\thref=\"https://github.com/frostblazergit\" target=\"_blank\">GitHub profile</a>), lqzhgood (<a\n\t\t\t\t\t\t\thref=\"https://github.com/lqzhgood\" target=\"_blank\">GitHub profile</a>)</li>\n\t\t\t\t\t<li>Dutch translation done by jooleer (<a href=\"https://github.com/jooleer\" target=\"_blank\">GitHub\n\t\t\t\t\t\t\tprofile</a>)</li>\n\t\t\t\t\t<li>Dutch translation done by jooleer (<a href=\"https://github.com/jooleer\" target=\"_blank\">GitHub\n\t\t\t\t\t\t\tprofile</a>)</li>\n\t\t\t\t\t<li>German translation done by womotroll (<a href=\"https://github.com/womotroll\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>), bannmann (<a href=\"https://github.com/bannmann\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>) </li>\n\t\t\t\t\t<li>Italian translation done by Fastbyte01 (<a href=\"https://github.com/Fastbyte01\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>)</li>\n\t\t\t\t\t<li>Japanese translation, done by Shitennouji （四天王寺) (<a href=\"https://github.com/Shitennouji\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>)</li>\n\t\t\t\t\t<li>Polish translation done by xesarni (<a href=\"https://github.com/xesarni\" target=\"_blank\">GitHub\n\t\t\t\t\t\t\tprofile</a>)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>Portuguese translation done by @Blackspirits (<a href=\"https://github.com/Blackspirit\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>Portuguese-Brazilian translation done by @mezysinc, Blackspirits (<a\n\t\t\t\t\t\t\thref=\"https://github.com/Blackspirit\" target=\"_blank\">GitHub profile</a>)\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>Russian translation done by rstp14 (<a href=\"https://github.com/rstp14\" target=\"_blank\">GitHub\n\t\t\t\t\t\t\tprofile</a>), kramola-RU (<a href=\"https://github.com/kramola-RU\" target=\"_blank\">GitHub\n\t\t\t\t\t\t\tprofile</a>), solokot (<a href=\"https://github.com/solokot\" target=\"_blank\">GitHub\n\t\t\t\t\t\t\tprofile</a>)</li>\n\t\t\t\t\t<li>Spanish translation done by strel (<a href=\"https://github.com/strel\" target=\"_blank\">GitHub\n\t\t\t\t\t\t\tprofile</a>)</li>\n\t\t\t\t\t<li>Swedish translation done by NickWick13 (<a href=\"https://github.com/NickWick13\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>)</li>\n\t\t\t\t\t<li>Turkish translation done by hbaklan943 (<a href=\"https://github.com/hbaklan943\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>)</li>\n\t\t\t\t\t<li>Ukrainian translation done by perdolka (<a href=\"https://github.com/perdolka\"\n\t\t\t\t\t\t\ttarget=\"_blank\">GitHub profile</a>), gildas-lormeau</li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<li><a id=\"icons\">Icons</a>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>Icon made by <a href=\"https://www.flaticon.com/authors/kiranshastry\" title=\"Kiranshastry\"\n\t\t\t\t\t\t\ttarget=\"_blank\" s>Kiranshastry</a> from <a href=\"https://www.flaticon.com/\" title=\"Flaticon\"\n\t\t\t\t\t\t\ttarget=\"_blank\">www.flaticon.com</a> is licensed by <a\n\t\t\t\t\t\t\thref=\"http://creativecommons.org/licenses/by/3.0/\" title=\"Creative Commons BY 3.0\"\n\t\t\t\t\t\t\ttarget=\"_blank\">CC 3.0 BY</a> </li>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ol>\n\t</div>\n\t<script type=\"module\" src=\"../bg/ui-help.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/ui/pages/help_zh_CN.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n    <title>SingleFile帮助</title>\n    <link href=\"help.css\" rel=\"stylesheet\">\n    <meta content=\"width=device-width,initial-scale=1\" name=\"viewport\">\n    <meta content=\"light dark\" name=\"color-scheme\">\n    <link href=\"/src/ui/resources/icon_128.png\" rel=\"icon\">\n</head>\n\n<body>\n    <div>\n        <div id=\"titleBorder\">\n            <h2>SingleFile</h2>\n            <h4>将整个页面保存到单个HTML文件中</h4>\n        </div><span id=\"index\"><a href=\"#getting-started\">开始使用</a>-<a href=\"#general-notes\">附加说明</a>-<a\n                href=\"#options\">选项说明</a>-<a href=\"#annotation-editor\">注释编辑器</a>-<a href=\"#notes\">技术说明</a>-<a\n                href=\"#template-variables\">模板变量</a>-<a href=\"#template-functions\">模板函数</a>-<a\n                href=\"#external-messages\">与其他扩展集成</a>-<a href=\"#known-issues\">已知问题</a>-<a\n                href=\"#unknown-issues\">排除未知问题</a>-<a href=\"#contributors\">贡献者</a></span>\n        <hr>\n        <ol>\n            <li><a id=\"getting-started\">开始使用</a>\n                <ul>\n                    <li>等待页面完全加载。</li>\n                    <li>单击SingleFile按钮<img class=\"icon\" src=\"../resources/icon_16.png\">在扩展工具栏中处理和保存页面。</li>\n                    <li>处理页面时，您可以再次单击按钮取消操作。</li>\n                </ul>\n            </li>\n            <li><a id=\"general-notes\">附加说明</a>\n                <ul>\n                    <li>要保存多个选项卡，请先选择它们，然后单击SingleFile按钮<img class=\"icon\" src=\"../resources/icon_16.png\">.</li>\n                    <li>右键单击SingleFile按钮打开上下文菜单<img class=\"icon\" src=\"../resources/icon_16.png\">在扩展工具栏或网页上。它允许您保存：<ul>\n                            <li>当前标签，</li>\n                            <li>或所选内容，</li>\n                            <li>或所选帧。</li>\n                        </ul>\n                    </li>\n                    <li>您还可以一键处理多个选项卡并保存：<ul>\n                            <li id=\"selectableTabsMenu\">所选选项卡，</li>\n                            <li>或未缝合的标签，</li>\n                            <li>或所有选项卡。</li>\n                        </ul>\n                    </li>\n                    <li id=\"autoSaveMenu\">上下文菜单还允许您激活以下内容的自动保存：<ul>\n                            <li>当前标签，</li>\n                            <li>或未缝合的标签，</li>\n                            <li>或所有选项卡。</li>\n                        </ul>\n                    </li>\n                    <li>在使用保存页面之前，您可以突出显示文本、添加注释、格式化和删除内容<a href=\"#annotation-editor\">注释编辑器</a>通过在上下文菜单中选择“注释并保存页面…”\n                    </li>\n                    <li id=\"autoSaveHint\">当自动保存功能处于活动状态时，页面每次加载后（如果没有，则在卸载前）都会自动保存。</li>\n                    <li>从上下文菜单中选择“保存选择”，而不首先选择任何内容，以显示一个选择器，该选择器将通过用鼠标悬停在内容上来帮助您选择内容。</li>\n                    <li>右键单击SingleFile按钮，选择“选项”打开选项页面。</li>\n                    <li id=\"saveToGDriveHint\">启用“目的地&gt;上传到Google Drive”选项，将页面上传到Google云端硬盘</li>\n                    <li id=\"shortcutsSection\">\n                        您可以使用可自定义的快捷键Ctrl+Shift+Y保存当前选项卡或所选选项卡。转到about:addons，在齿轮菜单中选择“管理扩展快捷方式”，在Firefox中更改它。首选chrome://extensions/shortcuts在Chrome中更改它。。\n                    </li>\n                    <li>默认保存文件夹是在浏览器中配置的下载文件夹，参见Firefox中的about:preferences，chrome://settings在Chrome浏览器中，在Safari浏览器中选择“设置”&gt;“常规”&gt;“文件下载位置”。\n                    </li>\n                </ul>\n            </li>\n            <li><a id=\"options\">选项说明</a>\n                <p>您可以通过选项页面自定义SingleFile。右键单击SingleFile按钮<img class=\"icon\"\n                        src=\"../resources/icon_16.png\">在浏览器工具栏中，选择上下文菜单中的“选项”/“管理扩展”以打开选项页面。</p>\n                <p>个人资料</p>\n                <ul>\n                    <li>\n                        <p>配置文件是一组与唯一名称关联的用户定义选项。</p>\n                        <p>选项页面右上角的下拉列表允许您选择配置文件并修改相关选项。下拉列表旁边的按钮分别允许您创建、删除和重命名配置文件。</p>\n                    </li>\n                    <li>\n                        <p>您可以通过SingleFile的上下文菜单选择默认配置文件。该选择是持久的，并应用于所有选项卡。</p>\n                    </li>\n                    <li>\n                        <p>您还可以通过将配置文件与完整或部分URL相关联来覆盖默认配置文件。请参阅<a href=\"#auto-settings-rules\">自动设置规则</a>功能以获取更多信息。</p>\n                    </li>\n                </ul>\n                <p>用户界面</p>\n                <ul>\n                    <li data-options-label=\"addMenuEntryLabel\"><span class=\"option\">选项：在网页的上下文菜单中添加条目</span>\n                        <p>选中此选项可在网页的上下文菜单中显示SingleFile的条目。SingleFile按钮的上下文菜单<img class=\"icon\"\n                                src=\"../resources/icon_16.png\">无论是否选中此选项，都会显示扩展工具栏中的。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"shadowEnabledLabel\"><span class=\"option\">选项：在处理过程中在页面上叠加阴影</span>\n                        <p>选中此选项可在SingleFile检索页面资源时在页面上覆盖阴影。这提醒您不要关闭选项卡。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"openSavedPageLabel\" id=\"openSavedPageOption\"><span\n                            class=\"option\">选项：在新选项卡中打开已保存的页面</span>\n                        <p>选中此选项可在新选项卡中显示保存的页面。例如，此选项可用于检查页面是否已正确保存。</p>\n                    </li>\n                    <li data-options-label=\"autoCloseLabel\"><span class=\"option\">选项：保存页面后自动关闭选项卡</span>\n                        <p>选中此选项可在保存内部显示的页面后自动关闭选项卡。</p>\n                    </li>\n                    <li data-options-label=\"customShortcutLabel\">\n                        <span class=\"option\">选项：键盘快捷命令</span>\n                        <p>使用此选项可以选择哪个自定义键盘快捷命令（在浏览器扩展的快捷键页面中定义）将触发当前配置文件。当在此处分配了快捷键后，使用该快捷键将按照此配置文件的设置保存页面。</p>\n                    </li>\n                </ul>\n                <p>文件名</p>\n                <ul>\n                    <li data-options-label=\"filenameTemplateLabel\"><span class=\"option\">选项：模板</span>\n                        <p>该模板允许您自定义已保存页面的文件名。您可以使用任何有效字符和“/”创建子文件夹（启用“在后台保存页面”选项）。您还可以使用以下任何变量<a\n                                href=\"#template-variables\">这个列表</a>功能来自<a href=\"#template-functions\">这个列表</a>模板中的任何位置。\n                        </p>\n                        <p>无效字符会自动转换并折叠为下划线。文件名不能超过192个字符，如果更长，则会被截断。无效字符包括：<code>[</code><code>~</code><code>+</code><code>\\</code><code>?</code><code>%</code><code>*</code><code>:</code><code>|</code><code>\"</code><code>&lt;</code><code>&gt;</code>以及ASCII表中0到31的控制字符。当您想自定义信息栏时，可以在特殊字符前添加前缀<code>%</code>,<code>&lt;</code>,<code>&gt;</code>,<code>{</code>,<code>}</code>和<code>|</code>具有<code>\\</code>（例如。<code>\\&gt;</code>)将它们保存在信息栏内容中。\n                        </p>\n                        <p>模板示例：</p>\n                        <ul>\n                            <li><code>{page-title} ({date-iso} {time-locale}).html</code>将为标题为“SingleFile简介”的页面生成类似“SingleFile介绍（2018-09-15\n                                11_06_03 PM）.html”的文件名。</li>\n                            <li><code>存档/{url-last-segment} - {date-iso}</code>将为托管在上的页面生成类似“welcome-2018-09-15”的文件名https://example.com/welcome.html.保存的文件将保存在子目录“archives”中。\n                            </li>\n                            <li><code>archives/{year-locale}/{month-locale}/{day-locale}/{page-title}.html</code>将生成文件名，如“Introduction\n                                to\n                                SingleFile.html”，存储在“archives”文件夹中的3个子目录中，每个子目录对应保存日期的每个部分（例如“2018/9/15/Introduction to\n                                SingleFile.htm”）。</li>\n                        </ul>\n                    </li>\n                    <li data-options-label=\"filenameMaxLengthLabel\"><span class=\"option\">选项：最大长度</span>\n                        <p>输入文件名的最大长度（不带扩展名）及其单位（字节或字符）。</p>\n                    </li>\n                    <li data-options-label=\"filenameReplacementCharacterLabel\"><span class=\"option\">选项：替换字符</span>\n                        <p>输入用于替换文件名中无效字符的字符。</p>\n                    </li>\n                    <li data-options-label=\"replaceEmojisInFilenameLabel\"><span class=\"option\">选项：用文本替换表情符号</span>\n                        <p>选中此选项可将文件名中的表情符号替换为其unicode文本表示形式。</p>\n                    </li>\n                    <li data-options-label=\"saveFilenameTemplateDataLabel\"><span class=\"option\">选项：将文件名模板数据保存到页面中</span>\n                        <p>选中此选项可将模板文件数据保存到页面。这允许您恢复保存页面时以前使用的模板数据，例如，确保再次保存页面时文件与原始文件保存在同一目录中。</p>\n                    </li>\n                    <li data-options-label=\"confirmFilenameLabel\" id=\"confirmFilenameOption\"><span\n                            class=\"option\">选项：打开“另存为”对话框以确认文件名</span>\n                        <p>选中此选项可显示“另存为”对话框，以便在保存页面之前确认文件名。如果未选中“在后台保存页面”选项，则将显示一个提示对话框，而不是“另存为”对话框。</p>\n                    </li>\n                    <li data-options-label=\"filenameConflictActionLabel\" id=\"filenameConflictActionOption\"><span\n                            class=\"option\">选项：文件名冲突解决</span>\n                        <p>当保存的页面的文件名与文件系统上的现有文件名冲突时，选择最合适的操作。“跳过重复文件”操作仅检测当前浏览会话期间下载的文件中的重复项。</p>\n                    </li>\n                </ul>\n                <p>文件格式</p>\n                <ul>\n                    <li data-options-label=\"fileFormatSelectLabel\"><span class=\"option\">选项：格式</span>\n                        <p>选择保存文件的输出格式：</p>\n                        <ul>\n                            <li><code>“HTML”</code>：HTML文件（默认格式）。此格式生成不依赖于JavaScript打开的HTML文件。</li>\n                            <li><code>“自解压ZIP（通用）”</code>：可以在任何平台上打开的自解压ZIP文件。此格式生成的文件小于“HTML”格式，但需要启用JavaScript才能打开文件。\n                            </li>\n                            <li><code>“自解压ZIP”</code>：自解压ZIP文件，可以在任何平台上从HTTP打开，但在某些浏览器（例如基于Chromium或WebKit的浏览器）中不能从文件系统打开，而无需安装SingleFile。这种格式产生的文件比“自解压ZIP（通用）”格式小（约1%）。\n                            </li>\n                            <li><code>“ZIP”</code>：ZIP文件。此格式生成的ZIP文件无法在浏览器中打开，但可以在注释编辑器中打开。</li>\n                        </ul>\n                    </li>\n                    <li data-options-label=\"passwordLabel\"><span class=\"option\">选项：密码</span>\n                        <p>键入密码，使用AES-256（与Winzip兼容）加密ZIP文件。小心，如果你丢失了密码，就无法打开文件。启用此选项会增加CPU消耗和保存或读取页面所需的时间。</p>\n                    </li>\n                    <li data-options-label=\"insertEmbeddedImageLabel\"><span class=\"option\">选项：嵌入图像</span>\n                        <p>选中其中一个选项，在将页面另存为ZIP文件时嵌入图像（自解压或非自解压）。这允许您在文件扩展名更改为“.PNG”时将保存的页面显示为PNG图像。</p>\n                    </li>\n                    <li data-options-label=\"createRootDirectoryLabel\"><span class=\"option\">选项：创建根目录</span>\n                        <p>选中此选项可在ZIP文件中创建根目录。目录名由时间戳和显示已保存页面的选项卡的标识符组成。</p>\n                    </li>\n                    <li data-options-label=\"preventAppendedDataLabel\"><span class=\"option\">选项：不在ZIP数据后附加数据</span>\n                        <p>选中此选项可删除ZIP数据后附加的数据。使用一些不支持带附加数据的ZIP文件的存档管理器，可能更容易打开生成的文件。启用此选项会增加保存页面所需的时间。</p>\n                    </li>\n                    <li data-options-label=\"insertTextBodyLabel\"><span class=\"option\">选项：使文本可搜索</span>\n                        <p>选中此选项可将保存页面的文本内容插入自解压ZIP文件。例如，这使得从文本中搜索页面成为可能。请注意，如果所选格式为“自解压ZIP（通用）”，则文本内容以UTF-8编码，但页面以ISO-8859-1声明。\n                        </p>\n                    </li>\n                </ul>\n                <p>HTML内容</p>\n                <ul>\n                    <li data-options-label=\"compressHTMLLabel\"><span class=\"option\">选项：压缩HTML内容</span>\n                        <p>选中此选项可删除所有HTML注释和不需要的标记、空格、引号和空白字符。选中此选项有助于在不更改文档的情况下减小文件大小。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"removeHiddenElementsLabel\"><span class=\"option\">选项：删除隐藏元素</span>\n                        <p>选中此选项可删除所有隐藏元素。选中此选项有助于在不更改文档的情况下减小文件大小。它还可能增加CPU消耗和保存页面所需的时间。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"removedElementsSelectorLabel\"> <span class=\"option\">选项：删除特定元素</span>\n                        <p>使用此选项通过提供以逗号分隔的CSS选择器列表从页面中删除元素。</p>\n                    </li>\n                    <li data-options-label=\"insertMetaCSPLabel\"><span class=\"option\">选项：设置内容安全策略</span>\n                        <p>选中此选项可添加具有策略的元标记，以阻止加载任何外部资源。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"removeFramesLabel\"><span class=\"option\">选项：删除框架</span>\n                        <p>选中此选项可删除所有框架和iframe元素。选中此选项可以大大减小文件的大小，而不会在大多数情况下更改文档。它还可以减少保存页面所需的时间。</p>\n                    </li>\n                    <li data-options-label=\"saveOriginalURLsLabel\"><span class=\"option\">：保存嵌入资源的原始URL</span>\n                        <p>选中此选项可保存嵌入到已保存页面中的资源的URL。URL存储在属性中，其名称前缀为“data-sf-original-”，后缀为HTML内容的原始属性名称（例如“data-sf\n                            original src”、“data-sf-original href”）。对于CSS内容，URL存储为以“原始URL:”开头的注释。</p>\n                    </li>\n                    <li data-options-label=\"removeInfobarSavedDateLabel\"><span class=\"option\">选项：不包括保存的日期</span>\n                        <p>选中此选项可删除已保存页面中包含并显示在信息栏中的已保存日期。</p>\n                    </li>\n                    <li data-options-label=\"saveRawPageLabel\"><span class=\"option\">选项：保存原始页面</span>\n                        <p>选中此选项可保存浏览器收到的原始HTML文件。选中此选项后，页面将保存为禁用JavaScript。选中此选项可能会更改文档。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                </ul>\n                <p>信息栏</p>\n                <ul>\n                    <li data-options-label=\"displayInfobarLabel\" id=\"displayInfobarOption\"><span\n                            class=\"option\">选项：查看保存的页面时显示信息栏</span>\n                        <p>选中此选项以显示ℹ 查看保存的页面时，请单击页面右上角的按钮。单击此按钮，您可以获取有关保存日期的更多信息并打开原始URL。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"infobarTemplateLabel\"><span class=\"option\">选项：信息栏内容模板</span>\n                        <p>该模板允许您自定义信息栏中显示的内容。您可以使用任何有效字符，<code>n</code>对于新线路或<code>\\t</code>对于选项卡。您还可以使用以下任何变量<a\n                                href=\"#template-variables\">这个列表</a>模板中的任何位置。如果模板或生成的内容为空，则信息栏将默认显示保存的日期。</p>\n                        <p>模板示例：</p>\n                        <ul>\n                            <li><code>{url href}（{date iso}）</code>将产生类似“https://www.example.com（2018-09-15 11 06\n                                03下午）”。</li>\n                            <li><code>Title: {page-title}</code>将为以“示例域”为标题的页面生成“标题：示例域”等内容。</li>\n                        </ul>\n                    </li>\n                    <li data-options-label=\"confirmInfobarLabel\"><span class=\"option\">选项：打开提示对话框以编辑信息栏内容</span>\n                        <p>选中此选项可显示提示对话框，以便在保存页面之前确认信息栏内容。</p>\n                    </li>\n                    <li data-options-label=\"includeInfobarLabel\"><span class=\"option\">选项：在保存的页面中包含信息栏</span>\n                        <p>选中此选项以显示ℹ 在未安装SingleFile的浏览器中查看保存的页面时，请单击页面右上角的按钮。</p>\n                    </li>\n                    <li data-options-label=\"openInfobarLabel\"><span class=\"option\">选项：保持信息栏打开</span>\n                        <p>选中此选项可在查看已保存的页面时保持信息栏打开。</p>\n                    </li>\n                </ul>\n                <p>样式表</p>\n                <ul>\n                    <li data-options-label=\"removeUnusedStylesLabel\"><span class=\"option\">选项：删除未使用的样式</span>\n                        <p>选中此选项可删除与保存页面中任何元素都不匹配的所有CSS规则和样式。选中此选项不会更改文档，并且可以大大减小文件的大小。它还将增加CPU消耗和保存页面所需的时间。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"removeAlternativeMediasLabel\"><span class=\"option\">选项：删除屏幕替代设备的样式表</span>\n                        <p>选中此选项可删除不用于屏幕显示的样式表，如打印预览和语音合成器的样式表。选中此选项可以帮助减小文件的大小。</p>\n                    </li>\n                    <li data-options-label=\"compressCSSLabel\"><span class=\"option\">选项：压缩CSS内容</span>\n                        <p>选中此选项可缩小CSS样式表。选中此选项可以在不更改文档的情况下减小文件的大小。它还可能增加CPU消耗和保存页面所需的时间。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"groupDuplicateStylesheetsLabel\"><span class=\"option\">选项：将重复的样式表分组在一起</span>\n                        <p>选中此选项可将所有重复的内联样式表组合在一起。选中此选项不应更改文档，并且可以大大减小文件的大小。对于基于ZIP文件的存档格式，此选项将被忽略。请注意，此选项需要启用JavaScript才能正常运行。\n                        </p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"moveStylesInHeadLabel\"><span class=\"option\">选项：在head元素中移动其外部的样式</span>\n                        <p>选中此选项可将head元素外的所有样式元素移动到head元素中。这有助于在显示保存的页面时避免出现FOUC（“未样式化内容的闪烁”）。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                </ul>\n                <p>图像</p>\n                <ul>\n                    <li data-options-label=\"groupDuplicateImagesLabel\"><span class=\"option\">选项：将重复图像分组在一起</span>\n                        <p>选中此选项可避免保存多次重复的图像。选中此选项不应更改现代浏览器中的文档，并且可以大大减小文件的大小。对于基于ZIP文件的存档格式，此选项将被忽略。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"loadDeferredImagesLabel\"><span class=\"option\">选项：保存延迟的图像</span>\n                        <p>选中此选项可保存所有尚未显示的延迟图像（或帧）。这可能有助于在不滚动页面的情况下保存所有图像。此功能已尽最大努力，并不能保证在所有网站上都能正常工作。这也会增加保存页面所需的时间。\n                        </p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"loadDeferredImagesMaxIdleTimeLabel\"><span\n                            class=\"option\">选项：最大空闲时间（ms）</span>\n                        <p>输入等待延迟图像的最大延迟时间。例如，如果网络或系统条件恶化，您可以增加此值。否则，您也可以减小此值。</p>\n                    </li>\n                    <li data-options-label=\"loadDeferredImagesDispatchScrollEventLabel\"><span\n                            class=\"option\">选项：发送“滚动”事件</span>\n                        <p>选中此选项以分派<a href=\"https://developer.mozilla.org/docs/Web/API/Document/scroll_event\"\n                                target=\"_blank\">“滚动”事件</a>当等待延迟图像时。这可以改善某些网站上的图像加载，但也可能导致其他一些网站出现意外的滚动问题。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"loadDeferredImagesKeepZoomLevelLabel\"><span class=\"option\">选项：缩小页面</span>\n                        <p>选中此选项可通过缩小页面来保存页面的全部内容。例如，这可以帮助使用无限虚拟列表保存页面。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"loadDeferredImagesBeforeFramesLabel\"><span class=\"option\">选项：加载延迟帧</span>\n                        <p>选中此选项可在保存帧内容之前加载延迟帧和图像。这将增加保存页面所需的时间。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"imageReductionFactorLabel\"> <span class=\"option\">图片缩小系数</span>\n\t\t\t\t\t\t<p>\n                            缩小嵌入在已保存页面中的图像大小。该值表示一个除数。例如，如果设置为 2，图像尺寸将减半；如果设置为 4，图像尺寸将减为四分之一，依此类推。此选项仅适用于 PNG、JPEG 和 WEBP 图像。可以帮助减小最终文件大小，但也可能降低图像质量。默认值为 1（不缩减）。\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</li>\n                    <li data-options-label=\"removeAlternativeImagesLabel\"><span class=\"option\">选项：删除图像以获得其他屏幕分辨率</span>\n                        <p>选中此选项可删除默认显示分辨率较低和/或较高的替代图像。选中此选项可以大大减小文件的大小。</p>\n                    </li>\n                </ul>\n                <p>字体</p>\n                <ul>\n                    <li data-options-label=\"removeUnusedFontsLabel\"><span class=\"option\">选项：删除未使用的字体</span>\n                        <p>选中此选项可删除与任何内容都不匹配的所有字体CSS规则。选中此选项不应更改文档，并且可以大大减小文件的大小。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"removeAlternativeFontsLabel\"><span class=\"option\">选项：删除替代字体</span>\n                        <p>选中此选项可删除所用字体的替代字体。选中此选项不应更改文档，并且可以大大减小文件的大小。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                </ul>\n                <p>目的地</p>\n                <ul>\n                    <li data-options-label=\"saveToFilesystemLabel\"><span class=\"option\">选项：保存到文件系统</span>\n                        <p>选中此选项可将下载的页面保存在计算机的文件系统上。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"sharePageLabel\" id=\"sharePageInput\"><span class=\"option\">选项：共享页面</span>\n                        <p>选中此选项可与其他应用程序共享页面。此选项仅在支持以下功能的浏览器中可用<a href=\"https://web.dev/web-share/\"\n                                target=\"_blank\">Web共享API</a>.</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"saveToClipboardLabel\" id=\"saveToClipboardOption\"><span\n                            class=\"option\">选项：复制到剪贴板</span>\n                        <p>选中此选项可将页面复制到剪贴板。此选项不适用于基于ZIP文件的存档格式。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"saveToGitHubLabel\"><span class=\"option\">选项：上传到GitHub</span>\n                        <p>选中此选项可将页面保存在GitHub上。请参阅<a\n                                href=\"https://github.com/gildas-lormeau/SingleFile/wiki/How-to-publish-saved-pages-with-SingleFile-on-GitHub\"\n                                target=\"_blank\">文档页面</a>学习如何配置SingleFile以在GitHub上保存页面。警告：一旦页面保存在GitHub上，删除它很复杂，请参阅<a\n                                href=\"https://docs.github.com/github/authenticating-to-github/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository\"\n                                target=\"_blank\">文档页面</a>在GitHub上获取更多信息。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"githubTokenLabel\"><span class=\"option\">选项：访问令牌</span>\n                        <p>在GitHub上输入您的个人访问令牌，请参阅<a\n                                href=\"https://docs.github.com/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token\"\n                                target=\"_blank\">文档页面</a>在GitHub上获取更多信息。</p>\n                    </li>\n                    <li data-options-label=\"githubUserLabel\"><span class=\"option\">选项：用户名</span>\n                        <p>在GitHub上输入您的用户名。</p>\n                    </li>\n                    <li data-options-label=\"githubRepositoryLabel\"><span class=\"option\">选项：存储库名称</span>\n                        <p>在GitHub上输入将存档已保存页面的存储库的名称，请参阅<a\n                                href=\"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/creating-a-new-repository\"\n                                target=\"_blank\">文档页面</a>有关如何创建存储库的更多信息，请访问GitHub。</p>\n                    </li>\n                    <li data-options-label=\"githubBranchLabel\"><span class=\"option\">选项：分支名称</span>\n                        <p>输入将存档页面的存储库分支名称。分支机构<strong>必须</strong>存在于GitHub上，请参阅<a\n                                href=\"https://docs.github.com/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site\"\n                                target=\"_blank\">文档页面</a>关于如何在GitHub.io上发布该分支的更多信息，请访问GitHub。</p>\n                    </li>\n                    <li data-options-label=\"saveWithWebDAVLabel\"><span class=\"option\">选项：上传到WebDAV服务器</span>\n                        <p>选中此选项可将页面保存在WebDAV服务器上。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"webDAVURLLabel\"><span class=\"option\">选项：URL</span>\n                        <p>输入WebDAV服务器的URL。</p>\n                    </li>\n                    <li data-options-label=\"webDAVUserLabel\"><span class=\"option\">选项：用户标识符</span>\n                        <p>在WebDAV服务器上输入您的用户标识符。</p>\n                    </li>\n                    <li data-options-label=\"webDAVPasswordLabel\"><span class=\"option\">选项：密码</span>\n                        <p>请输入您的密码。</p>\n                    </li>\n                    <li data-options-label=\"saveWithMCPLabel\"> <span class=\"option\">选项：通过 MCP 服务器保存</span>\n                        <p>选中此选项可以通过 Model Context Protocol（MCP）服务器保存页面。</p>\n                        <p>MCP 是一种开放协议，用于规范应用如何向 AI 模型提供上下文信息。启用此选项后，SingleFile\n                            会将保存的页面发送到实现了文件系统工具（write_file、get_file_info）的 MCP 服务器。</p>\n                        <p class=\"notice\">除非你已经有正在运行的 MCP 服务器，否则建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"mcpServerUrlLabel\"> <span class=\"option\">选项：服务器 URL</span>\n                        <p>输入 MCP 服务器的 URL（例如：<code>http://localhost:3000/mcp</code>）。</p>\n                        <p>服务器必须按照 MCP 协议中指定的方式实现 HTTP 传输，并提供 <code>write_file</code> 和 <code>get_file_info</code> 工具。\n                        </p>\n                    </li>\n                    <li data-options-label=\"mcpAuthTokenLabel\"> <span class=\"option\">选项：认证令牌</span>\n                        <p>输入 MCP 服务器的 Bearer 认证令牌（可选）。</p>\n                        <p>如果 MCP 服务器需要认证，SingleFile 会在每个请求中通过 <code>Authorization: Bearer &lt;token&gt;</code>\n                            请求头发送该令牌。</p>\n                    </li>\n                    <li data-options-label=\"saveToGDriveLabel\" id=\"saveToGDriveOption\"><span\n                            class=\"option\">选项：上传到谷歌云端硬盘</span>\n                        <p>选中此选项可将页面保存在Google云端硬盘上。</p>\n                        <p>SingleFile请求的权限只允许它访问它创建的文件和文件夹。当您取消选中此选项时，SingleFile会自动撤销其对您的Google Drive帐户的访问权限。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"saveToS3Label\" id=\"saveToS3Option\"><span class=\"option\">选项：上传到亚马逊S3</span>\n                        <p>选中此选项可将页面保存在Amazon\n                            S3上。您必须配置bucket策略以包含权限<code>s3：放置对象</code>，以及<code>s3：头部对象</code>或<code>s3：列表对象</code>，或<code>s3：获取对象</code>如果您不想在文件名冲突时覆盖或跳过现有文件。\n                        </p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"S3DomainLabel\"><span class=\"option\">选项：域</span>\n                        <p>输入Amazon S3服务器的域（例如。<code>s3.amazonaws.com</code>).</p>\n                    </li>\n                    <li data-options-label=\"S3RegionLabel\"><span class=\"option\">选项：地区</span>\n                        <p>输入Amazon S3服务器的区域（例如。<code>美国东部-1</code>).</p>\n                    </li>\n                    <li data-options-label=\"S3BucketLabel\"><span class=\"option\">选项：存储桶名称</span>\n                        <p>在Amazon S3上输入将存档已保存页面的存储桶的名称。页面将上传到<code>&lt;存储桶名称&gt;&lt;域名&gt;</code></p>.\n                    </li>\n                    <li data-options-label=\"S3AccessKeyLabel\"><span class=\"option\">选项：访问密钥</span>\n                        <p>在Amazon S3上输入您的访问密钥（例如。<code>akdo525k84ljth4s蛋糕</code>).</p>\n                    </li>\n                    <li data-options-label=\"S3SecretKeyLabel\"><span class=\"option\">选项：密钥</span>\n                        <p>在Amazon S3上输入您的密钥。</p>\n                    </li>\n                    <li data-options-label=\"saveToDropboxLabel\" id=\"saveToDropboxOption\"><span\n                            class=\"option\">选项：上传到Dropbox</span>\n                        <p>选中此选项可将页面保存在Dropbox上。</p>\n                        <p>SingleFile请求的权限只允许它访问它创建的文件和文件夹。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"saveWithCompanionLabel\" id=\"saveWithCompanionOption\"><span\n                            class=\"option\">选项：使用SingleFile Companion保存</span>\n                        <p>选中此选项可将保存过程委托给SingleFile\n                            Companion。它是一个在浏览器之外运行的程序，可以帮助使保存过程更加透明。它还允许将页面保存在下载目录以外的其他目录中。您可以找到更多信息<a\n                                href=\"https://github.com/gildas-lormeau/single-file-companion\" target=\"_blank\">在这里</a>\n                        </p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"saveToRestFormApiLabel\"><span class=\"option\">选项：上传到REST表单API</span>\n                        <p>选中此选项可将页面保存在接受表单数据的API终结点上。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"saveToRestFormApiUrlLabel\"><span class=\"option\">选项：URL</span>\n                        <p>输入API终结点的URL。</p>\n                    </li>\n                    <li data-options-label=\"saveToRestFormApiTokenLabel\"><span class=\"option\">选项：授权令牌</span>\n                        <p>提供“Bearer”令牌的值以验证请求。</p>\n                    </li>\n                    <li data-options-label=\"saveToRestFormApiFileFieldNameLabel\"><span class=\"option\">选项：存档数据字段名称</span>\n                        <p>输入将包含已保存页面数据的字段的名称。</p>\n                    </li>\n                    <li data-options-label=\"saveToRestFormApiUrlFieldNameLabel\"><span class=\"option\">选项：存档URL字段名</span>\n                        <p>输入将包含已保存页面URL的字段名称。</p>\n                    </li>\n                </ul>\n                <p>网络</p>\n                <ul>\n                    <li data-options-label=\"blockResourcesLabel\"><span class=\"option\">选项：被阻止的资源</span>\n                        <p>选中以下选项以阻止下载相应的资源类型。</p>\n                    </li>\n                    <li data-options-label=\"blockMixedContentLabel\"><span class=\"option\">选项：阻止混合内容</span>\n                        <p>选中此选项可在以HTTPS查看页面时阻止从HTTP提供的活动内容。您可以找到有关混合内容页面的更多信息<a\n                                href=\"https://developer.mozilla.org/docs/Web/Security/Mixed_content\"\n                                target=\"_blank\">在这里</a>.</p>\n                    </li>\n                    <li data-options-label=\"acceptHeadersLabel\"><span class=\"option\">选项：“接受”标题</span>\n                        <p>输入<a href=\"https://developer.mozilla.org/docs/Web/HTTP/Headers/Accept\"\n                                target=\"_blank\">“Accept”HTTP标头</a>以下值用于调整对相应资源类型的支持。</p>\n                        <p class=\"notice\">建议保留这些值<u>事实上</u></p>\n                    </li>\n                    <li data-options-label=\"setMaxResourceSizeLabel\"><span class=\"option\">选项：设置最大大小（MB）</span>\n                        <p>选中此选项可从保存的页面中删除超过给定大小的嵌入式资源（即图像、样式表、脚本和iframe）。</p>\n                    </li>\n                    <li data-options-label=\"maxResourceSizeLabel\"><span class=\"option\">选项：最大大小（MB）</span>\n                        <p>输入最大大小（MB）。</p>\n                    </li>\n                    <li data-options-label=\"setMaxResourceDelayLabel\"><span class=\"option\">选项：设置最大下载延迟</span>\n                        <p>选中此选项可从保存的页面中删除超过给定下载时间的嵌入式资源（即图像、样式表、脚本和iframe）。</p>\n                    </li>\n                    <li data-options-label=\"maxResourceDelayLabel\"><span class=\"option\">选项：最大下载延迟</span>\n                        <p>输入最大下载延迟（秒）。</p>\n                    </li>\n                    <li data-options-label=\"passReferrerOnErrorLabel\" id=\"passReferrerOnErrorOption\"><span\n                            class=\"option\">选项：在跨源错误时传递“Referer”标头</span>\n                        <p>选中此选项，在下载跨源资源时发生401、403或404 HTTP错误后，传递带有“origin”策略的HTTP标头“Referer”。如果无法下载被热链接保护阻止的资源，则应启用此选项。\n                        </p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                </ul>\n                <p>注释编辑器</p>\n                <ul>\n                    <li data-options-label=\"defaultEditorModeLabel\"><span class=\"option\">选项：默认模式</span>\n                        <p>打开注释编辑器时选择默认模式。可用的选项有：\n                        <ul>\n                            <li><code>正常的</code>：默认值</li>\n                            <li><code>编辑页面</code>：启用按钮<img class=\"icon button\" src=\"../resources/button_note_edit.png\">\n                            </li>\n                            <li><code>设置页面格式</code>：启用按钮<img class=\"icon button\"\n                                    src=\"../resources/button_note_format.png\">如果页面可以格式化</li>\n                            <li><code>删除元素</code>：启用按钮<img class=\"icon button\" src=\"../resources/button_cut_inner.png\">\n                            </li>\n                            <li><code>移除外部元素</code>：启用按钮<img class=\"icon button\"\n                                    src=\"../resources/button_cut_outer.png\"></li>\n                        </ul>\n                        </p>\n                    </li>\n                    <li data-options-label=\"applySystemThemeLabel\"><span class=\"option\">选项：在注释编辑器中格式化页面时应用系统主题</span>\n                        <p>如果您不想在注释编辑器中单击“格式化页面以提高可读性”按钮时应用操作系统或浏览器的主题（例如深色或浅色），请取消选中此选项。</p>\n                    </li>\n                    <li data-options-label=\"warnUnsavedPageLabel\"><span class=\"option\">选项：如果页面中有未保存的更改，则发出警告</span>\n                        <p>选中此选项可在您离开注释编辑器（例如关闭选项卡）而不保存更改时显示一个阻止弹出窗口。</p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"openEditorLabel\"><span class=\"option\">选项：保存前编辑页面</span>\n                        <p>选中此选项可在保存任何页面之前打开注释编辑器。选中此选项会从上下文菜单中删除“注释并保存页面…”条目。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"autoOpenEditorLabel\" id=\"autoOpenEditorOption\"><span\n                            class=\"option\">选项：查看用SingleFile保存的页面时打开注释编辑器</span>\n                        <p>选中此选项可在显示SingleFile保存的页面时打开注释编辑器。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"displayInfobarInEditorLabel\"><span class=\"option\">选项：显示信息栏</span>\n                        <p>选中此选项可在注释编辑器中显示页面时显示信息栏。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                </ul>\n                <p id=\"bookmarksSection\">书签</p>\n                <ul id=\"bookmarksOptions\">\n                    <li data-options-label=\"saveCreatedBookmarksLabel\"><span class=\"option\">选项：保存新创建书签的页面</span>\n                        <p>选中此选项可保存添加到书签中的页面。请注意，如果要保存的页面尚未显示在选项卡中，SingleFile将临时打开一个新的选项卡来保存页面。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"replaceBookmarkURLLabel\"><span class=\"option\">选项：将新书签链接到已保存的页面</span>\n                        <p>选中此选项，将添加到书签中的页面的URL替换为磁盘上已保存页面的文件URI。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"ignoredBookmarkFoldersLabel\"><span class=\"option\">选项：忽略文件夹</span>\n                        <p>输入要忽略的书签文件夹名称列表。文件夹名称必须用逗号分隔。SingleFile将忽略在包含这些名称的文件夹中添加的书签。</p>\n                    </li>\n                    <li data-options-label=\"allowedBookmarkFoldersLabel\"><span class=\"option\">选项：允许的文件夹</span>\n                        <p>输入要允许的书签文件夹名称列表。文件夹名称必须用逗号分隔。SingleFile将仅保存在包含这些名称的文件夹中添加的页面。</p>\n                    </li>\n                </ul>\n                <p id=\"autoSaveSection\">自动保存</p>\n                <ul id=\"autoSaveOptions\">\n                    <li data-options-label=\"autoSaveLoadOrUnloadLabel\"><span class=\"option\">选项：页面加载后或页面卸载时自动保存</span>\n                        <p>选中此选项可在加载后自动保存页面。如果在页面完全加载之前浏览到另一个页面，则页面将在卸载之前保存。当此选项处于活动状态时，您可以保证页面将始终被保存。在卸载页面之前保存页面时，某些框架内容可能会丢失（如果您选中了“删除框架”）。\n                        </p>\n                    </li>\n                    <li data-options-label=\"autoSaveLoadLabel\"><span class=\"option\">选项：页面加载后自动保存</span>\n                        <p>选中此选项可在加载后自动保存页面。</p>\n                    </li>\n                    <li data-options-label=\"autoSaveUnloadLabel\"><span class=\"option\">选项：页面卸载时自动保存</span>\n                        <p>选中此选项可在卸载前自动保存页面，而不是在加载后保存页面。当此选项处于活动状态时，您可以保证页面始终会被保存，但某些框架内容可能会丢失（如果您选中“删除框架”）。</p>\n                    </li>\n                    <li data-options-label=\"autoSaveDiscardLabel\"><span class=\"option\">选项：选项卡丢弃时自动保存</span>\n                        <p>选中此选项可在丢弃选项卡时自动保存页面。某些框架内容可能会丢失（如果选中“删除框架”）。</p>\n                    </li>\n                    <li data-options-label=\"autoSaveRemoveLabel\"><span class=\"option\">选项：删除标签时自动保存</span>\n                        <p>选中此选项可在关闭选项卡时自动保存页面。某些框架内容可能会丢失（如果选中“删除框架”）。</p>\n                    </li>\n                    <li data-options-label=\"autoSaveDelayLabel\"><span class=\"option\">选项：加载后自动保存等待延迟</span>\n                        <p>当勾选“页面加载时自动保存或页面卸载时自动保存”或“页面加载后自动保存”时，输入保存页面之前等待的延迟秒数。</p>\n                    </li>\n                    <li data-options-label=\"autoSaveRepeatLabel\"><span class=\"option\">选项：定期自动保存</span>\n                        <p>选中此选项可在加载后定期自动保存页面。</p>\n                    </li>\n                    <li data-options-label=\"autoSaveRepeatDelayLabel\"><span class=\"option\">选项：周期</span>\n                        <p>在选中“定期自动保存”选项时，输入每页保存前等待的延迟秒数。</p>\n                    </li>\n                    <li data-options-label=\"autoSaveExternalSaveLabel\"><span class=\"option\">选项：使用SingleFile\n                            Companion保存页面</span>\n                        <p>选中此选项可将捕获和保存过程委托给SingleFile\n                            Companion。它是一个在浏览器之外运行的程序，可以帮助使保存过程更加透明。它还允许将页面保存在下载目录以外的其他目录中。您可以找到更多信息<a\n                                href=\"https://github.com/gildas-lormeau/single-file-companion\" target=\"_blank\">在这里</a>\n                        </p>\n                    </li>\n                </ul>\n                <p>杂项。</p>\n                <ul>\n                    <li data-options-label=\"addProofLabel\"><span class=\"option\">选项：添加存在证明</span>\n                        <p>选中此选项可创建要保存的页面存在的全球证明。</p>\n                        <ul>\n                            <li><strong>什么是存在证明（数据锚定）？</strong><br>数据锚定包括通过将数据链接到防篡改和带时间戳的区块链来为数据构建带时间戳存在证明。数据锚定实施依赖于比特币区块链的弹性和不变性，以提供最佳的安全级别\n                            </li>\n                            <li><strong>这如何保护我的数据？</strong><br>锚定机制仅处理数据展示。您的数据将保留在您计算指纹的地方，即浏览器中。他们的机密性完全得到了保护。</li>\n                            <li><strong>备份后的第二天，您可以在此处免费获得证明收据：<a\n                                        href=\"https://gildas-lormeau.github.io/singlefile-woleet/index.html\"\n                                        target=\"_blank\">gildas-lormeau.github.io/singlefile-woleet/index.html</a>证明收据将用于验证证据的有效性</strong>\n                            </li>\n                        </ul>\n                        <p>更多信息<a href=\"https://doc.woleet.io\" target=\"_blank\">doc.woleet.io</a></p>\n                    </li>\n                    <li data-options-label=\"woleetKeyLabel\" hidden=\"\"><span class=\"option\">选项：访问令牌</span>\n                        <p>在Woleet上输入您的个人访问令牌，请参阅<a href=\"http://app.woleet.io/\" target=\"_blank\">注册页面</a>更多信息请访问Woleet。\n                        </p>\n                    </li>\n                    <li data-options-label=\"backgroundSaveLabel\" id=\"backgroundSaveOption\"><span\n                            class=\"option\">选项：在后台保存页面</span>\n                        <p>如果您在保存页面时收到无效的文件名，如“37bec68b-446a-46a5-8642-19a89c231b46.html”或下载中断，请取消选中此选项。如果您希望“另存为”对话框记住上次保存的路径，也可以取消选中此选项。取消选中此选项可防止在文件名模板中使用子目录。\n                        </p>\n                        <p class=\"notice\">建议<u>检查</u>此选项</p>\n                    </li>\n                    <li data-options-label=\"displayStatsLabel\"><span class=\"option\">选项：处理后在控制台中显示统计数据</span>\n                        <p>选中此选项可在浏览器的JavaScript开发工具中显示有关处理的统计信息。选中此选项可能会增加CPU消耗和保存页面所需的时间。</p>\n                        <p class=\"notice\">建议<u>取消选中</u>此选项</p>\n                    </li>\n                </ul>\n                <p id=\"auto-settings-rules\">自动设置规则</p>\n                <ul>\n                    <li>自动设置规则允许您将完整或部分URL与配置文件相关联。它还允许为自动保存关联特定的配置文件，或禁用它（选中“显示‘自动保存配置文件’列”）。当两个或多个规则与要保存的页面的URL匹配时，将选择URL最长的规则。特殊配置文件“-”表示当前配置文件。\n                    </li>\n                    <li>您可以使用特殊值“*”作为URL来创建适用于所有URL的规则</li>\n                    <li>您可以通过在URL前加上“regexp:”来使用正则表达式（例如，“regexp:.*\\.com”来匹配所有包含“.com”的URL）。当零条或多条基于URL的规则和一条或多个基于正则表达式的规则与一个URL匹配时，将选择基于正则表达式最长的规则。\n                    </li>\n                </ul>\n                <p>表单按钮</p>\n                <ul>\n                    <li><span class=\"option\">同步选项</span>\n                        <p>选中此选项可同步您的选项，并使其在您登录的浏览器的不同设备上的所有实例中可用。</p>\n                    </li>\n                    <li><span class=\"option\">重置</span>\n                        <p>将所有选项重置为默认值。</p>\n                    </li>\n                </ul>\n            </li>\n            <li><a id=\"annotation-editor\">注释编辑器</a>\n                <p>通过在上下文菜单中选择“注释并保存页面”或启用“注释编辑器&gt;保存前编辑页面”选项，可以打开注释编辑器。它允许您：\n                <ul>\n                    <li>通过单击以下按钮之一添加注释：<img class=\"icon button\" src=\"../resources/button_note_yellow.png\"><img\n                            class=\"icon button\" src=\"../resources/button_note_pink.png\"><img class=\"icon button\"\n                            src=\"../resources/button_note_blue.png\"><img class=\"icon button\"\n                            src=\"../resources/button_note_green.png\"></li>\n                    <li>通过单击按钮隐藏或显示笔记<img class=\"icon button\" src=\"../resources/button_note_visible.png\"></li>\n                    <li>通过单击以下按钮之一突出显示文本：<img class=\"icon button\" src=\"../resources/button_highlighter_yellow.png\"><img\n                            class=\"icon button\" src=\"../resources/button_highlighter_pink.png\"><img class=\"icon button\"\n                            src=\"../resources/button_highlighter_blue.png\"><img class=\"icon button\"\n                            src=\"../resources/button_highlighter_green.png\"></li>\n                    <li>通过单击按钮隐藏或显示突出显示的文本<img class=\"icon button\" src=\"../resources/button_highlighter_visible.png\">\n                    </li>\n                    <li>单击按钮删除突出显示的文本<img class=\"icon button\" src=\"../resources/button_highlighter_delete.png\"></li>\n                    <li>单击按钮编辑页面<img class=\"icon button\" src=\"../resources/button_note_edit.png\"></li>\n                    <li>通过单击按钮格式化页面以提高可读性（如果可能）<img class=\"icon button\" src=\"../resources/button_note_format.png\">\n                    </li>\n                    <li>单击按钮删除内容<img class=\"icon button\" src=\"../resources/button_cut_inner.png\">（内部元件）或<img\n                            class=\"icon button\" src=\"../resources/button_cut_outer.png\">（外部元素）</li>\n                    <li>单击按钮撤消删除<img class=\"icon button\" src=\"../resources/button_undo_cut.png\">或按钮<img\n                            class=\"icon button\" src=\"../resources/button_undo_all_cut.png\">（全部撤消）</li>\n                    <li>点击按钮即可删除redo<img class=\"icon button\" src=\"../resources/button_redo_cut.png\"></li>\n                    <li>单击按钮打印页面<img class=\"icon button\" src=\"../resources/button_print.png\">或按<code>Ctrl-P</code>\n                    </li>\n                    <li>单击按钮保存页面<img class=\"icon button\" src=\"../resources/button_download.png\">或按<code>Ctrl-S</code>\n                    </li>\n                </ul>\n                </p><br>\n                <p>使用删除内容时，可以使用以下键盘快捷键<img class=\"icon button\" src=\"../resources/button_cut_inner.png\">或<img\n                        class=\"icon button\" src=\"../resources/button_cut_outer.png\">:\n                <ul>\n                    <li><code>Tab</code>：展开选择</li>\n                    <li><code>Shift-Tab</code>：减少选择</li>\n                    <li><code>Space</code>：删除所选元素</li>\n                    <li><code>Ctrl-Z</code>：撤消上次删除</li>\n                    <li><code>Ctrl-Shift-Z</code>：重新执行上次删除</li>\n                    <li><code>Ctrl</code>：选择/取消选择多个元素，释放<code>Ctrl键</code>键验证选择</li>\n                    <li><code>Shift</code>：暂时反转最后一个选定元素的移除类型（即移除内部元素或移除外部元素），并重置其他选定元素（如果有的话）</li>\n                    <li><code>Escape</code>：重置所选元素</li>\n                </ul>\n                </p>\n            </li>\n            <li><a id=\"template-variables\">模板变量</a>\n                <p>模板变量用于自定义信息栏内容或已保存页面的文件名。它们有助于插入动态值，如保存日期或页面标题。</p>\n                <p>您可以通过添加以下内容来限制动态值的长度<code>[<em>maxByteSize</em>]</code>或<code>[<em>maxCharSize</em>ch]</code>就在变量名之后。这个<code>maxByteSize</code>value是该值的最大长度（以字节为单位）（例如“{page-title}[20]”将标题限制为20个字节）。这个<code>maxCharSize</code>value是以字符为单位的最大长度（例如`{page-title}[10ch]`将标题限制为10个字符）。\n                </p>\n                <ul>\n                    <li><code>{navigator-language}</code>: 浏览器的语言</li>\n                    <li><code>{page-title}</code>: 页面的标题</li>\n                    <li><code>{page-heading}</code>: 页面中 H1 标签的内容</li>\n                    <li><code>{page-language}</code>: 页面的语言</li>\n                    <li><code>{page-description}</code>: 页面的描述</li>\n                    <li><code>{page-author}</code>: 页面的作者</li>\n                    <li><code>{page-creator}</code>: 页面的创建者</li>\n                    <li><code>{page-publisher}</code>: 页面的出版者</li>\n                    <li><code>{datetime-iso}</code>: 保存日期和时间的 ISO 格式（例如 \"2018-09-15T22_38_26_317Z\"）</li>\n                    <li><code>{datetime-utc}</code>: 保存日期和时间的 UTC 格式（例如 \"Sat, 15 Sep 2018 22_38_26 GMT\"）</li>\n                    <li><code>{datetime-locale}</code>: 日期和时间的本地化值（例如 \"9_16_2018, 12_54_31 AM\"）</li>\n                    <li><code>{date-iso}</code>: 保存日期的 ISO 格式（例如 \"2018-09-15\"）</li>\n                    <li><code>{date-locale}</code>: 保存日期的本地化值（例如 \"16_09_2018\"）</li>\n                    <li><code>{time-iso}</code>: 保存时间的 ISO 格式（例如 \"22_38_26_317\"）</li>\n                    <li><code>{time-locale}</code>: 保存时间的本地化值（例如 \"00_38_26\"）</li>\n                    <li><code>{time-ms}</code>: 保存时间的 Unix Epoch 后的毫秒数（例如 1563582018000）</li>\n                    <li><code>{day-utc}</code>: 保存日期的 UTC 格式的天数（例如 \"15\"）</li>\n                    <li><code>{day-locale}</code>: 天数的本地化值（例如 \"15\"）</li>\n                    <li><code>{month-utc}</code>: 保存日期的 UTC 格式的月份（例如 \"09\"）</li>\n                    <li><code>{month-locale}</code>: 月份的本地化值（例如 \"09\"）</li>\n                    <li><code>{year-utc}</code>: 保存日期的 UTC 格式的年份（例如 \"2018\"）</li>\n                    <li><code>{year-locale}</code>: 年份的本地化值（例如 \"2018\"）</li>\n                    <li><code>{hours-utc}</code>: 保存日期的 UTC 格式的小时（例如 \"20\"）</li>\n                    <li><code>{hours-locale}</code>: 小时的本地化值（例如 \"22\"）</li>\n                    <li><code>{minutes-utc}</code>: 保存日期的 UTC 格式的分钟（例如 \"38\"）</li>\n                    <li><code>{minutes-locale}</code>: 分钟的本地化值（例如 \"38\"）</li>\n                    <li><code>{seconds-utc}</code>: 保存日期的 UTC 格式的秒数（例如 \"31\"）</li>\n                    <li><code>{seconds-locale}</code>: 秒数的本地化值（例如 \"31\"）</li>\n                    <li><code>{visit-datetime-iso}</code>: 访问日期和时间的 ISO 格式（例如 \"2018-09-15T22_38_26_317Z\"）</li>\n                    <li><code>{visit-datetime-utc}</code>: 访问日期和时间的 UTC 格式（例如 \"Sat, 15 Sep 2018 22_38_26 GMT\"）</li>\n                    <li><code>{visit-datetime-locale}</code>: 日期和时间的本地化值（例如 \"9_16_2018, 12_54_31 AM\"）</li>\n                    <li><code>{visit-date-iso}</code>: 访问日期的 ISO 格式（例如 \"2018-09-15\"）</li>\n                    <li><code>{visit-date-locale}</code>: 访问日期的本地化值（例如 \"16_09_2018\"）</li>\n                    <li><code>{visit-time-iso}</code>: 访问时间的 ISO 格式（例如 \"22_38_26_317\"）</li>\n                    <li><code>{visit-time-locale}</code>: 访问时间的本地化值（例如 \"00_38_26\"）</li>\n                    <li><code>{visit-time-ms}</code>: 访问时间的 Unix Epoch 后的毫秒数（例如 1563582018000）</li>\n                    <li><code>{visit-day-utc}</code>: 访问日期的 UTC 格式的天数（例如 \"15\"）</li>\n                    <li><code>{visit-day-locale}</code>: 访问日期的本地化天数（例如 \"15\"）</li>\n                    <li><code>{visit-month-utc}</code>: 访问日期的 UTC 格式的月份（例如 \"09\"）</li>\n                    <li><code>{visit-month-locale}</code>: 访问日期的本地化月份（例如 \"09\"）</li>\n                    <li><code>{visit-year-utc}</code>: 访问日期的 UTC 格式的年份（例如 \"2018\"）</li>\n                    <li><code>{visit-year-locale}</code>: 访问日期的本地化年份（例如 \"2018\"）</li>\n                    <li><code>{visit-hours-utc}</code>: 访问日期的 UTC 格式的小时（例如 \"20\"）</li>\n                    <li><code>{visit-hours-locale}</code>: 访问日期的本地化小时（例如 \"22\"）</li>\n                    <li><code>{visit-minutes-utc}</code>: 访问日期的 UTC 格式的分钟（例如 \"38\"）</li>\n                    <li><code>{visit-minutes-locale}</code>: 访问日期的本地化分钟（例如 \"38\"）</li>\n                    <li><code>{visit-seconds-utc}</code>: 访问日期的 UTC 格式的秒数（例如 \"31\"）</li>\n                    <li><code>{visit-seconds-locale}</code>: 访问日期的本地化秒数（例如 \"31\"）</li>\n                    <li><code>{url-href}</code>: 页面的 URL（例如 \"http://example.com/category/index.html\"）</li>\n                    <li><code>{url-href-digest-sha-1}</code>: 页面的 URL 的 SHA-1 哈希值（例如\n                        4b826844d9f5c128533e4ff14d746334f3ac9e00）<strong>注意：仅支持文件名，而不支持信息栏</strong></li>\n                    <li><code>{url-href-flat}</code>: 替换斜杠后的页面 URL（例如 \"http__example.com_category_index.html\"）</li>\n                    <li><code>{url-pathname}</code>: URL 的路径名（例如 \"category/index.html\"）</li>\n                    <li><code>{url-pathname-flat}</code>: 替换斜杠后的 URL 路径名（例如 \"category_index.html\"）</li>\n                    <li><code>{url-last-segment}</code>: 路径名的最后一部分（没有扩展名）或主机（如果没有找到）（例如 \"index\"）</li>\n                    <li><code>{url-filename}</code>: URL 的文件名（例如 \"index.html\"）</li>\n                    <li><code>{url-protocol}</code>: URL 的协议（例如 \"https\"）</li>\n                    <li><code>{url-host}</code>: URL 的主机名 + 端口（例如 \"example.com_8080\"）</li>\n                    <li><code>{url-hostname}</code>: URL 的主机名（例如 \"example.com\"）</li>\n                    <li><code>{url-hostname-suffix}</code>: URL 主机名的后缀（例如 \"com\"）</li>\n                    <li><code>{url-hostname-domain}</code>: URL 主机名的域名（例如 \"example\"）</li>\n                    <li><code>{url-hostname-root}</code>: URL 主机名的根（例如 \"example.com\"）</li>\n                    <li><code>{url-hostname-subdomains}</code>: URL 主机名的子域名（例如 \"sub\" 对于 \"sub.example.com\"），\"www\" 被忽略\n                    </li>\n                    <li><code>{url-port}</code>: URL 的端口（例如 \"8080\"）</li>\n                    <li><code>{url-username}</code>: URL 的用户名（例如 \"john_doe\"）</li>\n                    <li><code>{url-password}</code>: URL 的密码（例如 \"qwerty123\"）</li>\n                    <li><code>{url-search}</code>: URL 的搜索字符串（例如 \"order=ascending\"）</li>\n                    <li><code>{url-hash}</code>: URL 的哈希值（例如 \"chapter-2\"）</li>\n                    <li><code>{url-referrer}</code>: 链接到该页面的页面的 URI（例如 \"http://example.com\"）</li>\n                    <li><code>{url-referrer-flat}</code>: 链接到该页面的页面的 URI，斜杠被替换（例如 \"http_example.com\"）</li>\n                    <li><code>{url-original}</code>: 页面的原始 URL（例如 \"http://example.com/index.html\"）</li>\n                    <li><code>{bookmark-pathname}</code>: 新创建的书签的路径名（例如 \"我的书签/上个月\"），当选项 \"书签 > 保存新创建书签的页面\" 被启用时</li>\n                    <li><code>{bookmark-pathname-flat}</code>: 新创建的书签的路径名，斜杠被替换（例如 \"我的书签_上个月\"），当选项 \"书签 > 保存新创建书签的页面\"被启用时\n                    </li>\n                    <li><code>{tab-id}</code>: 标签的唯一标识符（例如 \"326\"）</li>\n                    <li><code>{tab-index}</code>: 标签在窗口中的索引（例如 \"1\"）</li>\n                    <li><code>{digest-sha-256}</code>: 整个页面内容的 SHA-256\n                        哈希值（例如e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855）<strong>注意：仅支持文件名，而不支持信息栏</strong>\n                    </li>\n                    <li><code>{digest-sha-384}</code>: 整个页面内容的 SHA-384 哈希值<strong>注意：仅支持文件名，而不支持信息栏</strong></li>\n                    <li><code>{digest-sha-512}</code>: 整个页面内容的 SHA-512 哈希值<strong>注意：仅支持文件名，而不支持信息栏</strong></li>\n                    <li><code>{profile-name}</code>: 用于保存页面的配置文件名称</li>\n                    <li><code>{filename-extension}</code>: 根据文件格式的文件名扩展名（例如 \"html\"、\"u.zip.html\"、\"zip.html\"、\"zip\"）</li>\n                    <li><code>{save-action}</code>: 保存页面时使用的操作（例如 \"page\"、\"selection\"）</li>\n                    <li><code>{options-json}</code>: 用于保存页面的选项的 JSON 表示。每个属性名称采用小驼峰命名法（例如 \"blockScripts\"）</li>\n                    <li><code>{options-text}</code>: 用于保存页面的选项的文本表示。文本表示由选项及其值的列表组成，以换行符分隔（例如 \"saveRawPage:\n                        false\\includeInfobar: true...\"）</li>\n                </ul>\n            </li>\n            <li><a href=\"#template-functions\" id=\"template-functions\">模板函数</a>\n                <p>模板函数用于格式化模板中的值或根据参数插入值。</p>\n                <p>函数调用的语法是 <code>%<em>function-name</em>&lt;<em>parameter</em>&gt;</code>。您可以传递多个用管道字符分隔的参数（例如\n                    \"%<em>function-name</em>&lt;<em>parameter1</em>|<em>parameter2</em>&gt;\"）。与模板变量一样，您可以通过在函数名称后添加\n                    <code>[<em>maxByteSize</em>]</code> 或 <code>[<em>maxCharSize</em>ch]</code> 来限制动态值的长度。\n                </p>\n                <ul>\n                    <li><code>%if-empty&lt;value|default&gt;</code>: 如果 <code>value</code> 为空，则返回 <code>default</code>\n                        值（例如 \"%if-empty&lt;{page-title}|Untitled&gt;\" 当页面标题为空时返回 \"Untitled\"）。您还可以传递多个用管道字符分隔的值（例如\n                        \"%if-empty&lt;{page-title}|{page-heading}|Untitled&gt;\" 当页面标题不为空时返回页面标题，如果不为空则返回页面标题，如果两个都为空则返回\n                        \"Untitled\"）。</li>\n                    <li><code>%if-not-empty&lt;value|default&gt;</code>: 如果 <code>value</code> 不为空，则返回\n                        <code>default</code> 值（例如 \"%if-not-empty&lt;{page-title}({page-title})&gt;\"\n                        当页面标题不为空时返回带括号的页面标题）。您也可以传递多个用管道字符分隔的值，就像使用 <code>%if-empty</code> 函数一样。\n                    </li>\n                    <li><code>%if-equals&lt;value|expected|trueValue|falseValue&gt;</code>: 如果 <code>value</code> 等于\n                        <code>expected</code>，则返回 <code>trueValue</code>，否则返回 <code>falseValue</code>（例如\n                        \"%if-equals&lt;{page-title}|Untitled|{page-heading}|{page-title}&gt;\" 当页面标题等于 \"Untitled\"\n                        时返回页面标题，否者返回页面标题）。\n                    </li>\n                    <li><code>%if-not-equals&lt;value|expected|trueValue|falseValue&gt;</code>: 如果 <code>value</code>\n                        不等于 <code>expected</code>，则返回 <code>trueValue</code>，否则返回 <code>falseValue</code>（例如\n                        \"%if-not-equals&lt;{page-title}|Untitled|{page-title}|{page-heading}&gt;\" 当页面标题不等于 \"Untitled\"\n                        时返回页面标题，否者返回页面标题）。</li>\n                    <li><code>%if-contains&lt;value|expected|trueValue|falseValue&gt;</code>: 如果 <code>value</code> 包含\n                        <code>expected</code>，则返回 <code>trueValue</code>，否则返回 <code>falseValue</code>（例如\n                        \"%if-contains&lt;{page-title}|Untitled|{page-heading}|{page-title}&gt;\" 当页面标题包含 \"Untitled\"\n                        时返回页面标题，否者返回页面标题）。\n                    </li>\n                    <li><code>%if-not-contains&lt;value|expected|trueValue|falseValue&gt;</code>: 如果 <code>value</code>\n                        不包含 <code>expected</code>，则返回 <code>trueValue</code>，否则返回 <code>falseValue</code>（例如\n                        \"%if-not-contains&lt;{page-title}|Untitled|{page-title}|{page-heading}&gt;\" 当页面标题不包含 \"Untitled\"\n                        时返回页面标题，否者返回页面标题）。</li>\n\n                    <li><code>%substring&lt;value|start|end&gt;</code>: 返回 <code>value</code> 的子字符串（例如\n                        \"%substring&lt;{page-title}|0|20&gt;\" 返回页面标题的前20个字符，\"%substring&lt;{page-title}|5&gt;\"\n                        返回页面标题去掉前5个字符的部分）。</li>\n                    <li><code>%lowercase&lt;value&gt;</code>: 返回 <code>value</code> 的小写形式（例如\n                        \"%lowercase&lt;{page-title}&gt;\" 返回页面标题的小写形式）。</li>\n                    <li><code>%uppercase&lt;value&gt;</code>: 返回 <code>value</code> 的大写形式（例如\n                        \"%uppercase&lt;{page-title}&gt;\" 返回页面标题的大写形式）。</li>\n                    <li><code>%capitalize&lt;value&gt;</code>: 返回 <code>value</code> 的首字母大写形式（例如\n                        \"%capitalize&lt;{page-title}&gt;\" 返回页面标题的首字母大写形式）。</li>\n                    <li><code>%replace&lt;value|search|replacement&gt;</code>: 返回 <code>value</code>，将所有\n                        <code>search</code> 值替换为 <code>replacement</code>（例如 \"%replace&lt;{page-title}| |_&gt;\"\n                        将页面标题中的所有空格替换为下划线）。\n                    </li>\n                    <li><code>%repeat&lt;value|count&gt;</code>: 返回 <code>value</code> 重复 <code>count</code> 次（例如\n                        \"%repeat&lt;{page-title}|3&gt;\" 将页面标题重复3次）。</li>\n                    <li><code>%index-of&lt;value|search|fromIndex&gt;</code>: 返回 <code>value</code> 中\n                        <code>search</code> 首次出现的索引（例如 \"%index-of&lt;{page-title}|\"Title\"&gt;\" 返回字符串 \"Title\" 在\n                        <code>page-title</code> 中首次出现的索引）。\n                    </li>\n                    <li><code>%last-index-of&lt;value|search|fromIndex&gt;</code>: 返回 <code>value</code> 中\n                        <code>search</code> 最后一次出现的索引（例如 \"%last-index-of&lt;{page-title}|\"Title\"&gt;\" 返回字符串 \"Title\" 在\n                        <code>page-title</code> 中最后一次出现的索引）。\n                    </li>\n                    <li><code>%length&lt;value&gt;</code>: 返回 <code>value</code> 的长度（例如 \"%length&lt;{page-title}&gt;\"\n                        返回页面标题的长度）。</li>\n                    <li><code>%trim&lt;value&gt;</code>: 返回 <code>value</code>，去掉所有前导和后缀空白字符（例如\n                        \"%trim&lt;{page-title}&gt;\" 去掉页面标题的所有前导和后缀空白字符）。</li>\n                    <li><code>%trim-left&lt;value&gt;</code>: 返回 <code>value</code>，去掉所有前导空白字符（例如\n                        \"%trim-left&lt;{page-title}&gt;\" 去掉页面标题的所有前导空白字符）。</li>\n                    <li><code>%trim-right&lt;value&gt;</code>: 返回 <code>value</code>，去掉所有后缀空白字符（例如\n                        \"%trim-right&lt;{page-title}&gt;\" 去掉页面标题的所有后缀空白字符）。</li>\n\n                    <li><code>%pad-left&lt;value|length|pad&gt;</code>: 返回 <code>value</code>，在左侧添加 <code>pad</code> 以使\n                        <code>value</code> 的长度等于 <code>length</code>（例如 \"%pad-left&lt;{page-title}|20|_&gt;\"\n                        在页面标题的左侧添加下划线，以使其长度等于20）。\n                    </li>\n                    <li><code>%pad-right&lt;value|length|pad&gt;</code>: 返回 <code>value</code>，在右侧添加 <code>pad</code> 以使\n                        <code>value</code> 的长度等于 <code>length</code>（例如 \"%pad-right&lt;{page-title}|20|_&gt;\"\n                        在页面标题的右侧添加下划线，以使其长度等于20）。\n                    </li>\n                    <li><code>%url-search-name&lt;index&gt;</code>: 指定索引处的搜索参数名称（例如 \"%url-search-name&lt;0&gt;\"\n                        获取第一个搜索参数的名称）。</li>\n                    <li><code>%url-search-value&lt;index&gt;</code>: 指定索引处的搜索参数值（例如 \"%url-search-value&lt;0&gt;\"\n                        获取第一个搜索参数的值）。</li>\n                    <li><code>%url-search-named-value&lt;name&gt;</code>: 指定名称的搜索参数的值（例如\n                        \"%url-search-named-value&lt;id&gt;\" 获取名为 \"id\" 的搜索参数的值）。</li>\n                    <li><code>%url-segment&lt;index&gt;</code>: 指定索引处的路径名段（例如 \"%url-segment&lt;0&gt;\" 获取路径名的第一个段）。</li>\n                    <li><code>%url-hostname-subdomain&lt;index&gt;</code>: 指定索引处的主机名子域（例如\n                        \"%url-hostname-subdomain&lt;0&gt;\" 获取主机名的第一个子域）。</li>\n                    <li><code>%stringify&lt;value&gt;</code>: 指定值的字符串表示（例如 \"%stringify&lt;{page-title}&gt;\"\n                        获取页面标题的字符串表示）。</li>\n                    <li><code>%encode-uri&lt;value&gt;</code>: 指定值的 URI 编码表示（例如 \"%encode-uri&lt;{page-title}&gt;\"\n                        获取页面标题的 URI 编码表示）。</li>\n                    <li><code>%decode-uri&lt;value&gt;</code>: 指定值的 URI 解码表示（例如 \"%decode-uri&lt;{page-title}&gt;\"\n                        获取页面标题的 URI 解码表示）。</li>\n                    <li><code>%encode-uri-component&lt;value&gt;</code>: 指定值的 URI 编码表示（例如\n                        \"%encode-uri-component&lt;{page-title}&gt;\" 获取页面标题的 URI 编码表示）。</li>\n                    <li><code>%decode-uri-component&lt;value&gt;</code>: 指定值的 URI 解码表示（例如\n                        \"%decode-uri-component&lt;{page-title}&gt;\" 获取页面标题的 URI 解码表示）。</li>\n                    <li><code>%encode-base64&lt;value&gt;</code>: 指定值的 Base64 编码表示（例如\n                        \"%encode-base64&lt;{page-title}&gt;\"\n                        获取页面标题的 Base64 编码表示）。</li>\n                    <li><code>%decode-base64&lt;value&gt;</code>: 指定值的 Base64 解码表示（例如\n                        \"%decode-base64&lt;{page-title}&gt;\"\n                        获取页面标题的 Base64 解码表示）。</li>\n                    <li><code>%page-element-text&lt;selector&gt;</code>: 获取第一个匹配指定选择器的元素的文本内容（例如\n                        \"%page-element-text&lt;h1&gt;\" 获取第一个 H1 元素的文本内容）。</li>\n                    <li><code>%page-element-attribute&lt;selector|attribute&gt;</code>: 获取第一个匹配指定选择器的元素的指定属性值（例如\n                        \"%page-element-attribute&lt;h1|class&gt;\" 获取第一个 H1 元素的 class 属性值）。</li>\n                    <li><code>%date-locale&lt;locales&gt;</code>: 日期和时间的本地化值（例如 \"%date-locale&lt;en-US&gt;\"\n                        表示美国英语格式的日期和时间）。</li>\n                    <li><code>%time-locale&lt;locales&gt;</code>: 时间的本地化值（例如 \"%time-locale&lt;en-US&gt;\" 表示美国英语格式的时间）。\n                    </li>\n                    <li><code>%datetime-locale&lt;locales&gt;</code>: 日期和时间的本地化值（例如 \"%datetime-locale&lt;en-US&gt;\"\n                        表示美国英语格式的日期和时间）。</li>\n                    <li><code>%datetime-custom&lt;locale|year|month|day|weekday|hour|minute|second|hour12|time-zone|fractional-seconds-digits|time-zone-name|era|locale-matcher&gt;</code>:\n                        根据指定的区域和选项格式化的日期和时间。请参见下面的选项列表。您可以将\n                        <code> </code>（空格字符）作为值传递，以使用选项的默认值。您还可以省略列表末尾的选项。例如，要以美国英语格式格式化日期和时间，并包含年份、日期和星期几，可以使用\n                        \"%datetime-custom&lt;en-US|numeric| |numeric| |numeric&gt;\"。\n                        <ul>\n                            <li><code>locale</code>: 作为 BCP 47 语言标签使用的区域（例如 \"en-US\"）。</li>\n                            <li><code>year</code>: 年份格式（即 \"numeric\", \"2-digit\"）。</li>\n                            <li><code>month</code>: 月份格式（即 \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"）。</li>\n                            <li><code>day</code>: 日期格式（即 \"numeric\", \"2-digit\"）。</li>\n                            <li><code>weekday</code>: 星期几格式（即 \"narrow\", \"short\", \"long\"）。</li>\n                            <li><code>hour</code>: 小时格式（即 \"numeric\", \"2-digit\"）。</li>\n                            <li><code>minute</code>: 分钟格式（即 \"numeric\", \"2-digit\"）。</li>\n                            <li><code>second</code>: 秒格式（即 \"numeric\", \"2-digit\"）。</li>\n                            <li><code>hour12</code>: 是否使用12小时制（即 \"true\", \"false\"）。</li>\n                            <li><code>time-zone</code>: IANA时区数据库中的时区（例如 \"UTC\", \"GMT\", \"EST\", \"PST\",\n                                \"America/New_York\"）。</li>\n                            <li><code>fractional-seconds-digits</code>: 小数秒数字的数量（即 \"1\" 到 \"3\"）。</li>\n                            <li><code>time-zone-name</code>: 时区名称格式（即 \"short\", \"long\", \"shortOffset\", \"longOffset\",\n                                \"shortGeneric\", \"longGeneric\"）。</li>\n                            <li><code>day-period</code>: 日期周期（即 \"narrow\", \"short\", \"long\"）。</li>\n                            <li><code>era</code>: 纪元（即 \"narrow\", \"short\", \"long\"）。</li>\n                            <li><code>locale-matcher</code>: 区域匹配器（例如 \"lookup\", \"best fit\"）。</li>\n                        </ul>\n                        您可以在<a\n                            href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#parameters\"\n                            target=\"_blank\">DateTimeFormat 构造函数</a> 文档中找到有关选项的更多信息。\n                    </li>\n                    <li><code>%option-value&lt;key&gt;</code>：指定选项的值（例如，“displayInfobar”选项的值为“%option\n                        value&lt;displayInfobar&gt;”）</li>\n                </ul>\n            </li>\n            <li><a id=\"external-messages\">与其他扩展集成</a>\n                <p>SingleFile可以接收来自其他扩展名的消息。消息必须发送到SingleFile的扩展ID，并且必须是包含以下值之一的字符串：\n                <ul>\n                    <li><code>“保存页面”</code>：保存当前页面</li>\n                    <li><code>“编辑并保存页面”</code>：在注释编辑器中编辑当前页面并保存</li>\n                    <li><code>“保存所选链接”</code>：保存所选内容中的所有链接</li>\n                    <li><code>“保存所选内容”</code>：保存所选内容</li>\n                    <li><code>“保存所选选项卡”</code>：保存所选选项卡</li>\n                    <li><code>“保存未固定的选项卡”</code>：保存未固定的选项卡</li>\n                    <li><code>“保存所有选项卡”</code>：保存所有选项卡</li>\n                </ul>\n                </p>\n            </li>\n            <li><a id=\"notes\">技术说明</a>\n                <ul>\n                    <li>所有图像都转换为<a href=\"http://en.wikipedia.org/wiki/Base64\" target=\"_blank\">base64</a>.</li>\n                    <li>除框架内容外的所有资源都使用以下方式注入文档中<a href=\"http://en.wikipedia.org/wiki/Data_URI_scheme\"\n                            target=\"_blank\">数据URI方案</a>.</li>\n                    <li>使用srcdoc属性将框架内容作为文本注入文档中。</li>\n                </ul>\n            </li>\n            <li><a id=\"known-issues\">已知问题</a>\n                <ul>\n                    <li>所有浏览器<ul>\n                            <li>出于安全原因，您无法保存托管在上的页面https://chrome.google.com,\n                                https://addons.mozilla.org以及其他一些Mozilla域名。当这种情况发生时，🚫 显示在SingleFile图标的顶部。</li>\n                            <li>出于安全原因，SingleFile有时无法保存画布的图像表示和视频元素的快照。</li>\n                            <li>默认情况下，无法记住上次保存的路径。要规避此限制，请禁用“杂项&gt;在后台保存页面”选项。</li>\n                            <li>以下字符在文件名中被替换为其全角等效符号：~、+、?、%、*、:、|、\"、&lt;、&gt;、\\。替换后的字符分别是：～、＋、？、％、＊、：、｜、＂、＜、＞、＼。其他无效字符会被替换为\n                                _。这样做是为了兼容不同的操作系统和文件系统。如果不需要这种兼容性，并且知道自己在做什么，可以在<a\n                                    href=\"https://github.com/gildas-lormeau/SingleFile/wiki/Hidden-options\">隐藏选项</a>中更改禁止字符和替换字符的列表。\n                            </li>\n                        </ul>\n                    </li>\n                    <li>基于Chromium的浏览器<ul>\n                            <li>您必须在扩展页面中启用“允许访问文件URL”选项，以便在查看已保存的页面时显示信息栏，保存或注释存储在文件系统上的页面。</li>\n                            <li>如果已保存页面的文件名看起来像“56833935-156b-4d8c-a00f-19599c6513d3”，请禁用“其他&gt;在后台保存页面”选项。重新安装浏览器也可能解决此问题。\n                            </li>\n                            <li>禁用“文件名”选项，打开“另存为”对话框以确认文件名，只有在禁用“下载前询问每个文件的保存位置”时才有效chrome://settings/downloads</li>\n                        </ul>\n                    </li>\n                    <li>火狐<ul>\n                            <li>如果设置为“提示输入名称”，则“文件名&gt;文件名冲突解决”选项不起作用。</li>\n                            <li>有时，SingleFile无法保存沙盒iframe的内容。</li>\n                            <li>在处理文件系统中的页面时，外部资源（如图像、样式表、字体等）将不会嵌入到保存的页面中。</li>\n                        </ul>\n                    </li>\n                </ul>\n            </li>\n            <li><a id=\"unknown-issues\">排除未知问题</a>\n                <p>如果您发现未知问题，请按照以下步骤操作：</p>\n                <ul>\n                    <li>以匿名方式保存页面。</li>\n                    <li>如果以隐身方式保存页面没有解决问题，请重置SingleFile选项。</li>\n                    <li>如果重置选项没有解决问题，请重新启动浏览器。</li>\n                    <li>如果重新启动浏览器没有解决问题，请尝试禁用所有其他扩展，查看是否存在冲突。</li>\n                    <li>如果存在冲突，请尝试确定针对哪个扩展。</li>\n                    <li>请报告该问题<a href=\"https://github.com/gildas-lormeau/SingleFile/issues\"\n                            target=\"_blank\">在这里</a>并简要描述了如何复制它。</li>\n                </ul>\n                <p>欢迎提出建议：）</p>\n            </li>\n            <li><a id=\"contributors\">贡献者</a>\n                <ul>\n                    <li>由Hajiagha_Sadikhov完成的阿塞拜疆语翻译(<a href=\"https://github.com/Hajiagha-Sadikhov\"\n                            target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>yfdyh000完成的中文翻译(<a href=\"https://github.com/yfdyh000\"\n                            target=\"_blank\">GitHub配置文件</a>)KrasnayaPloshchad(<a\n                            href=\"https://github.com/KrasnayaPloshchad\" target=\"_blank\">GitHub配置文件</a>)，冻疮(<a\n                            href=\"https://github.com/frostblazergit\" target=\"_blank\">GitHub配置文件</a>)，夜鹰(<a\n                            href=\"https://github.com/NightSharp\" target=\"_blank\">GitHub配置文件</a>)，lqzhgood(<a\n                            href=\"https://github.com/lqzhgood\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>弗罗斯特开拓者的中国传统翻译(<a href=\"https://github.com/frostblazergit\"\n                            target=\"_blank\">GitHub配置文件</a>)，lqzhgood(<a href=\"https://github.com/lqzhgood\"\n                            target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>由jooleer完成的荷兰语翻译(<a href=\"https://github.com/jooleer\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>由jooleer完成的荷兰语翻译(<a href=\"https://github.com/jooleer\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>由womotroll完成的德语翻译(<a href=\"https://github.com/womotroll\" target=\"_blank\">GitHub配置文件</a>)，班曼(<a\n                            href=\"https://github.com/bannmann\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>意大利语翻译由Fastbyte01完成(<a href=\"https://github.com/Fastbyte01\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>日语翻译，由四天王（Shitennouji）完成(<a href=\"https://github.com/Shitennouji\"\n                            target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>xesarni完成的波兰语翻译(<a href=\"https://github.com/xesarni\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>葡萄牙语翻译由@Blackspirits完成(<a href=\"https://github.com/Blackspirit\" target=\"_blank\">GitHub配置文件</a>)\n                    </li>\n                    <li>葡萄牙语巴西语翻译由@mezysinc，Blackspirits完成(<a href=\"https://github.com/Blackspirit\"\n                            target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>俄语翻译由rstp14完成(<a href=\"https://github.com/rstp14\" target=\"_blank\">GitHub配置文件</a>)克拉莫拉RU(<a\n                            href=\"https://github.com/kramola-RU\" target=\"_blank\">GitHub配置文件</a>)，索洛科特(<a\n                            href=\"https://github.com/solokot\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>西班牙语翻译由strel完成(<a href=\"https://github.com/strel\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>瑞典语翻译由NickWick13完成(<a href=\"https://github.com/NickWick13\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>土耳其语翻译由hbaklan943完成(<a href=\"https://github.com/hbaklan943\" target=\"_blank\">GitHub配置文件</a>)</li>\n                    <li>乌克兰语翻译由perdolka完成(<a href=\"https://github.com/perdolka\" target=\"_blank\">GitHub配置文件</a>)吉尔达斯·洛默\n                    </li>\n                </ul>\n            </li>\n            <li><a id=\"icons\">图标</a>\n                <ul>\n                    <li>图标制作人<a href=\"https://www.flaticon.com/authors/kiranshastry\" s=\"\" target=\"_blank\"\n                            title=\"Kiranshastry\">基兰化学</a>从<a href=\"https://www.flaticon.com/\" target=\"_blank\"\n                            title=\"Flaticon\">www.flaticon.com</a>已获得许可<a\n                            href=\"http://creativecommons.org/licenses/by/3.0/\" target=\"_blank\"\n                            title=\"Creative Commons BY 3.0\">CC 3.0</a></li>\n                </ul>\n            </li>\n        </ol>\n    </div>\n    <script src=\"../bg/ui-help.js\" type=\"module\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/ui/pages/offscreen-document.html",
    "content": "<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n    <meta charset=\"utf-8\">\r\n    <title>[SingleFile] Autosave offscreen document</title>\r\n</head>\r\n\r\n<body>\r\n    <script src=\"/lib/chrome-browser-polyfill.js\"></script>\r\n    <script src=\"/lib/single-file.js\"></script>\r\n    <script src=\"/lib/single-file-extension-offscreen-document.js\"></script>\r\n</body>\r\n\r\n</html>"
  },
  {
    "path": "src/ui/pages/options-editor.html",
    "content": "<!DOCTYPE html>\n<html class=\"maximized\">\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>SingleFile options editor</title>\n\t<link rel=\"stylesheet\" href=\"options.css\">\n\t<style>\n\t\t.option {\n\t\t\tpadding: 6px;\n\t\t}\n\n\t\ttextarea {\n\t\t\twidth: 100%;\n\t\t\theight: 80vh;\n\t\t}\n\n\t\t.option.bottom {\n\t\t\tjustify-content: end;\n\t\t}\n\t</style>\n\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n\t<meta name=\"color-scheme\" content=\"light dark\">\n\t<link rel=\"icon\" href=\"/src/ui/resources/icon_128.png\">\n</head>\n\n<body>\n\t<main>\n\t\t<h3>\n\t\t\t<span class=\"options-title\">\n\t\t\t\t<span id=\"titleLabel\"></span>\n\t\t\t</span>\n\t\t</h3>\n\t\t<div class=\"option\">\n\t\t\t<textarea id=\"optionsInput\">\n\t\t\t</textarea>\n\t\t</div>\n\t\t<div class=\"option bottom\">\n\t\t\t<div class=\"buttons\">\n\t\t\t\t<button id=\"saveButton\"></button>\n\t\t\t</div>\n\t\t</div>\n\t</main>\n\t<script src=\"/lib/chrome-browser-polyfill.js\"></script>\n\t<script type=\"module\" src=\"../bg/ui-options-editor.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/ui/pages/options.css",
    "content": "* {\n    box-sizing: content-box;\n}\n\nbody {\n    background-color: #fff;\n    font-family: sans-serif;\n    font-size: 12px;\n    min-width: 480px;\n    max-width: 1024px;\n    width: 100%;\n    margin: 0;\n    margin-left: auto;\n    margin-right: auto;\n}\n\n.side-panel body {\n    background-color: #fbfbfb;\n}\n\nbutton {\n    padding-top: 5px;\n    padding-bottom: 5px;\n    padding-left: 8px;\n    padding-right: 8px;\n    border-width: 1px;\n}\n\nbutton:not([disabled]):hover {\n    background-color: #ededed;\n}\n\nbutton,\nselect,\ninput[type=text],\ntextarea,\ninput[type=password] {\n    background-color: transparent;\n    border-color: rgb(191, 191, 191);\n    border-style: solid;\n    border-radius: 2px;\n    border-width: 1px;\n    color: black;\n}\n\ntextarea {\n    width: 100%;\n    min-height: 1.2em;\n    height: 2.4em;\n    resize: vertical;\n}\n\ninput[type=checkbox] {\n    margin-bottom: 1px;\n}\n\nbutton:active {\n    border-color: rgb(237, 237, 237);\n}\n\nbutton:focus {\n    border-color: black;\n    background-color: #fefefe;\n}\n\ninput {\n    margin-left: 5px;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"] {\n    min-width: 70%;\n}\n\ninput[type=\"number\"] {\n    max-width: 50px;\n}\n\nselect {\n    min-height: 20px;\n}\n\n#profileNamesInput {\n    min-height: 22px;\n}\n\ninput.small-input {\n    max-width: 3ch;\n}\n\ninput.medium-input {\n    min-width: 50%;\n}\n\ninput.large-input {\n    min-width: 60px;\n}\n\n.option-input {\n    display: flex;\n}\n\n#filenameMaxLengthUnitInput {\n    margin-left: 2px;\n}\n\nh3 {\n    display: flex;\n    padding-left: 8px;\n    padding-top: 5px;\n    margin-right: 10px;\n    min-height: 28px;\n    margin-top: 8px;\n}\n\nh3 a {\n    padding-left: 5px;\n}\n\n.sync-input {\n    margin-bottom: 20px;\n    text-align: right;\n}\n\n.sync-input input {\n    margin: 0;\n    margin-right: 4px;\n    vertical-align: bottom;\n}\n\n.buttons {\n    white-space: nowrap;\n}\n\n.buttons button {\n    margin-left: 4px;\n}\n\n.profiles {\n    display: flex;\n    flex: 0 1 auto;\n    margin-left: 8px;\n    justify-content: flex-end;\n}\n\n.options-title {\n    flex: 1;\n    white-space: nowrap;\n}\n\n.help-icon-wrapper {\n    white-space: nowrap;\n}\n\n.help-icon {\n    vertical-align: middle;\n    display: inline-block;\n    margin-left: 3px;\n}\n\n.help-icon>img {\n    border-radius: 50%;\n    border: 1px black solid;\n    opacity: .2;\n    width: 12px;\n    margin-top: 4px;\n    margin-bottom: 2px;\n    margin-left: 8px;\n    margin-right: 8px;\n    transition: opacity;\n    transition-duration: 200ms;\n    cursor: pointer;\n}\n\n.help-icon>img:hover {\n    opacity: .4;\n}\n\n.help-content {\n    margin-top: 4px;\n    margin-left: 8px;\n    margin-bottom: 12px;\n    border: 1px #bfbfbf dotted;\n    border-radius: 4px;\n    padding: 2px;\n    background-color: #fffdde;\n    line-height: 1.6em;\n}\n\n.help-content img {\n    max-height: 1em;\n}\n\n.help-content a {\n    padding: 0px;\n}\n\n.help-content p {\n    margin: 6px;\n}\n\n.help-content ul {\n    margin: 4px;\n    padding-left: 25px;\n}\n\n.help-content li {\n    margin: 2px;\n}\n\n.rules-table-container * {\n    box-sizing: border-box;\n}\n\n.rules-table-container {\n    width: calc(100% - 10px);\n    border-spacing: 0;\n    border-color: rgb(191, 191, 191);\n    border-style: solid;\n    border-width: 1px;\n    margin-top: 24px;\n    margin-left: 6px;\n}\n\n.rules-table-container .tr {\n    height: 26px;\n    display: grid;\n    grid-template-columns: 1fr 1fr 1fr 64px;\n}\n\n.rules-table-container.compact .tr {\n    grid-template-columns: 1fr 1fr 64px;\n}\n\n.rules-table-container.compact .tr .rule-autosave-profile {\n    display: none;\n}\n\n.rules-table-container .tr[hidden] {\n    display: none;\n}\n\n.rules-table-container .thead {\n    text-align: left;\n    border-color: rgb(225, 225, 225);\n    border-style: solid;\n    border-width: 0;\n    border-bottom-width: 1px;\n}\n\n.rules-table-container .th,\n.rules-table-container .td {\n    padding: 4px;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    white-space: nowrap;\n    align-self: center;\n}\n\n.rules-table .td:first-of-type {\n    padding-right: 8px;\n}\n\n.rules-table .td:last-of-type {\n    text-align: right;\n}\n\n.rules-data {\n    max-height: 552px;\n    overflow-y: auto;\n    padding-top: 2px;\n    padding-bottom: 2px;\n    scrollbar-width: thin;\n}\n\n::-webkit-scrollbar {\n    width: 6px;\n    background-color: #cdcdcd;\n}\n\n::-webkit-scrollbar-thumb {\n    background-color: #38383d;\n}\n\n.profiles button,\n.rules-table-container button {\n    padding: 0;\n    margin: 0;\n    text-align: center;\n    margin-left: 4px;\n    min-width: 22px;\n}\n\n.rules-table-container .thead .tr {\n    min-height: 32px;\n}\n\n.rules-table-container .thead .th:last-of-type {\n    text-align: right;\n}\n\n.profiles button,\n.profiles select,\n.rules-table-container button,\n.rules-table-container select,\n.rules-table-container input {\n    height: 22px;\n    vertical-align: top;\n}\n\n.rules-table-container input {\n    width: 100%;\n    height: 20px;\n    margin: 0;\n    padding: 0;\n    padding-left: 2px;\n    padding-right: 2px;\n}\n\n.rules-table-container .rule-create {\n    margin-top: 8px;\n    margin-bottom: 3px;\n}\n\n.profiles select {\n    width: calc(100% - 86px);\n    text-align-last: right;\n    padding: 0px;\n    padding-left: 4px;\n    padding-right: 4px;\n}\n\n.rules-table-container select {\n    max-width: 100%;\n}\n\n.profiles button:disabled,\n.rules-table-container button:disabled {\n    opacity: .25;\n}\n\n.profiles button>img,\n.rules-table-container button>img {\n    width: 14px;\n    height: auto;\n    vertical-align: middle;\n    padding: 2px;\n    box-sizing: content-box;\n}\n\n.rules-table-container+.option label,\n.rules-table-container+.option+.option label {\n    text-align: right;\n    width: 100%;\n    align-self: center;\n}\n\n#profilesLabel {\n    font-weight: normal;\n    padding-top: 5px;\n    margin-right: 5px;\n}\n\ndetails {\n    color: #555;\n    margin-left: 6px;\n    margin-right: 12px;\n    margin-bottom: 4px;\n    border-top: #bfbfbf 1px dashed;\n}\n\ndetails:last-of-type {\n    border-bottom: #bfbfbf 1px dashed;\n}\n\ndetails>summary {\n    color: black;\n    padding-bottom: 7px;\n    padding-top: 7px;\n    margin-bottom: 3px;\n    margin-top: 3px;\n    padding-left: 6px;\n    cursor: pointer;\n}\n\ndetails[open]>summary {\n    cursor: pointer;\n    outline-width: 0px;\n}\n\na {\n    display: inline-block;\n    padding-top: 5px;\n}\n\n.option.second-level {\n    margin-left: 10px;\n}\n\n.option:not([hidden]) {\n    display: flex;\n    justify-content: space-between;\n    margin-top: 3px;\n    padding-left: 8px;\n    padding-bottom: 2px;\n    min-height: 24px;\n    align-items: center;\n}\n\n.option.vertical {\n    flex-direction: column;\n}\n\n.option.vertical label {\n    align-self: flex-start;\n    min-height: 24px;\n}\n\n.option.vertical input {\n    margin-top: 4px;\n    align-self: flex-end;\n    width: calc(100% - 6px);\n    margin-bottom: 2px;\n    padding: 2px;\n}\n\n.option:last-of-type {\n    padding-bottom: 12px;\n}\n\n.option:first-of-type {\n    padding-top: 6px;\n}\n\n.option.bottom {\n    padding-top: 24px;\n    padding-right: 12px;\n    padding-bottom: 12px;\n    padding-left: 12px;\n}\n\n#expandAllButton {\n    font-family: monospace;\n    display: inline-block;\n    min-width: 7px;\n    max-width: 7px;\n    margin-left: 5px;\n    opacity: .4;\n    transition: opacity 250ms;\n    cursor: pointer;\n    font-size: 1.1em;\n    position: relative;\n    top: -1px;\n    left: -2px;\n}\n\n#expandAllButton::after {\n    content: '+';\n}\n\n#expandAllButton.opened::after {\n    content: '-';\n}\n\n#expandAllButton:hover {\n    opacity: 1;\n}\n\n.popup {\n    width: 100%;\n    height: 100%;\n    position: fixed;\n    top: 0;\n    left: 0;\n    background-color: rgba(191, 191, 191, .75);\n    display: none;\n}\n\n.popup-content {\n    align-self: flex-start;\n    width: 90%;\n    max-width: 320px;\n    margin-top: 100px;\n    margin-bottom: 100px;\n    margin-left: auto;\n    margin-right: auto;\n    background-color: white;\n    box-shadow: 5px 5px #ababab;\n}\n\n.popup-content header {\n    padding-top: 10px;\n    padding-left: 10px;\n    padding-bottom: 20px;\n    font-size: 14px;\n    line-height: 20px;\n}\n\n.popup-content main {\n    padding-top: 10px;\n    padding-left: 10px;\n    padding-bottom: 10px;\n}\n\n.popup-content main input {\n    margin-bottom: 10px;\n    padding: 2px;\n    font-size: 13px;\n    margin-left: 0px;\n    width: calc(100% - 16px);\n}\n\n.popup-content footer {\n    text-align: right;\n    padding-left: 10px;\n    padding-right: 10px;\n}\n\n.popup-content footer button {\n    margin-bottom: 10px;\n    margin-left: 4px;\n}\n\n.side-panel .profiles {\n    max-width: unset;\n}\n\n.side-panel .profiles {\n    top: 0px;\n    min-width: calc(100% - 12px);\n}\n\n.side-panel .profiles select {\n    min-width: calc(100% - 78px);\n    text-align-last: auto;\n    padding-right: 0;\n}\n\n.side-panel .options-title,\n.side-panel .option.bottom {\n    display: none;\n}\n\n.side-panel h3 {\n    margin-top: 0;\n}\n\n.maximized body {\n    margin-top: 8px;\n}\n\n.maximized body>main {\n    margin: 0px;\n    border: solid 1px rgb(191, 191, 191);\n    background-color: #fbfbfb;\n}\n\nhtml.maximized {\n    background-color: #f0f0f0;\n}\n\n.maximized .profiles {\n    position: relative;\n    top: -4px;\n}\n\n.maximized #helpLabel {\n    padding-left: 4px;\n    padding-right: 4px;\n    padding-top: 0;\n}\n\n@media (max-width:279px) {\n    h3 {\n        flex-direction: column;\n    }\n\n    .profiles,\n    .maximized .profiles {\n        position: static;\n        margin-top: 8px;\n        margin-left: 16px;\n        max-width: 100%;\n        justify-content: flex-start;\n    }\n\n    .side-panel .profiles {\n        margin-top: 0;\n        margin-left: 0;\n        margin-right: 8px;\n        justify-content: inherit;\n    }\n\n    .profiles select {\n        text-align-last: auto;\n        padding-right: 0;\n    }\n}\n\n@media (max-width:479px) {\n    body {\n        min-width: auto;\n    }\n\n    body,\n    input,\n    select,\n    button {\n        font-size: 11px;\n    }\n}\n\n@media (prefers-color-scheme: dark) {\n\n    ::-webkit-scrollbar {\n        background-color: #2A2A2E;\n    }\n\n    ::-webkit-scrollbar-thumb {\n        background-color: #555;\n    }\n\n    details {\n        color: #ccc;\n    }\n\n    html {\n        background-color: #202023;\n    }\n\n    html.maximized {\n        background-color: #373737;\n    }\n\n    main,\n    .maximized body>main,\n    details>summary,\n    button,\n    select,\n    .popup-content {\n        background-color: #23222b;\n        color: #fdfdfd;\n    }\n\n    .side-panel,\n    .side-panel body>main,\n    .side-panel details>summary,\n    .side-panel button,\n    .side-panel select,\n    .side-panel .popup-content {\n        background-color: #38383d;\n    }\n\n    .maximized body>main {\n        border-color: rgb(81, 81, 81);\n    }\n\n    .new-window-link img,\n    .profiles button img {\n        filter: invert(100%);\n    }\n\n    .profiles button img:hover {\n        filter: invert(0%);\n    }\n\n    .profiles button[disabled] {\n        opacity: .4;\n    }\n\n    .profiles button[disabled] img {\n        filter: invert(50%);\n    }\n\n    .help-icon>img {\n        opacity: .6;\n        border-color: #ccc;\n    }\n\n    .help-icon>img:hover {\n        opacity: .8;\n    }\n\n    input[type=\"text\"],\n    textarea,\n    input[type=\"password\"] {\n        background-color: #fff;\n    }\n\n    button:not([disabled]):hover {\n        color: #2A2A2E;\n    }\n\n    button:focus {\n        color: black;\n        border-color: black;\n        background-color: #d2d2d2;\n    }\n\n    .help-content {\n        background-color: rgb(85, 85, 97);\n    }\n\n    .rules-table-container,\n    .rules-table-container .thead {\n        border-color: rgb(85, 85, 97);\n    }\n\n    a,\n    a:visited {\n        color: white;\n    }\n\n    .popup {\n        background-color: rgba(59, 59, 59, 0.95);\n    }\n\n    .popup-content {\n        box-shadow: 5px 5px #000000;\n    }\n\n}"
  },
  {
    "path": "src/ui/pages/options.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>SingleFile options</title>\n\t<link rel=\"stylesheet\" href=\"options.css\">\n\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n\t<meta name=\"color-scheme\" content=\"light dark\">\n\t<link rel=\"icon\" href=\"/src/ui/resources/icon_128.png\">\n</head>\n\n<body>\n\t<main>\n\t\t<h3>\n\t\t\t<span class=\"options-title\">\n\t\t\t\t<span id=\"expandAllButton\"></span>\n\t\t\t\t<span id=\"titleLabel\"></span>\n\t\t\t\t<a href=\"options.html#\" target=\"_blank\" class=\"new-window-link\"><img\n\t\t\t\t\t\tsrc=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAQElEQVR42qXKwQkAIAxDUUdxtO6/RBQkQZvSi8I/pL4BoGw/XPkh4XigPmsUgh0626AjRsgxHTkUThsG2T/sIlzdTsp52kSS1wAAAABJRU5ErkJggg==\"></a>\n\t\t\t\t<a href=\"options-editor.html\" target=\"_blank\" class=\"new-window-link\"><img\n\t\t\t\t\t\tsrc=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAABg2lDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9TpSIVQYuoOGSoTnbRIo61CkWoEGqFVh1MLv2CJg1Jiouj4Fpw8GOx6uDirKuDqyAIfoC4C06KLlLi/5pCixgPjvvx7t7j7h0g1MtMs7pigKbbZioRFzPZVTHwCgEDGMIIojKzjDlJSsJzfN3Dx9e7CM/yPvfn6FNzFgN8InGMGaZNvEE8s2kbnPeJQ6woq8TnxJMmXZD4keuKy2+cC00WeGbITKfmiUPEYqGDlQ5mRVMjjhKHVU2nfCHjssp5i7NWrrLWPfkLgzl9ZZnrNMeQwCKWIEGEgipKKMNGhFadFAsp2o97+EebfolcCrlKYORYQAUa5KYf/A9+d2vlp6fcpGAc6H5xnI9xILALNGqO833sOI0TwP8MXOltf6UOzH6SXmtr4SOgfxu4uG5ryh5wuQMMPxmyKTclP00hnwfez+ibssDgLdC75vbW2sfpA5CmrpI3wMEhMFGg7HWPd/d09vbvmVZ/P8lTcsmmxgruAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH6QISFiAoxdV/BAAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAkSURBVBjTY2AgEjBC6f9EqqPcROJNwmci6aaQ6mtGqpmIYhIA3lQFBjN3Og8AAAAASUVORK5CYII=\"></a>\n\t\t\t</span>\n\t\t\t<span class=\"profiles\">\n\t\t\t\t<select id=\"profileNamesInput\"></select>\n\t\t\t\t<button id=\"addProfileButton\"><img src=\"../resources/button_new.png\"></button>\n\t\t\t\t<button id=\"deleteProfileButton\"><img src=\"../resources/button_delete.png\"></button>\n\t\t\t\t<button id=\"renameProfileButton\"><img src=\"../resources/button_edit.png\"></button>\n\t\t\t</span>\n\t\t</h3>\n\t\t<details>\n\t\t\t<summary id=\"userInterfaceLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"contextMenuEnabledInput\" id=\"addMenuEntryLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"contextMenuEnabledInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"shadowEnabledInput\" id=\"shadowEnabledLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"shadowEnabledInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"openSavedPageOption\">\n\t\t\t\t<label for=\"openSavedPageInput\" id=\"openSavedPageLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"openSavedPageInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"autoCloseInput\" id=\"autoCloseLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoCloseInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"customShortcutInput\" id=\"customShortcutLabel\"></label>\n\t\t\t\t<select id=\"customShortcutInput\">\n\t\t\t\t\t<option value=\"\" id=\"customShortcutDefaultLabel\"></option>\n\t\t\t\t\t<option value=\"custom-command-0\" id=\"customShortcut0Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-1\" id=\"customShortcut1Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-2\" id=\"customShortcut2Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-3\" id=\"customShortcut3Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-4\" id=\"customShortcut4Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-5\" id=\"customShortcut5Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-6\" id=\"customShortcut6Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-7\" id=\"customShortcut7Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-8\" id=\"customShortcut8Label\"></option>\n\t\t\t\t\t<option value=\"custom-command-9\" id=\"customShortcut9Label\"></option>\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"filenameLabel\"></summary>\n\t\t\t<div class=\"option vertical\">\n\t\t\t\t<label for=\"filenameTemplateInput\" id=\"filenameTemplateLabel\"></label>\n\t\t\t\t<textarea id=\"filenameTemplateInput\"></textarea>\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"filenameMaxLengthInput\" id=\"filenameMaxLengthLabel\"></label>\n\t\t\t\t<div class=\"option-input\">\n\t\t\t\t\t<input type=\"number\" id=\"filenameMaxLengthInput\" min=\"1\">\n\t\t\t\t\t<select id=\"filenameMaxLengthUnitInput\">\n\t\t\t\t\t\t<option id=\"filenameMaxLengthBytesUnitLabel\" value=\"bytes\"></option>\n\t\t\t\t\t\t<option id=\"filenameMaxLengthCharsUnitLabel\" value=\"chars\"></option>\n\t\t\t\t\t</select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"filenameReplacementCharacterInput\" id=\"filenameReplacementCharacterLabel\"></label>\n\t\t\t\t<div class=\"option-input\">\n\t\t\t\t\t<input type=\"text\" id=\"filenameReplacementCharacterInput\" class=\"small-input\">\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"replaceEmojisInFilenameInput\" id=\"replaceEmojisInFilenameLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"replaceEmojisInFilenameInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveFilenameTemplateDataInput\" id=\"saveFilenameTemplateDataLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"saveFilenameTemplateDataInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"confirmFilenameOption\">\n\t\t\t\t<label for=\"confirmFilenameInput\" id=\"confirmFilenameLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"confirmFilenameInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"filenameConflictAction\">\n\t\t\t\t<label for=\"filenameConflictActionInput\" id=\"filenameConflictActionLabel\"></label>\n\t\t\t\t<select id=\"filenameConflictActionInput\">\n\t\t\t\t\t<option id=\"filenameConflictActionUniquifyLabel\" value=\"uniquify\"></option>\n\t\t\t\t\t<option id=\"filenameConflictActionOverwriteLabel\" value=\"overwrite\"></option>\n\t\t\t\t\t<option id=\"filenameConflictActionPromptLabel\" value=\"prompt\"></option>\n\t\t\t\t\t<option id=\"filenameConflictActionSkipLabel\" value=\"skip\"></option>\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"fileFormatLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"fileFormatSelectInput\" id=\"fileFormatSelectLabel\"></label>\n\t\t\t\t<select id=\"fileFormatSelectInput\">\n\t\t\t\t\t<option id=\"fileFormatSelectHTMLLabel\" value=\"html\"></option>\n\t\t\t\t\t<option id=\"fileFormatSelectSelfExtractingUniversalLabel\" value=\"self-extracting-zip-universal\">\n\t\t\t\t\t</option>\n\t\t\t\t\t<option id=\"fileFormatSelectSelfExtractingLabel\" value=\"self-extracting-zip\"></option>\n\t\t\t\t\t<option id=\"fileFormatSelectZIPLabel\" value=\"zip\"></option>\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t\t<div class=\"option vertical\">\n\t\t\t\t<label for=\"passwordInput\" id=\"passwordLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"passwordInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"insertEmbeddedImageInput\" id=\"insertEmbeddedImageLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"insertEmbeddedImageInput\" name=\"embeddedImageInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"insertEmbeddedScreenshotImageInput\" id=\"insertEmbeddedScreenshotImageLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"insertEmbeddedScreenshotImageInput\" name=\"embeddedImageInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"insertEmbeddedCustomImageInput\" id=\"insertEmbeddedCustomImageLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"insertEmbeddedCustomImageInput\" name=\"embeddedImageInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"createRootDirectoryInput\" id=\"createRootDirectoryLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"createRootDirectoryInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"disableCompressionInput\" id=\"disableCompressionLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"disableCompressionInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"preventAppendedDataInput\" id=\"preventAppendedDataLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"preventAppendedDataInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"insertTextBodyInput\" id=\"insertTextBodyLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"insertTextBodyInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"htmlContentLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"compressHTMLInput\" id=\"compressHTMLLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"compressHTMLInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"removeHiddenElementsInput\" id=\"removeHiddenElementsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"removeHiddenElementsInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option vertical\">\n\t\t\t\t<label for=\"removedElementsSelectorInput\" id=\"removedElementsSelectorLabel\"></label>\n\t\t\t\t<textarea id=\"removedElementsSelectorInput\"></textarea>\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"insertMetaCSPInput\" id=\"insertMetaCSPLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"insertMetaCSPInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"removeFramesInput\" id=\"removeFramesLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"removeFramesInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveOriginalURLsInput\" id=\"saveOriginalURLsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"saveOriginalURLsInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"removeInfobarSavedDateInput\" id=\"removeInfobarSavedDateLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"removeInfobarSavedDateInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveRawPageInput\" id=\"saveRawPageLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"saveRawPageInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"infobarLabel\"></summary>\n\t\t\t<div class=\"option\" id=\"displayInfobarOption\">\n\t\t\t\t<label for=\"displayInfobarInput\" id=\"displayInfobarLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"displayInfobarInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option vertical\">\n\t\t\t\t<label for=\"infobarTemplateInput\" id=\"infobarTemplateLabel\"></label>\n\t\t\t\t<textarea id=\"infobarTemplateInput\"></textarea>\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"confirmInfobarInput\" id=\"confirmInfobarLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"confirmInfobarInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"includeInfobarInput\" id=\"includeInfobarLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"includeInfobarInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"openInfobarInput\" id=\"openInfobarLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"openInfobarInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"stylesheetsLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"removeUnusedStylesInput\" id=\"removeUnusedStylesLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"removeUnusedStylesInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"removeAlternativeMediasInput\" id=\"removeAlternativeMediasLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"removeAlternativeMediasInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"compressCSSInput\" id=\"compressCSSLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"compressCSSInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"groupDuplicateStylesheetsInput\" id=\"groupDuplicateStylesheetsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"groupDuplicateStylesheetsInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"moveStylesInHeadInput\" id=\"moveStylesInHeadLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"moveStylesInHeadInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"imagesLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"groupDuplicateImagesInput\" id=\"groupDuplicateImagesLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"groupDuplicateImagesInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"loadDeferredImagesInput\" id=\"loadDeferredImagesLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"loadDeferredImagesInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"loadDeferredImagesMaxIdleTimeInput\" id=\"loadDeferredImagesMaxIdleTimeLabel\"></label>\n\t\t\t\t<input type=\"number\" class=\"large-input\" id=\"loadDeferredImagesMaxIdleTimeInput\" step=\"100\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"loadDeferredImagesDispatchScrollEventInput\"\n\t\t\t\t\tid=\"loadDeferredImagesDispatchScrollEventLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"loadDeferredImagesDispatchScrollEventInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"loadDeferredImagesKeepZoomLevelInput\" id=\"loadDeferredImagesKeepZoomLevelLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"loadDeferredImagesKeepZoomLevelInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"loadDeferredImagesBeforeFramesInput\" id=\"loadDeferredImagesBeforeFramesLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"loadDeferredImagesBeforeFramesInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"imageReductionFactorInput\" id=\"imageReductionFactorLabel\"></label>\n\t\t\t\t<input type=\"number\" id=\"imageReductionFactorInput\" min=\"1\" max=\"16\" step=\".5\" value=\"1\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"removeAlternativeImagesInput\" id=\"removeAlternativeImagesLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"removeAlternativeImagesInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"fontsLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"removeUnusedFontsInput\" id=\"removeUnusedFontsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"removeUnusedFontsInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"removeAlternativeFontsInput\" id=\"removeAlternativeFontsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"removeAlternativeFontsInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"destinationLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveToFilesystemInput\" id=\"saveToFilesystemLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveToFilesystemInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"sharePageOption\">\n\t\t\t\t<label for=\"sharePageInput\" id=\"sharePageLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"sharePageInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"saveToClipboardOption\">\n\t\t\t\t<label for=\"saveToClipboardInput\" id=\"saveToClipboardLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveToClipboardInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveToGitHubInput\" id=\"saveToGitHubLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveToGitHubInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"githubTokenInput\" id=\"githubTokenLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"githubTokenInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"githubUserInput\" id=\"githubUserLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"githubUserInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"githubRepositoryInput\" id=\"githubRepositoryLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"githubRepositoryInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"githubBranchInput\" id=\"githubBranchLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"githubBranchInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveWithWebDAVInput\" id=\"saveWithWebDAVLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveWithWebDAVInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"webDAVURLInput\" id=\"webDAVURLLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"webDAVURLInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"webDAVUserInput\" id=\"webDAVUserLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"webDAVUserInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"webDAVPasswordInput\" id=\"webDAVPasswordLabel\"></label>\n\t\t\t\t<input type=\"password\" id=\"webDAVPasswordInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveWithMCPInput\" id=\"saveWithMCPLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveWithMCPInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"mcpServerUrlInput\" id=\"mcpServerUrlLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"mcpServerUrlInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"mcpAuthTokenInput\" id=\"mcpAuthTokenLabel\"></label>\n\t\t\t\t<input type=\"password\" id=\"mcpAuthTokenInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"saveToGDriveOption\">\n\t\t\t\t<label for=\"saveToGDriveInput\" id=\"saveToGDriveLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveToGDriveInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"saveToS3Option\">\n\t\t\t\t<label for=\"saveToS3Input\" id=\"saveToS3Label\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveToS3Input\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"S3DomainInput\" id=\"S3DomainLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"S3DomainInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"S3RegionInput\" id=\"S3RegionLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"S3RegionInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"S3BucketInput\" id=\"S3BucketLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"S3BucketInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"S3AccessKeyInput\" id=\"S3AccessKeyLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"S3AccessKeyInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"S3SecretKeyInput\" id=\"S3SecretKeyLabel\"></label>\n\t\t\t\t<input type=\"password\" id=\"S3SecretKeyInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"saveToDropboxOption\">\n\t\t\t\t<label for=\"saveToDropboxInput\" id=\"saveToDropboxLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveToDropboxInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"saveWithCompanionOption\">\n\t\t\t\t<label for=\"saveWithCompanionInput\" id=\"saveWithCompanionLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveWithCompanionInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveToRestFormApiInput\" id=\"saveToRestFormApiLabel\"></label>\n\t\t\t\t<input type=\"radio\" id=\"saveToRestFormApiInput\" name=\"destinationInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"saveToRestFormApiUrlInput\" id=\"saveToRestFormApiUrlLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"saveToRestFormApiUrlInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"saveToRestFormApiTokenInput\" id=\"saveToRestFormApiTokenLabel\"></label>\n\t\t\t\t<input type=\"password\" id=\"saveToRestFormApiTokenInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"saveToRestFormApiFileFieldNameInput\" id=\"saveToRestFormApiFileFieldNameLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"saveToRestFormApiFileFieldNameInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"saveToRestFormApiUrlFieldNameInput\" id=\"saveToRestFormApiUrlFieldNameLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"saveToRestFormApiUrlFieldNameInput\" class=\"medium-input\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"networkLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label id=\"blockResourcesLabel\"></label>\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"blockImagesInput\" id=\"blockImagesLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"blockImagesInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"blockStylesheetsInput\" id=\"blockStylesheetsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"blockStylesheetsInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"blockFontsInput\" id=\"blockFontsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"blockFontsInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"blockScriptsInput\" id=\"blockScriptsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"blockScriptsInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"blockVideosInput\" id=\"blockVideosLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"blockVideosInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"blockAudiosInput\" id=\"blockAudiosLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"blockAudiosInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"blockMixedContentInput\" id=\"blockMixedContentLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"blockMixedContentInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label id=\"acceptHeadersLabel\"></label>\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"acceptHeaderDocumentInput\" id=\"acceptHeaderDocumentLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"acceptHeaderDocumentInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"acceptHeaderImageInput\" id=\"acceptHeaderImageLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"acceptHeaderImageInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"acceptHeaderStylesheetInput\" id=\"acceptHeaderStylesheetLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"acceptHeaderStylesheetInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"acceptHeaderFontInput\" id=\"acceptHeaderFontLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"acceptHeaderFontInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"acceptHeaderScriptInput\" id=\"acceptHeaderScriptLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"acceptHeaderScriptInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"acceptHeaderVideoInput\" id=\"acceptHeaderVideoLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"acceptHeaderVideoInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"acceptHeaderAudioInput\" id=\"acceptHeaderAudioLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"acceptHeaderAudioInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"maxResourceSizeEnabledInput\" id=\"setMaxResourceSizeLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"maxResourceSizeEnabledInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"maxResourceSizeInput\" id=\"maxResourceSizeLabel\"></label>\n\t\t\t\t<input type=\"number\" id=\"maxResourceSizeInput\" min=\"1\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"maxResourceDelayEnabledInput\" id=\"setMaxResourceDelayLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"maxResourceDelayEnabledInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"maxResourceDelayInput\" id=\"maxResourceDelayLabel\"></label>\n\t\t\t\t<input type=\"number\" id=\"maxResourceDelayInput\" min=\"1\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"passReferrerOnErrorOption\">\n\t\t\t\t<label for=\"passReferrerOnErrorInput\" id=\"passReferrerOnErrorLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"passReferrerOnErrorInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"editorLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"defaultEditorModeInput\" id=\"defaultEditorModeLabel\"></label>\n\t\t\t\t<select id=\"defaultEditorModeInput\">\n\t\t\t\t\t<option id=\"defaultEditorModeNormalLabel\" value=\"normal\"></option>\n\t\t\t\t\t<option id=\"defaultEditorModeEditLabel\" value=\"edit\"></option>\n\t\t\t\t\t<option id=\"defaultEditorModeFormatLabel\" value=\"format\"></option>\n\t\t\t\t\t<option id=\"defaultEditorModeCutLabel\" value=\"cut\"></option>\n\t\t\t\t\t<option id=\"defaultEditorModeCutExternalLabel\" value=\"cut-external\"></option>\n\t\t\t\t</select>\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"applySystemThemeInput\" id=\"applySystemThemeLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"applySystemThemeInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"contentWidthInput\" id=\"contentWidthLabel\"></label>\n\t\t\t\t<input type=\"number\" id=\"contentWidthInput\" min=\"0\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"warnUnsavedPageInput\" id=\"warnUnsavedPageLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"warnUnsavedPageInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"openEditorInput\" id=\"openEditorLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"openEditorInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"autoOpenEditorOption\">\n\t\t\t\t<label for=\"autoOpenEditorInput\" id=\"autoOpenEditorLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoOpenEditorInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"displayInfobarInEditorInput\" id=\"displayInfobarInEditorLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"displayInfobarInEditorInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details id=\"bookmarksOptions\">\n\t\t\t<summary id=\"bookmarksLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"saveCreatedBookmarksInput\" id=\"saveCreatedBookmarksLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"saveCreatedBookmarksInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"replaceBookmarkURLInput\" id=\"replaceBookmarkURLLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"replaceBookmarkURLInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level vertical\">\n\t\t\t\t<label for=\"ignoredBookmarkFoldersInput\" id=\"ignoredBookmarkFoldersLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"ignoredBookmarkFoldersInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level vertical\">\n\t\t\t\t<label for=\"allowedBookmarkFoldersInput\" id=\"allowedBookmarkFoldersLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"allowedBookmarkFoldersInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details id=\"autoSaveSection\">\n\t\t\t<summary id=\"autoSaveLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"autoSaveLoadOrUnloadInput\" id=\"autoSaveLoadOrUnloadLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoSaveLoadOrUnloadInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"autoSaveLoadInput\" id=\"autoSaveLoadLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoSaveLoadInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"autoSaveUnloadInput\" id=\"autoSaveUnloadLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoSaveUnloadInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"autoSaveDiscardInput\" id=\"autoSaveDiscardLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoSaveDiscardInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"autoSaveRemoveInput\" id=\"autoSaveRemoveLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoSaveRemoveInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"autoSaveDelayInput\" id=\"autoSaveDelayLabel\"></label>\n\t\t\t\t<input type=\"number\" id=\"autoSaveDelayInput\" min=\"0\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"autoSaveRepeatInput\" id=\"autoSaveRepeatLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoSaveRepeatInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level\">\n\t\t\t\t<label for=\"autoSaveRepeatDelayInput\" id=\"autoSaveRepeatDelayLabel\"></label>\n\t\t\t\t<input type=\"number\" id=\"autoSaveRepeatDelayInput\" min=\"1\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"autoSaveExternalSaveInput\" id=\"autoSaveExternalSaveLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"autoSaveExternalSaveInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"miscLabel\"></summary>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"addProofInput\" id=\"addProofLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"addProofInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option second-level vertical\" hidden>\n\t\t\t\t<label for=\"woleetKeyInput\" id=\"woleetKeyLabel\"></label>\n\t\t\t\t<input type=\"text\" id=\"woleetKeyInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"backgroundSaveOptions\">\n\t\t\t\t<label for=\"backgroundSaveInput\" id=\"backgroundSaveLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"backgroundSaveInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"displayStatsInput\" id=\"displayStatsLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"displayStatsInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<details>\n\t\t\t<summary id=\"autoSettingsLabel\"></summary>\n\t\t\t<div class=\"rules-table-container compact\">\n\t\t\t\t<div class=\"thead\">\n\t\t\t\t\t<div class=\"tr\">\n\t\t\t\t\t\t<span class=\"th\" id=\"autoSettingsUrlLabel\"></span>\n\t\t\t\t\t\t<span class=\"th\" id=\"autoSettingsProfileLabel\"></span>\n\t\t\t\t\t\t<span class=\"th rule-autosave-profile\" id=\"autoSettingsAutoSaveProfileLabel\"></span>\n\t\t\t\t\t\t<span class=\"th\"><button id=\"rulesDeleteAllButton\"><img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_delete_all.png\"></button></span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"rules-table\">\n\t\t\t\t\t<div class=\"rules-data\">\n\t\t\t\t\t</div>\n\t\t\t\t\t<div hidden class=\"tr rule-view\">\n\t\t\t\t\t\t<span class=\"td rule-url\"></span>\n\t\t\t\t\t\t<span class=\"td rule-profile\"></span>\n\t\t\t\t\t\t<span class=\"td rule-autosave-profile\"></span>\n\t\t\t\t\t\t<span class=\"td\"><button class=\"rule-update-button\"><img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_edit.png\"></button> <button class=\"rule-delete-button\"><img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_delete.png\"></button></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<form class=\"tr rule-create\">\n\t\t\t\t\t\t<span class=\"td rule-url\"><input type=\"text\" id=\"ruleUrlInput\"\n\t\t\t\t\t\t\t\tplaceholder=\"Type a complete or partial URL (e.g. example.com)\"></span>\n\t\t\t\t\t\t<span class=\"td rule-profile\"><select id=\"ruleProfileInput\"></select></span>\n\t\t\t\t\t\t<span class=\"td rule-autosave-profile\"><select id=\"ruleAutoSaveProfileInput\"></select></span>\n\t\t\t\t\t\t<span class=\"td\"><button id=\"ruleAddButton\" disabled type=\"submit\"><img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_new.png\"></button></span>\n\t\t\t\t\t</form>\n\t\t\t\t\t<form hidden class=\"tr rule-edit\">\n\t\t\t\t\t\t<span class=\"td rule-url\"><input type=\"text\" id=\"ruleEditUrlInput\"></span>\n\t\t\t\t\t\t<span class=\"td rule-profile\"><select id=\"ruleEditProfileInput\"></select></span>\n\t\t\t\t\t\t<span class=\"td rule-autosave-profile\"><select\n\t\t\t\t\t\t\t\tid=\"ruleEditAutoSaveProfileInput\"></select></span>\n\t\t\t\t\t\t<span class=\"td\"><button id=\"ruleEditButton\" type=\"submit\"><img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_ok.png\"></button> <button id=\"ruleCancelButton\"><img\n\t\t\t\t\t\t\t\t\tsrc=\"../resources/button_cancel.png\"></button></span>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"option\">\n\t\t\t\t<label for=\"showAllProfilesInput\" id=\"showAllProfilesLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"showAllProfilesInput\">\n\t\t\t</div>\n\t\t\t<div class=\"option\" id=\"showAutoSaveProfileOption\">\n\t\t\t\t<label for=\"showAutoSaveProfileInput\" id=\"showAutoSaveProfileLabel\"></label>\n\t\t\t\t<input type=\"checkbox\" id=\"showAutoSaveProfileInput\">\n\t\t\t</div>\n\t\t</details>\n\t\t<div class=\"option bottom\">\n\t\t\t<a target=\"SingleFileHelpPage\" id=\"helpLabel\"></a>\n\t\t\t<div class=\"buttons\">\n\t\t\t\t<div class=\"sync-input\">\n\t\t\t\t\t<input type=\"checkbox\" id=\"synchronizeInput\">\n\t\t\t\t\t<label for=\"synchronizeInput\" id=\"synchronizeLabel\"></label>\n\t\t\t\t</div>\n\t\t\t\t<button id=\"importButton\"></button>\n\t\t\t\t<button id=\"exportButton\"></button>\n\t\t\t\t<button id=\"resetButton\"></button>\n\t\t\t\t<input type=\"file\" id=\"fileInput\" hidden>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"formResetContainer\" class=\"popup\">\n\t\t\t<form class=\"popup-content\">\n\t\t\t\t<header>\n\t\t\t\t\t<span id=\"resetConfirmLabel\"></span>\n\t\t\t\t</header>\n\t\t\t\t<footer>\n\t\t\t\t\t<button type=\"submit\" id=\"resetAllButton\"></button>\n\t\t\t\t\t<button id=\"resetCurrentButton\"></button>\n\t\t\t\t\t<button id=\"resetCancelButton\"></button>\n\t\t\t\t</footer>\n\t\t\t</form>\n\t\t</div>\n\t\t<div id=\"formConfirmContainer\" class=\"popup\">\n\t\t\t<form class=\"popup-content\">\n\t\t\t\t<header>\n\t\t\t\t\t<span id=\"confirmLabel\"></span>\n\t\t\t\t</header>\n\t\t\t\t<footer>\n\t\t\t\t\t<button type=\"submit\" id=\"confirmButton\"></button>\n\t\t\t\t\t<button id=\"cancelButton\"></button>\n\t\t\t\t</footer>\n\t\t\t</form>\n\t\t</div>\n\t\t<div id=\"formPromptContainer\" class=\"popup\">\n\t\t\t<form class=\"popup-content\">\n\t\t\t\t<header>\n\t\t\t\t\t<span id=\"promptLabel\"></span>\n\t\t\t\t</header>\n\t\t\t\t<main><input id=\"promptInput\" type=\"text\"></main>\n\t\t\t\t<footer>\n\t\t\t\t\t<button type=\"submit\" id=\"promptConfirmButton\"></button>\n\t\t\t\t\t<button id=\"promptCancelButton\"></button>\n\t\t\t\t</footer>\n\t\t\t</form>\n\t\t</div>\n\t</main>\n\t<script src=\"/lib/chrome-browser-polyfill.js\"></script>\n\t<script type=\"module\" src=\"../bg/ui-options.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/ui/pages/panel.css",
    "content": "html,\nbody {\n    height: 100%;\n    font-family: sans-serif;\n    font-size: 12px;\n}\n\nbody {\n    display: flex;\n    flex-direction: column;\n    margin: 0;\n    height: 100%;\n    overflow: hidden;\n    background-color: #fbfbfb;\n}\n\nheader {\n    display: flex;\n    flex-direction: row;    \n}\n\n.tab {\n    height: 30px;\n    padding-top: 8px;\n    padding-left: 8px;\n    padding-right: 8px;\n    opacity: .5;\n\tcursor: pointer;\n\toverflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n}\n\n.tab-selected {\n    opacity: 1;\n}\n\nmain {\n    flex: 1;\n}\n\niframe {\n    height: 100%;\n    width: 100%;\n    border-width: 0;\n}\n\n@media (prefers-color-scheme: dark) {\n    body {\n        background-color: #38383d;\n        color: #fdfdfd;\n    }\n}"
  },
  {
    "path": "src/ui/pages/panel.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>Panel</title>\n\t<link rel=\"stylesheet\" href=\"panel.css\">\n\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n\t<meta name=\"color-scheme\" content=\"light dark\">\n\t<link rel=\"icon\" href=\"/src/ui/resources/icon_128.png\">\n</head>\n\n<body>\n\t<header>\n\t\t<span id=\"tab-options\" class=\"tab tab-selected\"></span>\n\t\t<span id=\"tab-batch-save-urls\" class=\"tab\"></span>\n\t\t<span id=\"tab-pendings\" class=\"tab\"></span>\n\t</header>\n\t<main>\n\t\t<iframe id=\"view-panel\" src=\"options.html#side-panel\"></iframe>\n\t</main>\n\t<script src=\"/lib/chrome-browser-polyfill.js\"></script>\n\t<script type=\"module\" src=\"../bg/ui-panel.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/ui/pages/pendings.css",
    "content": "html {\r\n    background-color: #f0f0f0;\r\n    color: black;\r\n}\r\n\r\nbody {\r\n    margin: 0;\r\n    margin-left: 5px;\r\n    margin-right: 5px;\r\n}\r\n\r\nmain,\r\nheader {\r\n    font-family: sans-serif;\r\n}\r\n\r\nbody>main {\r\n    background-color: #fff;\r\n    border: solid 1px rgb(191, 191, 191);\r\n}\r\n\r\nbody>main,\r\nbody>header {\r\n    font-size: 12px;\r\n    font-family: sans-serif;\r\n    margin: 0;\r\n    margin-left: auto;\r\n    margin-right: auto;\r\n    max-width: 1024px;\r\n}\r\n\r\nbody>header {\r\n    display: flex;\r\n    flex-direction: column;\r\n    align-items: flex-end;\r\n}\r\n\r\nbutton {\r\n    background-color: #fbfbfb;\r\n    border-color: rgb(191, 191, 191);\r\n    border-style: solid;\r\n    border-radius: 2px;\r\n    border-width: 1px;\r\n    color: black;\r\n    cursor: pointer;\r\n}\r\n\r\nbutton:not(:disabled):hover {\r\n    background-color: #ededed;\r\n}\r\n\r\nbutton:disabled {\r\n    opacity: .25;\r\n    cursor: default;\r\n}\r\n\r\nbody>header button {\r\n    margin-top: 5px;\r\n    margin-bottom: 5px;\r\n    align-self: flex-end;\r\n    padding: 5px;\r\n    padding-left: 10px;\r\n    padding-right: 10px;\r\n    margin-left: 8px;\r\n}\r\n\r\n.result-row {\r\n    display: flex;\r\n    flex-direction: row;\r\n    padding-top: 5px;\r\n    padding-bottom: 5px;\r\n    min-height: 40px;\r\n}\r\n\r\n.result-row:not(:first-child) {\r\n    border-top: #bfbfbf 1px dashed;\r\n}\r\n\r\n.result-head {\r\n    background-color: #ececec;\r\n}\r\n\r\n.result-row>span {\r\n    padding: 10px;\r\n    align-self: center;\r\n}\r\n\r\n.result-row>span>span {\r\n    padding: 5px;\r\n}\r\n\r\n.result-head .unselected {\r\n    opacity: .5;\r\n}\r\n\r\n.result-row.result-head .result-head-separator {\r\n    padding-left: 2px;\r\n    padding-right: 2px;\r\n}\r\n\r\n.result-url-title {\r\n    flex: 1;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    display: inline-block;\r\n    white-space: nowrap;\r\n    user-select: none;\r\n    cursor: pointer;\r\n}\r\n\r\n.result-row:not(.result-head) .result-url-title {\r\n    cursor: pointer;\r\n}\r\n\r\n.result-status {\r\n    min-width: 120px;\r\n}\r\n\r\n.result-cancel {\r\n    text-align: right;\r\n    width: 19px;\r\n}\r\n\r\n.result-cancel button {\r\n    background-color: #fbfbfb;\r\n    width: 19px;\r\n    padding: 0;\r\n}\r\n\r\n.no-result {\r\n    color: #888;\r\n}\r\n\r\nhtml.side-panel body {\r\n    margin: 0;\r\n}\r\n\r\nhtml.side-panel,\r\n.side-panel .result-head,\r\n.side-panel body>main {\r\n    background-color: #fbfbfb;\r\n}\r\n\r\n.side-panel .header-buttons {\r\n    position: absolute;\r\n    right: 12px;\r\n    display: flex;\r\n}\r\n\r\nhtml.side-panel #addUrlsButton {\r\n    display: none;\r\n}\r\n\r\n.side-panel body>main {\r\n    border: 0;\r\n    margin-left: 8px;\r\n    margin-right: 12px;\r\n}\r\n\r\n.side-panel .result-status {\r\n    display: none;\r\n}\r\n\r\n.side-panel .result-row>span,\r\n.side-panel .result-row>span>span {\r\n    padding: 0px;\r\n}\r\n\r\n.side-panel .result-head {\r\n    border-bottom: dashed 1px rgb(191, 191, 191);\r\n}\r\n\r\n@media (max-width:400px) {\r\n\r\n    body>main,\r\n    body>header,\r\n    .header-buttons>button {\r\n        font-size: 11px;\r\n    }\r\n\r\n    .result-row {\r\n        padding-top: 3px;\r\n        padding-bottom: 3px;\r\n        min-height: 30px;\r\n    }\r\n\r\n    .side-panel .header-buttons {\r\n        top: 0px;\r\n    }\r\n}\r\n\r\n@media (max-width:300px) {\r\n    .side-panel :not(.result-cancel)>button {\r\n        display: flex;\r\n    }\r\n\r\n    .side-panel .header-buttons {\r\n        flex-direction: column;\r\n    }\r\n\r\n    .result-head {\r\n        padding-bottom: 40px;\r\n    }\r\n}\r\n\r\n@media (prefers-color-scheme: dark) {\r\n    html {\r\n        background-color: #373737;\r\n        color: #fdfdfd;\r\n    }\r\n\r\n    body>main {\r\n        border-color: rgb(81, 81, 81);\r\n    }\r\n\r\n    body>main,\r\n    button {\r\n        background-color: #202023;\r\n        color: #fdfdfd;\r\n    }\r\n\r\n    .result-row {\r\n        color: #dedede;\r\n    }\r\n\r\n    .result-head {\r\n        background-color: #191919;\r\n        color: #fdfdfd;\r\n    }\r\n\r\n    .no-result {\r\n        color: #888;\r\n    }\r\n\r\n    .result-cancel button {\r\n        color: #202023;\r\n    }\r\n\r\n    .result-cancel button:hover {\r\n        background-color: #ccc;\r\n    }\r\n\r\n    button:not(:disabled):hover {\r\n        color: #2A2A2E;\r\n    }\r\n\r\n    textarea {\r\n        background-color: #fff;\r\n    }\r\n\r\n    button:focus {\r\n        color: gray;\r\n        border-color: gray;\r\n        background-color: #d2d2d2;\r\n    }\r\n\r\n    html.side-panel,\r\n    .side-panel .result-head,\r\n    .side-panel body>main,\r\n    .side-panel button {\r\n        background-color: #38383d;\r\n    }\r\n\r\n    .side-panel .result-cancel button {\r\n        color: #fdfdfd;\r\n    }\r\n}"
  },
  {
    "path": "src/ui/pages/pendings.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n\t<title>&nbsp;</title>\n\t<link rel=\"stylesheet\" href=\"pendings.css\">\n\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n\t<meta name=\"color-scheme\" content=\"light dark\">\n\t<link rel=\"icon\" href=\"/src/ui/resources/icon_128.png\">\n</head>\n\n<body>\n\t<header>\n\t\t<div class=\"header-buttons\">\n\t\t\t<button id=\"addUrlsButton\"></button>\n\t\t\t<button id=\"cancelAllButton\"></button>\n\t\t</div>\n\t</header>\n\t<main>\n\t\t<div class=\"result-row result-head\">\n\t\t\t<span class=\"result-url-title\" id=\"URLTitleLabel\">\n\t\t\t\t<span id=\"URLLabel\"></span>\n\t\t\t\t<span class=\"result-head-separator\">/</span>\n\t\t\t\t<span id=\"titleLabel\"></span>\n\t\t\t</span>\n\t\t\t<span class=\"result-status\" id=\"statusLabel\"></span>\n\t\t\t<span class=\"result-cancel\">&nbsp;</span>\n\t\t</div>\n\t\t<div id=\"resultsTable\">\n\t\t</div>\n\t</main>\n\t<script src=\"/lib/chrome-browser-polyfill.js\"></script>\n\t<script type=\"module\" src=\"../bg/ui-pendings.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/ui/pages/viewer.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>Page viewer</title>\n</head>\n\n<body></body>\n<script src=\"/lib/single-file-extension-editor-helper.js\"></script>\n<script src=\"../bg/ui-viewer.js\" type=\"module\"></script>\n\n</html>"
  }
]